void Draw::printTextCentered(int16 id, int16 left, int16 top, int16 right, int16 bottom, const char *str, int16 fontIndex, int16 color) { adjustCoords(1, &left, &top); adjustCoords(1, &right, &bottom); uint16 centerOffset = _vm->_game->_script->getFunctionOffset(TOTFile::kFunctionCenter); if (centerOffset != 0) { _vm->_game->_script->call(centerOffset); WRITE_VAR(17, (uint32) id); WRITE_VAR(18, (uint32) left); WRITE_VAR(19, (uint32) top); WRITE_VAR(20, (uint32) (right - left + 1)); WRITE_VAR(21, (uint32) (bottom - top + 1)); _vm->_inter->funcBlock(0); _vm->_game->_script->pop(); } if (str[0] == '\0') return; if (fontIndex >= kFontCount) { warning("Draw::printTextCentered(): Font %d > Count %d", fontIndex, kFontCount); return; } if (!_fonts[fontIndex]) return; _transparency = 1; _destSpriteX = left; _destSpriteY = top; _fontIndex = fontIndex; _frontColor = color; _textToPrint = str; Font &font = *_fonts[fontIndex]; int16 width = 0; if (!font.isMonospaced()) { const char *s = str; while (*s != '\0') width += font.getCharWidth(*s++); } else width = strlen(str) * font.getCharWidth(); adjustCoords(1, &width, 0); _destSpriteX += (right - left + 1 - width) / 2; spriteOperation(DRAW_PRINTTEXT); }
void Draw_v1::printTotText(int16 id) { byte *dataPtr; byte *ptr, *ptrEnd; byte cmd; int16 destX, destY; int16 val; int16 savedFlags; int16 destSpriteX; int16 spriteRight, spriteBottom; char buf[20]; _vm->_sound->cdPlayMultMusic(); TextItem *textItem = _vm->_game->_resources->getTextItem(id); if (!textItem) return; dataPtr = textItem->getData(); ptr = dataPtr; destX = READ_LE_UINT16(ptr) & 0x7FFF; destY = READ_LE_UINT16(ptr + 2); spriteRight = READ_LE_UINT16(ptr + 4); spriteBottom = READ_LE_UINT16(ptr + 6); ptr += 8; if (_renderFlags & RENDERFLAG_CAPTUREPUSH) { _vm->_game->capturePush(destX, destY, spriteRight - destX + 1, spriteBottom - destY + 1); (*_vm->_scenery->_pCaptureCounter)++; } _destSpriteX = destX; _destSpriteY = destY; _spriteRight = spriteRight; _spriteBottom = spriteBottom; _destSurface = kBackSurface; _backColor = *ptr++; _transparency = 1; spriteOperation(DRAW_CLEARRECT); _backColor = 0; savedFlags = _renderFlags; _renderFlags &= ~RENDERFLAG_NOINVALIDATE; while ((_destSpriteX = READ_LE_UINT16(ptr)) != -1) { _destSpriteX += destX; _destSpriteY = READ_LE_UINT16(ptr + 2) + destY; _spriteRight = READ_LE_UINT16(ptr + 4) + destX; _spriteBottom = READ_LE_UINT16(ptr + 6) + destY; ptr += 8; cmd = *ptr++; switch ((cmd & 0xF0) >> 4) { case 0: _frontColor = cmd & 0xF; spriteOperation(DRAW_DRAWLINE); break; case 1: _frontColor = cmd & 0xF; spriteOperation(DRAW_DRAWBAR); break; case 2: _backColor = cmd & 0xF; spriteOperation(DRAW_FILLRECTABS); break; } } ptr += 2; for (ptrEnd = ptr; *ptrEnd != 1; ptrEnd++) { if (*ptrEnd == 3) ptrEnd++; if (*ptrEnd == 2) ptrEnd += 4; } ptrEnd++; while (*ptr != 1) { cmd = *ptr; if (cmd == 3) { ptr++; _fontIndex = (*ptr & 0xF0) >> 4; _frontColor = *ptr & 0xF; ptr++; continue; } else if (cmd == 2) {
void Draw::oPlaytoons_sub_F_1B(uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 fontIndex, int16 var4, int16 shortId) { int16 width; char tmpStr[128]; strcpy(tmpStr, paramStr); adjustCoords(1, &left, &top); adjustCoords(1, &right, &bottom); uint16 centerOffset = _vm->_game->_script->getFunctionOffset(TOTFile::kFunctionCenter); if (centerOffset != 0) { _vm->_game->_script->call(centerOffset); WRITE_VAR(17, (uint32) id & 0x7FFF); WRITE_VAR(18, (uint32) left); WRITE_VAR(19, (uint32) top); WRITE_VAR(20, (uint32) (right - left + 1)); WRITE_VAR(21, (uint32) (bottom - top + 1)); if (_vm->_game->_script->peekUint16(41) >= '4') { WRITE_VAR(22, (uint32) fontIndex); WRITE_VAR(23, (uint32) var4); if (id & 0x8000) WRITE_VAR(24, (uint32) 1); else WRITE_VAR(24, (uint32) 0); WRITE_VAR(25, (uint32) shortId); if (_hotspotText) Common::strlcpy(_hotspotText, paramStr, 40); } _vm->_inter->funcBlock(0); _vm->_game->_script->pop(); } strcpy(paramStr, tmpStr); if (fontIndex >= kFontCount) { warning("Draw::oPlaytoons_sub_F_1B(): Font %d > Count %d", fontIndex, kFontCount); return; } if (!_fonts[fontIndex]) return; if (*paramStr) { _transparency = 1; _fontIndex = fontIndex; _frontColor = var4; if (_vm->_game->_script->peekUint16(41) >= '4' && strchr(paramStr, 92)) { char str[80]; char *str2; int16 strLen= 0; int16 offY, deltaY; str2 = paramStr; do { strLen++; str2++; str2 = strchr(str2, 92); } while (str2); deltaY = (bottom - right + 1 - (strLen * _fonts[fontIndex]->getCharHeight())) / (strLen + 1); offY = right + deltaY; for (int i = 0; paramStr[i]; i++) { int j = 0; while (paramStr[i] && paramStr[i] != 92) str[j++] = paramStr[i++]; str[j] = 0; _destSpriteX = left; _destSpriteY = offY; _textToPrint = str; width = stringLength(str, fontIndex); adjustCoords(1, &width, NULL); _destSpriteX += (top - left + 1 - width) / 2; spriteOperation(DRAW_PRINTTEXT); offY += deltaY + _fonts[fontIndex]->getCharHeight(); } } else { _destSpriteX = left; if (_vm->_game->_script->peekUint16(41) >= '4') _destSpriteY = right + (bottom - right + 1 - _fonts[fontIndex]->getCharHeight()) / 2; else _destSpriteY = right; _textToPrint = paramStr; width = stringLength(paramStr, fontIndex); adjustCoords(1, &width, NULL); _destSpriteX += (top - left + 1 - width) / 2; spriteOperation(DRAW_PRINTTEXT); } } return; }