[Scummvm-cvs-logs] SF.net SVN: scummvm: [30360] scummvm/trunk/engines/parallaction
peres001 at users.sourceforge.net
peres001 at users.sourceforge.net
Wed Jan 9 22:46:57 CET 2008
Revision: 30360
http://scummvm.svn.sourceforge.net/scummvm/?rev=30360&view=rev
Author: peres001
Date: 2008-01-09 13:46:57 -0800 (Wed, 09 Jan 2008)
Log Message:
-----------
Replaced the remaining old string code with the new label code. All the text is now drawn in the framebuffer instead of being blitted onto the internal game screen buffer.
Modified Paths:
--------------
scummvm/trunk/engines/parallaction/callables_ns.cpp
scummvm/trunk/engines/parallaction/graphics.cpp
scummvm/trunk/engines/parallaction/graphics.h
scummvm/trunk/engines/parallaction/gui_ns.cpp
scummvm/trunk/engines/parallaction/objects.cpp
scummvm/trunk/engines/parallaction/objects.h
scummvm/trunk/engines/parallaction/parallaction.cpp
scummvm/trunk/engines/parallaction/parallaction_ns.cpp
Modified: scummvm/trunk/engines/parallaction/callables_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/callables_ns.cpp 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/callables_ns.cpp 2008-01-09 21:46:57 UTC (rev 30360)
@@ -384,42 +384,36 @@
void Parallaction_ns::_c_finito(void *parm) {
- const char **v8C = endMsg0;
- const char **v7C = endMsg1;
- const char **v6C = endMsg2;
- const char **v5C = endMsg3;
- const char **v4C = endMsg4;
- const char **v3C = endMsg5;
- const char **v2C = endMsg6;
- const char **v1C = endMsg7;
-
setPartComplete(_char);
cleanInventory();
_gfx->setPalette(_gfx->_palette);
- _gfx->setFont(_menuFont);
- _gfx->setFontShadow(true);
+ uint id[4];
if (allPartsComplete()) {
- _gfx->displayCenteredString(70, v4C[_language]);
- _gfx->displayCenteredString(100, v3C[_language]);
- _gfx->displayCenteredString(130, v2C[_language]);
- _gfx->displayCenteredString(160, v1C[_language]);
+ id[0] = _gfx->createLabel(_menuFont, endMsg4[_language], 1);
+ id[1] = _gfx->createLabel(_menuFont, endMsg5[_language], 1);
+ id[2] = _gfx->createLabel(_menuFont, endMsg6[_language], 1);
+ id[3] = _gfx->createLabel(_menuFont, endMsg7[_language], 1);
+ } else {
+ id[0] = _gfx->createLabel(_menuFont, endMsg0[_language], 1);
+ id[1] = _gfx->createLabel(_menuFont, endMsg1[_language], 1);
+ id[2] = _gfx->createLabel(_menuFont, endMsg2[_language], 1);
+ id[3] = _gfx->createLabel(_menuFont, endMsg3[_language], 1);
+ }
- _gfx->updateScreen();
- waitUntilLeftClick();
+ _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 70);
+ _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 100);
+ _gfx->showLabel(id[2], CENTER_LABEL_HORIZONTAL, 130);
+ _gfx->showLabel(id[3], CENTER_LABEL_HORIZONTAL, 160);
+ waitUntilLeftClick();
+ _gfx->freeLabels();
+
+ if (allPartsComplete()) {
scheduleLocationSwitch("estgrotta.drki");
} else {
- _gfx->displayCenteredString(70, v8C[_language]);
- _gfx->displayCenteredString(100, v7C[_language]);
- _gfx->displayCenteredString(130, v6C[_language]);
- _gfx->displayCenteredString(160, v5C[_language]);
-
- _gfx->updateScreen();
- waitUntilLeftClick();
-
selectStartLocation();
}
@@ -439,15 +433,13 @@
_disk->selectArchive("disk1");
parseLocation("common");
- _gfx->setFont(_menuFont);
- _gfx->setFontShadow(true);
+ uint id[2];
+ id[0] = _gfx->createLabel(_menuFont, _slideText[0], 1);
+ id[1] = _gfx->createLabel(_menuFont, _slideText[1], 1);
- _gfx->displayCenteredString(38, _slideText[0]);
- _gfx->displayCenteredString(58, _slideText[1]);
+ _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 38);
+ _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 58);
- _gfx->copyScreen(Gfx::kBitFront, Gfx::kBitBack);
- _gfx->copyScreen(Gfx::kBitFront, Gfx::kBit2);
-
return;
}
@@ -485,15 +477,16 @@
void Parallaction_ns::_c_endIntro(void *parm) {
- _gfx->setFont(_menuFont);
- _gfx->setFontShadow(true);
-
debugC(1, kDebugExec, "endIntro()");
+ uint id[2];
for (uint16 _si = 0; _si < 6; _si++) {
- _gfx->displayCenteredString(80, _credits[_si]._role);
- _gfx->displayCenteredString(100, _credits[_si]._name);
+ id[0] = _gfx->createLabel(_menuFont, _credits[_si]._role, 1);
+ id[1] = _gfx->createLabel(_menuFont, _credits[_si]._name, 1);
+ _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 80);
+ _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 100);
+
_gfx->updateScreen();
for (uint16 v2 = 0; v2 < 100; v2++) {
@@ -505,18 +498,21 @@
waitTime( 1 );
}
- _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront);
+ _gfx->freeLabels();
}
debugC(1, kDebugExec, "endIntro(): done showing credits");
_soundMan->stopMusic();
if ((getFeatures() & GF_DEMO) == 0) {
- _gfx->displayCenteredString(80, "CLICK MOUSE BUTTON TO START");
- _gfx->updateScreen();
+ id[0] = _gfx->createLabel(_menuFont, "CLICK MOUSE BUTTON TO START", 1);
+ _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 80);
+
waitUntilLeftClick();
+ _gfx->freeLabels();
+
_engineFlags &= ~kEngineBlockInput;
selectStartLocation();
Modified: scummvm/trunk/engines/parallaction/graphics.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/graphics.cpp 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/graphics.cpp 2008-01-09 21:46:57 UTC (rev 30360)
@@ -360,7 +360,7 @@
drawItems();
drawBalloons();
- drawLabel();
+ drawLabels();
g_system->updateScreen();
return;
@@ -541,17 +541,82 @@
return label;
}
+uint Gfx::createLabel(Font *font, const char *text, byte color) {
+ assert(_numLabels < MAX_NUM_LABELS);
-void Gfx::setLabel(Label *label) {
- _label = label;
+ Label *label = new Label;
+ Graphics::Surface *cnv = &label->_cnv;
- if (_label) {
- _label->resetPosition();
+ uint w, h;
+
+ if (_vm->getPlatform() == Common::kPlatformAmiga) {
+ w = font->getStringWidth(text) + 2;
+ h = font->height() + 2;
+
+ cnv->create(w, h, 1);
+ cnv->fillRect(Common::Rect(w,h), LABEL_TRANSPARENT_COLOR);
+
+ font->setColor(0);
+ font->drawString((byte*)cnv->getBasePtr(0, 2), cnv->pitch, text);
+ font->setColor(color);
+ font->drawString((byte*)cnv->getBasePtr(2, 0), cnv->pitch, text);
+ } else {
+ w = font->getStringWidth(text);
+ h = font->height();
+
+ cnv->create(w, h, 1);
+ cnv->fillRect(Common::Rect(w,h), LABEL_TRANSPARENT_COLOR);
+
+ font->setColor(color);
+ font->drawString((byte*)cnv->getBasePtr(0, 0), cnv->pitch, text);
}
+
+ uint id = _numLabels;
+ _labels[id] = label;
+ _numLabels++;
+
+ return id;
}
-void Gfx::drawLabel() {
- if (!_label) {
+void Gfx::showLabel(uint id, int16 x, int16 y) {
+ assert(id < _numLabels);
+ _labels[id]->_visible = true;
+
+ if (x == CENTER_LABEL_HORIZONTAL) {
+ x = CLIP<int16>((_vm->_screenWidth - _labels[id]->_cnv.w) / 2, 0, _vm->_screenWidth/2);
+ }
+
+ if (y == CENTER_LABEL_VERTICAL) {
+ y = CLIP<int16>((_vm->_screenHeight - _labels[id]->_cnv.h) / 2, 0, _vm->_screenHeight/2);
+ }
+
+ _labels[id]->_pos.x = x;
+ _labels[id]->_pos.y = y;
+}
+
+void Gfx::hideLabel(uint id) {
+ assert(id < _numLabels);
+ _labels[id]->_visible = false;
+}
+
+void Gfx::freeLabels() {
+ for (uint i = 0; i < _numLabels; i++) {
+ delete _labels[i];
+ }
+ _numLabels = 0;
+}
+
+
+void Gfx::setFloatingLabel(Label *label) {
+ _floatingLabel = label;
+
+ if (_floatingLabel) {
+ _floatingLabel->resetPosition();
+ }
+}
+
+void Gfx::updateFloatingLabel() {
+ if (!_floatingLabel) {
return;
}
@@ -561,31 +626,68 @@
_vm->getCursorPos(cursor);
if (_vm->_activeItem._id != 0) {
- _si = cursor.x + 16 - _label->_cnv.w/2;
+ _si = cursor.x + 16 - _floatingLabel->_cnv.w/2;
_di = cursor.y + 34;
} else {
- _si = cursor.x + 8 - _label->_cnv.w/2;
+ _si = cursor.x + 8 - _floatingLabel->_cnv.w/2;
_di = cursor.y + 21;
}
if (_si < 0) _si = 0;
if (_di > 190) _di = 190;
- if (_label->_cnv.w + _si > _vm->_screenWidth)
- _si = _vm->_screenWidth - _label->_cnv.w;
+ if (_floatingLabel->_cnv.w + _si > _vm->_screenWidth)
+ _si = _vm->_screenWidth - _floatingLabel->_cnv.w;
- _label->_pos.x = _si;
- _label->_pos.y = _di;
+ _floatingLabel->_pos.x = _si;
+ _floatingLabel->_pos.y = _di;
+}
- Common::Rect r(_label->_cnv.w, _label->_cnv.h);
- r.moveTo(_label->_pos);
+void Gfx::drawLabels() {
+ if ((!_floatingLabel) && (_numLabels == 0)) {
+ return;
+ }
+ updateFloatingLabel();
Graphics::Surface* surf = g_system->lockScreen();
- flatBlit(r, (byte*)_label->_cnv.getBasePtr(0, 0), surf, LABEL_TRANSPARENT_COLOR);
+
+ for (uint i = 0; i < _numLabels; i++) {
+ if (_labels[i]->_visible) {
+ Common::Rect r(_labels[i]->_cnv.w, _labels[i]->_cnv.h);
+ r.moveTo(_labels[i]->_pos);
+ flatBlit(r, (byte*)_labels[i]->_cnv.getBasePtr(0, 0), surf, LABEL_TRANSPARENT_COLOR);
+ }
+ }
+
+ if (_floatingLabel) {
+ Common::Rect r(_floatingLabel->_cnv.w, _floatingLabel->_cnv.h);
+ r.moveTo(_floatingLabel->_pos);
+ flatBlit(r, (byte*)_floatingLabel->_cnv.getBasePtr(0, 0), surf, LABEL_TRANSPARENT_COLOR);
+ }
+
g_system->unlockScreen();
}
+Label::Label() {
+ resetPosition();
+ _visible = false;
+}
+Label::~Label() {
+ free();
+}
+
+void Label::free() {
+ _cnv.free();
+ resetPosition();
+}
+
+void Label::resetPosition() {
+ _pos.x = -1000;
+ _pos.y = -1000;
+}
+
+
//
// Cnv management
//
@@ -701,25 +803,6 @@
-void Gfx::displayString(uint16 x, uint16 y, const char *text, byte color) {
- byte *dst = (byte*)_buffers[kBitFront]->getBasePtr(x, y);
- if (_fontShadow) {
- dst = (byte*)_buffers[kBitFront]->getBasePtr(x-2, y+2);
- _font->setColor(0);
- _font->drawString(dst, _vm->_screenWidth, text);
- }
-
- dst = (byte*)_buffers[kBitFront]->getBasePtr(x, y);
- _font->setColor(color);
- _font->drawString(dst, _vm->_screenWidth, text);
-}
-
-void Gfx::displayCenteredString(uint16 y, const char *text) {
- uint16 x = (_vm->_screenWidth - getStringWidth(text)) / 2;
- displayString(x, y, text, 1);
-}
-
-
uint16 Gfx::getStringWidth(const char *text) {
return _font->getStringWidth(text);
}
@@ -865,7 +948,8 @@
_numBalloons = 0;
_numItems = 0;
- _label = 0;
+ _numLabels = 0;
+ _floatingLabel = 0;
_screenX = 0;
_screenY = 0;
Modified: scummvm/trunk/engines/parallaction/graphics.h
===================================================================
--- scummvm/trunk/engines/parallaction/graphics.h 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/graphics.h 2008-01-09 21:46:57 UTC (rev 30360)
@@ -220,6 +220,25 @@
};
+#define CENTER_LABEL_HORIZONTAL -1
+#define CENTER_LABEL_VERTICAL -1
+
+struct Label {
+ Graphics::Surface _cnv;
+
+ Common::Point _pos;
+ bool _visible;
+
+ Label();
+ ~Label();
+
+ void free();
+ void resetPosition();
+};
+
+
+
+
#define NUM_BUFFERS 4
#define MAX_BALLOON_WIDTH 130
@@ -243,16 +262,19 @@
public:
// balloons and text
- void displayString(uint16 x, uint16 y, const char *text, byte color);
- void displayCenteredString(uint16 y, const char *text);
uint16 getStringWidth(const char *text);
void getStringExtent(char *text, uint16 maxwidth, int16* width, int16* height);
// labels
- Label *_label;
- void setLabel(Label *label);
+ Label *_floatingLabel;
+ void setFloatingLabel(Label *label);
Label *renderFloatingLabel(Font *font, char *text);
+ uint createLabel(Font *font, const char *text, byte color);
+ void showLabel(uint id, int16 x, int16 y);
+ void hideLabel(uint id);
+ void freeLabels();
+
// cut/paste
void flatBlitCnv(Graphics::Surface *cnv, int16 x, int16 y, Gfx::Buffers buffer);
void flatBlitCnv(Frames *cnv, uint16 frame, int16 x, int16 y, Gfx::Buffers buffer);
@@ -354,8 +376,13 @@
uint _numItems;
+ #define MAX_NUM_LABELS 5
+ Label* _labels[MAX_NUM_LABELS];
+ uint _numLabels;
+
void drawInventory();
- void drawLabel();
+ void updateFloatingLabel();
+ void drawLabels();
void drawItems();
void drawBalloons();
Modified: scummvm/trunk/engines/parallaction/gui_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/gui_ns.cpp 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/gui_ns.cpp 2008-01-09 21:46:57 UTC (rev 30360)
@@ -127,9 +127,6 @@
guiSplash();
- _gfx->setFont(_introFont);
- _gfx->setFontShadow(true);
-
_language = guiChooseLanguage();
_disk->setLanguage(_language);
@@ -192,19 +189,21 @@
const char **v14 = introMsg3;
- _gfx->setFont(_menuFont);
- _gfx->setFontShadow(true);
-
_disk->selectArchive("disk1");
setBackground("test", NULL, NULL);
_gfx->swapBuffers();
- _gfx->displayCenteredString(50, v14[0]);
- _gfx->displayCenteredString(70, v14[1]);
- _gfx->displayCenteredString(100, v14[2]);
- _gfx->displayCenteredString(120, v14[3]);
+ uint id[4];
+ id[0] = _gfx->createLabel(_menuFont, v14[0], 1);
+ id[1] = _gfx->createLabel(_menuFont, v14[1], 1);
+ id[2] = _gfx->createLabel(_menuFont, v14[2], 1);
+ id[3] = _gfx->createLabel(_menuFont, v14[3], 1);
+ _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 50);
+ _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 70);
+ _gfx->showLabel(id[2], CENTER_LABEL_HORIZONTAL, 100);
+ _gfx->showLabel(id[3], CENTER_LABEL_HORIZONTAL, 120);
showCursor(false);
@@ -217,6 +216,8 @@
showCursor(true);
+ _gfx->freeLabels();
+
if (_mouseButtons != kMouseRightUp) {
return START_INTRO;
}
@@ -259,7 +260,10 @@
// user can choose language in dos version
showSlide("lingua");
- _gfx->displayString(60, 30, "SELECT LANGUAGE", 1);
+
+ uint id = _gfx->createLabel(_introFont, "SELECT LANGUAGE", 1);
+ _gfx->showLabel(id, 60, 30);
+
setArrowCursor();
int selection = -1;
@@ -275,6 +279,8 @@
beep();
+ _gfx->freeLabels();
+
return selection;
}
@@ -288,6 +294,10 @@
uint16 _si = 0;
uint16 _di = 3;
+ uint id0, id1;
+ id0 = _gfx->createLabel(_introFont, loadGameMsg[_language], 1);
+ id1 = _gfx->createLabel(_introFont, newGameMsg[_language], 1);
+
_mouseButtons = kMouseNone;
while (_mouseButtons != kMouseLeftUp) {
@@ -296,23 +306,24 @@
_si = (_mousePos.x > 160) ? 1 : 0;
if (_si != _di) {
- _di = _si;
-
- _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront);
if (_si != 0) {
// load a game
- _gfx->displayString(60, 30, loadGameMsg[_language], 1);
+ _gfx->hideLabel(id1);
+ _gfx->showLabel(id0, 60, 30);
} else {
// new game
- _gfx->displayString(60, 30, newGameMsg[_language], 1);
+ _gfx->hideLabel(id0);
+ _gfx->showLabel(id1, 60, 30);
}
-
+ _di = _si;
}
_gfx->updateScreen();
g_system->delayMillis(30);
}
+ _gfx->freeLabels();
+
return _si ? LOAD_GAME : NEW_GAME;
}
@@ -391,6 +402,10 @@
bool fail;
+ uint id[2];
+ id[0] = _gfx->createLabel(_introFont, introMsg1[_language], 1);
+ id[1] = _gfx->createLabel(_introFont, introMsg2[_language], 1);
+
while (true) {
points[0] = 0;
@@ -398,7 +413,8 @@
points[2] = 0;
fail = false;
- _gfx->displayString(60, 30, introMsg1[_language], 1); // displays message
+ _gfx->hideLabel(id[1]);
+ _gfx->showLabel(id[0], 60, 30);
_di = 0;
while (_di < PASSWORD_LEN) {
@@ -437,14 +453,17 @@
}
_gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront);
- _gfx->displayString(60, 30, introMsg2[_language], 1);
+
+ _gfx->hideLabel(id[0]);
+ _gfx->showLabel(id[1], 60, 30);
+
_gfx->updateScreen();
g_system->delayMillis(2000);
-
- _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront);
}
+ _gfx->freeLabels();
+
_gfx->setBlackPalette();
_gfx->updateScreen();
Modified: scummvm/trunk/engines/parallaction/objects.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/objects.cpp 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/objects.cpp 2008-01-09 21:46:57 UTC (rev 30360)
@@ -194,24 +194,6 @@
return _bottom - _top;
}
-Label::Label() {
- resetPosition();
-}
-
-Label::~Label() {
- free();
-}
-
-void Label::free() {
- _cnv.free();
- resetPosition();
-}
-
-void Label::resetPosition() {
- _pos.x = -1000;
- _pos.y = -1000;
-}
-
Answer::Answer() {
_text = NULL;
_mood = 0;
Modified: scummvm/trunk/engines/parallaction/objects.h
===================================================================
--- scummvm/trunk/engines/parallaction/objects.h 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/objects.h 2008-01-09 21:46:57 UTC (rev 30360)
@@ -257,18 +257,7 @@
}
};
-struct Label {
- Graphics::Surface _cnv;
- Common::Point _pos;
-
- Label();
- ~Label();
-
- void free();
- void resetPosition();
-};
-
#define ZONENAME_LENGTH 32
struct Zone {
Modified: scummvm/trunk/engines/parallaction/parallaction.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.cpp 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/parallaction.cpp 2008-01-09 21:46:57 UTC (rev 30360)
@@ -320,12 +320,12 @@
switch (data->_event) {
case kEvEnterZone:
debugC(2, kDebugInput, "processInput: kEvEnterZone");
- _gfx->setLabel(data->_label);
+ _gfx->setFloatingLabel(data->_label);
break;
case kEvExitZone:
debugC(2, kDebugInput, "processInput: kEvExitZone");
- _gfx->setLabel(0);
+ _gfx->setFloatingLabel(0);
break;
case kEvAction:
@@ -340,7 +340,7 @@
case kEvOpenInventory:
_procCurrentHoverItem = -1;
_hoverZone = NULL;
- _gfx->setLabel(0);
+ _gfx->setFloatingLabel(0);
if (hitZone(kZoneYou, _mousePos.x, _mousePos.y) == 0) {
setArrowCursor();
}
Modified: scummvm/trunk/engines/parallaction/parallaction_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction_ns.cpp 2008-01-09 21:27:26 UTC (rev 30359)
+++ scummvm/trunk/engines/parallaction/parallaction_ns.cpp 2008-01-09 21:46:57 UTC (rev 30360)
@@ -184,7 +184,7 @@
debugC(1, kDebugInput, "setting mouse cursor to arrow");
// this stuff is needed to avoid artifacts with labels and selected items when switching cursors
- _gfx->setLabel(0);
+ _gfx->setFloatingLabel(0);
_activeItem._id = 0;
_system->setMouseCursor(_mouseArrow, MOUSEARROW_WIDTH, MOUSEARROW_HEIGHT, 0, 0, 0);
@@ -298,7 +298,8 @@
// WORKAROUND: this hideLabel has been added to avoid crashes caused by
// execution of label jobs after a location switch. The other workaround in
// Parallaction::runGame should have been rendered useless by this one.
- _gfx->setLabel(0);
+ _gfx->setFloatingLabel(0);
+ _gfx->freeLabels();
_hoverZone = NULL;
if (_engineFlags & kEngineBlockInput) {
@@ -320,10 +321,10 @@
if (locname.hasSlide()) {
showSlide(locname.slide());
- _gfx->setFont(_menuFont);
- _gfx->displayCenteredString(14, _slideText[0]); // displays text on screen
- _gfx->updateScreen();
+ uint id = _gfx->createLabel(_menuFont, _slideText[0], 1);
+ _gfx->showLabel(id, CENTER_LABEL_HORIZONTAL, 14);
waitUntilLeftClick();
+ _gfx->freeLabels();
}
if (locname.hasCharacter()) {
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