[Scummvm-cvs-logs] scummvm master -> 5b6114f4cc6605b122180fd069148387b9712739

csnover csnover at users.noreply.github.com
Tue Jun 21 23:12:49 CEST 2016


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
d6d0e00dc5 SCI32: Expose a draw buffer on BitmapResource objects
5b6114f4cc SCI32: Implement kBitmapDrawView


Commit: d6d0e00dc539bf65ba1d023ef8938ad114ee8b9b
    https://github.com/scummvm/scummvm/commit/d6d0e00dc539bf65ba1d023ef8938ad114ee8b9b
Author: Colin Snover (github.com at zetafleet.com)
Date: 2016-06-21T16:11:43-05:00

Commit Message:
SCI32: Expose a draw buffer on BitmapResource objects

Most of the time, we get a bitmap to draw on it. Exposing a buffer
avoids consumers having to create their own all the time, and
encourages use of common drawing code exposed by the buffer.

Changed paths:
    engines/sci/engine/kgraphics32.cpp
    engines/sci/graphics/helpers.h
    engines/sci/graphics/text32.cpp
    engines/sci/graphics/text32.h



diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 4083414..b606073 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -619,9 +619,8 @@ reg_t kBitmapDrawText(EngineState *s, int argc, reg_t *argv) {
 	textRect.clip(Common::Rect(bitmap.getWidth(), bitmap.getHeight()));
 
 	reg_t textBitmapObject = g_sci->_gfxText32->createFontBitmap(textRect.width(), textRect.height(), Common::Rect(textRect.width(), textRect.height()), text, foreColor, backColor, skipColor, fontId, alignment, borderColor, dimmed, false);
-	Buffer bitmapBuffer(bitmap.getWidth(), bitmap.getHeight(), bitmap.getPixels());
 	CelObjMem textCel(textBitmapObject);
-	textCel.draw(bitmapBuffer, textRect, Common::Point(textRect.left, textRect.top), false);
+	textCel.draw(bitmap.getBuffer(), textRect, Common::Point(textRect.left, textRect.top), false);
 	s->_segMan->freeHunkEntry(textBitmapObject);
 
 	return s->r_acc;
@@ -638,8 +637,7 @@ reg_t kBitmapDrawColor(EngineState *s, int argc, reg_t *argv) {
 		argv[4].toSint16() + 1
 	);
 
-	Buffer buffer(bitmap.getWidth(), bitmap.getHeight(), bitmap.getPixels());
-	buffer.fillRect(fillRect, argv[5].toSint16());
+	bitmap.getBuffer().fillRect(fillRect, argv[5].toSint16());
 	return s->r_acc;
 }
 
diff --git a/engines/sci/graphics/helpers.h b/engines/sci/graphics/helpers.h
index 19dddd7..32e7140 100644
--- a/engines/sci/graphics/helpers.h
+++ b/engines/sci/graphics/helpers.h
@@ -191,6 +191,12 @@ struct Buffer : public Graphics::Surface {
 	uint16 scriptWidth;
 	uint16 scriptHeight;
 
+	Buffer() :
+		screenWidth(0),
+		screenHeight(0),
+		scriptWidth(320),
+		scriptHeight(200) {}
+
 	Buffer(const uint16 width, const uint16 height, uint8 *const pix) :
 		screenWidth(width),
 		screenHeight(height),
diff --git a/engines/sci/graphics/text32.cpp b/engines/sci/graphics/text32.cpp
index 993c5c9..277e6e9 100644
--- a/engines/sci/graphics/text32.cpp
+++ b/engines/sci/graphics/text32.cpp
@@ -137,7 +137,6 @@ reg_t GfxText32::createFontBitmap(const CelInfo32 &celInfo, const Common::Rect &
 
 	BitmapResource bitmap(_segMan, _width, _height, _skipColor, 0, 0, _scaledWidth, _scaledHeight, 0, false);
 	_bitmap = bitmap.getObject();
-	Buffer buffer(_width, _height, bitmap.getPixels());
 
 	// NOTE: The engine filled the bitmap pixels with 11 here, which is silly
 	// because then it just erased the bitmap using the skip color. So we don't
@@ -147,7 +146,7 @@ reg_t GfxText32::createFontBitmap(const CelInfo32 &celInfo, const Common::Rect &
 	erase(bitmapRect, false);
 	_backColor = backColor;
 
-	view.draw(buffer, bitmapRect, Common::Point(0, 0), false, Ratio(_scaledWidth, view._scaledWidth), Ratio(_scaledHeight, view._scaledHeight));
+	view.draw(bitmap.getBuffer(), bitmapRect, Common::Point(0, 0), false, Ratio(_scaledWidth, view._scaledWidth), Ratio(_scaledHeight, view._scaledHeight));
 
 	if (_backColor != skipColor && _foreColor != skipColor) {
 		erase(_textRect, false);
@@ -616,14 +615,8 @@ Common::Rect GfxText32::getTextSize(const Common::String &text, int16 maxWidth,
 void GfxText32::erase(const Common::Rect &rect, const bool doScaling) {
 	Common::Rect targetRect = doScaling ? scaleRect(rect) : rect;
 
-	byte *bitmap = _segMan->getHunkPointer(_bitmap);
-	byte *pixels = bitmap + READ_SCI11ENDIAN_UINT32(bitmap + 28);
-
-	// NOTE: There is an extra optimisation within the SCI code to
-	// do a single memset if the scaledRect is the same size as
-	// the bitmap, not implemented here.
-	Buffer buffer(_width, _height, pixels);
-	buffer.fillRect(targetRect, _backColor);
+	BitmapResource bitmap(_bitmap);
+	bitmap.getBuffer().fillRect(targetRect, _backColor);
 }
 
 int16 GfxText32::getStringWidth(const Common::String &text) {
diff --git a/engines/sci/graphics/text32.h b/engines/sci/graphics/text32.h
index 9892740..a61760d 100644
--- a/engines/sci/graphics/text32.h
+++ b/engines/sci/graphics/text32.h
@@ -26,6 +26,7 @@
 #include "sci/engine/state.h"
 #include "sci/graphics/celobj32.h"
 #include "sci/graphics/frameout.h"
+#include "sci/graphics/helpers.h"
 
 namespace Sci {
 
@@ -60,6 +61,7 @@ inline void set##property(uint##size value) {\
 class BitmapResource {
 	byte *_bitmap;
 	reg_t _object;
+	Buffer _buffer;
 
 	/**
 	 * Gets the size of the bitmap header for the current
@@ -103,6 +105,8 @@ public:
 			if (_bitmap == nullptr || getUncompressedDataOffset() != getBitmapHeaderSize()) {
 				error("Invalid Text bitmap %04x:%04x", PRINT_REG(bitmap));
 			}
+
+			_buffer = Buffer(getWidth(), getHeight(), getPixels());
 	}
 
 	/**
@@ -110,7 +114,6 @@ public:
 	 * segment manager.
 	 */
 	inline BitmapResource(SegManager *segMan, const int16 width, const int16 height, const uint8 skipColor, const int16 displaceX, const int16 displaceY, const int16 scaledWidth, const int16 scaledHeight, const uint32 hunkPaletteOffset, const bool remap) {
-
 		_object = segMan->allocateHunkEntry("Bitmap()", getBitmapSize(width, height));
 		_bitmap = segMan->getHunkPointer(_object);
 
@@ -131,12 +134,18 @@ public:
 		setControlOffset(0);
 		setScaledWidth(scaledWidth);
 		setScaledHeight(scaledHeight);
+
+		_buffer = Buffer(getWidth(), getHeight(), getPixels());
 	}
 
 	inline reg_t getObject() const {
 		return _object;
 	}
 
+	inline Buffer &getBuffer() {
+		return _buffer;
+	}
+
 	BITMAP_PROPERTY(16, Width, 0);
 	BITMAP_PROPERTY(16, Height, 2);
 


Commit: 5b6114f4cc6605b122180fd069148387b9712739
    https://github.com/scummvm/scummvm/commit/5b6114f4cc6605b122180fd069148387b9712739
Author: Colin Snover (github.com at zetafleet.com)
Date: 2016-06-21T16:12:33-05:00

Commit Message:
SCI32: Implement kBitmapDrawView

Changed paths:
    engines/sci/engine/kgraphics32.cpp



diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index b606073..9270c81 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -549,46 +549,31 @@ reg_t kBitmapDrawLine(EngineState *s, int argc, reg_t *argv) {
 }
 
 reg_t kBitmapDrawView(EngineState *s, int argc, reg_t *argv) {
-	// viewId, loopNo, celNo, displace x, displace y, unused, view x, view y
+	BitmapResource bitmap(argv[0]);
+	CelObjView view(argv[1].toUint16(), argv[2].toSint16(), argv[3].toSint16());
 
-	// called e.g. from TiledBitmap::resize() in Torin's Passage, script 64869
-	// The tiled view seems to always have 2 loops.
-	// These loops need to have 1 cel in loop 0 and 8 cels in loop 1.
+	const int16 x = argc > 4 ? argv[4].toSint16() : 0;
+	const int16 y = argc > 5 ? argv[5].toSint16() : 0;
+	const int16 alignX = argc > 7 ? argv[7].toSint16() : -1;
+	const int16 alignY = argc > 8 ? argv[8].toSint16() : -1;
 
-	return kStubNull(s, argc + 1, argv - 1);
+	Common::Point position(
+		x == -1 ? bitmap.getDisplace().x : x,
+		y == -1 ? bitmap.getDisplace().y : y
+	);
 
-#if 0
-	// tiled surface
-	// 6 params, called e.g. from TiledBitmap::resize() in Torin's Passage,
-	// script 64869
-	reg_t hunkId = argv[1];	// obtained from kBitmap(0)
-	// The tiled view seems to always have 2 loops.
-	// These loops need to have 1 cel in loop 0 and 8 cels in loop 1.
-	uint16 viewNum = argv[2].toUint16();	// vTiles selector
-	uint16 loop = argv[3].toUint16();
-	uint16 cel = argv[4].toUint16();
-	uint16 x = argv[5].toUint16();
-	uint16 y = argv[6].toUint16();
-
-	byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
-	// Get totalWidth, totalHeight
-	uint16 totalWidth = READ_LE_UINT16(memoryPtr);
-	uint16 totalHeight = READ_LE_UINT16(memoryPtr + 2);
-	byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
-
-	GfxView *view = g_sci->_gfxCache->getView(viewNum);
-	uint16 tileWidth = view->getWidth(loop, cel);
-	uint16 tileHeight = view->getHeight(loop, cel);
-	const byte *tileBitmap = view->getBitmap(loop, cel);
-	uint16 width = MIN<uint16>(totalWidth - x, tileWidth);
-	uint16 height = MIN<uint16>(totalHeight - y, tileHeight);
-
-	for (uint16 curY = 0; curY < height; curY++) {
-		for (uint16 curX = 0; curX < width; curX++) {
-			bitmap[(curY + y) * totalWidth + (curX + x)] = tileBitmap[curY * tileWidth + curX];
-		}
-	}
-#endif
+	position.x -= alignX == -1 ? view._displace.x : alignX;
+	position.y -= alignY == -1 ? view._displace.y : alignY;
+
+	Common::Rect drawRect(
+		position.x,
+		position.y,
+		position.x + view._width,
+		position.y + view._height
+	);
+	drawRect.clip(Common::Rect(bitmap.getWidth(), bitmap.getHeight()));
+	view.draw(bitmap.getBuffer(), drawRect, position, view._mirrorX);
+	return s->r_acc;
 }
 
 reg_t kBitmapDrawText(EngineState *s, int argc, reg_t *argv) {






More information about the Scummvm-git-logs mailing list