diff options
author | Paul Gilbert | 2017-02-25 19:03:47 -0500 |
---|---|---|
committer | Paul Gilbert | 2017-02-25 19:03:47 -0500 |
commit | 92f158384484c1bb00e82464c5af0de280e40877 (patch) | |
tree | f9f215bd7a5589037ff8181efe3d071a57680e9d /engines/titanic/star_control | |
parent | 26b6d450df37f1a299c154cb24c03af48f96ef58 (diff) | |
download | scummvm-rg350-92f158384484c1bb00e82464c5af0de280e40877.tar.gz scummvm-rg350-92f158384484c1bb00e82464c5af0de280e40877.tar.bz2 scummvm-rg350-92f158384484c1bb00e82464c5af0de280e40877.zip |
TITANIC: Implementing CSurfaceArea methods
Diffstat (limited to 'engines/titanic/star_control')
-rw-r--r-- | engines/titanic/star_control/surface_area.cpp | 69 | ||||
-rw-r--r-- | engines/titanic/star_control/surface_area.h | 37 |
2 files changed, 92 insertions, 14 deletions
diff --git a/engines/titanic/star_control/surface_area.cpp b/engines/titanic/star_control/surface_area.cpp index 77f8222dad..2d25d64541 100644 --- a/engines/titanic/star_control/surface_area.cpp +++ b/engines/titanic/star_control/surface_area.cpp @@ -39,12 +39,71 @@ CSurfaceArea::CSurfaceArea(CVideoSurface *surface) { void CSurfaceArea::initialize() { _bounds = Rect(0, 0, _width - 1, _height - 1); - _centroid = Point(_width / 2, _height / 2); - _field22 = _field21 = _field20 = 0xFF; + _centroid = FPoint(_width / 2.0, _height / 2.0); + _pixel = 0xffffff; _field27 = _field26 = _field25 = 0; - _field24 = _field23 = 0; - _field28 = _field2C = 0; - _field38 = 0; + _field24 = 0; + _rgb = _field2C = 0; + _mode = SA_NONE; +} + +void CSurfaceArea::setColor(uint rgb) { + switch (_mode) { + case SA_MODE1: + _color = 0; + _colorMask = rgb; + break; + case SA_MODE2: + _color = rgb; + _colorMask = ~rgb; + break; + case SA_MODE3: + _color = rgb; + _colorMask = 0xFFFFFFFF; + break; + case SA_MODE4: + _color = 0; + _colorMask = ~rgb; + break; + default: + break; + } +} + +SurfaceAreaMode CSurfaceArea::setMode(SurfaceAreaMode mode) { + SurfaceAreaMode oldMode = _mode; + _mode = mode; + setColor(_color); + return oldMode; +} + +void CSurfaceArea::setColorFromPixel() { + pixelToRGB(_pixel, &_rgb); + setColor(_rgb); +} + +void CSurfaceArea::pixelToRGB(uint pixel, uint *rgb) { + switch (_bpp) { + case 0: + *rgb = 0; + break; + + case 1: + case 2: { + uint r = pixel & 0xF8; + uint g = (pixel >> 8) & 0xf8; + uint b = ((pixel >> 16) & 0xff) >> 3; + uint value = (((r << 5) | g) << 2) | b; + value &= 0xffff; + *rgb = (value << 16) | value; + break; + } + + case 3: + case 4: + *rgb = pixel; + break; + } } } // End of namespace Titanic diff --git a/engines/titanic/star_control/surface_area.h b/engines/titanic/star_control/surface_area.h index 4d1913123c..bb851b7a07 100644 --- a/engines/titanic/star_control/surface_area.h +++ b/engines/titanic/star_control/surface_area.h @@ -25,15 +25,27 @@ #include "titanic/support/rect.h" #include "titanic/support/video_surface.h" +#include "titanic/star_control/fpoint.h" namespace Titanic { +enum SurfaceAreaMode { + SA_NONE = 0, SA_MODE1 = 1, SA_MODE2 = 2, SA_MODE3 = 3, SA_MODE4 = 4 +}; + class CSurfaceArea { private: /** * Initialize data for the class */ void initialize(); + + /** + * Sets the drawing color and mask + */ + void setColor(uint rgb); + + void pixelToRGB(uint pixel, uint *rgb); public: int _field0; int _width; @@ -41,23 +53,30 @@ public: int _pitch; int _bpp; uint16 *_pixelsPtr; - Point _centroid; - byte _field20; - byte _field21; - byte _field22; - byte _field23; + FPoint _centroid; + uint _pixel; byte _field24; byte _field25; byte _field26; byte _field27; - int _field28; + uint _rgb; int _field2C; - int _field30; - int _field34; - int _field38; + uint _colorMask; + uint _color; + SurfaceAreaMode _mode; Rect _bounds; public: CSurfaceArea(CVideoSurface *surface); + + /** + * Sets the drawing mode, and returns the old mode + */ + SurfaceAreaMode setMode(SurfaceAreaMode mode); + + /** + * Sets the color from the current pixel + */ + void setColorFromPixel(); }; } // End of namespace Titanic |