aboutsummaryrefslogtreecommitdiff
path: root/engines/prince
diff options
context:
space:
mode:
authorlukaslw2014-06-06 22:21:39 +0200
committerlukaslw2014-06-22 20:08:44 +0200
commitdcd9c48906f9039d05c9545a4f90418f10aeef2a (patch)
tree77dd7bec7cdc93edeb1931664f8f3ebb93e5fc5d /engines/prince
parentaeea3302d537d66d3f144f72bcfa9d083e8b512c (diff)
downloadscummvm-rg350-dcd9c48906f9039d05c9545a4f90418f10aeef2a.tar.gz
scummvm-rg350-dcd9c48906f9039d05c9545a4f90418f10aeef2a.tar.bz2
scummvm-rg350-dcd9c48906f9039d05c9545a4f90418f10aeef2a.zip
PRINCE: getBlendTableColor(), drawTransparentWithBlend()
Diffstat (limited to 'engines/prince')
-rw-r--r--engines/prince/graphics.cpp122
-rw-r--r--engines/prince/graphics.h6
-rw-r--r--engines/prince/prince.cpp10
-rw-r--r--engines/prince/prince.h2
4 files changed, 133 insertions, 7 deletions
diff --git a/engines/prince/graphics.cpp b/engines/prince/graphics.cpp
index 49cc88c8ae..298337673f 100644
--- a/engines/prince/graphics.cpp
+++ b/engines/prince/graphics.cpp
@@ -24,6 +24,8 @@
#include "prince/prince.h"
+#include "prince/mhwanh.h"
+
#include "graphics/palette.h"
#include "common/memstream.h"
@@ -89,6 +91,29 @@ void GraphicsMan::drawTransparentSurface(int32 posX, int32 posY, const Graphics:
change();
}
+void GraphicsMan::drawTransparentWithBlend(int32 posX, int32 posY, const Graphics::Surface *s, int transColor) {
+ _blendTable = new byte[256];
+ for (int i = 0; i < 256; i++) {
+ _blendTable[i] = 255;
+ }
+ for (int y = 0; y < s->h; y++) {
+ for (int x = 0; x < s->w; x++) {
+ byte pixel = *((byte*)s->getBasePtr(x, y));
+ if (pixel != transColor) {
+ if (x + posX < _frontScreen->w && x + posX >= 0) {
+ if (y + posY < _frontScreen->h && y + posY >= 0) {
+ byte backgroundPixel = *((byte*)_frontScreen->getBasePtr(x + posX, y + posY));
+ byte blendPixel = getBlendTableColor(pixel, backgroundPixel);
+ *((byte*)_frontScreen->getBasePtr(x + posX, y + posY)) = blendPixel;
+ }
+ }
+ }
+ }
+ }
+ delete _blendTable;
+ change();
+}
+
void GraphicsMan::drawTransparent(Graphics::Surface *frontScreen, DrawNode *drawNode) {
for (int y = 0; y < drawNode->s->h; y++) {
for (int x = 0; x < drawNode->s->w; x++) {
@@ -147,6 +172,103 @@ void GraphicsMan::drawAsShadow(Graphics::Surface *frontScreen, DrawNode *drawNod
}
}
+byte GraphicsMan::getBlendTableColor(byte pixelColor, byte backgroundPixelColor) {
+ int32 redFirstOrg, greenFirstOrg, blueFirstOrg;
+ int32 redFirstBack, greenFirstBack, blueFirstBack;
+ int32 redSecondOrg, greenSecondOrg, blueSecondOrg;
+ int32 redNew, greenNew, blueNew;
+
+ int32 sumOfColorValues;
+ int32 bigValue;
+ int32 currColor;
+
+ if (_blendTable[pixelColor] != 255) {
+ currColor = _blendTable[pixelColor];
+ } else {
+ const byte *originalPalette = _vm->_roomBmp->getPalette(); //?
+ const byte *suitcasePalette = _vm->_suitcaseBmp->getPalette(); //?
+
+ //debug("backgroundPixelColor: %d", backgroundPixelColor);
+ //debug("orgpalette: %d", pixelColor);
+ //debug("mst_shadow: %d", _vm->_mst_shadow);
+
+ redFirstOrg = originalPalette[pixelColor * 4] * _vm->_mst_shadow / 256;
+ if (redFirstOrg >= 256) {
+ redFirstOrg = 255;
+ }
+ if (_vm->_mst_shadow <= 256) {
+ redFirstBack = suitcasePalette[backgroundPixelColor * 4] * (256 - _vm->_mst_shadow) / 256;
+ if (redFirstBack >= 256) {
+ redFirstBack = 255;
+ }
+ redFirstOrg += redFirstBack;
+ if (redFirstOrg >= 256) {
+ redFirstOrg = 255;
+ }
+ }
+
+ greenFirstOrg = originalPalette[pixelColor * 4 + 1] * _vm->_mst_shadow / 256;
+ if (greenFirstOrg >= 256) {
+ greenFirstOrg = 255;
+ }
+ if (_vm->_mst_shadow <= 256) {
+ greenFirstBack = suitcasePalette[backgroundPixelColor * 4 + 1] * (256 - _vm->_mst_shadow) / 256;
+ if (greenFirstBack >= 256) {
+ greenFirstBack = 255;
+ }
+ greenFirstOrg += greenFirstBack;
+ if (greenFirstOrg >= 256) {
+ greenFirstOrg = 255;
+ }
+ }
+
+ blueFirstOrg = originalPalette[pixelColor * 4 + 2] * _vm->_mst_shadow / 256;
+ if (blueFirstOrg >= 256) {
+ blueFirstOrg = 255;
+ }
+ if (_vm->_mst_shadow <= 256) {
+ blueFirstBack = suitcasePalette[backgroundPixelColor * 4 + 2] * (256 - _vm->_mst_shadow) / 256;
+ if (blueFirstBack >= 256) {
+ blueFirstBack = 255;
+ }
+ blueFirstOrg += blueFirstBack;
+ if (blueFirstOrg >= 256) {
+ blueFirstOrg = 255;
+ }
+ }
+
+ currColor = 0;
+ bigValue = 999999999; // infinity
+ for (int j = 0; j < 256; j++) {
+ redSecondOrg = originalPalette[3 * j];
+ redNew = redFirstOrg - redSecondOrg;
+ redNew = redNew * redNew;
+
+ greenSecondOrg = originalPalette[3 * j + 1];
+ greenNew = greenFirstOrg - greenSecondOrg;
+ greenNew = greenNew * greenNew;
+
+ blueSecondOrg = originalPalette[3 * j + 2];
+ blueNew = blueFirstOrg - blueSecondOrg;
+ blueNew = blueNew * blueNew;
+
+ sumOfColorValues = redNew + greenNew + blueNew;
+
+ if (sumOfColorValues < bigValue) {
+ bigValue = sumOfColorValues;
+ currColor = j;
+ }
+
+ if (sumOfColorValues == 0) {
+ break;
+ }
+ }
+ _blendTable[pixelColor] = currColor;
+ }
+ //debug("currColor: %d", currColor);
+ return currColor;
+}
+
void GraphicsMan::makeShadowTable(int brightness, byte *shadowPalette) {
int32 redFirstOrg, greenFirstOrg, blueFirstOrg;
int32 redSecondOrg, greenSecondOrg, blueSecondOrg;
diff --git a/engines/prince/graphics.h b/engines/prince/graphics.h
index cd3d8b4f35..7651dae7a1 100644
--- a/engines/prince/graphics.h
+++ b/engines/prince/graphics.h
@@ -30,6 +30,7 @@ namespace Prince {
class PrinceEngine;
struct DrawNode;
+class MhwanhDecoder;
class GraphicsMan
{
@@ -46,11 +47,14 @@ public:
void draw(uint16 x, uint16 y, const Graphics::Surface *s);
void drawTransparentSurface(int32 posX, int32 poxY, const Graphics::Surface *s, int transColor);
+ void drawTransparentWithBlend(int32 posX, int32 poxY, const Graphics::Surface *s, int transColor);
static void drawTransparent(Graphics::Surface *frontScreen, DrawNode *drawNode);
static void drawAsShadow(Graphics::Surface *frontScreen, DrawNode *drawNode);
static void drawMask(Graphics::Surface *frontScreen, DrawNode *drawNode);
+ byte getBlendTableColor(byte pixelColor, byte backgroundPixelColor);
+
Graphics::Surface *_frontScreen;
Graphics::Surface *_backScreen;
const Graphics::Surface *_roomBackground;
@@ -60,6 +64,8 @@ public:
static const byte kShadowColor = 191;
+ byte *_blendTable;
+
private:
PrinceEngine *_vm;
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp
index 7a716fd98a..a0405c76db 100644
--- a/engines/prince/prince.cpp
+++ b/engines/prince/prince.cpp
@@ -1398,9 +1398,10 @@ void PrinceEngine::drawInvItems() {
drawY += (_maxInvH - itemSurface->h) / 2;
}
if (!_mst_shadow) {
- _graph->drawTransparentSurface(drawX, drawY, itemSurface, 0); //TODO - ShowSprite0
+ _graph->drawTransparentSurface(drawX, drawY, itemSurface, 0);
} else {
- _graph->drawTransparentSurface(drawX, drawY, itemSurface, 0); //TODO - ShowSprite01
+ _mst_shadow = _mst_shadow2;
+ _graph->drawTransparentWithBlend(drawX, drawY, itemSurface, 0); //TODO - ShowSprite01
}
} else {
// candle item:
@@ -1418,11 +1419,8 @@ void PrinceEngine::displayInventory() {
// temp:
_mainHero->_inventory.clear();
_mainHero->_inventory.push_back(0);
- _mainHero->_inventory.push_back(1);
_mainHero->_inventory.push_back(2);
- _mainHero->_inventory.push_back(3);
- _mainHero->_inventory.push_back(4);
- _mainHero->_inventory.push_back(5);
+ _mainHero->_inventory.push_back(1);
prepareInventoryToView();
diff --git a/engines/prince/prince.h b/engines/prince/prince.h
index 1694286f54..71512f0d8a 100644
--- a/engines/prince/prince.h
+++ b/engines/prince/prince.h
@@ -254,6 +254,7 @@ public:
int32 _picWindowX;
int32 _picWindowY;
Image::BitmapDecoder *_roomBmp;
+ MhwanhDecoder *_suitcaseBmp;
Common::Array<AnimListItem> _animList;
Common::Array<BackgroundAnim> _backAnimList;
@@ -330,7 +331,6 @@ private:
Common::RandomSource *_rnd;
Cursor *_cursor1;
Cursor *_cursor2;
- MhwanhDecoder *_suitcaseBmp;
Debugger *_debugger;
GraphicsMan *_graph;
Script *_script;