From 2071196f4235c75ff020605f53b3d397532e841a Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Fri, 29 Jul 2016 15:48:14 -0500 Subject: SCI32: Add bitmap segment and remove GC option from hunk segment --- engines/sci/graphics/text32.h | 204 ------------------------------------------ 1 file changed, 204 deletions(-) (limited to 'engines/sci/graphics/text32.h') diff --git a/engines/sci/graphics/text32.h b/engines/sci/graphics/text32.h index 40921563d0..44bd48afd5 100644 --- a/engines/sci/graphics/text32.h +++ b/engines/sci/graphics/text32.h @@ -42,210 +42,6 @@ enum ScrollDirection { kScrollDown }; -enum BitmapFlags { - kBitmapRemap = 2 -}; - -enum { - kDefaultSkipColor = 250 -}; - -#define BITMAP_PROPERTY(size, property, offset)\ -inline uint##size get##property() const {\ - return READ_SCI11ENDIAN_UINT##size(_bitmap + (offset));\ -}\ -inline void set##property(uint##size value) {\ - WRITE_SCI11ENDIAN_UINT##size(_bitmap + (offset), (value));\ -} - -/** - * A convenience class for creating and modifying in-memory - * bitmaps. - */ -class BitmapResource { - byte *_bitmap; - reg_t _object; - Buffer _buffer; - - /** - * Gets the size of the bitmap header for the current - * engine version. - */ - static inline uint16 getBitmapHeaderSize() { - // TODO: These values are accurate for each engine, but there may be no reason - // to not simply just always use size 40, since SCI2.1mid does not seem to - // actually store any data above byte 40, and SCI2 did not allow bitmaps with - // scaling resolutions other than the default (320x200). Perhaps SCI3 used - // the extra bytes, or there is some reason why they tried to align the header - // size with other headers like pic headers? -// uint32 bitmapHeaderSize; -// if (getSciVersion() >= SCI_VERSION_2_1_MIDDLE) { -// bitmapHeaderSize = 46; -// } else if (getSciVersion() == SCI_VERSION_2_1_EARLY) { -// bitmapHeaderSize = 40; -// } else { -// bitmapHeaderSize = 36; -// } -// return bitmapHeaderSize; - return 46; - } - - /** - * Gets the byte size of a bitmap with the given width - * and height. - */ - static inline uint32 getBitmapSize(const uint16 width, const uint16 height) { - return width * height + getBitmapHeaderSize(); - } - -public: - /** - * Create a bitmap resource for an existing bitmap. - * Ownership of the bitmap is retained by the caller. - */ - inline BitmapResource(reg_t bitmap) : - _bitmap(g_sci->getEngineState()->_segMan->getHunkPointer(bitmap)), - _object(bitmap) { - if (_bitmap == nullptr || getUncompressedDataOffset() != getBitmapHeaderSize()) { - error("Invalid Text bitmap %04x:%04x", PRINT_REG(bitmap)); - } - - _buffer = Buffer(getWidth(), getHeight(), getPixels()); - } - - /** - * Allocates and initialises a new bitmap in the given - * segment manager. - */ - inline BitmapResource(SegManager *segMan, const int16 width, const int16 height, const uint8 skipColor, const int16 displaceX, const int16 displaceY, const int16 scaledWidth, const int16 scaledHeight, const uint32 paletteSize, const bool remap, const bool gc) { - _object = segMan->allocateHunkEntry("Bitmap()", getBitmapSize(width, height) + paletteSize, gc); - _bitmap = segMan->getHunkPointer(_object); - - const uint16 bitmapHeaderSize = getBitmapHeaderSize(); - - setWidth(width); - setHeight(height); - setDisplace(Common::Point(displaceX, displaceY)); - setSkipColor(skipColor); - _bitmap[9] = 0; - WRITE_SCI11ENDIAN_UINT16(_bitmap + 10, 0); - setRemap(remap); - setDataSize(width * height); - WRITE_SCI11ENDIAN_UINT32(_bitmap + 16, 0); - setHunkPaletteOffset(paletteSize > 0 ? (width * height) : 0); - setDataOffset(bitmapHeaderSize); - setUncompressedDataOffset(bitmapHeaderSize); - setControlOffset(0); - setScaledWidth(scaledWidth); - setScaledHeight(scaledHeight); - - _buffer = Buffer(getWidth(), getHeight(), getPixels()); - } - - inline reg_t getObject() const { - return _object; - } - - inline Buffer &getBuffer() { - return _buffer; - } - - BITMAP_PROPERTY(16, Width, 0); - BITMAP_PROPERTY(16, Height, 2); - - inline Common::Point getDisplace() const { - return Common::Point( - (int16)READ_SCI11ENDIAN_UINT16(_bitmap + 4), - (int16)READ_SCI11ENDIAN_UINT16(_bitmap + 6) - ); - } - - inline void setDisplace(const Common::Point &displace) { - WRITE_SCI11ENDIAN_UINT16(_bitmap + 4, (uint16)displace.x); - WRITE_SCI11ENDIAN_UINT16(_bitmap + 6, (uint16)displace.y); - } - - inline uint8 getSkipColor() const { - return _bitmap[8]; - } - - inline void setSkipColor(const uint8 skipColor) { - _bitmap[8] = skipColor; - } - - inline bool getRemap() const { - return READ_SCI11ENDIAN_UINT16(_bitmap + 10) & kBitmapRemap; - } - - inline void setRemap(const bool remap) { - uint16 flags = READ_SCI11ENDIAN_UINT16(_bitmap + 10); - if (remap) { - flags |= kBitmapRemap; - } else { - flags &= ~kBitmapRemap; - } - WRITE_SCI11ENDIAN_UINT16(_bitmap + 10, flags); - } - - BITMAP_PROPERTY(32, DataSize, 12); - - inline uint32 getHunkPaletteOffset() const { - return READ_SCI11ENDIAN_UINT32(_bitmap + 20); - } - - inline void setHunkPaletteOffset(uint32 hunkPaletteOffset) { - if (hunkPaletteOffset) { - hunkPaletteOffset += getBitmapHeaderSize(); - } - - WRITE_SCI11ENDIAN_UINT32(_bitmap + 20, hunkPaletteOffset); - } - - BITMAP_PROPERTY(32, DataOffset, 24); - - // NOTE: This property is used as a "magic number" for - // validating that a block of memory is a valid bitmap, - // and so is always set to the size of the header. - BITMAP_PROPERTY(32, UncompressedDataOffset, 28); - - // NOTE: This property always seems to be zero - BITMAP_PROPERTY(32, ControlOffset, 32); - - inline uint16 getScaledWidth() const { - if (getDataOffset() >= 40) { - return READ_SCI11ENDIAN_UINT16(_bitmap + 36); - } - - // SCI2 bitmaps did not have scaling ability - return 320; - } - - inline void setScaledWidth(uint16 scaledWidth) { - if (getDataOffset() >= 40) { - WRITE_SCI11ENDIAN_UINT16(_bitmap + 36, scaledWidth); - } - } - - inline uint16 getScaledHeight() const { - if (getDataOffset() >= 40) { - return READ_SCI11ENDIAN_UINT16(_bitmap + 38); - } - - // SCI2 bitmaps did not have scaling ability - return 200; - } - - inline void setScaledHeight(uint16 scaledHeight) { - if (getDataOffset() >= 40) { - WRITE_SCI11ENDIAN_UINT16(_bitmap + 38, scaledHeight); - } - } - - inline byte *getPixels() { - return _bitmap + getUncompressedDataOffset(); - } -}; - class GfxFont; /** -- cgit v1.2.3