#include "metawndo.h" #include int ZoomRect ( grafPort *srcPort, grafPort *desPort, rect *srcRect, rect * desRect); int ZoomRect ( grafPort *srcPort, grafPort *desPort, rect *srcRect, rect * desRect) { float ratioX = 0.0; float ratioY = 0.0; rect padRect; int srcOffX, srcOffY; // Offset of srcRect from (0,0). int desOffX, desOffY; // Offset of desRect from (0,0). int count; int srcX, srcY; int desX, desY; int srcXsize, srcYsize; int desXsize, desYsize; int color; int step = 0; float errStep; float errTerm = 0.0; int (*GetPixelPrim)(int, int, grafMap *); GetPixelPrim = srcPort->portMap->prGetPx; srcXsize = srcRect->Xmax - srcRect->Xmin; srcYsize = srcRect->Ymax - srcRect->Ymin; desXsize = desRect->Xmax - desRect->Xmin; desYsize = desRect->Ymax - desRect->Ymin; ratioX = (float)srcXsize / (float)desXsize; ratioY = (float)srcYsize / (float)desYsize; if (ratioX < 1.0) { step = (float)(desXsize / srcXsize); errStep = ((desXsize % srcXsize) / (float)desXsize) * step; } // Test for empty ratio's or 1:1 if ((ratioX == 0.0) || (ratioY == 0.0)) return False; if ((ratioX == 1.0) && (ratioY == 1.0)) { CopyBlit (srcPort, desPort, srcRect, desRect); return True; } // The main loop. // Scan each destination line, and match it to a source raster. SetPort (desPort); PenSize (0,0); for (desY = desRect->Ymin; desY < desRect->Ymax; desY++) { errTerm = 0.0; srcY = (desY * ratioY) + srcRect->Ymin; for (desX = desRect->Xmin; desX < desRect->Xmax;) { srcX = (desX * ratioX) + srcRect->Xmin ; color = GetPixelPrim (srcX, srcY, srcPort->portMap); PenColor (color); // This gets used when you're Zooming up. if (step) { /* for (count = 0; count < step; count++) { SetPixel (desX, desY); desX++; } SetPixel (desX, desY); */ MoveTo (desX, desY); LineTo (desX + step, desY); errTerm += errStep; if (errTerm >= 1.0) { desX++; SetPixel (desX, desY); errTerm -= 1.0; } } // If you're Zooming down, use this one. else { SetPixel (desX, desY); desX++; } } } return True; }