diff options
author | David Turner | 2012-09-06 20:00:00 -0700 |
---|---|---|
committer | David Turner | 2012-09-06 20:00:00 -0700 |
commit | 8f9b81104f061625531da29e80ce208370b44551 (patch) | |
tree | 7cc8f7d821c55111631f1ea115ad7e8130c4347f /engines/cine | |
parent | 74d521485f27116436f4c93aba586d18b0f4d60d (diff) | |
parent | 855a0d331fa7d0ba8745c43e0e2311717987e33d (diff) | |
download | scummvm-rg350-8f9b81104f061625531da29e80ce208370b44551.tar.gz scummvm-rg350-8f9b81104f061625531da29e80ce208370b44551.tar.bz2 scummvm-rg350-8f9b81104f061625531da29e80ce208370b44551.zip |
Merge pull request #277 from lordhoto/cine-amiga-menu
Improvements for Cine's selection menu.
Diffstat (limited to 'engines/cine')
-rw-r--r-- | engines/cine/gfx.cpp | 60 | ||||
-rw-r--r-- | engines/cine/gfx.h | 1 |
2 files changed, 53 insertions, 8 deletions
diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index 7a988227f6..6e313ab224 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -471,6 +471,41 @@ int FWRenderer::drawChar(char character, int x, int y) { return x; } +/** + * Clears the character glyph to black + * This function is called "undrawChar", because the original only applies + * this drawing after the original glyph has been drawn. + * Possible TODO: Find a better name. + * @param character Character to undraw + * @param x Character coordinate + * @param y Character coordinate + */ +int FWRenderer::undrawChar(char character, int x, int y) { + int width, idx; + + if (character == ' ') { + x += 5; + } else if ((width = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterWidth)) { + idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx; + const byte *sprite = g_cine->_textHandler.textTable[idx][FONT_DATA]; + for (uint i = 0; i < FONT_HEIGHT; ++i) { + byte *dst = _backBuffer + (y + i) * 320 + x; + for (uint j = 0; j < FONT_WIDTH; ++j, ++dst) { + // The original does this based on whether bit 1 of the pixel + // is set. Since that's the only bit ever set in (FW) this + // check should be fine. + // TODO: Check how Operation Stealth Amiga works + if (*sprite++) { + *dst = 0; + } + } + } + x += width + 1; + } + + return x; +} + int FWRenderer::getStringWidth(const char *str) { const char *p = str; int width = 0; @@ -969,20 +1004,29 @@ void SelectionMenu::drawMenu(FWRenderer &r, bool top) { charX = x + 4; if (i == _selection) { + int color; + if (isAmiga) { - // The original Amiga version is using a different highlight color here, - // but with our current code it is not possible to change the text color, - // thus we can not use the Amiga's color, since otherwise the text - // wouldn't be visible anymore. - r.drawPlainBox(charX, lineY, _width - 8, FONT_HEIGHT, top ? r._messageBg/*2*/ : 18); + if (top) { + color = 2; + } else { + color = 18; + } } else { - r.drawPlainBox(charX, lineY, _width - 8, 9, 0); + color = 0; } + + r.drawPlainBox(x + 2, lineY - 1, _width - 3, 9, color); } const int size = _elements[i].size(); - for (int j = 0; j < size; ++j) - charX = r.drawChar(_elements[i][j], charX, lineY); + for (int j = 0; j < size; ++j) { + if (isAmiga && i == _selection) { + charX = r.undrawChar(_elements[i][j], charX, lineY); + } else { + charX = r.drawChar(_elements[i][j], charX, lineY); + } + } } } diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h index 3434cf9fc2..10bf27312c 100644 --- a/engines/cine/gfx.h +++ b/engines/cine/gfx.h @@ -152,6 +152,7 @@ protected: void drawBorder(int x, int y, int width, int height, byte color); void drawDoubleBorder(int x, int y, int width, int height, byte color); virtual int drawChar(char character, int x, int y); + virtual int undrawChar(char character, int x, int y); void drawLine(int x, int y, int width, int height, byte color); void remaskSprite(byte *mask, Common::List<overlay>::iterator it); virtual void drawBackground(); |