diff options
Diffstat (limited to 'engines/sci/engine')
| -rw-r--r-- | engines/sci/engine/kernel.h | 3 | ||||
| -rw-r--r-- | engines/sci/engine/kernel_tables.h | 55 | ||||
| -rw-r--r-- | engines/sci/engine/kgraphics.cpp | 7 | ||||
| -rw-r--r-- | engines/sci/engine/kgraphics32.cpp | 58 | ||||
| -rw-r--r-- | engines/sci/engine/kstring.cpp | 13 | 
5 files changed, 87 insertions, 49 deletions
| diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 92916ecc68..3a6809aec1 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -499,6 +499,8 @@ reg_t kPalVaryMergeStart(EngineState *s, int argc, reg_t *argv);  // SCI2.1 Kernel Functions  reg_t kMorphOn(EngineState *s, int argc, reg_t *argv);  reg_t kText(EngineState *s, int argc, reg_t *argv); +reg_t kTextSize32(EngineState *s, int argc, reg_t *argv); +reg_t kTextWidth(EngineState *s, int argc, reg_t *argv);  reg_t kSave(EngineState *s, int argc, reg_t *argv);  reg_t kAutoSave(EngineState *s, int argc, reg_t *argv);  reg_t kList(EngineState *s, int argc, reg_t *argv); @@ -516,6 +518,7 @@ reg_t kGetSierraProfileInt(EngineState *s, int argc, reg_t *argv);  reg_t kCelInfo(EngineState *s, int argc, reg_t *argv);  reg_t kSetLanguage(EngineState *s, int argc, reg_t *argv);  reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv); +reg_t kSetFontHeight(EngineState *s, int argc, reg_t *argv);  reg_t kSetFontRes(EngineState *s, int argc, reg_t *argv);  reg_t kFont(EngineState *s, int argc, reg_t *argv);  reg_t kBitmap(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index fbd0b13c88..d3b2bfee54 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -60,15 +60,17 @@ struct SciKernelMapSubEntry {  #define SCI_SUBOPENTRY_TERMINATOR { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, NULL, NULL, NULL, NULL } -#define SIG_SCIALL          SCI_VERSION_NONE, SCI_VERSION_NONE -#define SIG_SCI0            SCI_VERSION_NONE, SCI_VERSION_01 -#define SIG_SCI1            SCI_VERSION_1_EGA_ONLY, SCI_VERSION_1_LATE -#define SIG_SCI11           SCI_VERSION_1_1, SCI_VERSION_1_1 -#define SIG_SINCE_SCI11     SCI_VERSION_1_1, SCI_VERSION_NONE -#define SIG_SCI21EARLY_ONLY SCI_VERSION_2_1_EARLY, SCI_VERSION_2_1_EARLY -#define SIG_SINCE_SCI21     SCI_VERSION_2_1_EARLY, SCI_VERSION_3 -#define SIG_UNTIL_SCI21MID  SCI_VERSION_2, SCI_VERSION_2_1_MIDDLE -#define SIG_SINCE_SCI21LATE SCI_VERSION_2_1_LATE, SCI_VERSION_3 +#define SIG_SCIALL           SCI_VERSION_NONE, SCI_VERSION_NONE +#define SIG_SCI0             SCI_VERSION_NONE, SCI_VERSION_01 +#define SIG_SCI1             SCI_VERSION_1_EGA_ONLY, SCI_VERSION_1_LATE +#define SIG_SCI11            SCI_VERSION_1_1, SCI_VERSION_1_1 +#define SIG_SINCE_SCI11      SCI_VERSION_1_1, SCI_VERSION_NONE +#define SIG_SCI21EARLY       SCI_VERSION_2_1_EARLY, SCI_VERSION_2_1_EARLY +#define SIG_UNTIL_SCI21EARLY SCI_VERSION_2, SCI_VERSION_2_1_EARLY +#define SIG_UNTIL_SCI21MID   SCI_VERSION_2, SCI_VERSION_2_1_MIDDLE +#define SIG_SINCE_SCI21      SCI_VERSION_2_1_EARLY, SCI_VERSION_3 +#define SIG_SINCE_SCI21MID   SCI_VERSION_2_1_MIDDLE, SCI_VERSION_3 +#define SIG_SINCE_SCI21LATE  SCI_VERSION_2_1_LATE, SCI_VERSION_3  #define SIG_SCI16          SCI_VERSION_NONE, SCI_VERSION_1_1  #define SIG_SCI32          SCI_VERSION_2, SCI_VERSION_NONE @@ -284,6 +286,20 @@ static const SciKernelMapSubEntry kSave_subops[] = {  };  //    version,         subId, function-mapping,                    signature,              workarounds +static const SciKernelMapSubEntry kFont_subops[] = { +	{ SIG_SINCE_SCI21MID,  0, MAP_CALL(SetFontHeight),             "i",                    NULL }, +	{ SIG_SINCE_SCI21MID,  1, MAP_CALL(SetFontRes),                "ii",                   NULL }, +	SCI_SUBOPENTRY_TERMINATOR +}; + +//    version,         subId, function-mapping,                    signature,              workarounds +static const SciKernelMapSubEntry kText_subops[] = { +	{ SIG_SINCE_SCI21MID,  0, MAP_CALL(TextSize32),                "r[r0]i(i)(i)",         NULL }, +	{ SIG_SINCE_SCI21MID,  1, MAP_CALL(TextWidth),                 "ri",                   NULL }, +	SCI_SUBOPENTRY_TERMINATOR +}; + +//    version,         subId, function-mapping,                    signature,              workarounds  static const SciKernelMapSubEntry kList_subops[] = {  	{ SIG_SINCE_SCI21,     0, MAP_CALL(NewList),                   "",                     NULL },  	{ SIG_SINCE_SCI21,     1, MAP_CALL(DisposeList),               "l",                    NULL }, @@ -546,10 +562,10 @@ static SciKernelMapEntry s_kernelMap[] = {  	{ MAP_CALL(StrEnd),            SIG_EVERYWHERE,           "r",                     NULL,            NULL },  	{ MAP_CALL(StrLen),            SIG_EVERYWHERE,           "[r0]",                  NULL,            kStrLen_workarounds },  	{ MAP_CALL(StrSplit),          SIG_EVERYWHERE,           "rr[r0]",                NULL,            NULL }, -	{ MAP_CALL(TextColors),        SIG_EVERYWHERE,           "(i*)",                  NULL,            NULL }, -	{ MAP_CALL(TextFonts),         SIG_EVERYWHERE,           "(i*)",                  NULL,            NULL }, -	{ MAP_CALL(TextSize),          SIG_SCIALL, SIGFOR_MAC,   "r[r0]i(i)(r0)(i)",      NULL,            NULL }, -	{ MAP_CALL(TextSize),          SIG_EVERYWHERE,           "r[r0]i(i)(r0)",         NULL,            NULL }, +	{ MAP_CALL(TextColors),        SIG_SCI16, SIGFOR_ALL,    "(i*)",                  NULL,            NULL }, +	{ MAP_CALL(TextFonts),         SIG_SCI16, SIGFOR_ALL,    "(i*)",                  NULL,            NULL }, +	{ MAP_CALL(TextSize),          SIG_SCI16, SIGFOR_MAC,    "r[r0]i(i)(r0)(i)",      NULL,            NULL }, +	{ MAP_CALL(TextSize),          SIG_SCI16, SIGFOR_ALL,    "r[r0]i(i)(r0)",         NULL,            NULL },  	{ MAP_CALL(TimesCos),          SIG_EVERYWHERE,           "ii",                    NULL,            NULL },  	{ "CosMult", kTimesCos,        SIG_EVERYWHERE,           "ii",                    NULL,            NULL },  	{ MAP_CALL(TimesCot),          SIG_EVERYWHERE,           "ii",                    NULL,            NULL }, @@ -581,6 +597,10 @@ static SciKernelMapEntry s_kernelMap[] = {  #ifdef ENABLE_SCI32  	// SCI2 Kernel Functions  	// TODO: whoever knows his way through those calls, fix the signatures. +	{ "TextSize", kTextSize32,     SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "r[r0]i(i)",     NULL,            NULL }, +	{ MAP_DUMMY(TextColors),       SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "(.*)",          NULL,            NULL }, +	{ MAP_DUMMY(TextFonts),        SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "(.*)",          NULL,            NULL }, +  	{ MAP_CALL(AddPlane),          SIG_EVERYWHERE,           "o",                     NULL,            NULL },  	{ MAP_CALL(AddScreenItem),     SIG_EVERYWHERE,           "o",                     NULL,            NULL },  	{ MAP_CALL(Array),             SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL }, @@ -651,7 +671,7 @@ static SciKernelMapEntry s_kernelMap[] = {  	{ MAP_DUMMY(ShowStylePercent), SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },  	{ MAP_DUMMY(InvertRect),       SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },  	{ MAP_DUMMY(InputText),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL }, -	{ MAP_DUMMY(TextWidth),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL }, +	{ MAP_CALL(TextWidth),         SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "ri",            NULL,            NULL },  	{ MAP_DUMMY(PointSize),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },  	// SCI2.1 Kernel Functions @@ -662,7 +682,7 @@ static SciKernelMapEntry s_kernelMap[] = {  	{ MAP_CALL(PlayVMD),           SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },  	{ MAP_CALL(Robot),             SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },  	{ MAP_CALL(Save),              SIG_EVERYWHERE,           "i(.*)",                 kSave_subops,    NULL }, -	{ MAP_CALL(Text),              SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL }, +	{ MAP_CALL(Text),              SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)",           kText_subops,    NULL },  	{ MAP_CALL(AddPicAt),          SIG_EVERYWHERE,           "oiii",                  NULL,            NULL },  	{ MAP_CALL(GetWindowsOption),  SIG_EVERYWHERE,           "i",                     NULL,            NULL },  	{ MAP_CALL(WinHelp),           SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL }, @@ -671,8 +691,8 @@ static SciKernelMapEntry s_kernelMap[] = {  	{ MAP_CALL(CelInfo),           SIG_EVERYWHERE,           "iiiiii",                NULL,            NULL },  	{ MAP_CALL(SetLanguage),       SIG_EVERYWHERE,           "r",                     NULL,            NULL },  	{ MAP_CALL(ScrollWindow),      SIG_EVERYWHERE,           "i(.*)",                 kScrollWindow_subops, NULL }, -	{ MAP_CALL(SetFontRes),        SIG_SCI21EARLY_ONLY, SIGFOR_ALL, "ii",             NULL,            NULL }, -	{ MAP_CALL(Font),              SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL }, +	{ MAP_CALL(SetFontRes),        SIG_SCI21EARLY, SIGFOR_ALL, "ii",                  NULL,            NULL }, +	{ MAP_CALL(Font),              SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)",           kFont_subops,    NULL },  	{ MAP_CALL(Bitmap),            SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },  	{ MAP_CALL(AddLine),           SIG_EVERYWHERE,           "oiiiiiiiii",            NULL,            NULL },  	{ MAP_CALL(UpdateLine),        SIG_EVERYWHERE,           "[r0]oiiiiiiiii",        NULL,            NULL }, @@ -1030,7 +1050,6 @@ static const char *const sci2_default_knames[] = {  	/*0x89*/ "TextWidth",		  // for debugging(?), only in SCI2, not used in any SCI2 game  	/*0x8a*/ "PointSize",	      // for debugging(?), only in SCI2, not used in any SCI2 game -	// GK2 Demo (and similar) only kernel functions  	/*0x8b*/ "AddLine",  	/*0x8c*/ "DeleteLine",  	/*0x8d*/ "UpdateLine", diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 91d241fb79..c0a3be4c11 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -359,12 +359,7 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) {  	uint16 languageSplitter = 0;  	Common::String splitText = g_sci->strSplitLanguage(text.c_str(), &languageSplitter, sep); -#ifdef ENABLE_SCI32 -	if (g_sci->_gfxText32) -		g_sci->_gfxText32->kernelTextSize(splitText.c_str(), font_nr, maxwidth, &textWidth, &textHeight); -	else -#endif -		g_sci->_gfxText16->kernelTextSize(splitText.c_str(), languageSplitter, font_nr, maxwidth, &textWidth, &textHeight); +	g_sci->_gfxText16->kernelTextSize(splitText.c_str(), languageSplitter, font_nr, maxwidth, &textWidth, &textHeight);  	// One of the game texts in LB2 German contains loads of spaces in  	// its end. We trim the text here, otherwise the graphics code will diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 4d48ae4e99..706edc87c6 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -197,7 +197,7 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) {  	if (subop == 0) {  		TextAlign alignment = (TextAlign)readSelectorValue(segMan, object, SELECTOR(mode));  		reg_t out; -		return g_sci->_gfxText32->createFontBitmap(width, height, rect, text, foreColor, backColor, skipColor, fontId, alignment, borderColor, dimmed, 1, &out); +		return g_sci->_gfxText32->createFontBitmap(width, height, rect, text, foreColor, backColor, skipColor, fontId, alignment, borderColor, dimmed, true, &out);  	} else {  		CelInfo32 celInfo;  		celInfo.type = kCelTypeView; @@ -214,6 +214,35 @@ reg_t kDisposeTextBitmap(EngineState *s, int argc, reg_t *argv) {  	return s->r_acc;  } +reg_t kText(EngineState *s, int argc, reg_t *argv) { +	if (!s) +		return make_reg(0, getSciVersion()); +	error("not supposed to call this"); +} + +reg_t kTextSize32(EngineState *s, int argc, reg_t *argv) { +	g_sci->_gfxText32->setFont(argv[2].toUint16()); + +	reg_t *rect = s->_segMan->derefRegPtr(argv[0], 4); + +	Common::String text = s->_segMan->getString(argv[1]); +	int16 maxWidth = argc > 3 ? argv[3].toSint16() : 0; +	bool doScaling = argc > 4 ? argv[4].toSint16() : true; + +	Common::Rect textRect = g_sci->_gfxText32->getTextSize(text, maxWidth, doScaling); +	rect[0] = make_reg(0, textRect.left); +	rect[1] = make_reg(0, textRect.top); +	rect[2] = make_reg(0, textRect.right - 1); +	rect[3] = make_reg(0, textRect.bottom - 1); +	return NULL_REG; +} + +reg_t kTextWidth(EngineState *s, int argc, reg_t *argv) { +	g_sci->_gfxText32->setFont(argv[1].toUint16()); +	Common::String text = s->_segMan->getString(argv[0]); +	return make_reg(0, g_sci->_gfxText32->getStringWidth(text)); +} +  reg_t kWinHelp(EngineState *s, int argc, reg_t *argv) {  	switch (argv[0].toUint16()) {  	case 1: @@ -454,18 +483,18 @@ reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) {  #endif  reg_t kFont(EngineState *s, int argc, reg_t *argv) { -	// TODO: Handle font settings for SCI2.1 - -	switch (argv[0].toUint16()) { -	case 1: -		g_sci->_gfxText32->_scaledWidth = argv[1].toUint16(); -		g_sci->_gfxText32->_scaledHeight = argv[2].toUint16(); -		return NULL_REG; -	default: -		error("kFont: unknown subop %d", argv[0].toUint16()); -	} +	if (!s) +		return make_reg(0, getSciVersion()); +	error("not supposed to call this"); +} -	return s->r_acc; +reg_t kSetFontHeight(EngineState *s, int argc, reg_t *argv) { +	// TODO: Setting font may have just been for side effect +	// of setting the fontHeight on the font manager, in +	// which case we could just get the font directly ourselves. +	g_sci->_gfxText32->setFont(argv[0].toUint16()); +	g_sci->_gfxText32->_scaledHeight = (g_sci->_gfxText32->_font->getHeight() * g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight + g_sci->_gfxText32->_scaledHeight - 1) / g_sci->_gfxText32->_scaledHeight; +	return NULL_REG;  }  reg_t kSetFontRes(EngineState *s, int argc, reg_t *argv) { @@ -563,6 +592,10 @@ reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {  		break;  	case 4:	// add text to bitmap  		{ +			warning("kBitmap(4)"); +			return NULL_REG; +		} +#if 0  		// 13 params, called e.g. from TextButton::createBitmap() in Torin's Passage,  		// script 64894  		reg_t hunkId = argv[1];	// obtained from kBitmap(0) @@ -613,6 +646,7 @@ reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {  		}  		break; +#endif  	case 5:	// fill with color  		{  		// 6 params, called e.g. from TextView::init() and TextView::draw() diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 310e38dbd1..f598cf7457 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -661,19 +661,6 @@ reg_t kStrSplit(EngineState *s, int argc, reg_t *argv) {  #ifdef ENABLE_SCI32 -reg_t kText(EngineState *s, int argc, reg_t *argv) { -	switch (argv[0].toUint16()) { -	case 0: -		return kTextSize(s, argc - 1, argv + 1); -	default: -		// TODO: Other subops here too, perhaps kTextColors and kTextFonts -		warning("kText(%d)", argv[0].toUint16()); -		break; -	} - -	return s->r_acc; -} -  // TODO: there is an unused second argument, happens at least in LSL6 right during the intro  reg_t kStringNew(EngineState *s, int argc, reg_t *argv) {  	reg_t stringHandle; | 
