Пример #1
0
void Surface::transBlitFrom(const Graphics::Surface &src, const Common::Point &pt,
		bool flipped, int overrideColor, int scaleVal) {
	if (scaleVal == SCALE_THRESHOLD) {
		transBlitFromUnscaled(src, pt, flipped, overrideColor);
		return;
	}

	int destWidth = src.w * SCALE_THRESHOLD / scaleVal;
	int destHeight = src.h * SCALE_THRESHOLD / scaleVal;

	// Loop through drawing output lines
	for (int destY = pt.y, scaleYCtr = 0; destY < (pt.y + destHeight); ++destY, scaleYCtr += scaleVal) {
		if (destY < 0 || destY >= this->h())
			continue;
		const byte *srcLine = (const byte *)src.getBasePtr(0, scaleYCtr / SCALE_THRESHOLD);
		byte *destLine = (byte *)getBasePtr(pt.x, destY);

		// Loop through drawing individual rows
		for (int xCtr = 0, scaleXCtr = 0; xCtr < destWidth; ++xCtr, scaleXCtr += scaleVal) {
			int destX = pt.x + xCtr;
			if (destX < 0 || destX >= this->w())
				continue;

			byte srcVal = srcLine[flipped ? src.w - scaleXCtr / SCALE_THRESHOLD - 1 : scaleXCtr / SCALE_THRESHOLD];
			if (srcVal != TRANSPARENCY)
				destLine[xCtr] = srcVal;
		}
	}

	// Mark the affected area
	addDirtyRect(Common::Rect(pt.x, pt.y, pt.x + destWidth, pt.y + destHeight));
}
Пример #2
0
void Surface::transBlitFrom(const Graphics::Surface &src, const Common::Point &pt,
		bool flipped, int overrideColor, int scaleVal) {
	if (scaleVal == 256) {
		transBlitFromUnscaled(src, pt, flipped, overrideColor);
		return;
	}

	int scaleX = SCALE_THRESHOLD * SCALE_THRESHOLD / scaleVal;
	int scaleY = scaleX;
	int scaleXCtr = 0, scaleYCtr = 0;

	for (int yCtr = 0, destY = pt.y; yCtr < src.h && destY < this->h(); ++yCtr) {
		// Handle skipping lines if Y scaling
		scaleYCtr += scaleY;
		
		while (scaleYCtr >= SCALE_THRESHOLD && destY < this->h()) {
			scaleYCtr -= SCALE_THRESHOLD;

			if (destY >= 0) {
				// Handle drawing the line
				const byte *pSrc = (const byte *)src.getBasePtr(flipped ? src.w - 1 : 0, yCtr);
				byte *pDest = (byte *)getBasePtr(pt.x, destY);
				scaleXCtr = 0;

				for (int xCtr = 0, destX = pt.x; xCtr < src.w && destX < this->w(); ++xCtr) {
					// Handle horizontal scaling
					scaleXCtr += scaleX;

					while (scaleXCtr >= SCALE_THRESHOLD && destX < this->w()) {
						scaleXCtr -= SCALE_THRESHOLD;

						// Only handle on-screen pixels
						if (destX >= 0 && *pSrc != TRANSPARENCY)
							*pDest = *pSrc;

						++pDest;
						++destX;
					}

					pSrc = pSrc + (flipped ? -1 : 1);
				}
			}

			++destY;
		}
	}
}