diff options
| author | athrxx | 2015-11-14 19:52:26 +0100 | 
|---|---|---|
| committer | athrxx | 2018-11-14 17:22:20 +0100 | 
| commit | e4e5e68f0dbec85bb28157e094a95ef33440a2ba (patch) | |
| tree | d00173f96124da9712509234984219c2296ba756 | |
| parent | 35126dba8a22aea3b0235ffbe5ae9df2ad248f7b (diff) | |
| download | scummvm-rg350-e4e5e68f0dbec85bb28157e094a95ef33440a2ba.tar.gz scummvm-rg350-e4e5e68f0dbec85bb28157e094a95ef33440a2ba.tar.bz2 scummvm-rg350-e4e5e68f0dbec85bb28157e094a95ef33440a2ba.zip | |
KYRA: implement SJIS features required for EOB II FM-Towns
- low res font drawing for intro and outro texts
- fat print mode for ingame texts
| -rw-r--r-- | engines/kyra/screen.cpp | 19 | ||||
| -rw-r--r-- | engines/kyra/screen.h | 32 | ||||
| -rw-r--r-- | graphics/sjis.cpp | 37 | ||||
| -rw-r--r-- | graphics/sjis.h | 14 | 
4 files changed, 82 insertions, 20 deletions
| diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index c994f47d7d..bce45b2514 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -141,7 +141,7 @@ bool Screen::init() {  			if (!font)  				error("Could not load any SJIS font, neither the original nor ScummVM's 'SJIS.FNT'"); -			_fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, _use16ColorMode, !_use16ColorMode && _vm->game() != GI_LOL, !_use16ColorMode && _vm->game() == GI_LOL ? 1 : 0); +			_fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, _use16ColorMode, !_use16ColorMode && _vm->game() != GI_LOL && _vm->game() != GI_EOB2, _vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns, !_use16ColorMode && _vm->game() == GI_LOL ? 1 : 0);  		}  	} @@ -3583,12 +3583,11 @@ void AMIGAFont::unload() {  	memset(_chars, 0, sizeof(_chars));  } -SJISFont::SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, int extraSpacing) -    : _colorMap(0), _font(font), _invisColor(invisColor), _is16Color(is16Color), _drawOutline(drawOutline), _sjisWidthOffset(extraSpacing) { +SJISFont::SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, bool fatPrint, int extraSpacing) +	: _colorMap(0), _font(font), _invisColor(invisColor), _is16Color(is16Color), _drawOutline(drawOutline), _sjisWidthOffset(extraSpacing) {  	assert(_font); -  	_font->setDrawingMode(_drawOutline ? Graphics::FontSJIS::kOutlineMode : Graphics::FontSJIS::kDefaultMode); - +	_font->toggleFatPrint(fatPrint);  	_sjisWidth = _font->getMaxFontWidth() >> 1;  	_fontHeight = _font->getFontHeight() >> 1;  	_asciiWidth = _font->getCharWidth('a') >> 1; @@ -3641,6 +3640,16 @@ void SJISFont::drawChar(uint16 c, byte *dst, int pitch) const {  	_font->drawChar(dst, c, 640, 1, color1, color2, 640, 400);  } +SJISFontLarge::SJISFontLarge(Graphics::FontSJIS *font) : SJISFont(font, 0, false, false, false, 0) { +	_sjisWidth = _font->getMaxFontWidth(); +	_fontHeight = _font->getFontHeight(); +	_asciiWidth = _font->getCharWidth('a'); +} + +void SJISFontLarge::drawChar(uint16 c, byte *dst, int pitch) const { +	_font->drawChar(dst, c, 320, 1, _colorMap[1], _colorMap[0], 320, 200); +} +  #pragma mark -  Palette::Palette(const int numColors) : _palData(0), _numColors(numColors) { diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h index b58371ce9b..0b287aa8bc 100644 --- a/engines/kyra/screen.h +++ b/engines/kyra/screen.h @@ -211,34 +211,47 @@ private:   */  class SJISFont : public Font {  public: -	SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, int extraSpacing); -	~SJISFont() { unload(); } +	SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, bool fatPrint, int extraSpacing); +	virtual ~SJISFont() { unload(); } -	bool usesOverlay() const { return true; } +	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); -	void drawChar(uint16 c, byte *dst, int pitch) const; -private: +	virtual void drawChar(uint16 c, byte *dst, int pitch) const; + +protected:  	void unload();  	const uint8 *_colorMap; +	Graphics::FontSJIS *_font;	 +	int _sjisWidth, _asciiWidth; +	int _fontHeight; +	const bool _drawOutline; -	Graphics::FontSJIS *_font; +private:  	const uint8 _invisColor;  	const bool _is16Color; -	const bool _drawOutline;  	// 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; +}; -	int _sjisWidth, _asciiWidth; -	int _fontHeight; +/** +* SJISFont variant used in the intro and outro of EOB II FM-Towns. It appears twice as large, since it is not rendered on the hires overlay pages +*/ +class SJISFontLarge : public SJISFont { +public: +	SJISFontLarge(Graphics::FontSJIS *font); +	virtual ~SJISFontLarge() { unload(); } + +	virtual bool usesOverlay() const { return false; } +	virtual void drawChar(uint16 c, byte *dst, int pitch) const;  };  /** @@ -400,6 +413,7 @@ public:  		FID_GOLDFONT_FNT,  		FID_INTRO_FNT,  		FID_SJIS_FNT, +		FID_SJIS_LARGE_FNT,  		FID_NUM  	}; diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp index 877f314c69..0c65492ece 100644 --- a/graphics/sjis.cpp +++ b/graphics/sjis.cpp @@ -71,7 +71,7 @@ void FontSJIS::drawChar(Graphics::Surface &dst, uint16 ch, int x, int y, uint32  }  FontSJISBase::FontSJISBase() -	: _drawMode(kDefaultMode), _flippedMode(false), _fontWidth(16), _fontHeight(16), _bitPosNewLineMask(0) { +: _drawMode(kDefaultMode), _flippedMode(false), _fatPrint(false), _fontWidth(16), _fontHeight(16), _bitPosNewLineMask(0) {  }  void FontSJISBase::setDrawingMode(DrawingMode mode) { @@ -88,6 +88,13 @@ void FontSJISBase::toggleFlippedMode(bool enable) {  		warning("Flipped mode unsupported by this font");  } +void FontSJISBase::toggleFatPrint(bool enable) { +	if (hasFeature(kFeatFatPrint)) +		_fatPrint = enable; +	else +		warning("Fat print unsupported by this font"); +} +  uint FontSJISBase::getFontHeight() const {  	switch (_drawMode) {  	case kOutlineMode: @@ -207,6 +214,25 @@ const uint8 *FontSJISBase::flipCharacter(const uint8 *glyph, const int w) const  }  #endif +const uint8 *FontSJISBase::makeFatCharacter(const uint8 *glyph, const int w) const { +	// This is the EOB II FM-Towns implementation. +	// The last bit to the right of each line is cut off so that the fat +	// character actually has the same width as it would normally have. +	if (w == 8) { +		for (int i = 0; i < 16; ++i) { +			_tempGlyph2[i] = *glyph | (*glyph >> 1); +			glyph++; +		} +	} else { +		for (int i = 0; i < 16; ++i) { +			uint16 l = READ_BE_UINT16(glyph); +			WRITE_BE_UINT16(&_tempGlyph2[i << 1], l | (l >> 1)); +			glyph += 2; +		} +	} +	return _tempGlyph2; +} +  void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW, int maxH) const {  	const uint8 *glyphSource = 0;  	int width = 0, height = 0; @@ -243,11 +269,14 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1,  		return;  	} +	if (_fatPrint) +		glyphSource = makeFatCharacter(glyphSource, width); +  #ifndef DISABLE_FLIPPED_MODE  	if (_flippedMode)  		glyphSource = flipCharacter(glyphSource, width);  #endif - +	  	uint8 outline[18 * 18];  	if (_drawMode == kOutlineMode) {  		memset(outline, 0, sizeof(outline)); @@ -409,7 +438,7 @@ const uint8 *FontTowns::getCharData(uint16 ch) const {  }  bool FontTowns::hasFeature(int feat) const { -	static const int features = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped; +	static const int features = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped | kFeatFatPrint;  	return (features & feat) ? true : false;  } @@ -577,7 +606,7 @@ bool FontSjisSVM::hasFeature(int feat) const {  	// Flipped mode is not supported since the hard coded table (taken from SCUMM 5 FM-TOWNS)  	// is set up for font sizes of 8/16. This mode is also not required at the moment, since  	// there aren't any SCUMM 5 PC-Engine games. -	static const int features16 = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped; +	static const int features16 = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped | kFeatFatPrint;  	static const int features12 = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow;  	return (((_fontWidth == 12) ? features12 : features16) & feat) ? true : false;  } diff --git a/graphics/sjis.h b/graphics/sjis.h index 4c5b2797c5..2872471d24 100644 --- a/graphics/sjis.h +++ b/graphics/sjis.h @@ -91,6 +91,11 @@ public:  	virtual void setDrawingMode(DrawingMode mode) {}  	/** +	* Enable fat character drawing if supported by the Font (used in EOB II FM-Towns). +	*/ +	virtual void toggleFatPrint(bool enable) {} + +	/**  	 * Enable flipped character drawing if supported by the Font (e.g. in the MI1 circus scene after Guybrush gets shot out of the cannon).  	 */  	virtual void toggleFlippedMode(bool enable) {} @@ -147,6 +152,8 @@ public:  	virtual void toggleFlippedMode(bool enable); +	virtual void toggleFatPrint(bool enable); +  	virtual uint getFontHeight() const;  	virtual uint getMaxFontWidth() const; @@ -165,9 +172,11 @@ private:  	const uint8 *flipCharacter(const uint8 *glyph, const int w) const;  	mutable uint8 _tempGlyph[32];  #endif +	const uint8 *makeFatCharacter(const uint8 *glyph, const int w) const; +	mutable uint8 _tempGlyph2[32];  protected:  	DrawingMode _drawMode; -	bool _flippedMode; +	bool _flippedMode, _fatPrint;  	int _fontWidth, _fontHeight;  	uint8 _bitPosNewLineMask; @@ -180,7 +189,8 @@ protected:  		kFeatOutline		= 1 << 1,  		kFeatShadow			= 1 << 2,  		kFeatFMTownsShadow	= 1 << 3, -		kFeatFlipped		= 1 << 4 +		kFeatFlipped		= 1 << 4, +		kFeatFatPrint		= 1 << 5  	};  	virtual bool hasFeature(int feat) const = 0; | 
