aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/graphics/screen.h
diff options
context:
space:
mode:
authorathrxx2019-01-26 01:31:34 +0100
committerathrxx2019-03-06 20:48:15 +0100
commit1dfdcc7252ac83643cae7a7447c025da2af63843 (patch)
treeb6736d006bf67d5264dd171c336f0915695d1f88 /engines/kyra/graphics/screen.h
parent8b53d20b51771680c3d31aa02c0285b7a8be4e85 (diff)
downloadscummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.tar.gz
scummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.tar.bz2
scummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.zip
KYRA: cleanup dir
Reorganize all files in sub directories. The file placement isn't as intuitive as it might be for other engines, which is probably the reason why this hasn't been done before.
Diffstat (limited to 'engines/kyra/graphics/screen.h')
-rw-r--r--engines/kyra/graphics/screen.h736
1 files changed, 736 insertions, 0 deletions
diff --git a/engines/kyra/graphics/screen.h b/engines/kyra/graphics/screen.h
new file mode 100644
index 0000000000..44113e4372
--- /dev/null
+++ b/engines/kyra/graphics/screen.h
@@ -0,0 +1,736 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef KYRA_SCREEN_H
+#define KYRA_SCREEN_H
+
+#include "common/util.h"
+#include "common/func.h"
+#include "common/list.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "common/rendermode.h"
+#include "common/stream.h"
+
+class OSystem;
+
+namespace Graphics {
+class FontSJIS;
+} // End of namespace Graphics
+
+namespace Kyra {
+
+typedef Common::Functor0<void> UpdateFunctor;
+
+class KyraEngine_v1;
+class Screen;
+
+struct ScreenDim {
+ uint16 sx;
+ uint16 sy;
+ uint16 w;
+ uint16 h;
+ uint16 unk8;
+ uint16 unkA;
+ uint16 unkC;
+ uint16 unkE;
+};
+
+/**
+ * A class that handles KYRA fonts.
+ */
+class Font {
+public:
+ virtual ~Font() {}
+
+ /**
+ * Tries to load a file from the given stream
+ */
+ virtual bool load(Common::SeekableReadStream &file) = 0;
+
+ /**
+ * Whether the font draws on the overlay.
+ */
+ virtual bool usesOverlay() const { return false; }
+
+ /**
+ * The font height.
+ */
+ virtual int getHeight() const = 0;
+
+ /**
+ * The font width, this is the maximal character
+ * width.
+ */
+ virtual int getWidth() const = 0;
+
+ /**
+ * Gets the width of a specific character.
+ */
+ virtual int getCharWidth(uint16 c) const = 0;
+
+ /**
+ * Sets a text palette map. The map contains 16 entries.
+ */
+ virtual void setColorMap(const uint8 *src) = 0;
+
+ /**
+ * Sets a text 16bit palette map. Only used in in EOB II FM-Towns. The map contains 2 entries.
+ */
+ virtual void set16bitColorMap(const uint16 *src) {}
+
+ /**
+ * Draws a specific character.
+ *
+ * TODO/FIXME: Replace this with a nicer API. Currently
+ * the user has to assure that the character fits.
+ * We use this API, since it's hard to assure dirty rect
+ * handling from outside Screen.
+ */
+ virtual void drawChar(uint16 c, byte *dst, int pitch, int bpp) const = 0;
+};
+
+/**
+ * Implementation of the Font interface for DOS fonts.
+ *
+ * TODO: Clean up the implementation. For example we might be able
+ * to not to keep the whole font in memory.
+ */
+class DOSFont : public Font {
+public:
+ DOSFont();
+ ~DOSFont() { unload(); }
+
+ bool load(Common::SeekableReadStream &file);
+ int getHeight() const { return _height; }
+ int getWidth() const { return _width; }
+ int getCharWidth(uint16 c) const;
+ void setColorMap(const uint8 *src) { _colorMap = src; }
+ void drawChar(uint16 c, byte *dst, int pitch, int) const;
+
+private:
+ void unload();
+
+ const uint8 *_colorMap;
+
+ uint8 *_data;
+
+ int _width, _height;
+
+ int _numGlyphs;
+
+ uint8 *_widthTable;
+ uint8 *_heightTable;
+ uint16 *_bitmapOffsets;
+};
+
+#ifdef ENABLE_EOB
+/**
+* Implementation of the Font interface for old DOS fonts used
+* in EOB and EOB II.
+*
+*/
+class OldDOSFont : public Font {
+public:
+ OldDOSFont(Common::RenderMode mode);
+ ~OldDOSFont();
+
+ bool load(Common::SeekableReadStream &file);
+ int getHeight() const { return _height; }
+ int getWidth() const { return _width; }
+ int getCharWidth(uint16 c) const;
+ void setColorMap(const uint8 *src) { _colorMap8bit = src; }
+ void set16bitColorMap(const uint16 *src) { _colorMap16bit = src; }
+ void drawChar(uint16 c, byte *dst, int pitch, int bpp) const;
+
+private:
+ void unload();
+
+ uint8 *_data;
+ uint16 *_bitmapOffsets;
+
+ int _width, _height;
+ const uint8 *_colorMap8bit;
+ const uint16 *_colorMap16bit;
+
+ int _numGlyphs;
+
+ Common::RenderMode _renderMode;
+
+ static uint16 *_cgaDitheringTable;
+ static int _numRef;
+};
+#endif // ENABLE_EOB
+
+/**
+ * Implementation of the Font interface for AMIGA fonts.
+ */
+class AMIGAFont : public Font {
+public:
+ AMIGAFont();
+ ~AMIGAFont() { unload(); }
+
+ bool load(Common::SeekableReadStream &file);
+ int getHeight() const { return _height; }
+ int getWidth() const { return _width; }
+ int getCharWidth(uint16 c) const;
+ void setColorMap(const uint8 *src) {}
+ void drawChar(uint16 c, byte *dst, int pitch, int) const;
+
+private:
+ void unload();
+
+ int _width, _height;
+
+ struct Character {
+ uint8 yOffset, xOffset, width;
+
+ struct Graphics {
+ uint16 width, height;
+ uint8 *bitmap;
+ } graphics;
+ };
+
+ Character _chars[255];
+};
+
+/**
+ * Implementation of the Font interface for FM-Towns/PC98 fonts
+ */
+class SJISFont : public Font {
+public:
+ SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, bool fatPrint, int extraSpacing);
+ virtual ~SJISFont() { unload(); }
+
+ virtual bool usesOverlay() const { return true; }
+
+ bool load(Common::SeekableReadStream &) { return true; }
+ int getHeight() const;
+ int getWidth() const;
+ int getCharWidth(uint16 c) const;
+ void setColorMap(const uint8 *src);
+ virtual void drawChar(uint16 c, byte *dst, int pitch, int) const;
+
+protected:
+ void unload();
+
+ const uint8 *_colorMap;
+ Graphics::FontSJIS *_font;
+ int _sjisWidth, _asciiWidth;
+ int _fontHeight;
+ const bool _drawOutline;
+
+private:
+ const uint8 _invisColor;
+ const bool _is16Color;
+ // We use this for cases where the font width returned by getWidth() or getCharWidth() does not match the original.
+ // The original Japanese game versions use hard coded sjis font widths of 8 or 9. However, this does not necessarily
+ // depend on whether an outline is used or not (neither LOL/PC-9801 nor LOL/FM-TOWNS use an outline, but the first
+ // version uses a font width of 8 where the latter uses a font width of 9).
+ const int _sjisWidthOffset;
+};
+
+/**
+ * A class that manages KYRA palettes.
+ *
+ * This class stores the palette data as VGA RGB internally.
+ */
+class Palette {
+public:
+ Palette(const int numColors);
+ ~Palette();
+
+ enum {
+ kVGABytesPerColor = 3,
+ kPC98BytesPerColor = 3,
+ kAmigaBytesPerColor = 2
+ };
+
+ /**
+ * Load a VGA palette from the given stream.
+ */
+ void loadVGAPalette(Common::ReadStream &stream, int startIndex, int colors);
+
+ /**
+ * Load a HiColor palette from the given stream.
+ */
+ void loadHiColorPalette(Common::ReadStream &stream, int startIndex, int colors);
+
+ /**
+ * Load a EGA palette from the given stream.
+ */
+ void loadEGAPalette(Common::ReadStream &stream, int startIndex, int colors);
+
+ /**
+ * Set default CGA palette. We only need the cyan/magenta/grey mode.
+ */
+ enum CGAIntensity {
+ kIntensityLow = 0,
+ kIntensityHigh = 1
+ };
+
+ void setCGAPalette(int palIndex, CGAIntensity intensity);
+
+ /**
+ * Load a AMIGA palette from the given stream.
+ */
+ void loadAmigaPalette(Common::ReadStream &stream, int startIndex, int colors);
+
+ /**
+ * Load a PC98 16 color palette from the given stream.
+ */
+ void loadPC98Palette(Common::ReadStream &stream, int startIndex, int colors);
+
+ /**
+ * Return the number of colors this palette manages.
+ */
+ int getNumColors() const { return _numColors; }
+
+ /**
+ * Set all palette colors to black.
+ */
+ void clear();
+
+ /**
+ * Fill the given indexes with the given component value.
+ *
+ * @param firstCol the first color, which should be overwritten.
+ * @param numCols number of colors, which schould be overwritten.
+ * @param value color component value, which should be stored.
+ */
+ void fill(int firstCol, int numCols, uint8 value);
+
+ /**
+ * Copy data from another palette.
+ *
+ * @param source palette to copy data from.
+ * @param firstCol the first color of the source which should be copied.
+ * @param numCols number of colors, which should be copied. -1 all remaining colors.
+ * @param dstStart the first color, which should be ovewritten. If -1 firstCol will be used as start.
+ */
+ void copy(const Palette &source, int firstCol = 0, int numCols = -1, int dstStart = -1);
+
+ /**
+ * Copy data from a raw VGA palette.
+ *
+ * @param source source buffer
+ * @param firstCol the first color of the source which should be copied.
+ * @param numCols number of colors, which should be copied.
+ * @param dstStart the first color, which should be ovewritten. If -1 firstCol will be used as start.
+ */
+ void copy(const uint8 *source, int firstCol, int numCols, int dstStart = -1);
+
+ /**
+ * Fetch a RGB palette.
+ *
+ * @return a pointer to the RGB palette data, the client must delete[] it.
+ */
+ uint8 *fetchRealPalette() const;
+
+ //XXX
+ uint8 &operator[](const int index) {
+ assert(index >= 0 && index <= _numColors * 3);
+ return _palData[index];
+ }
+
+ const uint8 &operator[](const int index) const {
+ assert(index >= 0 && index <= _numColors * 3);
+ return _palData[index];
+ }
+
+ /**
+ * Gets raw access to the palette.
+ *
+ * TODO: Get rid of this.
+ */
+ uint8 *getData() { return _palData; }
+ const uint8 *getData() const { return _palData; }
+
+private:
+ uint8 *_palData;
+ const int _numColors;
+
+ static const uint8 _egaColors[];
+ static const int _egaNumColors;
+ static const uint8 _cgaColors[4][12];
+ static const int _cgaNumColors;
+};
+
+class Screen {
+public:
+ enum {
+ SCREEN_W = 320,
+ SCREEN_H = 200,
+ SCREEN_PAGE_SIZE = 320 * 200 + 1024,
+ SCREEN_OVL_SJIS_SIZE = 640 * 400,
+ SCREEN_PAGE_NUM = 16,
+ SCREEN_OVLS_NUM = 6
+ };
+
+ enum CopyRegionFlags {
+ CR_NO_P_CHECK = 0x01
+ };
+
+ enum DrawShapeFlags {
+ DSF_X_FLIPPED = 0x01,
+ DSF_Y_FLIPPED = 0x02,
+ DSF_SCALE = 0x04,
+ DSF_WND_COORDS = 0x10,
+ DSF_CENTER = 0x20,
+
+ DSF_SHAPE_FADING = 0x100,
+ DSF_TRANSPARENCY = 0x1000,
+ DSF_BACKGROUND_FADING = 0x2000,
+ DSF_CUSTOM_PALETTE = 0x8000
+ };
+
+ enum FontId {
+ FID_6_FNT = 0,
+ FID_8_FNT,
+ FID_9_FNT,
+ FID_CRED6_FNT,
+ FID_CRED8_FNT,
+ FID_BOOKFONT_FNT,
+ FID_GOLDFONT_FNT,
+ FID_INTRO_FNT,
+ FID_SJIS_FNT,
+ FID_SJIS_LARGE_FNT,
+ FID_SJIS_SMALL_FNT,
+ FID_NUM
+ };
+
+ Screen(KyraEngine_v1 *vm, OSystem *system, const ScreenDim *dimTable, const int dimTableSize);
+ virtual ~Screen();
+
+ // init
+ virtual bool init();
+ virtual void setResolution();
+ virtual void enableHiColorMode(bool enabled);
+
+ void updateScreen();
+
+ // debug functions
+ bool queryScreenDebug() const { return _debugEnabled; }
+ bool enableScreenDebug(bool enable);
+
+ // page cur. functions
+ int setCurPage(int pageNum);
+ void clearCurPage();
+
+ void copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
+ int unk1, const uint8 *unkPtr1, const uint8 *unkPtr2);
+
+ // page 0 functions
+ void copyToPage0(int y, int h, uint8 page, uint8 *seqBuf);
+ void shakeScreen(int times);
+
+ // page functions
+ void copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage, int flags=0);
+ void copyPage(uint8 srcPage, uint8 dstPage);
+
+ void copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 *dest);
+ void copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint8 *src);
+
+ void shuffleScreen(int sx, int sy, int w, int h, int srcPage, int dstPage, int ticks, bool transparent);
+ void fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum = -1, bool xored = false);
+
+ void clearPage(int pageNum);
+
+ int getPagePixel(int pageNum, int x, int y);
+ void setPagePixel(int pageNum, int x, int y, uint8 color);
+
+ const uint8 *getCPagePtr(int pageNum) const;
+ uint8 *getPageRect(int pageNum, int x, int y, int w, int h);
+
+ // palette handling
+ void fadeFromBlack(int delay=0x54, const UpdateFunctor *upFunc = 0);
+ void fadeToBlack(int delay=0x54, const UpdateFunctor *upFunc = 0);
+
+ virtual void fadePalette(const Palette &pal, int delay, const UpdateFunctor *upFunc = 0);
+ virtual void getFadeParams(const Palette &pal, int delay, int &delayInc, int &diff);
+ virtual int fadePalStep(const Palette &pal, int diff);
+
+ void setPaletteIndex(uint8 index, uint8 red, uint8 green, uint8 blue);
+ virtual void setScreenPalette(const Palette &pal);
+
+ // AMIGA version only
+ bool isInterfacePaletteEnabled() const { return _interfacePaletteEnabled; }
+ void enableInterfacePalette(bool e);
+ void setInterfacePalette(const Palette &pal, uint8 r, uint8 g, uint8 b);
+
+ virtual void getRealPalette(int num, uint8 *dst);
+ Palette &getPalette(int num);
+ void copyPalette(const int dst, const int src);
+
+ // gui specific (processing on _curPage)
+ void drawLine(bool vertical, int x, int y, int length, int color);
+ void drawClippedLine(int x1, int y1, int x2, int y2, int color);
+ virtual void drawShadedBox(int x1, int y1, int x2, int y2, int color1, int color2);
+ void drawBox(int x1, int y1, int x2, int y2, int color);
+
+ // font/text handling
+ virtual bool loadFont(FontId fontId, const char *filename);
+ FontId setFont(FontId fontId);
+
+ int getFontHeight() const;
+ int getFontWidth() const;
+
+ int getCharWidth(uint16 c) const;
+ int getTextWidth(const char *str);
+
+ void printText(const char *str, int x, int y, uint8 color1, uint8 color2);
+
+ virtual void setTextColorMap(const uint8 *cmap) = 0;
+ void setTextColor(const uint8 *cmap, int a, int b);
+ void setTextColor16bit(const uint16 *cmap16);
+
+ const ScreenDim *getScreenDim(int dim) const;
+ void modifyScreenDim(int dim, int x, int y, int w, int h);
+ int screenDimTableCount() const { return _dimTableCount; }
+
+ void setScreenDim(int dim);
+ int curDimIndex() const { return _curDimIndex; }
+
+ const ScreenDim *_curDim;
+
+ // shape handling
+ uint8 *encodeShape(int x, int y, int w, int h, int flags);
+
+ int setNewShapeHeight(uint8 *shape, int height);
+ int resetShapeHeight(uint8 *shape);
+
+ virtual void drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int sd, int flags, ...);
+
+ // mouse handling
+ void hideMouse();
+ void showMouse();
+ bool isMouseVisible() const;
+ virtual void setMouseCursor(int x, int y, const byte *shape);
+
+ // rect handling
+ virtual int getRectSize(int w, int h) = 0;
+
+ void rectClip(int &x, int &y, int w, int h);
+
+ // misc
+ void loadBitmap(const char *filename, int tempPage, int dstPage, Palette *pal, bool skip=false);
+
+ virtual bool loadPalette(const char *filename, Palette &pal);
+ bool loadPaletteTable(const char *filename, int firstPalette);
+ virtual void loadPalette(const byte *data, Palette &pal, int bytes);
+
+ void setAnimBlockPtr(int size);
+
+ void setShapePages(int page1, int page2, int minY = -1, int maxY = 201);
+
+ virtual byte getShapeFlag1(int x, int y);
+ virtual byte getShapeFlag2(int x, int y);
+
+ virtual int getDrawLayer(int x, int y);
+ virtual int getDrawLayer2(int x, int y, int height);
+
+ void blockInRegion(int x, int y, int width, int height);
+ void blockOutRegion(int x, int y, int width, int height);
+
+ int _charWidth;
+ int _charOffset;
+ int _curPage;
+ uint8 *_shapePages[2];
+ int _maskMinY, _maskMaxY;
+ FontId _currentFont;
+
+ // decoding functions
+ static void decodeFrame1(const uint8 *src, uint8 *dst, uint32 size);
+ static uint16 decodeEGAGetCode(const uint8 *&pos, uint8 &nib);
+
+ static void decodeFrame3(const uint8 *src, uint8 *dst, uint32 size);
+ static uint decodeFrame4(const uint8 *src, uint8 *dst, uint32 dstSize);
+ static void decodeFrameDelta(uint8 *dst, const uint8 *src, bool noXor = false);
+ static void decodeFrameDeltaPage(uint8 *dst, const uint8 *src, const int pitch, bool noXor);
+
+ static void convertAmigaGfx(uint8 *data, int w, int h, int depth = 5, bool wsa = false, int bytesPerPlane = -1);
+ static void convertAmigaMsc(uint8 *data);
+
+ // RPG specific, this does not belong here
+ void crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage);
+
+ uint16 *get16bitPalette() { return _16bitPalette; }
+ void set16bitShadingLevel(int lvl) { _16bitShadingLevel = lvl; }
+
+protected:
+ void resetPagePtrsAndBuffers(int pageSize);
+ uint8 *getPagePtr(int pageNum);
+ virtual void updateDirtyRects();
+ void updateDirtyRectsAmiga();
+ void updateDirtyRectsOvl();
+
+ void scale2x(byte *dst, int dstPitch, const byte *src, int srcPitch, int w, int h);
+ virtual void mergeOverlay(int x, int y, int w, int h);
+
+ // overlay specific
+ byte *getOverlayPtr(int pageNum);
+ void clearOverlayPage(int pageNum);
+ void clearOverlayRect(int pageNum, int x, int y, int w, int h);
+ void copyOverlayRegion(int x, int y, int x2, int y2, int w, int h, int srcPage, int dstPage);
+
+ // font/text specific
+ uint16 fetchChar(const char *&s) const;
+ void drawChar(uint16 c, int x, int y);
+
+ int16 encodeShapeAndCalculateSize(uint8 *from, uint8 *to, int size);
+
+ template<bool noXor> static void wrapped_decodeFrameDelta(uint8 *dst, const uint8 *src);
+ template<bool noXor> static void wrapped_decodeFrameDeltaPage(uint8 *dst, const uint8 *src, const int pitch);
+
+ uint8 *_pagePtrs[16];
+ uint8 *_sjisOverlayPtrs[SCREEN_OVLS_NUM];
+ uint8 _pageMapping[SCREEN_PAGE_NUM];
+
+ bool _useOverlays;
+ bool _useSJIS;
+ bool _use16ColorMode;
+ bool _useHiResEGADithering;
+ bool _useHiColorScreen;
+ bool _isAmiga;
+ Common::RenderMode _renderMode;
+ int _bytesPerPixel;
+ int _screenPageSize;
+
+ uint8 _sjisInvisibleColor;
+ bool _sjisMixedFontMode;
+
+ Palette *_screenPalette;
+ Common::Array<Palette *> _palettes;
+ Palette *_internFadePalette;
+
+ uint16 shade16bitColor(uint16 col);
+
+ uint16 *_16bitPalette;
+ uint16 *_16bitConversionPalette;
+ uint8 _16bitShadingLevel;
+
+ Font *_fonts[FID_NUM];
+ uint8 _textColorsMap[16];
+ uint16 _textColorsMap16bit[2];
+
+ uint8 *_decodeShapeBuffer;
+ int _decodeShapeBufferSize;
+
+ uint8 *_animBlockPtr;
+ int _animBlockSize;
+
+ // dimension handling
+ const ScreenDim *const _dimTable;
+ ScreenDim **_customDimTable;
+ const int _dimTableCount;
+ int _curDimIndex;
+
+ // mouse handling
+ int _mouseLockCount;
+ const uint8 _cursorColorKey;
+
+ virtual void postProcessCursor(uint8 *data, int w, int h, int pitch) {}
+
+ enum {
+ kMaxDirtyRects = 50
+ };
+
+ bool _forceFullUpdate;
+ bool _paletteChanged;
+ Common::List<Common::Rect> _dirtyRects;
+
+ void addDirtyRect(int x, int y, int w, int h);
+
+ OSystem *_system;
+ KyraEngine_v1 *_vm;
+
+ // shape
+ int drawShapeMarginNoScaleUpwind(uint8 *&dst, const uint8 *&src, int &cnt);
+ int drawShapeMarginNoScaleDownwind(uint8 *&dst, const uint8 *&src, int &cnt);
+ int drawShapeMarginScaleUpwind(uint8 *&dst, const uint8 *&src, int &cnt);
+ int drawShapeMarginScaleDownwind(uint8 *&dst, const uint8 *&src, int &cnt);
+ int drawShapeSkipScaleUpwind(uint8 *&dst, const uint8 *&src, int &cnt);
+ int drawShapeSkipScaleDownwind(uint8 *&dst, const uint8 *&src, int &cnt);
+ void drawShapeProcessLineNoScaleUpwind(uint8 *&dst, const uint8 *&src, int &cnt, int16 scaleState);
+ void drawShapeProcessLineNoScaleDownwind(uint8 *&dst, const uint8 *&src, int &cnt, int16 scaleState);
+ void drawShapeProcessLineScaleUpwind(uint8 *&dst, const uint8 *&src, int &cnt, int16 scaleState);
+ void drawShapeProcessLineScaleDownwind(uint8 *&dst, const uint8 *&src, int &cnt, int16 scaleState);
+
+ void drawShapePlotType0(uint8 *dst, uint8 cmd);
+ void drawShapePlotType1(uint8 *dst, uint8 cmd);
+ void drawShapePlotType3_7(uint8 *dst, uint8 cmd);
+ void drawShapePlotType4(uint8 *dst, uint8 cmd);
+ void drawShapePlotType5(uint8 *dst, uint8 cmd);
+ void drawShapePlotType6(uint8 *dst, uint8 cmd);
+ void drawShapePlotType8(uint8 *dst, uint8 cmd);
+ void drawShapePlotType9(uint8 *dst, uint8 cmd);
+ void drawShapePlotType11_15(uint8 *dst, uint8 cmd);
+ void drawShapePlotType12(uint8 *dst, uint8 cmd);
+ void drawShapePlotType13(uint8 *dst, uint8 cmd);
+ void drawShapePlotType14(uint8 *dst, uint8 cmd);
+ void drawShapePlotType16(uint8 *dst, uint8 cmd);
+ void drawShapePlotType20(uint8 *dst, uint8 cmd);
+ void drawShapePlotType21(uint8 *dst, uint8 cmd);
+ void drawShapePlotType33(uint8 *dst, uint8 cmd);
+ void drawShapePlotType37(uint8 *dst, uint8 cmd);
+ void drawShapePlotType48(uint8 *dst, uint8 cmd);
+ void drawShapePlotType52(uint8 *dst, uint8 cmd);
+
+ typedef int (Screen::*DsMarginSkipFunc)(uint8 *&dst, const uint8 *&src, int &cnt);
+ typedef void (Screen::*DsLineFunc)(uint8 *&dst, const uint8 *&src, int &cnt, int16 scaleState);
+ typedef void (Screen::*DsPlotFunc)(uint8 *dst, uint8 cmd);
+
+ DsMarginSkipFunc _dsProcessMargin;
+ DsMarginSkipFunc _dsScaleSkip;
+ DsLineFunc _dsProcessLine;
+ DsPlotFunc _dsPlot;
+
+ const uint8 *_dsShapeFadingTable;
+ int _dsShapeFadingLevel;
+ const uint8 *_dsColorTable;
+ const uint8 *_dsTransparencyTable1;
+ const uint8 *_dsTransparencyTable2;
+ const uint8 *_dsBackgroundFadingTable;
+ int _dsDrawLayer;
+ uint8 *_dsDstPage;
+ int _dsTmpWidth;
+ int _dsOffscreenLeft;
+ int _dsOffscreenRight;
+ int _dsScaleW;
+ int _dsScaleH;
+ int _dsOffscreenScaleVal1;
+ int _dsOffscreenScaleVal2;
+ int _drawShapeVar1;
+ int _drawShapeVar3;
+ int _drawShapeVar4;
+ int _drawShapeVar5;
+
+ // AMIGA version
+ bool _interfacePaletteEnabled;
+
+ // debug
+ bool _debugEnabled;
+};
+
+} // End of namespace Kyra
+
+#endif