aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/graphics.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/graphics.h')
-rw-r--r--engines/agi/graphics.h105
1 files changed, 86 insertions, 19 deletions
diff --git a/engines/agi/graphics.h b/engines/agi/graphics.h
index fb596626c6..1cb595cdfa 100644
--- a/engines/agi/graphics.h
+++ b/engines/agi/graphics.h
@@ -29,13 +29,15 @@ namespace Agi {
#define SCRIPT_WIDTH 160
#define SCRIPT_HEIGHT 168
-#define DISPLAY_WIDTH 320
-#define DISPLAY_HEIGHT 200
-
-#define GFX_WIDTH 320
-#define GFX_HEIGHT 200
-#define CHAR_COLS 8
-#define CHAR_LINES 8
+#define VISUAL_WIDTH 160
+#define VISUAL_HEIGHT 200
+#define DISPLAY_DEFAULT_WIDTH 320
+#define DISPLAY_DEFAULT_HEIGHT 200
+
+enum GfxScreenUpscaledMode {
+ DISPLAY_UPSCALED_DISABLED = 0,
+ DISPLAY_UPSCALED_640x400 = 1
+};
class AgiEngine;
@@ -47,6 +49,7 @@ enum GfxScreenMasks {
struct MouseCursorData {
const byte *bitmapData;
+ byte *bitmapDataAllocated;
uint16 width;
uint16 height;
int hotspotX;
@@ -56,6 +59,7 @@ struct MouseCursorData {
class GfxMgr {
private:
AgiBase *_vm;
+ GfxFont *_font;
uint8 _paletteGfxMode[256 * 3];
uint8 _paletteTextMode[256 * 3];
@@ -64,7 +68,7 @@ private:
int _agipalFileNum;
public:
- GfxMgr(AgiBase *vm);
+ GfxMgr(AgiBase *vm, GfxFont *font);
int initVideo();
int deinitVideo();
@@ -78,18 +82,58 @@ public:
void setMouseCursor(bool busy = false);
void setRenderStartOffset(uint16 offsetY);
- uint16 getRenderStartOffsetY();
+ uint16 getRenderStartDisplayOffsetY();
+
+ void translateGamePosToDisplayScreen(int16 &x, int16 &y);
+ void translateVisualPosToDisplayScreen(int16 &x, int16 &y);
+ void translateDisplayPosToGameScreen(int16 &x, int16 &y);
+
+ void translateVisualDimensionToDisplayScreen(int16 &width, int16 &height);
+ void translateDisplayDimensionToVisualScreen(int16 &width, int16 &height);
+
+ void translateGameRectToDisplayScreen(int16 &x, int16 &y, int16 &width, int16 &height);
+ void translateVisualRectToDisplayScreen(int16 &x, int16 &y, int16 &width, int16 &height);
+ void translateDisplayRectToVisualScreen(int16 &x, int16 &y, int16 &width, int16 &height);
+
+ uint32 getDisplayOffsetToGameScreenPos(int16 x, int16 y);
+ uint32 getDisplayOffsetToVisualScreenPos(int16 x, int16 y);
+
+ void copyDisplayRectToScreen(int16 x, int16 y, int16 width, int16 height);
+ void copyDisplayRectToScreen(int16 x, int16 adjX, int16 y, int16 adjY, int16 width, int16 adjWidth, int16 height, int16 adjHeight);
+ void copyDisplayRectToScreenUsingGamePos(int16 x, int16 y, int16 width, int16 height);
+ void copyDisplayRectToScreenUsingVisualPos(int16 x, int16 y, int16 width, int16 height);
+ void copyDisplayToScreen();
+
+ void translateFontPosToDisplayScreen(int16 &x, int16 &y);
+ void translateDisplayPosToFontScreen(int16 &x, int16 &y);
+ void translateFontDimensionToDisplayScreen(int16 &width, int16 &height);
+ void translateFontRectToDisplayScreen(int16 &x, int16 &y, int16 &width, int16 &height);
+ Common::Rect getFontRectForDisplayScreen(int16 column, int16 row, int16 width, int16 height);
private:
uint _pixels;
- //uint16 _displayWidth;
- //uint16 _displayHeight;
uint _displayPixels;
byte *_activeScreen;
- byte *_visualScreen; // 160x168
- byte *_priorityScreen; // 160x168
- byte *_displayScreen; // 320x200
+ byte *_gameScreen; // 160x168 - screen, where the actual game content is drawn to (actual graphics, not including status line, prompt, etc.)
+ byte *_priorityScreen; // 160x168 - screen contains priority information of the game screen
+ // the term "visual screen" is effectively the display screen, but at 160x200 resolution. Used for coordinate translation
+ byte *_displayScreen; // 320x200 or 640x400 - screen, that the game is rendered to and which is then copied to framebuffer
+
+ uint16 _displayScreenWidth;
+ uint16 _displayScreenHeight;
+
+ uint16 _displayFontWidth;
+ uint16 _displayFontHeight;
+
+ uint16 _displayWidthMulAdjust;
+ uint16 _displayHeightMulAdjust;
+
+ /**
+ * This variable defines, if upscaled hires is active and what upscaled mode
+ * is used.
+ */
+ GfxScreenUpscaledMode _upscaledHires;
bool _priorityTableSet;
uint8 _priorityTable[SCRIPT_HEIGHT]; /**< priority table */
@@ -97,15 +141,32 @@ private:
MouseCursorData _mouseCursor;
MouseCursorData _mouseCursorBusy;
- uint16 _renderStartOffsetY;
+ uint16 _renderStartVisualOffsetY;
+ uint16 _renderStartDisplayOffsetY;
public:
+ uint16 getDisplayScreenWidth() {
+ return _displayScreenWidth;
+ }
+ uint16 getDisplayFontWidth() {
+ return _displayFontWidth;
+ }
+ uint16 getDisplayFontHeight() {
+ return _displayFontHeight;
+ }
+
+ GfxScreenUpscaledMode getUpscaledHires() {
+ return _upscaledHires;
+ }
+
void debugShowMap(int mapNr);
void clear(byte color, byte priority);
void clearDisplay(byte color, bool copyToScreen = true);
void putPixel(int16 x, int16 y, byte drawMask, byte color, byte priority);
void putPixelOnDisplay(int16 x, int16 y, byte color);
+ void putPixelOnDisplay(int16 x, int16 adjX, int16 y, int16 adjY, byte color);
+ void putFontPixelOnDisplay(int16 baseX, int16 baseY, int16 addX, int16 addY, byte color, bool isHires);
byte getColor(int16 x, int16 y);
byte getPriority(int16 x, int16 y);
@@ -119,6 +180,7 @@ public:
private:
void render_BlockEGA(int16 x, int16 y, int16 width, int16 height, bool copyToScreen);
void render_BlockCGA(int16 x, int16 y, int16 width, int16 height, bool copyToScreen);
+ void render_BlockHercules(int16 x, int16 y, int16 width, int16 height, bool copyToScreen);
public:
void transition_Amiga();
@@ -127,11 +189,9 @@ public:
void block_save(int16 x, int16 y, int16 width, int16 height, byte *bufferPtr);
void block_restore(int16 x, int16 y, int16 width, int16 height, byte *bufferPtr);
- void copyDisplayRectToScreen(int16 x, int16 y, int16 width, int16 height);
-
void drawBox(int16 x, int16 y, int16 width, int16 height, byte backgroundColor, byte lineColor);
- void drawRect(int16 x, int16 y, int16 width, int16 height, byte color);
void drawDisplayRect(int16 x, int16 y, int16 width, int16 height, byte color, bool copyToScreen = true);
+ void drawDisplayRect(int16 x, int16 adjX, int16 y, int16 adjY, int16 width, int16 adjWidth, int16 height, int16 adjHeight, byte color, bool copyToScreen = true);
private:
void drawDisplayRectEGA(int16 x, int16 y, int16 width, int16 height, byte color);
void drawDisplayRectCGA(int16 x, int16 y, int16 width, int16 height, byte color);
@@ -139,14 +199,21 @@ private:
public:
void drawCharacter(int16 row, int16 column, byte character, byte foreground, byte background, bool disabledLook);
void drawStringOnDisplay(int16 x, int16 y, const char *text, byte foreground, byte background);
+ void drawStringOnDisplay(int16 x, int16 adjX, int16 y, int16 adjY, const char *text, byte foregroundColor, byte backgroundColor);
void drawCharacterOnDisplay(int16 x, int16 y, byte character, byte foreground, byte background, byte transformXOR = 0, byte transformOR = 0);
void shakeScreen(int16 repeatCount);
void updateScreen();
void initPriorityTable();
+ void createDefaultPriorityTable(uint8 *priorityTable);
void setPriorityTable(int16 priorityBase);
- void setPriority(int16 yPos, int16 priority);
+ bool saveLoadWasPriorityTableModified();
+ int16 saveLoadGetPriority(int16 yPos);
+ void saveLoadSetPriorityTableModifiedBool(bool wasModified);
+ void saveLoadSetPriority(int16 yPos, int16 priority);
+ void saveLoadFigureOutPriorityTableModifiedBool();
+
int16 priorityToY(int16 priority);
int16 priorityFromY(int16 yPos);
};