[Scummvm-git-logs] scummvm master -> e86ee33999f33ad66bb7c018b4d4b7604b48badb

peterkohaut peterkohaut at users.noreply.github.com
Wed Apr 17 22:54:17 CEST 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
e86ee33999 BLADERUNNER: Abstraction from 555 pixel format


Commit: e86ee33999f33ad66bb7c018b4d4b7604b48badb
    https://github.com/scummvm/scummvm/commit/e86ee33999f33ad66bb7c018b4d4b7604b48badb
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2019-04-17T22:51:18+02:00

Commit Message:
BLADERUNNER: Abstraction from 555 pixel format

Removing hardcoded 555 pixel format to support Android

Changed paths:
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/debugger.cpp
    engines/bladerunner/dialogue_menu.cpp
    engines/bladerunner/font.cpp
    engines/bladerunner/font.h
    engines/bladerunner/image.cpp
    engines/bladerunner/obstacles.cpp
    engines/bladerunner/outtake.cpp
    engines/bladerunner/savefile.cpp
    engines/bladerunner/shape.cpp
    engines/bladerunner/slice_animations.cpp
    engines/bladerunner/slice_renderer.cpp
    engines/bladerunner/ui/esper.cpp
    engines/bladerunner/ui/kia.cpp
    engines/bladerunner/ui/kia_section_clues.cpp
    engines/bladerunner/ui/kia_section_crimes.cpp
    engines/bladerunner/ui/kia_section_diagnostic.cpp
    engines/bladerunner/ui/kia_section_diagnostic.h
    engines/bladerunner/ui/kia_section_pogo.cpp
    engines/bladerunner/ui/kia_section_pogo.h
    engines/bladerunner/ui/kia_section_save.cpp
    engines/bladerunner/ui/kia_section_settings.cpp
    engines/bladerunner/ui/kia_section_suspects.cpp
    engines/bladerunner/ui/scores.cpp
    engines/bladerunner/ui/ui_image_picker.cpp
    engines/bladerunner/ui/ui_input_box.cpp
    engines/bladerunner/ui/ui_scroll_box.cpp
    engines/bladerunner/ui/ui_scroll_box.h
    engines/bladerunner/ui/ui_slider.cpp
    engines/bladerunner/ui/ui_slider.h
    engines/bladerunner/ui/vk.cpp
    engines/bladerunner/vqa_decoder.cpp


diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 31aae35..e8a22a8 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -302,7 +302,7 @@ void BladeRunnerEngine::pauseEngineIntern(bool pause) {
 }
 
 Common::Error BladeRunnerEngine::run() {
-	Graphics::PixelFormat format = createRGB555();
+	Graphics::PixelFormat format = screenPixelForrmat();
 	initGraphics(640, 480, &format);
 
 	_system->showMouse(true);
@@ -375,8 +375,8 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 
 	// This is the original startup in the game
 
-	_surfaceFront.create(640, 480, createRGB555());
-	_surfaceBack.create(640, 480, createRGB555());
+	_surfaceFront.create(640, 480, screenPixelForrmat());
+	_surfaceBack.create(640, 480, screenPixelForrmat());
 
 	_time = new Time(this);
 
@@ -535,7 +535,7 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 	_scores = new Scores(this);
 
 	_mainFont = new Font(this);
-	_mainFont->open("KIA6PT.FON", 640, 480, -1, 0, 0x252D);
+	_mainFont->open("KIA6PT.FON", 640, 480, -1, 0, _surfaceFront.format.RGBToColor(72, 72, 104));
 	_mainFont->setSpacing(1, 0);
 
 	for (int i = 0; i != 43; ++i) {
@@ -1874,7 +1874,7 @@ void BladeRunnerEngine::playerDied() {
 	_kia->open(kKIASectionLoad);
 }
 
-bool BladeRunnerEngine::saveGame(Common::WriteStream &stream, const Graphics::Surface &thumbnail) {
+bool BladeRunnerEngine::saveGame(Common::WriteStream &stream, Graphics::Surface &thumbnail) {
 	if ( !_gameIsAutoSaving
 	     && ( !playerHasControl() || _sceneScript->isInsideScript() || _aiScripts->isInsideScript())
 	){
@@ -1884,6 +1884,7 @@ bool BladeRunnerEngine::saveGame(Common::WriteStream &stream, const Graphics::Su
 	Common::MemoryWriteStreamDynamic memoryStream(DisposeAfterUse::YES);
 	SaveFileWriteStream s(memoryStream);
 
+	thumbnail.convertToInPlace(gameDataPixelFormat());
 	s.write(thumbnail.getPixels(), SaveFileManager::kThumbnailSize);
 	s.writeFloat(1.0f);
 	_settings->save(s);
@@ -2080,7 +2081,7 @@ void BladeRunnerEngine::blitToScreen(const Graphics::Surface &src) const {
 
 Graphics::Surface BladeRunnerEngine::generateThumbnail() const {
 	Graphics::Surface thumbnail;
-	thumbnail.create(640 / 8, 480 / 8, createRGB555());
+	thumbnail.create(640 / 8, 480 / 8, _surfaceFront.format);
 
 	for (int y = 0; y < thumbnail.h; ++y) {
 		for (int x = 0; x < thumbnail.w; ++x) {
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index c3e53eb..fad396d 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -294,7 +294,7 @@ public:
 	void playerGainsControl();
 	void playerDied();
 
-	bool saveGame(Common::WriteStream &stream, const Graphics::Surface &thumbnail);
+	bool saveGame(Common::WriteStream &stream, Graphics::Surface &thumbnail);
 	bool loadGame(Common::SeekableReadStream &stream);
 	void newGame(int difficulty);
 	void autoSaveGame(int textId, bool endgame);
@@ -308,8 +308,13 @@ public:
 	Common::String getTargetName() const;
 };
 
-static inline const Graphics::PixelFormat createRGB555() {
-	return Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
+static inline const Graphics::PixelFormat gameDataPixelFormat() {
+	return Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15);
+}
+
+static inline const Graphics::PixelFormat screenPixelForrmat() {
+	// Should be a format supported by Android port
+	return Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0);
 }
 
 void blit(const Graphics::Surface &src, Graphics::Surface &dst);
diff --git a/engines/bladerunner/debugger.cpp b/engines/bladerunner/debugger.cpp
index 5a3aa24..9d31e5e 100644
--- a/engines/bladerunner/debugger.cpp
+++ b/engines/bladerunner/debugger.cpp
@@ -1129,13 +1129,13 @@ void Debugger::drawSceneObjects() {
 			case kSceneObjectTypeUnknown:
 				break;
 			case kSceneObjectTypeActor:
-				color = 0x7C00; // 11111 00000 00000;
+				color = _vm->_surfaceFront.format.RGBToColor(255, 0, 0);
 				drawBBox(a, b, _vm->_view, &_vm->_surfaceFront, color);
 				_vm->_surfaceFront.frameRect(sceneObject->screenRectangle, color);
 				_vm->_mainFont->drawColor(_vm->_textActorNames->getText(sceneObject->id - kSceneObjectOffsetActors), _vm->_surfaceFront, pos.x, pos.y, color);
 				break;
 			case kSceneObjectTypeItem:
-				color = 0x03E0; // 00000 11111 00000
+			color = _vm->_surfaceFront.format.RGBToColor(0, 255, 0);
 				char itemText[40];
 				drawBBox(a, b, _vm->_view, &_vm->_surfaceFront, color);
 				sprintf(itemText, "item %i", sceneObject->id - kSceneObjectOffsetItems);
@@ -1143,11 +1143,9 @@ void Debugger::drawSceneObjects() {
 				_vm->_mainFont->drawColor(itemText, _vm->_surfaceFront, pos.x, pos.y, color);
 				break;
 			case kSceneObjectTypeObject:
-				color = 0x3DEF; //01111 01111 01111;
-				//if (sceneObject->_isObstacle)
-				//	color += 0b100000000000000;
+				color = _vm->_surfaceFront.format.RGBToColor(127, 127, 127);
 				if (sceneObject->isClickable) {
-					color = 0x03E0; // 00000 11111 00000;
+					color = _vm->_surfaceFront.format.RGBToColor(0, 255, 0);
 				}
 				drawBBox(a, b, _vm->_view, &_vm->_surfaceFront, color);
 				_vm->_surfaceFront.frameRect(sceneObject->screenRectangle, color);
@@ -1175,10 +1173,7 @@ void Debugger::drawLights() {
 		posTarget.z = -t;
 
 		Vector3 size = Vector3(5.0f, 5.0f, 5.0f);
-		int colorR = (light->_color.r * 31.0f);
-		int colorG = (light->_color.g * 31.0f);
-		int colorB = (light->_color.b * 31.0f);
-		int color = (colorR << 10) + (colorG << 5) + colorB;
+		int color = _vm->_surfaceFront.format.RGBToColor(light->_color.r * 255.0f, light->_color.g * 255.0f, light->_color.b * 255.0f);
 
 		drawBBox(posOrigin - size, posOrigin + size, _vm->_view, &_vm->_surfaceFront, color);
 
@@ -1209,10 +1204,7 @@ void Debugger::drawFogs() {
 		posTarget.z = -t;
 
 		Vector3 size = Vector3(5.0f, 5.0f, 5.0f);
-		int colorR = (fog->_fogColor.r * 31.0f);
-		int colorG = (fog->_fogColor.g * 31.0f);
-		int colorB = (fog->_fogColor.b * 31.0f);
-		int color = (colorR << 10) + (colorG << 5) + colorB;
+		int color = _vm->_surfaceFront.format.RGBToColor(fog->_fogColor.r * 255.0f, fog->_fogColor.g * 255.0f, fog->_fogColor.b * 255.0f);
 
 		drawBBox(posOrigin - size, posOrigin + size, _vm->_view, &_vm->_surfaceFront, color);
 
@@ -1231,14 +1223,14 @@ void Debugger::drawRegions() {
 	for (int i = 0; i < 10; i++) {
 		Regions::Region *region = &_vm->_scene->_regions->_regions[i];
 		if (!region->present) continue;
-		_vm->_surfaceFront.frameRect(region->rectangle, 0x001F); // 00000 00000 11111
+		_vm->_surfaceFront.frameRect(region->rectangle, _vm->_surfaceFront.format.RGBToColor(0, 0, 255));
 	}
 
 	//draw exits
 	for (int i = 0; i < 10; i++) {
 		Regions::Region *region = &_vm->_scene->_exits->_regions[i];
 		if (!region->present) continue;
-		_vm->_surfaceFront.frameRect(region->rectangle, 0x7FFF); // 11111 11111 11111
+		_vm->_surfaceFront.frameRect(region->rectangle, _vm->_surfaceFront.format.RGBToColor(255, 255, 255));
 	}
 }
 
@@ -1251,7 +1243,7 @@ void Debugger::drawWaypoints() {
 		}
 		Vector3 pos = waypoint->position;
 		Vector3 size = Vector3(3.0f, 3.0f, 3.0f);
-		int color = 0x7FFF; // 11111 11111 11111
+		int color = _vm->_surfaceFront.format.RGBToColor(255, 255, 255);
 		drawBBox(pos - size, pos + size, _vm->_view, &_vm->_surfaceFront, color);
 		Vector3 spos = _vm->_view->calculateScreenPosition(pos);
 		char waypointText[40];
@@ -1267,7 +1259,7 @@ void Debugger::drawWaypoints() {
 		}
 		Vector3 pos = cover->position;
 		Vector3 size = Vector3(3.0f, 3.0f, 3.0f);
-		int color = 0x7C1F; // 11111 00000 11111
+		int color = _vm->_surfaceFront.format.RGBToColor(255, 0, 255);
 		drawBBox(pos - size, pos + size, _vm->_view, &_vm->_surfaceFront, color);
 		Vector3 spos = _vm->_view->calculateScreenPosition(pos);
 		char coverText[40];
@@ -1283,7 +1275,7 @@ void Debugger::drawWaypoints() {
 		}
 		Vector3 pos = flee->position;
 		Vector3 size = Vector3(3.0f, 3.0f, 3.0f);
-		int color = 0x03FF; // 00000 11111 11111
+		int color = _vm->_surfaceFront.format.RGBToColor(0, 255, 255);
 		drawBBox(pos - size, pos + size, _vm->_view, &_vm->_surfaceFront, color);
 		Vector3 spos = _vm->_view->calculateScreenPosition(pos);
 		char fleeText[40];
@@ -1300,9 +1292,9 @@ void Debugger::drawWalkboxes() {
 		for (int j = 0; j < walkbox->vertexCount; j++) {
 			Vector3 start = _vm->_view->calculateScreenPosition(walkbox->vertices[j]);
 			Vector3 end = _vm->_view->calculateScreenPosition(walkbox->vertices[(j + 1) % walkbox->vertexCount]);
-			_vm->_surfaceFront.drawLine(start.x, start.y, end.x, end.y, 0x7FE0); // 11111 11111 00000
+			_vm->_surfaceFront.drawLine(start.x, start.y, end.x, end.y, _vm->_surfaceFront.format.RGBToColor(255, 255, 0));
 			Vector3 pos = _vm->_view->calculateScreenPosition(0.5 * (start + end));
-			_vm->_mainFont->drawColor(walkbox->name, _vm->_surfaceFront, pos.x, pos.y, 0x7FE0); // 11111 11111 00000
+			_vm->_mainFont->drawColor(walkbox->name, _vm->_surfaceFront, pos.x, pos.y, _vm->_surfaceFront.format.RGBToColor(255, 255, 0));
 		}
 	}
 }
@@ -1317,19 +1309,16 @@ void Debugger::drawScreenEffects() {
 				Common::Rect r((entry.x + x) * 2, (entry.y + y) * 2, (entry.x + x) * 2 + 2, (entry.y + y) * 2 + 2);
 
 				int ec = entry.data[j++];
-				Color256 color = entry.palette[ec];
-				int bladeToScummVmConstant = 256 / 16;
-
-				Graphics::PixelFormat _pixelFormat = createRGB555();
-				int color555 = _pixelFormat.RGBToColor(
-					CLIP(color.r * bladeToScummVmConstant, 0, 255),
-					CLIP(color.g * bladeToScummVmConstant, 0, 255),
-					CLIP(color.b * bladeToScummVmConstant, 0, 255));
-				_vm->_surfaceFront.fillRect(r, color555);
+				const int bladeToScummVmConstant = 256 / 16;
+
+				int color = _vm->_surfaceFront.format.RGBToColor(
+					CLIP(entry.palette[ec].r * bladeToScummVmConstant, 0, 255),
+					CLIP(entry.palette[ec].g * bladeToScummVmConstant, 0, 255),
+					CLIP(entry.palette[ec].b * bladeToScummVmConstant, 0, 255));
+				_vm->_surfaceFront.fillRect(r, color);
 			}
 		}
 	}
 }
 
-
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/dialogue_menu.cpp b/engines/bladerunner/dialogue_menu.cpp
index 6339fa1..fb777d9 100644
--- a/engines/bladerunner/dialogue_menu.cpp
+++ b/engines/bladerunner/dialogue_menu.cpp
@@ -332,10 +332,10 @@ void DialogueMenu::draw(Graphics::Surface &s) {
 
 	Common::Point mouse = _vm->getMousePos();
 	if (mouse.x >= x && mouse.x < x2) {
-		s.vLine(mouse.x, y1 + 8, y2 + 2, 0x2108);
+		s.vLine(mouse.x, y1 + 8, y2 + 2, s.format.RGBToColor(64, 64, 64));
 	}
 	if (mouse.y >= y && mouse.y < y2) {
-		s.hLine(x1 + 8, mouse.y, x2 + 2, 0x2108);
+		s.hLine(x1 + 8, mouse.y, x2 + 2, s.format.RGBToColor(64, 64, 64));
 	}
 
 	_shapes[0].draw(s, x1, y1);
@@ -346,7 +346,7 @@ void DialogueMenu::draw(Graphics::Surface &s) {
 	for (int i = 0; i != _listSize; ++i) {
 		_shapes[1].draw(s, x1, y);
 		_shapes[4].draw(s, x2, y);
-		uint16 color = ((_items[i].colorIntensity >> 1) << 10) | ((_items[i].colorIntensity >> 1) << 5) | _items[i].colorIntensity;
+		uint16 color = s.format.RGBToColor((_items[i].colorIntensity / 2) * (256 / 32), (_items[i].colorIntensity / 2) * (256 / 32), _items[i].colorIntensity * (256 / 32));
 		_vm->_mainFont->drawColor(_items[i].text, s, x, y, color);
 		y += kLineHeight;
 	}
@@ -519,7 +519,12 @@ void DialogueMenu::darkenRect(Graphics::Surface &s, int x1, int y1, int x2, int
 		for (int y = y1; y != y2; ++y) {
 			for (int x = x1; x != x2; ++x) {
 				uint16 *p = (uint16 *)s.getBasePtr(x, y);
-				*p = (*p & 0x739C) >> 2; // 0 11100 11100 11100
+				uint8 r, g, b;
+				s.format.colorToRGB(*p, r, g, b);
+				r /= 4;
+				g /= 4;
+				b /= 4;
+				*p = s.format.RGBToColor(r, g, b);
 			}
 		}
 	}
diff --git a/engines/bladerunner/font.cpp b/engines/bladerunner/font.cpp
index 688bed1..6fa90e6 100644
--- a/engines/bladerunner/font.cpp
+++ b/engines/bladerunner/font.cpp
@@ -44,6 +44,7 @@ bool Font::open(const Common::String &fileName, int screenWidth, int screenHeigh
 	_screenHeight = screenHeight;
 	_spacing1 = spacing1;
 	_spacing2 = spacing2;
+	_defaultColor = color;
 	_color = color;
 
 	Common::ScopedPtr<Common::SeekableReadStream> stream(_vm->getResourceStream(fileName));
@@ -69,9 +70,11 @@ bool Font::open(const Common::String &fileName, int screenWidth, int screenHeigh
 		_characters[i].height = stream->readUint32LE();
 		_characters[i].dataOffset = stream->readUint32LE();
 	}
+
 	for (int i = 0; i < _dataSize; i++) {
 		_data[i] = stream->readUint16LE();
 	}
+
 	return true;
 }
 
@@ -90,10 +93,7 @@ void Font::setSpacing(int spacing1, int spacing2) {
 }
 
 void Font::setColor(uint16 color) {
-	if (_data && _color != color) {
-		replaceColor(_color, color);
-		_color = color;
-	}
+	_color = color;
 }
 
 void Font::draw(const Common::String &text, Graphics::Surface &surface, int x, int y) const {
@@ -114,9 +114,7 @@ void Font::draw(const Common::String &text, Graphics::Surface &surface, int x, i
 }
 
 void Font::drawColor(const Common::String &text, Graphics::Surface &surface, int x, int y, uint16 color) {
-	if (_color != color) {
-		setColor(color);
-	}
+	setColor(color);
 	draw(text, surface, x, y);
 }
 
@@ -159,23 +157,12 @@ void Font::reset() {
 	_screenHeight = 0;
 	_spacing1 = 0;
 	_spacing2 = 0;
-	_color = 0x7FFF;
+	_color = screenPixelForrmat().RGBToColor(255, 255, 255);
 	_intersperse = 0;
 
 	memset(_characters, 0, 256 * sizeof(Character));
 }
 
-void Font::replaceColor(uint16 oldColor, uint16 newColor) {
-	if (!_data || !_dataSize) {
-		return;
-	}
-	for (int i = 0; i < _dataSize; i++) {
-		if (_data[i] == oldColor) {
-			_data[i] = newColor;
-		}
-	}
-}
-
 void Font::drawCharacter(const uint8 character, Graphics::Surface &surface, int x, int y) const {
 	uint8 characterIndex = character + 1;
 	if (x < 0 || x >= _screenWidth || y < 0 || y >= _screenHeight || !_data || characterIndex >= _characterCount) {
@@ -208,8 +195,14 @@ void Font::drawCharacter(const uint8 character, Graphics::Surface &surface, int
 		int currentX = x;
 		int endX = width + x - 1;
 		while (currentX <= endX && currentX < _screenWidth) {
-			if ((*srcPtr & 0x8000) == 0) {
-				*dstPtr = *srcPtr;
+			uint8 a, r, g, b;
+			gameDataPixelFormat().colorToARGB(*srcPtr, a, r, g, b);
+			if (!a) {
+				if (_color == _defaultColor) {
+					*dstPtr = surface.format.RGBToColor(r, g, b);
+				} else {
+					*dstPtr = _color;
+				}
 			}
 			dstPtr++;
 			srcPtr++;
diff --git a/engines/bladerunner/font.h b/engines/bladerunner/font.h
index 4af2546..ba5b327 100644
--- a/engines/bladerunner/font.h
+++ b/engines/bladerunner/font.h
@@ -54,6 +54,7 @@ class Font {
 	int           _screenHeight;
 	int           _spacing1;
 	int           _spacing2;
+	uint16        _defaultColor;
 	uint16        _color;
 	int           _intersperse;
 
@@ -76,7 +77,6 @@ public:
 
 private:
 	void reset();
-	void replaceColor(uint16 oldColor, uint16 newColor);
 
 	void drawCharacter(const uint8 character, Graphics::Surface &surface, int x, int y) const;
 };
diff --git a/engines/bladerunner/image.cpp b/engines/bladerunner/image.cpp
index 19f9f00..bdd952b 100644
--- a/engines/bladerunner/image.cpp
+++ b/engines/bladerunner/image.cpp
@@ -73,8 +73,8 @@ bool Image::open(const Common::String &name) {
 #endif
 	}
 
-	const Graphics::PixelFormat pixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
-	_surface.init(width, height, 2*width, data, pixelFormat);
+	_surface.init(width, height, 2*width, data, gameDataPixelFormat());
+	_surface.convertToInPlace(screenPixelForrmat());
 
 	delete[] buf;
 	delete stream;
diff --git a/engines/bladerunner/obstacles.cpp b/engines/bladerunner/obstacles.cpp
index 1886de3..c94f271 100644
--- a/engines/bladerunner/obstacles.cpp
+++ b/engines/bladerunner/obstacles.cpp
@@ -950,7 +950,7 @@ void Obstacles::draw() {
 				_polygons[i].vertices[j].y
 			));
 
-			_vm->_surfaceFront.drawLine(p0.x, p0.y, p1.x, p1.y, 0x7FFF);
+			_vm->_surfaceFront.drawLine(p0.x, p0.y, p1.x, p1.y, _vm->_surfaceFront.format.RGBToColor(255, 255, 255));
 
 			p0 = p1;
 		}
@@ -964,17 +964,17 @@ void Obstacles::draw() {
 		Vector3 p2 = _vm->_view->calculateScreenPosition(playerPos + Vector3( 12.0f, 0.0f,  12.0f));
 		Vector3 p3 = _vm->_view->calculateScreenPosition(playerPos + Vector3(-12.0f, 0.0f,  12.0f));
 
-		_vm->_surfaceFront.drawLine(p0.x, p0.y, p1.x, p1.y, 0x7C00);
-		_vm->_surfaceFront.drawLine(p1.x, p1.y, p2.x, p2.y, 0x7C00);
-		_vm->_surfaceFront.drawLine(p2.x, p2.y, p3.x, p3.y, 0x7C00);
-		_vm->_surfaceFront.drawLine(p3.x, p3.y, p0.x, p0.y, 0x7C00);
+		_vm->_surfaceFront.drawLine(p0.x, p0.y, p1.x, p1.y, _vm->_surfaceFront.format.RGBToColor(255, 0, 0));
+		_vm->_surfaceFront.drawLine(p1.x, p1.y, p2.x, p2.y, _vm->_surfaceFront.format.RGBToColor(255, 0, 0));
+		_vm->_surfaceFront.drawLine(p2.x, p2.y, p3.x, p3.y, _vm->_surfaceFront.format.RGBToColor(255, 0, 0));
+		_vm->_surfaceFront.drawLine(p3.x, p3.y, p0.x, p0.y, _vm->_surfaceFront.format.RGBToColor(255, 0, 0));
 	}
 
 	// draw path along polygons
 	for (int i = 1; i < _pathSize; ++i) {
 		Vector3 p0 = _vm->_view->calculateScreenPosition(Vector3(_path[i - 1].x, y, _path[i - 1].y));
 		Vector3 p1 = _vm->_view->calculateScreenPosition(Vector3(_path[i].x, y, _path[i].y));
-		_vm->_surfaceFront.drawLine(p0.x, p0.y, p1.x, p1.y, 0x7C00);
+		_vm->_surfaceFront.drawLine(p0.x, p0.y, p1.x, p1.y, _vm->_surfaceFront.format.RGBToColor(255, 0, 0));
 	}
 
 	// draw "next" vertex
diff --git a/engines/bladerunner/outtake.cpp b/engines/bladerunner/outtake.cpp
index 986f6fc5..e38dff1 100644
--- a/engines/bladerunner/outtake.cpp
+++ b/engines/bladerunner/outtake.cpp
@@ -35,7 +35,7 @@ namespace BladeRunner {
 
 OuttakePlayer::OuttakePlayer(BladeRunnerEngine *vm) {
 	_vm = vm;
-	_surfaceVideo.create(_vm->_surfaceBack.w, _vm->_surfaceBack.h, createRGB555());
+	_surfaceVideo.create(_vm->_surfaceBack.w, _vm->_surfaceBack.h, screenPixelForrmat());
 }
 
 OuttakePlayer::~OuttakePlayer() {
diff --git a/engines/bladerunner/savefile.cpp b/engines/bladerunner/savefile.cpp
index b1e5aa3..0a20f50 100644
--- a/engines/bladerunner/savefile.cpp
+++ b/engines/bladerunner/savefile.cpp
@@ -143,8 +143,8 @@ bool SaveFileManager::readHeader(Common::SeekableReadStream &in, SaveFileHeader
 		void *thumbnailData = malloc(kThumbnailSize); // freed by ScummVM's smartptr
 		s.read(thumbnailData, kThumbnailSize);
 
-		header._thumbnail->init(80, 60, 160, thumbnailData, createRGB555());
-
+		header._thumbnail->init(80, 60, 160, thumbnailData, gameDataPixelFormat());
+		header._thumbnail->convertToInPlace(screenPixelForrmat());
 		s.seek(pos);
 	}
 
diff --git a/engines/bladerunner/shape.cpp b/engines/bladerunner/shape.cpp
index 828a8b2..39a7758 100644
--- a/engines/bladerunner/shape.cpp
+++ b/engines/bladerunner/shape.cpp
@@ -103,22 +103,22 @@ void Shape::draw(Graphics::Surface &surface, int x, int y) const {
 		return;
 	}
 
-	byte *src_p = _data + 2 * (src_y * _width + src_x);
-	byte *dst_p = (byte *)surface.getBasePtr(dst_x, dst_y);
+	const uint8 *src_p = _data + 2 * (src_y * _width + src_x);
 
 	for (int yi = 0; yi != rect_h; ++yi) {
 		for (int xi = 0; xi != rect_w; ++xi) {
-			uint16 color = READ_LE_UINT16(src_p);
-			if ((color & 0x8000) == 0) {
-				*(uint16 *)dst_p = color;
-			}
-
+			uint16 shpColor = READ_LE_UINT16(src_p);
 			src_p += 2;
-			dst_p += 2;
-		}
 
+			uint8 a, r, g, b;
+			gameDataPixelFormat().colorToARGB(shpColor, a, r, g, b);
+			uint16 outColor = (uint16)surface.format.ARGBToColor(a, r, g, b);
+
+			if (!a) {
+				*(uint16 *)(surface.getBasePtr(dst_x + xi, dst_y + yi)) = outColor;
+			}
+		}
 		src_p += 2 * (_width - rect_w);
-		dst_p += surface.pitch - 2 * rect_w;
 	}
 }
 
diff --git a/engines/bladerunner/slice_animations.cpp b/engines/bladerunner/slice_animations.cpp
index 1b2c2e2..2cff038 100644
--- a/engines/bladerunner/slice_animations.cpp
+++ b/engines/bladerunner/slice_animations.cpp
@@ -56,10 +56,8 @@ bool SliceAnimations::open(const Common::String &name) {
 			_palettes[i].color[j].g = color_g;
 			_palettes[i].color[j].b = color_b;
 
-			uint16 rgb555 = ((uint16)color_r << 10) |
-			                ((uint16)color_g <<  5) |
-			                 (uint16)color_b;
-
+			const int bladeToScummVmConstant = 256 / 32; // 5 bits to 8 bits
+			uint16 rgb555 = screenPixelForrmat().RGBToColor(color_r * bladeToScummVmConstant, color_g * bladeToScummVmConstant, color_b * bladeToScummVmConstant);
 			_palettes[i].color555[j] = rgb555;
 		}
 	}
diff --git a/engines/bladerunner/slice_renderer.cpp b/engines/bladerunner/slice_renderer.cpp
index 73d0cef..e497b15 100644
--- a/engines/bladerunner/slice_renderer.cpp
+++ b/engines/bladerunner/slice_renderer.cpp
@@ -36,7 +36,7 @@ namespace BladeRunner {
 
 SliceRenderer::SliceRenderer(BladeRunnerEngine *vm) {
 	_vm = vm;
-	_pixelFormat = createRGB555();
+	_pixelFormat = screenPixelForrmat();
 
 	for (int i = 0; i < 942; i++) { // yes, its going just to 942 and not 997
 		_animationsShadowEnabled[i] = true;
@@ -442,7 +442,6 @@ void SliceRenderer::drawInWorld(int animationId, int animationFrame, Vector3 pos
 
 	int frameY = sliceLineIterator._startY;
 
-	uint16 *frameLinePtr  = (uint16 *)surface.getPixels() + 640 * frameY;
 	uint16 *zBufferLinePtr = zbuffer + 640 * frameY;
 
 	while (sliceLineIterator._currentY <= sliceLineIterator._endY) {
@@ -468,13 +467,12 @@ void SliceRenderer::drawInWorld(int animationId, int animationFrame, Vector3 pos
 		_setEffectColor.g = setEffectColor.g * 31.0f * 65536.0f;
 		_setEffectColor.b = setEffectColor.b * 31.0f * 65536.0f;
 
-		if (frameY >= 0 && frameY < 480) {
-			drawSlice((int)sliceLine, true, frameLinePtr, zBufferLinePtr, frameY);
+		if (frameY >= 0 && frameY < surface.h) {
+			drawSlice((int)sliceLine, true, (uint16 *)surface.getBasePtr(0, frameY), zBufferLinePtr, frameY);
 		}
 
 		sliceLineIterator.advance();
 		frameY += 1;
-		frameLinePtr += 640;
 		zBufferLinePtr += 640;
 	}
 }
@@ -527,16 +525,14 @@ void SliceRenderer::drawOnScreen(int animationId, int animationFrame, int screen
 	float currentSlice = 0;
 	float sliceStep = 1.0f / size / _frameSliceHeight;
 
-	uint16 *frameLinePtr = (uint16 *)surface.getPixels() + 640 * frameY;
 	uint16 lineZbuffer[640];
 
 	while (currentSlice < _frameSliceCount) {
-		if (currentY >= 0 && currentY < 480) {
+		if (currentY >= 0 && currentY < surface.h) {
 			memset(lineZbuffer, 0xFF, 640 * 2);
-			drawSlice(currentSlice, false, frameLinePtr, lineZbuffer, currentY);
+			drawSlice(currentSlice, false, (uint16 *)surface.getBasePtr(0, currentY), lineZbuffer, currentY);
 			currentSlice += sliceStep;
 			currentY--;
-			frameLinePtr -= 640;
 		}
 	}
 }
@@ -730,7 +726,12 @@ void SliceRenderer::drawShadowPolygon(int transparency, Graphics::Surface &surfa
 			if (z >= zMin) {
 				int index = (x & 3) + ((y & 3) << 2);
 				if (transparency - ditheringFactor[index] <= 0) {
-					*pixel = ((*pixel & 0x7BDE) >> 1) + ((*pixel & 0x739C) >> 2);
+					uint8 r, g, b;
+					surface.format.colorToRGB(*pixel, r, g, b);
+					r *= 0.75f;
+					g *= 0.75f;
+					b *= 0.75f;
+					*pixel = surface.format.RGBToColor(r, g, b);
 				}
 			}
 		}
diff --git a/engines/bladerunner/ui/esper.cpp b/engines/bladerunner/ui/esper.cpp
index 6414154..513b980 100644
--- a/engines/bladerunner/ui/esper.cpp
+++ b/engines/bladerunner/ui/esper.cpp
@@ -95,13 +95,13 @@ void ESPER::open(Graphics::Surface *surface) {
 		return;
 	}
 
-	_surfacePhoto.create(kPhotoWidth, kPhotoHeight, createRGB555());
+	_surfacePhoto.create(kPhotoWidth, kPhotoHeight, gameDataPixelFormat());
 
-	_surfaceViewport.create(_screen.width(), _screen.height(), createRGB555());
+	_surfaceViewport.create(_screen.width(), _screen.height(), screenPixelForrmat());
 
 	_viewportNext = _viewport;
 
-	_vm->_mainFont->setColor(0x001F);
+	_vm->_mainFont->setColor(surface->format.RGBToColor(0, 0, 248));
 
 	_shapeButton = new Shape(_vm);
 	if (!_shapeButton->open("ESPBUTTN.SHP", 0)) {
@@ -562,7 +562,7 @@ void ESPER::draw(Graphics::Surface &surface) {
 		drawPhotoOpening(surface);
 		break;
 	case kEsperMainStateClear:
-		surface.fillRect(_screen, 0x0000);
+		surface.fillRect(_screen, surface.format.RGBToColor(0, 0, 0));
 		break;
 	case kEsperMainStatePhoto:
 		if (_isScrolling) {
@@ -585,7 +585,7 @@ void ESPER::draw(Graphics::Surface &surface) {
 								viewportXToScreenX(_regions[i].rectInner.right),
 								viewportYToScreenY(_regions[i].rectInner.bottom)
 							),
-							0x7FE0
+							surface.format.RGBToColor(248, 248, 0)
 						);
 						surface.frameRect(
 							Common::Rect(
@@ -594,7 +594,7 @@ void ESPER::draw(Graphics::Surface &surface) {
 								viewportXToScreenX(_regions[i].rectOuter.right),
 								viewportYToScreenY(_regions[i].rectOuter.bottom)
 							),
-							0x7FE0
+							surface.format.RGBToColor(248, 248, 0)
 						);
 					}
 				}
@@ -660,10 +660,10 @@ void ESPER::drawPhotoOpening(Graphics::Surface &surface) {
 	}
 	copyImageScale(&_surfacePhoto, _viewport, &surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
 
-	surface.hLine(_screen.left,           _photoOpeningHeight,     _screen.right  - 1, 0x03E0);
-	surface.vLine(_photoOpeningWidth,     _screen.top,             _screen.bottom - 1, 0x03E0);
-	surface.hLine(_screen.left,           _photoOpeningHeight - 1, _screen.right  - 1, 0x0240);
-	surface.vLine(_photoOpeningWidth - 1, _screen.top,             _screen.bottom - 1, 0x0240);
+	surface.hLine(_screen.left,           _photoOpeningHeight,     _screen.right  - 1, surface.format.RGBToColor(0, 248, 0));
+	surface.vLine(_photoOpeningWidth,     _screen.top,             _screen.bottom - 1, surface.format.RGBToColor(0, 248, 0));
+	surface.hLine(_screen.left,           _photoOpeningHeight - 1, _screen.right  - 1, surface.format.RGBToColor(0, 144, 0));
+	surface.vLine(_photoOpeningWidth - 1, _screen.top,             _screen.bottom - 1, surface.format.RGBToColor(0, 144, 0));
 
 	drawGrid(surface);
 
@@ -818,10 +818,10 @@ void ESPER::drawPhotoSharpening(Graphics::Surface &surface) {
 
 	}
 	drawGrid(surface);
-	surface.hLine(_screen.left,           _photoOpeningHeight,     _screen.right  - 1, 0x03E0);
-	surface.vLine(_photoOpeningWidth,     _screen.top,             _screen.bottom - 1, 0x03E0);
-	surface.hLine(_screen.left,           _photoOpeningHeight - 1, _screen.right  - 1, 0x0240);
-	surface.vLine(_photoOpeningWidth - 1, _screen.top,             _screen.bottom - 1, 0x0240);
+	surface.hLine(_screen.left,           _photoOpeningHeight,     _screen.right  - 1, surface.format.RGBToColor(0, 248, 0));
+	surface.vLine(_photoOpeningWidth,     _screen.top,             _screen.bottom - 1, surface.format.RGBToColor(0, 248, 0));
+	surface.hLine(_screen.left,           _photoOpeningHeight - 1, _screen.right  - 1, surface.format.RGBToColor(0, 144, 0));
+	surface.vLine(_photoOpeningWidth - 1, _screen.top,             _screen.bottom - 1, surface.format.RGBToColor(0, 144, 0));
 	if (!needMoreSharpening) {
 		if (_regionSelectedAck && !_regions[_regionSelected].name.empty()){
 			setStatePhoto(kEsperPhotoStateVideoShow);
@@ -949,11 +949,11 @@ void ESPER::drawPhoto(Graphics::Surface &surface) {
 
 void ESPER::drawGrid(Graphics::Surface &surface) {
 	for (int i = 0; i < 7; ++i) {
-		surface.drawLine(_screen.left + i * 50, _screen.top, _screen.left + i * 50, _screen.bottom - 1, 0x109C);
+		surface.drawLine(_screen.left + i * 50, _screen.top, _screen.left + i * 50, _screen.bottom - 1, surface.format.RGBToColor(32, 32, 224));
 	}
 
 	for (int i = 0; i < 7; ++i) {
-		surface.drawLine(_screen.left, _screen.top + i * 44, _screen.right - 1, _screen.top + i * 44, 0x109C);
+		surface.drawLine(_screen.left, _screen.top + i * 44, _screen.right - 1, _screen.top + i * 44, surface.format.RGBToColor(32, 32, 224));
 	}
 }
 
@@ -968,9 +968,9 @@ void ESPER::drawSelection(Graphics::Surface &surface, bool crosshair, int style)
 	int right  = CLIP(_selection.right,  _screen.left, (int16)(_screen.right  - 1));
 	int bottom = CLIP(_selection.bottom, _screen.top,  (int16)(_screen.bottom - 1));
 
-	int color = 0x0240;
+	int color = surface.format.RGBToColor(0, 144, 0);
 	if (style) {
-		color = 0x03E0;
+		color = surface.format.RGBToColor(0, 248, 0);
 	}
 
 	// selection rectangle
@@ -998,7 +998,7 @@ void ESPER::drawSelection(Graphics::Surface &surface, bool crosshair, int style)
 
 		// ghosting
 		if (_selectionCrosshairX != right) {
-			surface.vLine(_selectionCrosshairX, _screen.top, _screen.bottom - 1, 0x0240);
+			surface.vLine(_selectionCrosshairX, _screen.top, _screen.bottom - 1, surface.format.RGBToColor(0, 144, 0));
 			if (abs(_selectionCrosshairX - right) <= 1) {
 				_selectionCrosshairX = right;
 			} else {
@@ -1006,7 +1006,7 @@ void ESPER::drawSelection(Graphics::Surface &surface, bool crosshair, int style)
 			}
 		}
 		if (_selectionCrosshairY != bottom) {
-			surface.hLine(_screen.left, _selectionCrosshairY, _screen.right - 1, 0x0240);
+			surface.hLine(_screen.left, _selectionCrosshairY, _screen.right - 1, surface.format.RGBToColor(0, 144, 0));
 			if (abs(_selectionCrosshairY - bottom) <= 1) {
 				_selectionCrosshairY = bottom;
 			} else {
@@ -1014,8 +1014,8 @@ void ESPER::drawSelection(Graphics::Surface &surface, bool crosshair, int style)
 			}
 		}
 
-		surface.vLine(right,        _screen.top, _screen.bottom - 1, 0x03E0);
-		surface.hLine(_screen.left, bottom,      _screen.right  - 1, 0x03E0);
+		surface.vLine(right,        _screen.top, _screen.bottom - 1, surface.format.RGBToColor(0, 248, 0));
+		surface.hLine(_screen.left, bottom,      _screen.right  - 1, surface.format.RGBToColor(0, 248, 0));
 	}
 }
 
@@ -1026,13 +1026,13 @@ void ESPER::drawVideoFrame(Graphics::Surface &surface) {
 
 void ESPER::drawTextCoords(Graphics::Surface &surface) {
 	if (_vm->_language == Common::RU_RUS) {
-		_vm->_mainFont->drawColor(Common::String::format("gh %04.0f", _zoom / _zoomMin * 2.0f  ), surface, 155, 364, 0x001F);
-		_vm->_mainFont->drawColor(Common::String::format("dh %04d",   12 * _viewport.top  +  98), surface, 260, 364, 0x001F);
-		_vm->_mainFont->drawColor(Common::String::format("uh %04d",   12 * _viewport.left + 167), surface, 364, 364, 0x001F);
+		_vm->_mainFont->drawColor(Common::String::format("gh %04.0f", _zoom / _zoomMin * 2.0f  ), surface, 155, 364, surface.format.RGBToColor(0, 0, 255));
+		_vm->_mainFont->drawColor(Common::String::format("dh %04d",   12 * _viewport.top  +  98), surface, 260, 364, surface.format.RGBToColor(0, 0, 255));
+		_vm->_mainFont->drawColor(Common::String::format("uh %04d",   12 * _viewport.left + 167), surface, 364, 364, surface.format.RGBToColor(0, 0, 255));
 	} else {
-		_vm->_mainFont->drawColor(Common::String::format("ZM %04.0f", _zoom / _zoomMin * 2.0f  ), surface, 155, 364, 0x001F);
-		_vm->_mainFont->drawColor(Common::String::format("NS %04d",   12 * _viewport.top  +  98), surface, 260, 364, 0x001F);
-		_vm->_mainFont->drawColor(Common::String::format("EW %04d",   12 * _viewport.left + 167), surface, 364, 364, 0x001F);
+		_vm->_mainFont->drawColor(Common::String::format("ZM %04.0f", _zoom / _zoomMin * 2.0f  ), surface, 155, 364, surface.format.RGBToColor(0, 0, 255));
+		_vm->_mainFont->drawColor(Common::String::format("NS %04d",   12 * _viewport.top  +  98), surface, 260, 364, surface.format.RGBToColor(0, 0, 255));
+		_vm->_mainFont->drawColor(Common::String::format("EW %04d",   12 * _viewport.left + 167), surface, 364, 364, surface.format.RGBToColor(0, 0, 255));
 	}
 }
 
@@ -1083,10 +1083,10 @@ void ESPER::drawMouse(Graphics::Surface &surface) {
 					_isDrawingSelection = false;
 				}
 			}
-			surface.vLine(p.x,     p.y - 8, p.y - 1, 0x03E0);
-			surface.vLine(p.x,     p.y + 8, p.y + 1, 0x03E0);
-			surface.hLine(p.x - 8, p.y,     p.x - 1, 0x03E0);
-			surface.hLine(p.x + 8, p.y,     p.x + 1, 0x03E0);
+			surface.vLine(p.x,     p.y - 8, p.y - 1, surface.format.RGBToColor(0, 248, 0));
+			surface.vLine(p.x,     p.y + 8, p.y + 1, surface.format.RGBToColor(0, 248, 0));
+			surface.hLine(p.x - 8, p.y,     p.x - 1, surface.format.RGBToColor(0, 248, 0));
+			surface.hLine(p.x + 8, p.y,     p.x + 1, surface.format.RGBToColor(0, 248, 0));
 			_mouseOverScroll = -1;
 		} else if (p.x >= 85 && p.y >= 73 && p.x <= 484 && p.y <= 436) {
 			if (!_isDrawingSelection && _statePhoto != kEsperPhotoStateVideoShow && _zoom != 2.0f) {
@@ -1121,14 +1121,11 @@ void ESPER::drawMouse(Graphics::Surface &surface) {
 
 void ESPER::flashViewport() {
 	uint16 *ptr = (uint16 *)_surfaceViewport.getPixels();
-	for (int i = 0; i < _surfaceViewport.w * _surfaceViewport.h; ++i) {
-		int8 r = (*ptr >> 10) & 0x1F;
-		int8 g = (*ptr >>  5) & 0x1F;
-		int8 b = (*ptr      ) & 0x1F;
-		b = MIN(b * 2, 0x1F);
-		*ptr = r << 10 | g << 5 | b;
-
-		++ptr;
+	for (int i = 0; i < _surfaceViewport.w * _surfaceViewport.h; ++i, ++ptr) {
+		uint8 r, g, b;
+		_surfaceViewport.format.colorToRGB(*ptr, r, g, b);
+		b *= 2;
+		*ptr = _surfaceViewport.format.RGBToColor(r, g, b);
 	}
 }
 
@@ -1153,16 +1150,13 @@ void ESPER::copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphic
 				uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
 				uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
 
+				uint8 r, g, b;
+				src->format.colorToRGB(*srcPtr, r, g, b);
 				if (_flash) {
-					int8 r = (*srcPtr >> 10) & 0x1F;
-					int8 g = (*srcPtr >>  5) & 0x1F;
-					int8 b = (*srcPtr      ) & 0x1F;
 					// add blue-ish tint
-					b = MIN(b * 2, 0x1F);
-					*dstPtr = r << 10 | g << 5 | b;
-				} else {
-					*dstPtr = *srcPtr;
+					b *= 2;
 				}
+				*dstPtr = dst->format.RGBToColor(r, g, b);
 
 				srcX += srcDstWidthRatio;
 				srcXCounter += srcDstWidthRest;
@@ -1195,16 +1189,13 @@ void ESPER::copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphic
 				uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
 				uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
 
+				uint8 r, g, b;
+				src->format.colorToRGB(*srcPtr, r, g, b);
 				if (_flash) {
-					int8 r = (*srcPtr >> 10) & 0x1F;
-					int8 g = (*srcPtr >>  5) & 0x1F;
-					int8 b = (*srcPtr      ) & 0x1F;
 					// add blue-ish tint
-					b = MIN(b * 2, 0x1F);
-					*dstPtr = r << 10 | g << 5 | b;
-				} else {
-					*dstPtr = *srcPtr;
+					b *= 2;
 				}
+				*dstPtr = dst->format.RGBToColor(r, g, b);
 			}
 
 			srcYCounter += srcRect.height();
@@ -1259,16 +1250,13 @@ void ESPER::copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics
 						uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
 						uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
 
+						uint8 r, g, b;
+						src->format.colorToRGB(*srcPtr, r, g, b);
 						if (_flash) {
-							int8 r = (*srcPtr >> 10) & 0x1F;
-							int8 g = (*srcPtr >>  5) & 0x1F;
-							int8 b = (*srcPtr      ) & 0x1F;
 							// add blue-ish tint
-							b = MIN(b * 2, 0x1F);
-							*dstPtr = r << 10 | g << 5 | b;
-						} else {
-							*dstPtr = *srcPtr;
+							b *= 2;
 						}
+						*dstPtr = dst->format.RGBToColor(r, g, b);
 
 						++dstX;
 						++skipX;
@@ -1329,16 +1317,13 @@ void ESPER::copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics
 						uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
 						uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
 
+						uint8 r, g, b;
+						src->format.colorToRGB(*srcPtr, r, g, b);
 						if (_flash) {
-							int8 r = (*srcPtr >> 10) & 0x1F;
-							int8 g = (*srcPtr >>  5) & 0x1F;
-							int8 b = (*srcPtr      ) & 0x1F;
 							// add blue-ish tint
-							b = MIN(b * 2, 0x1F);
-							*dstPtr = r << 10 | g << 5 | b;
-						} else {
-							*dstPtr = *srcPtr;
+							b *= 2;
 						}
+						*dstPtr = dst->format.RGBToColor(r, g, b);
 
 						++dstX;
 						++skipX;
diff --git a/engines/bladerunner/ui/kia.cpp b/engines/bladerunner/ui/kia.cpp
index 4234f9f..1991074 100644
--- a/engines/bladerunner/ui/kia.cpp
+++ b/engines/bladerunner/ui/kia.cpp
@@ -310,7 +310,7 @@ void KIA::tick() {
 	}
 	if (_currentSectionId != kKIASectionQuit && _transitionId != 14) {
 		if (_vm->_settings->getDifficulty() > 0) {
-			_vm->_mainFont->drawColor(Common::String::format("%04d", _vm->_gameVars[kVariableChinyen]), _vm->_surfaceFront, 580, 341, 0x2991);
+			_vm->_mainFont->drawColor(Common::String::format("%04d", _vm->_gameVars[kVariableChinyen]), _vm->_surfaceFront, 580, 341, _vm->_surfaceFront.format.RGBToColor(80, 96, 136));
 		} else {
 			_shapes->get(39)->draw(_vm->_surfaceFront, 583, 342);
 		}
@@ -332,7 +332,7 @@ void KIA::tick() {
 			int height  = _playerPhotograph->getHeight();
 			_playerPhotograph->draw(_vm->_surfaceFront, 590 - width / 2, 80 - height / 2);
 		} else if (_playerImage.getPixels() != nullptr) {
-			_vm->_surfaceFront.fillRect(Common::Rect(549, 49, 631, 111), 0x7FFF);
+			_vm->_surfaceFront.fillRect(Common::Rect(549, 49, 631, 111), _vm->_surfaceFront.format.RGBToColor(255, 255, 255));
 			_vm->_surfaceFront.copyRectToSurface(_playerImage.getPixels(), _playerImage.pitch, 550, 50, _playerImage.w,  _playerImage.h);
 		}
 	}
@@ -370,7 +370,7 @@ void KIA::tick() {
 			_shapes->get(47)->draw(_vm->_surfaceFront, 182, 446);
 		}
 	}
-	_vm->_mainFont->drawColor("1.00", _vm->_surfaceFront, 438, 471, 0x1CE7); // 1.01 is DVD version, but only cd handling routines were changed, no game logic
+	_vm->_mainFont->drawColor("1.00", _vm->_surfaceFront, 438, 471, _vm->_surfaceFront.format.RGBToColor(56, 56, 56)); // 1.01 is DVD version, but only cd handling routines were changed, no game logic
 	if (!_transitionId) {
 		_buttons->drawTooltip(_vm->_surfaceFront, mouse.x, mouse.y);
 	}
diff --git a/engines/bladerunner/ui/kia_section_clues.cpp b/engines/bladerunner/ui/kia_section_clues.cpp
index 495458f..35a4294 100644
--- a/engines/bladerunner/ui/kia_section_clues.cpp
+++ b/engines/bladerunner/ui/kia_section_clues.cpp
@@ -120,10 +120,10 @@ void KIASectionClues::close() {
 void KIASectionClues::draw(Graphics::Surface &surface) {
 	_uiContainer->draw(surface);
 
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(0), surface, 300, 162, 0x77DF);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(2), surface, 440, 426, 0x2991);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(1), surface, 440, 442, 0x2991);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(4), surface, 440, 458, 0x2991);
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(0), surface, 300, 162, surface.format.RGBToColor(232, 240, 255));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(2), surface, 440, 426, surface.format.RGBToColor(80, 96, 136));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(1), surface, 440, 442, surface.format.RGBToColor(80, 96, 136));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(4), surface, 440, 458, surface.format.RGBToColor(80, 96, 136));
 
 	int clueId = _cluesScrollBox->getSelectedLineData();
 	if (clueId != -1) {
@@ -135,7 +135,7 @@ void KIASectionClues::draw(Graphics::Surface &surface) {
 		} else {
 			text.clear();
 		}
-		_vm->_mainFont->drawColor(text, surface, 490, 426, 0x46BF);
+		_vm->_mainFont->drawColor(text, surface, 490, 426, surface.format.RGBToColor(136, 168, 255));
 
 		int crimeId = _vm->_crimesDatabase->getCrime(clueId);
 		if (crimeId != -1) {
@@ -143,7 +143,7 @@ void KIASectionClues::draw(Graphics::Surface &surface) {
 		} else {
 			text.clear();
 		}
-		_vm->_mainFont->drawColor(text, surface, 490, 442, 0x46BF);
+		_vm->_mainFont->drawColor(text, surface, 490, 442, surface.format.RGBToColor(136, 168, 255));
 
 		int assetType = _vm->_crimesDatabase->getAssetType(clueId);
 		if (assetType != -1) {
@@ -151,17 +151,17 @@ void KIASectionClues::draw(Graphics::Surface &surface) {
 		} else {
 			text.clear();
 		}
-		_vm->_mainFont->drawColor(text, surface, 490, 458, 0x46BF);
+		_vm->_mainFont->drawColor(text, surface, 490, 458, surface.format.RGBToColor(136, 168, 255));
 	}
 
 	_buttons->draw(surface);
 	_buttons->drawTooltip(surface, _mouseX, _mouseY);
 
 	if (_debugNop) {
-		_vm->_mainFont->drawColor(Common::String::format("Debug display: %s", _vm->_textActorNames->getText(_debugNop)), surface, 120, 132, 0x7FE0);
+		_vm->_mainFont->drawColor(Common::String::format("Debug display: %s", _vm->_textActorNames->getText(_debugNop)), surface, 120, 132, surface.format.RGBToColor(255, 255, 0));
 	}
 	if (_debugIntangible) {
-		_vm->_mainFont->drawColor("Debug Mode: Showing intangible clues.", surface, 220, 105, 0x7FE0);
+		_vm->_mainFont->drawColor("Debug Mode: Showing intangible clues.", surface, 220, 105, surface.format.RGBToColor(255, 255, 0));
 	}
 }
 
diff --git a/engines/bladerunner/ui/kia_section_crimes.cpp b/engines/bladerunner/ui/kia_section_crimes.cpp
index f3452a8..9937209 100644
--- a/engines/bladerunner/ui/kia_section_crimes.cpp
+++ b/engines/bladerunner/ui/kia_section_crimes.cpp
@@ -142,15 +142,15 @@ void KIASectionCrimes::draw(Graphics::Surface &surface) {
 	}
 	if (_suspectPhotoShapeId == 14 || _suspectPhotoShapeId == 13) {
 		text = _vm->_textKIA->getText(49);
-		_vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 218, 0x7FFF);
+		_vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 218, surface.format.RGBToColor(255, 255, 255));
 	}
 
 	surface.fillRect(Common::Rect(120, 134, 250, 145), 0);
-	surface.hLine(120, 133, 250, 0x18A5);
-	surface.hLine(120, 146, 250, 0x2D4C);
-	surface.vLine(119, 134, 145, 0x18A5);
-	surface.vLine(251, 134, 145, 0x2D4C);
-	surface.hLine(251, 146, 251, 0x2509);
+	surface.hLine(120, 133, 250, surface.format.RGBToColor(48, 40, 40));
+	surface.hLine(120, 146, 250, surface.format.RGBToColor(88, 80, 96));
+	surface.vLine(119, 134, 145, surface.format.RGBToColor(48, 40, 40));
+	surface.vLine(251, 134, 145, surface.format.RGBToColor(88, 80, 96));
+	surface.hLine(251, 146, 251, surface.format.RGBToColor(72, 64, 72));
 
 	if (_crimeSelected == -1) {
 		text = _vm->_textKIA->getText(49);
@@ -158,14 +158,14 @@ void KIASectionCrimes::draw(Graphics::Surface &surface) {
 		text = _vm->_textCrimes->getText(_crimeSelected);
 	}
 
-	_vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, 0x46BF);
+	_vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, surface.format.RGBToColor(136, 168, 255));
 
 	surface.fillRect(Common::Rect(136, 304, 266, 315), 0);
-	surface.hLine(136, 303, 266, 0x18A5);
-	surface.hLine(136, 316, 266, 0x2D4C);
-	surface.vLine(135, 304, 315, 0x18A5);
-	surface.vLine(267, 304, 315, 0x2D4C);
-	surface.hLine(267, 316, 267, 0x2509);
+	surface.hLine(136, 303, 266, surface.format.RGBToColor(48, 40, 40));
+	surface.hLine(136, 316, 266, surface.format.RGBToColor(88, 80, 96));
+	surface.vLine(135, 304, 315, surface.format.RGBToColor(48, 40, 40));
+	surface.vLine(267, 304, 315, surface.format.RGBToColor(88, 80, 96));
+	surface.hLine(267, 316, 267, surface.format.RGBToColor(72, 64, 72));
 
 	char generatedText[64];
 	if (_suspectSelected == -1) {
@@ -182,7 +182,7 @@ void KIASectionCrimes::draw(Graphics::Surface &surface) {
 			text = generatedText;
 		}
 	}
-	_vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 306, 0x46BF);
+	_vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 306, surface.format.RGBToColor(136, 168, 255));
 
 	_uiContainer->draw(surface);
 	_buttons->draw(surface);
diff --git a/engines/bladerunner/ui/kia_section_diagnostic.cpp b/engines/bladerunner/ui/kia_section_diagnostic.cpp
index 333cf63..9c1f57d 100644
--- a/engines/bladerunner/ui/kia_section_diagnostic.cpp
+++ b/engines/bladerunner/ui/kia_section_diagnostic.cpp
@@ -31,7 +31,24 @@
 
 namespace BladeRunner {
 
-const int KIASectionDiagnostic::kTextColors[] = { 0x0000, 0x0821, 0x1061, 0x1C82, 0x24C2, 0x2CE3, 0x3524, 0x4145, 0x4586, 0x4DC7, 0x5609, 0x5E4B, 0x668C, 0x6EEE, 0x7730, 0x7B92 };
+const Color256  KIASectionDiagnostic::kTextColors[] = {
+	{ 0, 0, 0 },
+	{ 16, 8, 8 },
+	{ 32, 24, 8 },
+	{ 56, 32, 16 },
+	{ 72, 48, 16 },
+	{ 88, 56, 24 },
+	{ 104, 72, 32 },
+	{ 128, 80, 40 },
+	{ 136, 96, 48 },
+	{ 152, 112, 56 },
+	{ 168, 128, 72 },
+	{ 184, 144, 88 },
+	{ 200, 160, 96 },
+	{ 216, 184, 112 },
+	{ 232, 200, 128 },
+	{ 240, 224, 144 }
+};
 
 KIASectionDiagnostic::KIASectionDiagnostic(BladeRunnerEngine *vm) : KIASectionBase(vm) {
 	_text     = nullptr;
@@ -68,7 +85,7 @@ void KIASectionDiagnostic::draw(Graphics::Surface &surface) {
 
 			const char *text = _text->getText(i);
 			if (text) {
-				_vm->_mainFont->drawColor(text, surface, 320 - _vm->_mainFont->getTextWidth(text) / 2, y, kTextColors[colorIndex]);
+				_vm->_mainFont->drawColor(text, surface, 320 - _vm->_mainFont->getTextWidth(text) / 2, y, surface.format.RGBToColor(kTextColors[colorIndex].r, kTextColors[colorIndex].g, kTextColors[colorIndex].b));
 			}
 		}
 	}
diff --git a/engines/bladerunner/ui/kia_section_diagnostic.h b/engines/bladerunner/ui/kia_section_diagnostic.h
index 1642586..0c518f2 100644
--- a/engines/bladerunner/ui/kia_section_diagnostic.h
+++ b/engines/bladerunner/ui/kia_section_diagnostic.h
@@ -23,6 +23,7 @@
 #ifndef BLADERUNNER_KIA_SECTION_DIAGNOSTIC_H
 #define BLADERUNNER_KIA_SECTION_DIAGNOSTIC_H
 
+#include "bladerunner/color.h"
 #include "bladerunner/ui/kia_section_base.h"
 
 namespace BladeRunner {
@@ -30,8 +31,8 @@ namespace BladeRunner {
 class TextResource;
 
 class KIASectionDiagnostic : public KIASectionBase {
-	static const int kTextColors[];
-	static const int kLineHeight = 18;
+	static const Color256 kTextColors[];
+	static const int      kLineHeight = 18;
 
 	TextResource *_text;
 	int           _offset;
diff --git a/engines/bladerunner/ui/kia_section_pogo.cpp b/engines/bladerunner/ui/kia_section_pogo.cpp
index 4388c0f..7b6022c 100644
--- a/engines/bladerunner/ui/kia_section_pogo.cpp
+++ b/engines/bladerunner/ui/kia_section_pogo.cpp
@@ -32,7 +32,24 @@
 
 namespace BladeRunner {
 
-const int KIASectionPogo::kTextColors[] = { 0x0000, 0x0821, 0x1061, 0x1C82, 0x24C2, 0x2CE3, 0x3524, 0x4145, 0x4586, 0x4DC7, 0x5609, 0x5E4B, 0x668C, 0x6EEE, 0x7730, 0x7B92 };
+const Color256 KIASectionPogo::kTextColors[] = {
+	{ 0, 0, 0 },
+	{ 16, 8, 8 },
+	{ 32, 24, 8 },
+	{ 56, 32, 16 },
+	{ 72, 48, 16 },
+	{ 88, 56, 24 },
+	{ 104, 72, 32 },
+	{ 128, 80, 40 },
+	{ 136, 96, 48 },
+	{ 152, 112, 56 },
+	{ 168, 128, 72 },
+	{ 184, 144, 88 },
+	{ 200, 160, 96 },
+	{ 216, 184, 112 },
+	{ 232, 200, 128 },
+	{ 240, 224, 144 }
+};
 
 const char *KIASectionPogo::kStrings[] = {
 	"Air Conditioning",
@@ -242,7 +259,7 @@ void KIASectionPogo::draw(Graphics::Surface &surface) {
 	}
 
 	const char *title = "We 3 coders give special thanks to:";
-	_vm->_mainFont->drawColor(title, surface, 313 - _vm->_mainFont->getTextWidth(title) / 2, 143, 0x7BB8);
+	_vm->_mainFont->drawColor(title, surface, 313 - _vm->_mainFont->getTextWidth(title) / 2, 143, surface.format.RGBToColor(240, 232, 192));
 
 	int y = 158;
 	for (int i = 0; i < kLineCount; ++i) {
@@ -264,7 +281,7 @@ void KIASectionPogo::draw(Graphics::Surface &surface) {
 				colorIndex = 63 - colorIndex;
 			}
 			colorIndex /= 2;
-			_vm->_mainFont->drawColor(_lineTexts[i], surface, _lineOffsets[i], y, kTextColors[colorIndex]);
+			_vm->_mainFont->drawColor(_lineTexts[i], surface, _lineOffsets[i], y, surface.format.RGBToColor(kTextColors[colorIndex].r, kTextColors[colorIndex].g, kTextColors[colorIndex].b));
 		}
 		y += 10;
 	}
diff --git a/engines/bladerunner/ui/kia_section_pogo.h b/engines/bladerunner/ui/kia_section_pogo.h
index bcfd641..7392cde 100644
--- a/engines/bladerunner/ui/kia_section_pogo.h
+++ b/engines/bladerunner/ui/kia_section_pogo.h
@@ -23,15 +23,16 @@
 #ifndef BLADERUNNER_KIA_SECTION_POGO_H
 #define BLADERUNNER_KIA_SECTION_POGO_H
 
+#include "bladerunner/color.h"
 #include "bladerunner/ui/kia_section_base.h"
 
 namespace BladeRunner {
 
 class KIASectionPogo : public KIASectionBase {
-	static const int   kStringCount = 158;
-	static const int   kLineCount = 22;
-	static const char *kStrings[];
-	static const int   kTextColors[];
+	static const int      kStringCount = 158;
+	static const int      kLineCount = 22;
+	static const char    *kStrings[];
+	static const Color256 kTextColors[];
 
 	const char *_strings[kStringCount];
 	int         _stringIndex;
diff --git a/engines/bladerunner/ui/kia_section_save.cpp b/engines/bladerunner/ui/kia_section_save.cpp
index b8fcd2e..17320c4 100644
--- a/engines/bladerunner/ui/kia_section_save.cpp
+++ b/engines/bladerunner/ui/kia_section_save.cpp
@@ -150,35 +150,35 @@ void KIASectionSave::draw(Graphics::Surface &surface){
 	if (_state == kStateNormal) {
 		const char *textChooseSlot = _vm->_textOptions->getText(24); // Choose a slot ...
 		int textChooseSlotWidth = _vm->_mainFont->getTextWidth(textChooseSlot);
-		_vm->_mainFont->drawColor(textChooseSlot, surface, 308 - textChooseSlotWidth / 2, 143, 0x7BB8);
+		_vm->_mainFont->drawColor(textChooseSlot, surface, 308 - textChooseSlotWidth / 2, 143, surface.format.RGBToColor(240, 232, 192));
 
 		// Original game shows warnings/error here, but we don't have any
 
 		const char *textTypeName = _vm->_textOptions->getText(24); // Type a name ...
 		int textTypeNameWidth = _vm->_mainFont->getTextWidth(textTypeName);
-		_vm->_mainFont->drawColor(textTypeName, surface, 308 - textTypeNameWidth / 2, 352, 0x7BB8);
+		_vm->_mainFont->drawColor(textTypeName, surface, 308 - textTypeNameWidth / 2, 352, surface.format.RGBToColor(240, 232, 192));
 
 		_uiContainer->draw(surface);
 	} else if (_state == kStateOverwrite) {
-		surface.fillRect(Common::Rect(155, 230, 462, 239), 0x28E4);
+		surface.fillRect(Common::Rect(155, 230, 462, 239), surface.format.RGBToColor(80, 56, 32));
 
 		const Common::String &saveName = _saveList[_selectedLineId].getDescription();
 		int saveNameWidth = _vm->_mainFont->getTextWidth(saveName);
-		_vm->_mainFont->drawColor(saveName, surface, 308 - saveNameWidth / 2, 230, 0x7751);
+		_vm->_mainFont->drawColor(saveName, surface, 308 - saveNameWidth / 2, 230, surface.format.RGBToColor(232, 208, 136));
 
 		const char *textOverwrite = _vm->_textOptions->getText(35); // Overwrite previously saved game?
 		int textOverwriteWidth = _vm->_mainFont->getTextWidth(textOverwrite);
-		_vm->_mainFont->drawColor(textOverwrite, surface, 308 - textOverwriteWidth / 2, 240, 0x7BB8);
+		_vm->_mainFont->drawColor(textOverwrite, surface, 308 - textOverwriteWidth / 2, 240, surface.format.RGBToColor(240, 232, 192));
 	} else if (_state == kStateDelete) {
-		surface.fillRect(Common::Rect(155, 230, 462, 239), 0x28E4);
+		surface.fillRect(Common::Rect(155, 230, 462, 239), surface.format.RGBToColor(80, 56, 32));
 
 		const Common::String &saveName = _saveList[_selectedLineId].getDescription();
 		int saveNameWidth = _vm->_mainFont->getTextWidth(saveName); // Delete this game?
-		_vm->_mainFont->drawColor(saveName, surface, 308 - saveNameWidth / 2, 230, 0x7751);
+		_vm->_mainFont->drawColor(saveName, surface, 308 - saveNameWidth / 2, 230, surface.format.RGBToColor(232, 208, 136));
 
 		const char *textDelete = _vm->_textOptions->getText(40);
 		int textDeleteWidth = _vm->_mainFont->getTextWidth(textDelete);
-		_vm->_mainFont->drawColor(textDelete, surface, 308 - textDeleteWidth / 2, 240, 0x7BB8);
+		_vm->_mainFont->drawColor(textDelete, surface, 308 - textDeleteWidth / 2, 240, surface.format.RGBToColor(240, 232, 192));
 	}
 
 	int selectedLineId = _scrollBox->getSelectedLineData();
diff --git a/engines/bladerunner/ui/kia_section_settings.cpp b/engines/bladerunner/ui/kia_section_settings.cpp
index 24c24ac..5492fbe 100644
--- a/engines/bladerunner/ui/kia_section_settings.cpp
+++ b/engines/bladerunner/ui/kia_section_settings.cpp
@@ -167,35 +167,35 @@ void KIASectionSettings::draw(Graphics::Surface &surface) {
 	_uiContainer->draw(surface);
 	_playerAgendaSelector->draw(surface);
 
-	_vm->_mainFont->drawColor(textConversationChoices, surface, posConversationChoices, 280, 0x7751);
+	_vm->_mainFont->drawColor(textConversationChoices, surface, posConversationChoices, 280, surface.format.RGBToColor(232, 208, 136));
 
-	_vm->_mainFont->drawColor(textMusic, surface, posMusic, 150, 0x7751);
-	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 161, 0x6EEE);
-	_vm->_mainFont->drawColor(textLoud, surface, 462, 161, 0x6EEE);
+	_vm->_mainFont->drawColor(textMusic, surface, posMusic, 150, surface.format.RGBToColor(232, 208, 136));
+	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 161, surface.format.RGBToColor(216, 184, 112));
+	_vm->_mainFont->drawColor(textLoud, surface, 462, 161, surface.format.RGBToColor(216, 184, 112));
 
-	_vm->_mainFont->drawColor(textSoundEffects, surface, posSoundEffects, 175, 0x7751);
-	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 186, 0x6EEE);
-	_vm->_mainFont->drawColor(textLoud, surface, 462, 186, 0x6EEE);
+	_vm->_mainFont->drawColor(textSoundEffects, surface, posSoundEffects, 175, surface.format.RGBToColor(232, 208, 136));
+	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 186, surface.format.RGBToColor(216, 184, 112));
+	_vm->_mainFont->drawColor(textLoud, surface, 462, 186, surface.format.RGBToColor(216, 184, 112));
 
 #if BLADERUNNER_ORIGINAL_SETTINGS
-	_vm->_mainFont->drawColor(textAmbientSound, surface, posAmbientSound, 200, 0x7751);
-	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 211, 0x6EEE);
-	_vm->_mainFont->drawColor(textLoud, surface, 462, 211, 0x6EEE);
+	_vm->_mainFont->drawColor(textAmbientSound, surface, posAmbientSound, 200, surface.format.RGBToColor(232, 208, 136));
+	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 211, surface.format.RGBToColor(216, 184, 112));
+	_vm->_mainFont->drawColor(textLoud, surface, 462, 211, surface.format.RGBToColor(216, 184, 112));
 
-	_vm->_mainFont->drawColor(textSpeech, surface, posSpeech, 225, 0x7751);
-	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 236, 0x6EEE);
-	_vm->_mainFont->drawColor(textLoud, surface, 462, 236, 0x6EEE);
+	_vm->_mainFont->drawColor(textSpeech, surface, posSpeech, 225, surface.format.RGBToColor(232, 208, 136));
+	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 236, surface.format.RGBToColor(216, 184, 112));
+	_vm->_mainFont->drawColor(textLoud, surface, 462, 236, surface.format.RGBToColor(216, 184, 112));
 
-	_vm->_mainFont->drawColor(textGammaCorrection, surface, posGammaCorrection, 250, 0x7751);
-	_vm->_mainFont->drawColor(textDark, surface, posDark, 261, 0x6EEE);
-	_vm->_mainFont->drawColor(textLight, surface, 462, 261, 0x6EEE);
+	_vm->_mainFont->drawColor(textGammaCorrection, surface, posGammaCorrection, 250, surface.format.RGBToColor(232, 208, 136));
+	_vm->_mainFont->drawColor(textDark, surface, posDark, 261, surface.format.RGBToColor(216, 184, 112));
+	_vm->_mainFont->drawColor(textLight, surface, 462, 261, surface.format.RGBToColor(216, 184, 112));
 #else
-	_vm->_mainFont->drawColor(textSpeech, surface, posSpeech, 200, 0x7751);
-	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 211, 0x6EEE);
-	_vm->_mainFont->drawColor(textLoud, surface, 462, 211, 0x6EEE);
+	_vm->_mainFont->drawColor(textSpeech, surface, posSpeech, 200, surface.format.RGBToColor(232, 208, 136));
+	_vm->_mainFont->drawColor(textSoft, surface, posSoft, 211, surface.format.RGBToColor(216, 184, 112));
+	_vm->_mainFont->drawColor(textLoud, surface, 462, 211, surface.format.RGBToColor(216, 184, 112));
 #endif
 
-	_vm->_mainFont->drawColor(textDesignersCut, surface, 192, 365, 0x7751);
+	_vm->_mainFont->drawColor(textDesignersCut, surface, 192, 365, surface.format.RGBToColor(232, 208, 136));
 
 	if (_vm->_subtitles->isSystemActive()) {
 		// Allow this to be loading as an extra text item in the resource for text options
@@ -217,9 +217,9 @@ void KIASectionSettings::draw(Graphics::Surface &surface) {
 		const char *textSubtitles  = strcmp(_vm->_textOptions->getText(42), "") == 0? subtitlesTranslation : _vm->_textOptions->getText(42); // +1 to the max of original index of textOptions which is 41
 
 		if (_vm->_language == Common::RU_RUS) {
-			_vm->_mainFont->drawColor(textSubtitles, surface, 288, 376, 0x7751); // special case for Russian version, put the option in a new line to avoid overlap
+			_vm->_mainFont->drawColor(textSubtitles, surface, 288, 376, surface.format.RGBToColor(232, 208, 136)); // special case for Russian version, put the option in a new line to avoid overlap
 		} else {
-			_vm->_mainFont->drawColor(textSubtitles, surface, 323, 365, 0x7751); // moved further to the right to avoid overlap with 'Designer's Cut' in some language versions (ESP)
+			_vm->_mainFont->drawColor(textSubtitles, surface, 323, 365, surface.format.RGBToColor(232, 208, 136)); // moved further to the right to avoid overlap with 'Designer's Cut' in some language versions (ESP)
 		}
 	}
 
diff --git a/engines/bladerunner/ui/kia_section_suspects.cpp b/engines/bladerunner/ui/kia_section_suspects.cpp
index bf39732..220b269 100644
--- a/engines/bladerunner/ui/kia_section_suspects.cpp
+++ b/engines/bladerunner/ui/kia_section_suspects.cpp
@@ -175,7 +175,7 @@ void KIASectionSuspects::draw(Graphics::Surface &surface) {
 	}
 	if (_suspectPhotoShapeId == 14 || _suspectPhotoShapeId == 13) {
 		text = _vm->_textKIA->getText(49);
-		_vm->_mainFont->drawColor(text, surface, 190 - _vm->_mainFont->getTextWidth(text) / 2, 201, 0x7FFF);
+		_vm->_mainFont->drawColor(text, surface, 190 - _vm->_mainFont->getTextWidth(text) / 2, 201, surface.format.RGBToColor(255, 255, 255));
 	}
 
 	_whereaboutsCheckBox->setChecked(_whereaboutsFilter);
@@ -186,22 +186,22 @@ void KIASectionSuspects::draw(Graphics::Surface &surface) {
 
 	_uiContainer->draw(surface);
 
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(0),  surface, 300, 162, 0x77DF);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(46), surface, 142, 248, 0x77DF);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(47), surface, 142, 308, 0x77DF);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(14), surface, 154, 319, 0x25B3);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(15), surface, 154, 329, 0x31F7);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(16), surface, 154, 339, 0x3A5B);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(17), surface, 154, 349, 0x31F7);
-	_vm->_mainFont->drawColor(_vm->_textKIA->getText(48), surface, 154, 359, 0x25B3);
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(0),  surface, 300, 162, surface.format.RGBToColor(232, 240, 248));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(46), surface, 142, 248, surface.format.RGBToColor(232, 240, 248));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(47), surface, 142, 308, surface.format.RGBToColor(232, 240, 248));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(14), surface, 154, 319, surface.format.RGBToColor(72, 104, 152));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(15), surface, 154, 329, surface.format.RGBToColor(96, 120, 184));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(16), surface, 154, 339, surface.format.RGBToColor(112, 144, 216));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(17), surface, 154, 349, surface.format.RGBToColor(96, 120, 184));
+	_vm->_mainFont->drawColor(_vm->_textKIA->getText(48), surface, 154, 359, surface.format.RGBToColor(72, 104, 152));
 
 
 	surface.fillRect(Common::Rect(120, 134, 250, 145), 0);
-	surface.hLine(120, 133, 250, 0x18A5);
-	surface.hLine(120, 146, 250, 0x2D4C);
-	surface.vLine(119, 134, 145, 0x18A5);
-	surface.vLine(251, 134, 145, 0x2D4C);
-	surface.hLine(251, 146, 251, 0x2509);
+	surface.hLine(120, 133, 250, surface.format.RGBToColor(48, 40, 40));
+	surface.hLine(120, 146, 250, surface.format.RGBToColor(88, 80, 96));
+	surface.vLine(119, 134, 145, surface.format.RGBToColor(48, 40, 40));
+	surface.vLine(251, 134, 145, surface.format.RGBToColor(88, 80, 96));
+	surface.hLine(251, 146, 251, surface.format.RGBToColor(72, 64, 72));
 
 	char generatedText[64];
 	if (_suspectSelected == -1) {
@@ -219,7 +219,7 @@ void KIASectionSuspects::draw(Graphics::Surface &surface) {
 		}
 	}
 
-	_vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, 0x46BF);
+	_vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, surface.format.RGBToColor(136, 168, 248));
 
 	_buttons->draw(surface);
 	_buttons->drawTooltip(surface, _mouseX, _mouseY);
diff --git a/engines/bladerunner/ui/scores.cpp b/engines/bladerunner/ui/scores.cpp
index 3134299..4c4cb22 100644
--- a/engines/bladerunner/ui/scores.cpp
+++ b/engines/bladerunner/ui/scores.cpp
@@ -139,8 +139,8 @@ void Scores::tick() {
 	// vqaPlayer renders to _surfaceBack
 	blit(_vm->_surfaceBack, _vm->_surfaceFront);
 
-	_vm->_surfaceFront.hLine(200, 139, 400, 0x3e0);
-	_vm->_surfaceFront.hLine(200, 347, 400, 0x1f);
+	_vm->_surfaceFront.hLine(200, 139, 400, _vm->_surfaceFront.format.RGBToColor(0, 248, 0));
+	_vm->_surfaceFront.hLine(200, 347, 400, _vm->_surfaceFront.format.RGBToColor(0, 0, 248));
 
 	_font->draw(_txtScorers->getText(7), _vm->_surfaceFront, 200, 114);
 
diff --git a/engines/bladerunner/ui/ui_image_picker.cpp b/engines/bladerunner/ui/ui_image_picker.cpp
index cb7b61d..2a6d870 100644
--- a/engines/bladerunner/ui/ui_image_picker.cpp
+++ b/engines/bladerunner/ui/ui_image_picker.cpp
@@ -216,8 +216,8 @@ void UIImagePicker::draw(Graphics::Surface &surface) {
 		}
 
 		if (_vm->_debugger->_viewUI) {
-			surface.frameRect(img.rect, 0x7fff);
-			_vm->_mainFont->drawColor(Common::String::format("%d", i), surface, (img.rect.left + img.rect.right) / 2, (img.rect.top + img.rect.bottom) / 2, 0x7fff);
+			surface.frameRect(img.rect, surface.format.RGBToColor(255, 255, 255));
+			_vm->_mainFont->drawColor(Common::String::format("%d", i), surface, (img.rect.left + img.rect.right) / 2, (img.rect.top + img.rect.bottom) / 2, surface.format.RGBToColor(255, 255, 255));
 		}
 	}
 }
@@ -268,9 +268,9 @@ void UIImagePicker::drawTooltip(Graphics::Surface &surface, int x, int y) {
 		rect.top = 478 - height;
 	}
 
-	surface.fillRect(rect, 0);
-	surface.frameRect(rect, 0x7FFF);
-	_vm->_mainFont->drawColor(tooltip, surface, rect.left + 2, rect.top, 0x7FFF);
+	surface.fillRect(rect, surface.format.RGBToColor(0, 0, 0));
+	surface.frameRect(rect, surface.format.RGBToColor(255, 255, 255));
+	_vm->_mainFont->drawColor(tooltip, surface, rect.left + 2, rect.top, surface.format.RGBToColor(255, 255, 255));
 }
 
 bool UIImagePicker::handleMouseAction(int x, int y, bool down, bool up, bool ignore) {
diff --git a/engines/bladerunner/ui/ui_input_box.cpp b/engines/bladerunner/ui/ui_input_box.cpp
index 6ad2db2..e1b655e 100644
--- a/engines/bladerunner/ui/ui_input_box.cpp
+++ b/engines/bladerunner/ui/ui_input_box.cpp
@@ -55,10 +55,10 @@ void UIInputBox::draw(Graphics::Surface &surface) {
 	int rectHalfWidth = (_rect.right + _rect.left) / 2;
 	int textHalfWidth = _vm->_mainFont->getTextWidth(_text) / 2;
 
-	_vm->_mainFont->drawColor(_text, surface, rectHalfWidth - textHalfWidth, _rect.top, 0x4DC7); // 10011 01110 00111
+	_vm->_mainFont->drawColor(_text, surface, rectHalfWidth - textHalfWidth, _rect.top, surface.format.RGBToColor(152, 112, 56));
 
 	if (_cursorIsVisible) {
-		surface.vLine(textHalfWidth + rectHalfWidth + 2, _rect.top, _rect.bottom - 1, 0x7FDD); // 11111 11110 11101
+		surface.vLine(textHalfWidth + rectHalfWidth + 2, _rect.top, _rect.bottom - 1, surface.format.RGBToColor(248, 240, 232));
 	}
 
 	if (_vm->_time->currentSystem() - _timeLast > 500) {
diff --git a/engines/bladerunner/ui/ui_scroll_box.cpp b/engines/bladerunner/ui/ui_scroll_box.cpp
index 5bf96c7..0273803 100644
--- a/engines/bladerunner/ui/ui_scroll_box.cpp
+++ b/engines/bladerunner/ui/ui_scroll_box.cpp
@@ -34,12 +34,52 @@
 
 namespace BladeRunner {
 
-const int UIScrollBox::k3DFrameColors[]        = { 0x1083, 0x14A5, 0x14A6, 0x2508, 0x5230, 0x5230, 0x0000, 0x0000 };
-const int UIScrollBox::kTextBackgroundColors[] = { 0x14EA, 0x190C, 0x1D2E, 0x2570, 0x4F1F, 0x0000 };
-const int UIScrollBox::kTextColors1[]          = { 0x25B3, 0x31F7, 0x3A5B, 0x46BF, 0x4F1F };
-const int UIScrollBox::kTextColors2[]          = { 0x677F, 0x6F9F, 0x73BF, 0x77DF, 0x7FFF };
-const int UIScrollBox::kTextColors3[]          = { 0x7BB8, 0x7BBA, 0x7BDB, 0x7FDD, 0x7FFF };
-const int UIScrollBox::kTextColors4[]          = { 0x4DC7, 0x5E4B, 0x6EEE, 0x7751, 0x7F92 };
+const Color256 UIScrollBox::k3DFrameColors[] = {
+	{ 32, 32, 24 },
+	{ 40, 40, 40 },
+	{ 40, 40, 48 },
+	{ 72, 64, 64 },
+	{ 160, 136, 128 },
+	{ 160, 136, 128 },
+	{ 0, 0, 0 },
+	{ 0, 0, 0 }
+};
+const Color256 UIScrollBox::kTextBackgroundColors[] = {
+	{ 40, 56, 80 },
+	{ 48, 64, 96 },
+	{ 56, 72, 112 },
+	{ 72, 88, 128 },
+	{ 152, 192, 248 },
+	{ 0, 0, 0 }
+};
+const Color256 UIScrollBox::kTextColors1[] = {
+	{ 72, 104, 152 },
+	{ 96, 120, 184 },
+	{ 112, 144, 216 },
+	{ 136, 168, 248 },
+	{ 152, 192, 248 }
+};
+const Color256 UIScrollBox::kTextColors2[] = {
+	{ 200, 216, 248 },
+	{ 216, 224, 248 },
+	{ 224, 232, 248 },
+	{ 232, 240, 248 },
+	{ 248, 248, 248 }
+};
+const Color256 UIScrollBox::kTextColors3[] = {
+	{ 240, 232, 192 },
+	{ 240, 232, 208 },
+	{ 240, 240, 216 },
+	{ 248, 240, 232 },
+	{ 248, 248, 248 }
+};
+const Color256 UIScrollBox::kTextColors4[] = {
+	{ 152, 112, 56 },
+	{ 184, 144, 88 },
+	{ 216, 184, 112 },
+	{ 232, 208, 136 },
+	{ 248, 224, 144 }
+};
 
 UIScrollBox::UIScrollBox(BladeRunnerEngine *vm, UIScrollBoxCallback *lineSelectedCallback, void *callbackData, int maxLineCount, int style, bool center, Common::Rect rect, Common::Rect scrollBarRect) : UIComponent(vm) {
 	_selectedLineState     = 0;
@@ -438,16 +478,16 @@ void UIScrollBox::draw(Graphics::Surface &surface) {
 			if ((((_selectedLineState == 0 && i == _hoveredLine) || (_selectedLineState == 2 && i == _selectedLineIndex && _selectedLineIndex == _hoveredLine)) && _lines[i]->lineData != -1) || _lines[i]->flags & 0x04) {
 				v35 = true;
 				if (_style) {
-					color = kTextColors2[colorIndex];
+					color = surface.format.RGBToColor(kTextColors2[colorIndex].r, kTextColors2[colorIndex].g, kTextColors2[colorIndex].b);
 				} else {
-					color = kTextColors3[colorIndex];
+					color = surface.format.RGBToColor(kTextColors3[colorIndex].r, kTextColors3[colorIndex].g, kTextColors3[colorIndex].b);
 				}
 			}
 			else {
 				if (_style) {
-					color = kTextColors1[colorIndex];
+					color = surface.format.RGBToColor(kTextColors1[colorIndex].r, kTextColors1[colorIndex].g, kTextColors1[colorIndex].b);
 				} else {
-					color = kTextColors4[colorIndex];
+					color = surface.format.RGBToColor(kTextColors4[colorIndex].r, kTextColors4[colorIndex].g, kTextColors4[colorIndex].b);
 				}
 			}
 
@@ -492,9 +532,9 @@ void UIScrollBox::draw(Graphics::Surface &surface) {
 			if (_lines[i]->flags & 0x08) { // has background rectangle
 				int colorBackground = 0;
 				if (_style) {
-					colorBackground = kTextBackgroundColors[colorIndex];
+					colorBackground = surface.format.RGBToColor(kTextBackgroundColors[colorIndex].r, kTextBackgroundColors[colorIndex].g, kTextBackgroundColors[colorIndex].b);
 				} else {
-					colorBackground = 0x28E4;
+					colorBackground = surface.format.RGBToColor(80, 56, 32);
 				}
 				surface.fillRect(Common::Rect(x, y, _rect.right + 1, y1 + 1), colorBackground);
 			}
@@ -639,14 +679,15 @@ void UIScrollBox::draw3DFrame(Graphics::Surface &surface, Common::Rect rect, boo
 	int color1, color2;
 
 	if (pressed) {
-		color1 = k3DFrameColors[style + 6];
-		color2 = k3DFrameColors[style + 4];
+		color1 = surface.format.RGBToColor(k3DFrameColors[style + 6].r, k3DFrameColors[style + 6].g, k3DFrameColors[style + 6].b);
+		color2 = surface.format.RGBToColor(k3DFrameColors[style + 4].r, k3DFrameColors[style + 4].g, k3DFrameColors[style + 4].b);
 	} else {
-		color1 = k3DFrameColors[style + 4];
-		color2 = k3DFrameColors[style + 6];
+		color1 = surface.format.RGBToColor(k3DFrameColors[style + 4].r, k3DFrameColors[style + 4].g, k3DFrameColors[style + 4].b);
+		color2 = surface.format.RGBToColor(k3DFrameColors[style + 6].r, k3DFrameColors[style + 6].g, k3DFrameColors[style + 6].b);
 	}
 
-	int fillColor = k3DFrameColors[style + 2];
+	int color3 = surface.format.RGBToColor(k3DFrameColors[style].r, k3DFrameColors[style].g, k3DFrameColors[style].b);
+	int fillColor = surface.format.RGBToColor(k3DFrameColors[style + 2].r, k3DFrameColors[style + 2].g, k3DFrameColors[style + 2].b);
 
 	surface.fillRect(Common::Rect(rect.left + 1, rect.top + 1, rect.right - 1, rect.bottom - 1), fillColor);
 
@@ -654,8 +695,8 @@ void UIScrollBox::draw3DFrame(Graphics::Surface &surface, Common::Rect rect, boo
 	surface.hLine(rect.left + 1,  rect.bottom - 1, rect.right - 2,  color2);
 	surface.vLine(rect.left,      rect.top,        rect.bottom - 2, color1);
 	surface.vLine(rect.right - 1, rect.top + 1,    rect.bottom - 1, color2);
-	surface.hLine(rect.right - 1, rect.top,        rect.right - 1,  k3DFrameColors[style]);
-	surface.hLine(rect.left,      rect.bottom - 1, rect.left,       k3DFrameColors[style]);
+	surface.hLine(rect.right - 1, rect.top,        rect.right - 1,  color3);
+	surface.hLine(rect.left,      rect.bottom - 1, rect.left,       color3);
 }
 
 void UIScrollBox::scrollUp() {
diff --git a/engines/bladerunner/ui/ui_scroll_box.h b/engines/bladerunner/ui/ui_scroll_box.h
index f2b40a9..1cd2913 100644
--- a/engines/bladerunner/ui/ui_scroll_box.h
+++ b/engines/bladerunner/ui/ui_scroll_box.h
@@ -23,6 +23,7 @@
 #ifndef BLADERUNNER_UI_SCROLLBOX_H
 #define BLADERUNNER_UI_SCROLLBOX_H
 
+#include "bladerunner/color.h"
 #include "bladerunner/ui/ui_component.h"
 
 #include "common/array.h"
@@ -35,12 +36,12 @@ typedef void UIScrollBoxCallback(void *callbackData, void *source, int lineData,
 
 class UIScrollBox : public UIComponent {
 	static const int kLineHeight = 10;
-	static const int k3DFrameColors[];
-	static const int kTextBackgroundColors[];
-	static const int kTextColors1[];
-	static const int kTextColors2[];
-	static const int kTextColors3[];
-	static const int kTextColors4[];
+	static const Color256 k3DFrameColors[];
+	static const Color256 kTextBackgroundColors[];
+	static const Color256 kTextColors1[];
+	static const Color256 kTextColors2[];
+	static const Color256 kTextColors3[];
+	static const Color256 kTextColors4[];
 
 	struct Line {
 		Common::String text;
diff --git a/engines/bladerunner/ui/ui_slider.cpp b/engines/bladerunner/ui/ui_slider.cpp
index c008331..c1a5d0a 100644
--- a/engines/bladerunner/ui/ui_slider.cpp
+++ b/engines/bladerunner/ui/ui_slider.cpp
@@ -29,7 +29,24 @@
 
 namespace BladeRunner {
 
-const uint16 UISlider::kColors[] = { 0x0000, 0x0821, 0x1061, 0x1C82, 0x24C2, 0x2CE3, 0x3524, 0x4145, 0x4586, 0x4DC7, 0x5609, 0x5E4B, 0x668C, 0x6EEE, 0x7730, 0x7B92 };
+const Color256 UISlider::kColors[] = {
+	{ 0, 0, 0 },
+	{ 16, 8, 8 },
+	{ 32, 24, 8 },
+	{ 56, 32, 16 },
+	{ 72, 48, 16 },
+	{ 88, 56, 24 },
+	{ 104, 72, 32 },
+	{ 128, 80, 40 },
+	{ 136, 96, 48 },
+	{ 152, 112, 56 },
+	{ 168, 128, 72 },
+	{ 184, 144, 88 },
+	{ 200, 160, 96 },
+	{ 216, 184, 112 },
+	{ 232, 200, 128 },
+	{ 240, 224, 144 }
+};
 
 UISlider::UISlider(BladeRunnerEngine *vm, UIComponentCallback *valueChangedCallback, void *callbackData, Common::Rect rect, int maxValue, int value)
 	: UIComponent(vm) {
@@ -70,7 +87,7 @@ void UISlider::draw(Graphics::Surface &surface) {
 		--_currentFrameColor;
 	}
 
-	surface.frameRect(_rect, kColors[_currentFrameColor]);
+	surface.frameRect(_rect, surface.format.RGBToColor(kColors[_currentFrameColor].r, kColors[_currentFrameColor].g, kColors[_currentFrameColor].b));
 
 	int sliderX = 0;
 	if (_maxValue <= 1) {
@@ -98,7 +115,7 @@ void UISlider::draw(Graphics::Surface &surface) {
 				colorIndex = 3;
 			}
 
-			uint16 color = kColors[colorIndex];
+			uint16 color = surface.format.RGBToColor(kColors[colorIndex].r, kColors[colorIndex].g, kColors[colorIndex].b);
 			if ((striding + x) & 1 || x == sliderX) {
 				color = 0;
 			}
diff --git a/engines/bladerunner/ui/ui_slider.h b/engines/bladerunner/ui/ui_slider.h
index 2783cb0..146f638 100644
--- a/engines/bladerunner/ui/ui_slider.h
+++ b/engines/bladerunner/ui/ui_slider.h
@@ -23,6 +23,7 @@
 #ifndef BLADERUNNER_UI_SLIDER_H
 #define BLADERUNNER_UI_SLIDER_H
 
+#include "bladerunner/color.h"
 #include "bladerunner/ui/ui_component.h"
 
 #include "common/rect.h"
@@ -30,7 +31,7 @@
 namespace BladeRunner {
 
 class UISlider : public UIComponent {
-	static const uint16   kColors[];
+	static const Color256 kColors[];
 
 	UIComponentCallback *_valueChangedCallback;
 	void                *_callbackData;
diff --git a/engines/bladerunner/ui/vk.cpp b/engines/bladerunner/ui/vk.cpp
index d6055d5..821cf26 100644
--- a/engines/bladerunner/ui/vk.cpp
+++ b/engines/bladerunner/ui/vk.cpp
@@ -115,7 +115,7 @@ void VK::open(int actorId, int calibrationRatio) {
 		return;
 	}
 
-	_surfaceEye.create(172, 116, createRGB555());
+	_surfaceEye.create(172, 116, screenPixelForrmat());
 	_vqaPlayerEye = new VQAPlayer(_vm, &_surfaceEye, eyeVqa);
 	if (!_vqaPlayerEye->open()) {
 		return;
@@ -683,16 +683,15 @@ void VK::drawNeedle(Graphics::Surface &surface) {
 
 	float colorIntensity = MIN(78.0f, _needleValue + 39.0f) / 78.0f;
 
-	int r =  6 * colorIntensity;
-	int g =  8 * colorIntensity;
-	int b = 12 * colorIntensity;
+	uint16 color1 = surface.format.RGBToColor(56 - 48 * colorIntensity, 144 - 64 * colorIntensity, 184 - 96 * colorIntensity);
+	uint16 color2 = surface.format.RGBToColor(56 - 24 * colorIntensity, 144 - 32 * colorIntensity, 184 - 48 * colorIntensity);
 
-	surface.drawLine(203, 324, x - 2, y,     ((7 - r    ) << 10) | ((18 - g    ) << 5) | (23 - b    ));
-	surface.drawLine(203, 324, x + 2, y,     ((7 - r    ) << 10) | ((18 - g    ) << 5) | (23 - b    ));
-	surface.drawLine(203, 324, x - 1, y,     ((7 - r / 2) << 10) | ((18 - g / 2) << 5) | (23 - b / 2));
-	surface.drawLine(203, 324, x + 1, y,     ((7 - r / 2) << 10) | ((18 - g / 2) << 5) | (23 - b / 2));
-	surface.drawLine(203, 324, x,     y - 1, ((7 - r / 2) << 10) | ((18 - g / 2) << 5) | (23 - b / 2));
-	surface.drawLine(203, 324, x,     y,     0x1E57);
+	surface.drawLine(203, 324, x - 2, y,     color1);
+	surface.drawLine(203, 324, x + 2, y,     color1);
+	surface.drawLine(203, 324, x - 1, y,     color2);
+	surface.drawLine(203, 324, x + 1, y,     color2);
+	surface.drawLine(203, 324, x,     y - 1, color2);
+	surface.drawLine(203, 324, x,     y,     surface.format.RGBToColor(56, 144, 184));
 }
 
 void VK::drawEye(Graphics::Surface &surface) {
@@ -701,24 +700,24 @@ void VK::drawEye(Graphics::Surface &surface) {
 }
 
 void VK::drawEyeCrosshair(Graphics::Surface &surface, int timeNow) {
-	surface.drawLine(315,                                        _eyeLineY,     486,                                        _eyeLineY,     0x848u);
-	surface.drawLine(315,                                        _eyeLineY - 1, 486,                                        _eyeLineY - 1, 0x848u);
-	surface.drawLine(315,                                        _eyeLineY,     _vm->_rnd.getRandomNumberRng(10, 20) + 315, _eyeLineY,     0x84Au);
-	surface.drawLine(486 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineY,     486,                                        _eyeLineY,     0x84Au);
-	surface.drawLine(486 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineY - 1, 486,                                        _eyeLineY - 1, 0x846u);
-	surface.drawLine(315,                                        _eyeLineY - 1, _vm->_rnd.getRandomNumberRng(10, 20) + 315, _eyeLineY - 1, 0x846u);
-
-	surface.drawLine(_eyeLineX,     281,                                        _eyeLineX,     396,                                        0x848u);
-	surface.drawLine(_eyeLineX - 1, 281,                                        _eyeLineX - 1, 396,                                        0x848u);
-	surface.drawLine(_eyeLineX,     281,                                        _eyeLineX,     _vm->_rnd.getRandomNumberRng(10, 20) + 281, 0x846u);
-	surface.drawLine(_eyeLineX,     396 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineX,     396,                                        0x846u);
-	surface.drawLine(_eyeLineX - 1, 396 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineX - 1, 396,                                        0x84Au);
-	surface.drawLine(_eyeLineX - 1, 281,                                        _eyeLineX - 1, _vm->_rnd.getRandomNumberRng(10, 20) + 281, 0x84Au);
+	surface.drawLine(315,                                        _eyeLineY,     486,                                        _eyeLineY,     surface.format.RGBToColor(16, 16, 64));
+	surface.drawLine(315,                                        _eyeLineY - 1, 486,                                        _eyeLineY - 1, surface.format.RGBToColor(16, 16, 64));
+	surface.drawLine(315,                                        _eyeLineY,     _vm->_rnd.getRandomNumberRng(10, 20) + 315, _eyeLineY,     surface.format.RGBToColor(16, 16, 80));
+	surface.drawLine(486 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineY,     486,                                        _eyeLineY,     surface.format.RGBToColor(16, 16, 80));
+	surface.drawLine(486 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineY - 1, 486,                                        _eyeLineY - 1, surface.format.RGBToColor(16, 16, 48));
+	surface.drawLine(315,                                        _eyeLineY - 1, _vm->_rnd.getRandomNumberRng(10, 20) + 315, _eyeLineY - 1, surface.format.RGBToColor(16, 16, 48));
+
+	surface.drawLine(_eyeLineX,     281,                                        _eyeLineX,     396,                                        surface.format.RGBToColor(16, 16, 64));
+	surface.drawLine(_eyeLineX - 1, 281,                                        _eyeLineX - 1, 396,                                        surface.format.RGBToColor(16, 16, 64));
+	surface.drawLine(_eyeLineX,     281,                                        _eyeLineX,     _vm->_rnd.getRandomNumberRng(10, 20) + 281, surface.format.RGBToColor(16, 16, 48));
+	surface.drawLine(_eyeLineX,     396 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineX,     396,                                        surface.format.RGBToColor(16, 16, 48));
+	surface.drawLine(_eyeLineX - 1, 396 - _vm->_rnd.getRandomNumberRng(10, 20), _eyeLineX - 1, 396,                                        surface.format.RGBToColor(16, 16, 80));
+	surface.drawLine(_eyeLineX - 1, 281,                                        _eyeLineX - 1, _vm->_rnd.getRandomNumberRng(10, 20) + 281, surface.format.RGBToColor(16, 16, 80));
 
 	if (timeNow >= _timeNextEyeLineStart) {
 		if (_eyeLineSelected) {
 			if (_eyeLineYLast != _eyeLineY) {
-				surface.drawLine(315, _eyeLineYLast, 486, _eyeLineYLast, 0x844u);
+				surface.drawLine(315, _eyeLineYLast, 486, _eyeLineYLast, surface.format.RGBToColor(16, 16, 32));
 			}
 			_eyeLineYLast = _eyeLineY;
 			if (timeNow >= _timeNextEyeLineStep) {
@@ -738,7 +737,7 @@ void VK::drawEyeCrosshair(Graphics::Surface &surface, int timeNow) {
 			}
 		} else {
 			if (_eyeLineXLast != _eyeLineX) {
-				surface.drawLine(_eyeLineXLast, 281, _eyeLineXLast, 396, 0x844u);
+				surface.drawLine(_eyeLineXLast, 281, _eyeLineXLast, 396, surface.format.RGBToColor(16, 16, 32));
 			}
 			_eyeLineXLast = _eyeLineX;
 			if (timeNow >= _timeNextEyeLineStep) {
diff --git a/engines/bladerunner/vqa_decoder.cpp b/engines/bladerunner/vqa_decoder.cpp
index 05ad7a8..e97d238 100644
--- a/engines/bladerunner/vqa_decoder.cpp
+++ b/engines/bladerunner/vqa_decoder.cpp
@@ -830,42 +830,31 @@ bool VQADecoder::VQAVideoTrack::readVPTR(Common::SeekableReadStream *s, uint32 s
 }
 
 void VQADecoder::VQAVideoTrack::VPTRWriteBlock(Graphics::Surface *surface, unsigned int dstBlock, unsigned int srcBlock, int count, bool alpha) {
-	uint16 *frame        = (uint16 *)surface->getPixels();
-	uint16  frame_width  = _width;
-	uint32  frame_stride = surface->w;
-	uint16  block_width  = _blockW;
-	uint16  block_height = _blockH;
+	const uint8 *const block_src = &_codebook[2 * srcBlock * _blockW * _blockH];
 
-	const uint8 *const block_src =
-		&_codebook[2 * srcBlock * block_width * block_height];
+	int blocks_per_line = _width / _blockW;
 
-	int blocks_per_line = frame_width / block_width;
+	for (int i = 0; i < count; ++i) {
+		uint32 dst_x = (dstBlock + i) % blocks_per_line * _blockW + _offsetX;
+		uint32 dst_y = (dstBlock + i) / blocks_per_line * _blockH + _offsetY;
 
-	do {
-		uint32 frame_x = dstBlock % blocks_per_line * block_width  + _offsetX;
-		uint32 frame_y = dstBlock / blocks_per_line * block_height + _offsetY;
-
-		uint32 dst_offset = frame_x + frame_y * frame_stride;
+		const uint8 *src_p = block_src;
 
-		const uint8 *__restrict src = block_src;
-		uint16      *__restrict dst = frame + dst_offset;
+		for (int y = 0; y != _blockH; ++y) {
+			for (int x = 0; x != _blockW; ++x) {
+				uint16 vqaColor = READ_LE_UINT16(src_p);
+				src_p += 2;
 
-		unsigned int block_y;
-		for (block_y = 0; block_y != block_height; ++block_y) {
-			unsigned int block_x;
-			for (block_x = 0; block_x != block_width; ++block_x) {
-				uint16 rgb555 = src[0] | (src[1] << 8);
-				src += 2;
+				uint8 a, r, g, b;
+				gameDataPixelFormat().colorToARGB(vqaColor, a, r, g, b);
+				uint16 outColor = (uint16)surface->format.ARGBToColor(a, r, g, b);
 
-				if (!(alpha && (rgb555 & 0x8000)))
-					*dst = rgb555;
-				++dst;
+				if (!(alpha && a)) {
+					*(uint16 *)(surface->getBasePtr(dst_x + x, dst_y + y)) = outColor;
+				}
 			}
-			dst += frame_stride - block_width;
 		}
-
-		++dstBlock;
-	} while (--count);
+	}
 }
 
 bool VQADecoder::VQAVideoTrack::decodeFrame(Graphics::Surface *surface) {





More information about the Scummvm-git-logs mailing list