Skip to content

Commit

Permalink
SCI: Differentiate between screen width and pitch
Browse files Browse the repository at this point in the history
This properly addresses the odd screen width (630) in Phantasmagoria 1
  • Loading branch information
bluegr committed Jul 26, 2012
1 parent 321197e commit c0beaf2
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 46 deletions.
36 changes: 15 additions & 21 deletions engines/sci/graphics/frameout.cpp
Expand Up @@ -125,23 +125,17 @@ void GfxFrameout::kernelAddPlane(reg_t object) {
if (_planes.empty()) {
// There has to be another way for sierra sci to do this or maybe script resolution is compiled into
// interpreter (TODO)
uint16 tmpRunningWidth = readSelectorValue(_segMan, object, SELECTOR(resX));
uint16 tmpRunningHeight = readSelectorValue(_segMan, object, SELECTOR(resY));
uint16 scriptWidth = readSelectorValue(_segMan, object, SELECTOR(resX));
uint16 scriptHeight = readSelectorValue(_segMan, object, SELECTOR(resY));

// The above can be 0 in SCI3 (e.g. Phantasmagoria 2)
if (tmpRunningWidth == 0 && tmpRunningHeight == 0) {
tmpRunningWidth = 320;
tmpRunningHeight = 200;
}

// HACK: Phantasmagoria 1 sets a window size of 630x450.
// We can't set a width of 630, as that messes up the pitch, so we hack
// the internal script width here
if (g_sci->getGameId() == GID_PHANTASMAGORIA) {
tmpRunningWidth = 325;
// Phantasmagoria 2 doesn't specify a script width/height
if (g_sci->getGameId() == GID_PHANTASMAGORIA2) {
scriptWidth = 640;
scriptHeight = 480;
}

_coordAdjuster->setScriptsResolution(tmpRunningWidth, tmpRunningHeight);
assert(scriptWidth > 0 && scriptHeight > 0);
_coordAdjuster->setScriptsResolution(scriptWidth, scriptHeight);
}

// Import of QfG character files dialog is shown in QFG4.
Expand Down Expand Up @@ -704,13 +698,13 @@ void GfxFrameout::kernelFrameout() {
// TODO: maybe we should clip the cels rect with this, i'm not sure
// the only currently known usage is game menu of gk1
} else if (view) {
if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128))
view->getCelRect(itemEntry->loopNo, itemEntry->celNo,
itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect);
else
view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo,
itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX,
itemEntry->scaleY, itemEntry->celRect);
if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128))
view->getCelRect(itemEntry->loopNo, itemEntry->celNo,
itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect);
else
view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo,
itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX,
itemEntry->scaleY, itemEntry->celRect);

Common::Rect nsRect = itemEntry->celRect;
// Translate back to actual coordinate within scrollable plane
Expand Down
55 changes: 30 additions & 25 deletions engines/sci/graphics/screen.cpp
Expand Up @@ -53,23 +53,35 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {

#ifdef ENABLE_SCI32
// GK1 Mac uses a 640x480 resolution too
if (g_sci->getGameId() == GID_GK1 && g_sci->getPlatform() == Common::kPlatformMacintosh)
_upscaledHires = GFX_SCREEN_UPSCALED_640x480;
if (g_sci->getPlatform() == Common::kPlatformMacintosh) {
if (g_sci->getGameId() == GID_GK1)
_upscaledHires = GFX_SCREEN_UPSCALED_640x480;
}
#endif

if (_resMan->detectHires()) {
_width = 640;
_pitch = 640;
_height = 480;
} else {
_width = 320;
_pitch = 320;
_height = getLowResScreenHeight();
}

#ifdef ENABLE_SCI32
// Phantasmagoria 1 sets a window area of 630x450
if (g_sci->getGameId() == GID_PHANTASMAGORIA) {
_width = 630;
_height = 450;
}
#endif

// Japanese versions of games use hi-res font on upscaled version of the game.
if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1))
_upscaledHires = GFX_SCREEN_UPSCALED_640x400;

_pixels = _width * _height;
_pixels = _pitch * _height;

switch (_upscaledHires) {
case GFX_SCREEN_UPSCALED_640x400:
Expand All @@ -91,19 +103,12 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
_upscaledMapping[i] = (i * 12) / 5;
break;
default:
_displayWidth = _width;
_displayWidth = _pitch;
_displayHeight = _height;
memset(&_upscaledMapping, 0, sizeof(_upscaledMapping) );
break;
}

// Phantasmagoria 1 sets a window area of 630x450
if (g_sci->getGameId() == GID_PHANTASMAGORIA) {
// TODO: Also set width to 630 (can't be set right now, as it messes up
// the pitch). For now, a hack has been placed in GfxFrameout::kernelAddPlane()
_height = 450;
}

_displayPixels = _displayWidth * _displayHeight;
_visualScreen = (byte *)calloc(_pixels, 1);
_priorityScreen = (byte *)calloc(_pixels, 1);
Expand Down Expand Up @@ -214,7 +219,7 @@ byte GfxScreen::getDrawingMask(byte color, byte prio, byte control) {
}

void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority, byte control) {
int offset = y * _width + x;
int offset = y * _pitch + x;

if (drawMask & GFX_SCREEN_MASK_VISUAL) {
_visualScreen[offset] = color;
Expand Down Expand Up @@ -247,7 +252,7 @@ void GfxScreen::putFontPixel(int startingY, int x, int y, byte color) {
// Do not scale ourselves, but put it on the display directly
putPixelOnDisplay(x, y + startingY, color);
} else {
int offset = (startingY + y) * _width + x;
int offset = (startingY + y) * _pitch + x;

_visualScreen[offset] = color;
if (!_upscaledHires) {
Expand Down Expand Up @@ -349,19 +354,19 @@ void GfxScreen::putKanjiChar(Graphics::FontSJIS *commonFont, int16 x, int16 y, u
}

byte GfxScreen::getVisual(int x, int y) {
return _visualScreen[y * _width + x];
return _visualScreen[y * _pitch + x];
}

byte GfxScreen::getPriority(int x, int y) {
return _priorityScreen[y * _width + x];
return _priorityScreen[y * _pitch + x];
}

byte GfxScreen::getControl(int x, int y) {
return _controlScreen[y * _width + x];
return _controlScreen[y * _pitch + x];
}

byte GfxScreen::isFillMatch(int16 x, int16 y, byte screenMask, byte t_color, byte t_pri, byte t_con, bool isEGA) {
int offset = y * _width + x;
int offset = y * _pitch + x;
byte match = 0;

if (screenMask & GFX_SCREEN_MASK_VISUAL) {
Expand Down Expand Up @@ -422,14 +427,14 @@ void GfxScreen::bitsSave(Common::Rect rect, byte mask, byte *memoryPtr) {
memcpy(memoryPtr, (void *)&mask, sizeof(mask)); memoryPtr += sizeof(mask);

if (mask & GFX_SCREEN_MASK_VISUAL) {
bitsSaveScreen(rect, _visualScreen, _width, memoryPtr);
bitsSaveScreen(rect, _visualScreen, _pitch, memoryPtr);
bitsSaveDisplayScreen(rect, memoryPtr);
}
if (mask & GFX_SCREEN_MASK_PRIORITY) {
bitsSaveScreen(rect, _priorityScreen, _width, memoryPtr);
bitsSaveScreen(rect, _priorityScreen, _pitch, memoryPtr);
}
if (mask & GFX_SCREEN_MASK_CONTROL) {
bitsSaveScreen(rect, _controlScreen, _width, memoryPtr);
bitsSaveScreen(rect, _controlScreen, _pitch, memoryPtr);
}
if (mask & GFX_SCREEN_MASK_DISPLAY) {
if (!_upscaledHires)
Expand Down Expand Up @@ -482,14 +487,14 @@ void GfxScreen::bitsRestore(byte *memoryPtr) {
memcpy((void *)&mask, memoryPtr, sizeof(mask)); memoryPtr += sizeof(mask);

if (mask & GFX_SCREEN_MASK_VISUAL) {
bitsRestoreScreen(rect, memoryPtr, _visualScreen, _width);
bitsRestoreScreen(rect, memoryPtr, _visualScreen, _pitch);
bitsRestoreDisplayScreen(rect, memoryPtr);
}
if (mask & GFX_SCREEN_MASK_PRIORITY) {
bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _width);
bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _pitch);
}
if (mask & GFX_SCREEN_MASK_CONTROL) {
bitsRestoreScreen(rect, memoryPtr, _controlScreen, _width);
bitsRestoreScreen(rect, memoryPtr, _controlScreen, _pitch);
}
if (mask & GFX_SCREEN_MASK_DISPLAY) {
if (!_upscaledHires)
Expand Down Expand Up @@ -567,7 +572,7 @@ void GfxScreen::dither(bool addToFlag) {
if (!_unditheringEnabled) {
// Do dithering on visual and display-screen
for (y = 0; y < _height; y++) {
for (x = 0; x < _width; x++) {
for (x = 0; x < _pitch; x++) {
color = *visualPtr;
if (color & 0xF0) {
color ^= color << 4;
Expand All @@ -592,7 +597,7 @@ void GfxScreen::dither(bool addToFlag) {
memset(&_ditheredPicColors, 0, sizeof(_ditheredPicColors));
// Do dithering on visual screen and put decoded but undithered byte onto display-screen
for (y = 0; y < _height; y++) {
for (x = 0; x < _width; x++) {
for (x = 0; x < _pitch; x++) {
color = *visualPtr;
if (color & 0xF0) {
color ^= color << 4;
Expand Down
1 change: 1 addition & 0 deletions engines/sci/graphics/screen.h
Expand Up @@ -132,6 +132,7 @@ class GfxScreen {

private:
uint16 _width;
uint16 _pitch;
uint16 _height;
uint _pixels;
uint16 _displayWidth;
Expand Down

0 comments on commit c0beaf2

Please sign in to comment.