[Scummvm-cvs-logs] SF.net SVN: scummvm:[52651] scummvm/trunk/engines/sci

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Thu Sep 9 12:52:17 CEST 2010


Revision: 52651
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52651&view=rev
Author:   m_kiewitz
Date:     2010-09-09 10:52:17 +0000 (Thu, 09 Sep 2010)

Log Message:
-----------
SCI: adding text code reference support

fixes glossary in pepper, bug #3040039

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/graphics/text16.cpp
    scummvm/trunk/engines/sci/graphics/text16.h

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-09-09 10:46:43 UTC (rev 52650)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-09-09 10:52:17 UTC (rev 52651)
@@ -808,6 +808,7 @@
 		alignment = readSelectorValue(s->_segMan, controlObject, SELECTOR(mode));
 		debugC(2, kDebugLevelGraphics, "drawing text %04x:%04x ('%s') to %d,%d, mode=%d", PRINT_REG(controlObject), text.c_str(), x, y, alignment);
 		g_sci->_gfxControls->kernelDrawText(rect, controlObject, g_sci->strSplit(text.c_str()).c_str(), fontId, alignment, style, hilite);
+		s->r_acc = g_sci->_gfxText16->allocAndFillReferenceRectArray();
 		return;
 
 	case SCI_CONTROLS_TYPE_TEXTEDIT:

Modified: scummvm/trunk/engines/sci/graphics/text16.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/text16.cpp	2010-09-09 10:46:43 UTC (rev 52650)
+++ scummvm/trunk/engines/sci/graphics/text16.cpp	2010-09-09 10:52:17 UTC (rev 52651)
@@ -30,6 +30,7 @@
 #include "sci/sci.h"
 #include "sci/engine/state.h"
 #include "sci/graphics/cache.h"
+#include "sci/graphics/coordadjuster.h"
 #include "sci/graphics/ports.h"
 #include "sci/graphics/paint16.h"
 #include "sci/graphics/font.h"
@@ -88,7 +89,7 @@
 // will process the encountered code and set new font/set color. We only support
 // one-digit codes currently, don't know if multi-digit codes are possible.
 // Returns textcode character count.
-int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int16 orgPenColor) {
+int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int16 orgPenColor, bool doingDrawing) {
 	const char *textCode = text;
 	int16 textCodeSize = 0;
 	char curCode;
@@ -126,8 +127,20 @@
 			}
 		}
 		break;
-	case 'r': // reference?!
-		// Used in Pepper, no idea how this works out
+	case 'r': // reference (used in pepper)
+		if (doingDrawing) {
+			if (_codeRefTempRect.top == -1) {
+				// Starting point
+				_codeRefTempRect.top = _ports->_curPort->curTop;
+				_codeRefTempRect.left = _ports->_curPort->curLeft;
+			} else {
+				// End point reached
+				_codeRefTempRect.bottom = _ports->_curPort->curTop + _ports->_curPort->fontHeight;
+				_codeRefTempRect.right = _ports->_curPort->curLeft;
+				_codeRefRects.push_back(_codeRefTempRect);
+				_codeRefTempRect.left = _codeRefTempRect.top = -1;
+			}
+		}
 		break;
 	}
 	return textCodeSize;
@@ -162,7 +175,7 @@
 		case 0x7C:
 			if (getSciVersion() >= SCI_VERSION_1_1) {
 				curCharCount++;
-				curCharCount += CodeProcessing(text, orgFontId, previousPenColor);
+				curCharCount += CodeProcessing(text, orgFontId, previousPenColor, false);
 				continue;
 			}
 			break;
@@ -258,7 +271,7 @@
 				break;
 			case 0x7C:
 				if (getSciVersion() >= SCI_VERSION_1_1) {
-					len -= CodeProcessing(text, orgFontId, 0);
+					len -= CodeProcessing(text, orgFontId, 0, false);
 					break;
 				}
 			default:
@@ -359,7 +372,7 @@
 			break;
 		case 0x7C:
 			if (getSciVersion() >= SCI_VERSION_1_1) {
-				len -= CodeProcessing(text, orgFontId, orgPenColor);
+				len -= CodeProcessing(text, orgFontId, orgPenColor, true);
 				break;
 			}
 		default:
@@ -408,6 +421,10 @@
 			doubleByteMode = true;
 	}
 
+	// Reset reference code rects
+	_codeRefRects.clear();
+	_codeRefTempRect.left = _codeRefTempRect.top = -1;
+
 	maxTextWidth = 0;
 	while (*text) {
 		charCount = GetLongest(text, rect.width(), fontId);
@@ -485,6 +502,30 @@
 	return false;
 }
 
+reg_t GfxText16::allocAndFillReferenceRectArray() {
+	uint rectCount = _codeRefRects.size();
+	if (rectCount) {
+		reg_t rectArray;
+		byte *rectArrayPtr = g_sci->getEngineState()->_segMan->allocDynmem(4 * 2 * (rectCount + 1), "text code reference rects", &rectArray);
+		GfxCoordAdjuster *coordAdjuster = g_sci->_gfxCoordAdjuster;
+		for (uint curRect = 0; curRect < rectCount; curRect++) {
+			coordAdjuster->kernelLocalToGlobal(_codeRefRects[curRect].left, _codeRefRects[curRect].top);
+			coordAdjuster->kernelLocalToGlobal(_codeRefRects[curRect].right, _codeRefRects[curRect].bottom);
+			WRITE_LE_UINT16(rectArrayPtr + 0, _codeRefRects[curRect].left);
+			WRITE_LE_UINT16(rectArrayPtr + 2, _codeRefRects[curRect].top);
+			WRITE_LE_UINT16(rectArrayPtr + 4, _codeRefRects[curRect].right);
+			WRITE_LE_UINT16(rectArrayPtr + 6, _codeRefRects[curRect].bottom);
+			rectArrayPtr += 8;
+		}
+		WRITE_LE_UINT16(rectArrayPtr + 0, 0x7777);
+		WRITE_LE_UINT16(rectArrayPtr + 2, 0x7777);
+		WRITE_LE_UINT16(rectArrayPtr + 4, 0x7777);
+		WRITE_LE_UINT16(rectArrayPtr + 6, 0x7777);
+		return rectArray;
+	}
+	return NULL_REG;
+}
+
 void GfxText16::kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) {
 	Common::Rect rect(0, 0, 0, 0);
 	Size(rect, text, font, maxWidth);

Modified: scummvm/trunk/engines/sci/graphics/text16.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/text16.h	2010-09-09 10:46:43 UTC (rev 52650)
+++ scummvm/trunk/engines/sci/graphics/text16.h	2010-09-09 10:52:17 UTC (rev 52651)
@@ -32,6 +32,8 @@
 #define SCI_TEXT16_ALIGNMENT_CENTER 1
 #define SCI_TEXT16_ALIGNMENT_LEFT	0
 
+typedef Common::Array<Common::Rect> CodeRefRectArray;
+
 class GfxPorts;
 class GfxPaint16;
 class GfxScreen;
@@ -48,7 +50,7 @@
 	GfxFont *GetFont();
 	void SetFont(GuiResourceId fontId);
 
-	int16 CodeProcessing(const char *&text, GuiResourceId orgFontId, int16 orgPenColor);
+	int16 CodeProcessing(const char *&text, GuiResourceId orgFontId, int16 orgPenColor, bool doingDrawing);
 
 	void ClearChar(int16 chr);
 
@@ -65,6 +67,8 @@
 
 	GfxFont *_font;
 
+	reg_t allocAndFillReferenceRectArray();
+
 	void kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight);
 	void kernelTextFonts(int argc, reg_t *argv);
 	void kernelTextColors(int argc, reg_t *argv);
@@ -83,6 +87,9 @@
 	GuiResourceId *_codeFonts;
 	int _codeColorsCount;
 	uint16 *_codeColors;
+
+	Common::Rect _codeRefTempRect;
+	CodeRefRectArray _codeRefRects;
 };
 
 } // End of namespace Sci


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list