[Scummvm-git-logs] scummvm master -> 0fb9bbd55bb1a2e675c135a6b136a9f0f13e755d

bluegr noreply at scummvm.org
Mon Aug 12 20:31:53 UTC 2024


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

Summary:
e4247c660d ZVISION: Fix implicit cast of characters
6863fc5777 ZVISION: Use UTF-32 buffer in tty processing
0fb9bbd55b ZVISION: Support BiDi text in tty


Commit: e4247c660d9cd6c3bae4aa5483960eebe5fac156
    https://github.com/scummvm/scummvm/commit/e4247c660d9cd6c3bae4aa5483960eebe5fac156
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2024-08-12T23:31:49+03:00

Commit Message:
ZVISION: Fix implicit cast of characters

Changed paths:
    engines/zvision/text/truetype_font.cpp
    engines/zvision/text/truetype_font.h


diff --git a/engines/zvision/text/truetype_font.cpp b/engines/zvision/text/truetype_font.cpp
index c30ffe2355b..a8ef7433059 100644
--- a/engines/zvision/text/truetype_font.cpp
+++ b/engines/zvision/text/truetype_font.cpp
@@ -155,7 +155,7 @@ int StyledTTFont::getMaxCharWidth() {
 	return 0;
 }
 
-int StyledTTFont::getCharWidth(byte chr) {
+int StyledTTFont::getCharWidth(uint16 chr) {
 	if (_font)
 		return _font->getCharWidth(chr);
 
@@ -169,7 +169,7 @@ int StyledTTFont::getKerningOffset(byte left, byte right) {
 	return 0;
 }
 
-void StyledTTFont::drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 color) {
+void StyledTTFont::drawChar(Graphics::Surface *dst, uint16 chr, int x, int y, uint32 color) {
 	if (_font) {
 		_font->drawChar(dst, chr, x, y, color);
 		if (_style & TTF_STYLE_UNDERLINE) {
diff --git a/engines/zvision/text/truetype_font.h b/engines/zvision/text/truetype_font.h
index 00440389b8d..b2f426b6e03 100644
--- a/engines/zvision/text/truetype_font.h
+++ b/engines/zvision/text/truetype_font.h
@@ -71,10 +71,10 @@ public:
 
 	int getFontHeight();
 	int getMaxCharWidth();
-	int getCharWidth(byte chr);
+	int getCharWidth(uint16 chr);
 	int getKerningOffset(byte left, byte right);
 
-	void drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 color);
+	void drawChar(Graphics::Surface *dst, uint16 chr, int x, int y, uint32 color);
 
 	void drawString(Graphics::Surface *dst, const Common::String &str, int x, int y, int w, uint32 color, Graphics::TextAlign align = Graphics::kTextAlignLeft);
 	int getStringWidth(const Common::String &str);


Commit: 6863fc57776689a1b2dc642d138a4813485d6490
    https://github.com/scummvm/scummvm/commit/6863fc57776689a1b2dc642d138a4813485d6490
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2024-08-12T23:31:49+03:00

Commit Message:
ZVISION: Use UTF-32 buffer in tty processing

Changed paths:
    engines/zvision/scripting/controls/titler_control.cpp
    engines/zvision/scripting/effects/ttytext_effect.cpp
    engines/zvision/scripting/effects/ttytext_effect.h
    engines/zvision/text/string_manager.cpp
    engines/zvision/text/subtitles.cpp
    engines/zvision/text/text.cpp
    engines/zvision/text/text.h


diff --git a/engines/zvision/scripting/controls/titler_control.cpp b/engines/zvision/scripting/controls/titler_control.cpp
index 92c506986a5..8871a3f498f 100644
--- a/engines/zvision/scripting/controls/titler_control.cpp
+++ b/engines/zvision/scripting/controls/titler_control.cpp
@@ -98,7 +98,7 @@ void TitlerControl::readStringsFile(const Common::Path &fileName) {
 
 	while (!file.eos()) {
 
-		Common::String line = readWideLine(file);
+		Common::String line = readWideLine(file).encode();
 		_strings.push_back(line);
 	}
 	file.close();
diff --git a/engines/zvision/scripting/effects/ttytext_effect.cpp b/engines/zvision/scripting/effects/ttytext_effect.cpp
index 1e991483231..c2643ab4d58 100644
--- a/engines/zvision/scripting/effects/ttytext_effect.cpp
+++ b/engines/zvision/scripting/effects/ttytext_effect.cpp
@@ -46,7 +46,7 @@ ttyTextNode::ttyTextNode(ZVision *engine, uint32 key, const Common::Path &file,
 	Common::File *infile = _engine->getSearchManager()->openFile(file);
 	if (infile) {
 		while (!infile->eos()) {
-			Common::String asciiLine = readWideLine(*infile);
+			Common::U32String asciiLine = readWideLine(*infile);
 			if (asciiLine.empty()) {
 				continue;
 			}
@@ -57,7 +57,7 @@ ttyTextNode::ttyTextNode(ZVision *engine, uint32 key, const Common::Path &file,
 	}
 	_img.create(_r.width(), _r.height(), _engine->_resourcePixelFormat);
 	_state._sharp = true;
-	_state.readAllStyles(_txtbuf);
+	_state.readAllStyles(_txtbuf.encode());
 	_state.updateFontWithTextState(_fnt);
 	_engine->getScriptManager()->setStateValue(_key, 1);
 }
@@ -81,7 +81,8 @@ bool ttyTextNode::process(uint32 deltaTimeInMillis) {
 				end = _txtpos;
 				if (start != -1) {
 					if ((end - start - 1) > 0) {
-						ret = _state.parseStyle(_txtbuf.c_str() + start + 1, end - start - 1);
+						Common::String buf = _txtbuf.substr(start + 1, end - start - 1);
+						ret = _state.parseStyle(buf, buf.size());
 					}
 				}
 
@@ -101,22 +102,19 @@ bool ttyTextNode::process(uint32 deltaTimeInMillis) {
 
 				_txtpos++;
 			} else {
-				int8 charsz = getUtf8CharSize(_txtbuf[_txtpos]);
-
-				uint16 chr = readUtf8Char(_txtbuf.c_str() + _txtpos);
+				uint16 chr = _txtbuf[_txtpos];
 
 				if (chr == ' ') {
-					uint32 i = _txtpos + charsz;
+					uint32 i = _txtpos + 1;
 					uint16 width = _fnt.getCharWidth(chr);
 
 					while (i < _txtbuf.size() && _txtbuf[i] != ' ' && _txtbuf[i] != '<') {
 
-						int8 chsz   = getUtf8CharSize(_txtbuf[i]);
-						uint16 uchr = readUtf8Char(_txtbuf.c_str() + _txtpos);
+						uint16 uchr = _txtbuf[i];
 
 						width += _fnt.getCharWidth(uchr);
 
-						i += chsz;
+						i++;
 					}
 
 					if (_dx + width > _r.width())
@@ -126,7 +124,7 @@ bool ttyTextNode::process(uint32 deltaTimeInMillis) {
 				} else
 					outchar(chr);
 
-				_txtpos += charsz;
+				_txtpos++;
 			}
 			_nexttime = _delay;
 			_engine->getRenderManager()->blitSurfaceToBkg(_img, _r.left, _r.top);
diff --git a/engines/zvision/scripting/effects/ttytext_effect.h b/engines/zvision/scripting/effects/ttytext_effect.h
index 90c7dbed7f8..ed69188137c 100644
--- a/engines/zvision/scripting/effects/ttytext_effect.h
+++ b/engines/zvision/scripting/effects/ttytext_effect.h
@@ -52,7 +52,7 @@ private:
 
 	TextStyleState _state;
 	StyledTTFont _fnt;
-	Common::String _txtbuf;
+	Common::U32String _txtbuf;
 	uint32 _txtpos;
 
 	int32 _delay;
diff --git a/engines/zvision/text/string_manager.cpp b/engines/zvision/text/string_manager.cpp
index b3994cc4c48..e8bb67923db 100644
--- a/engines/zvision/text/string_manager.cpp
+++ b/engines/zvision/text/string_manager.cpp
@@ -54,7 +54,7 @@ void StringManager::loadStrFile(const Common::Path &fileName) {
 
 	uint lineNumber = 0;
 	while (!file.eos()) {
-		_lines[lineNumber] = readWideLine(file);
+		_lines[lineNumber] = readWideLine(file).encode();
 
 		lineNumber++;
 		assert(lineNumber <= NUM_TEXT_LINES);
diff --git a/engines/zvision/text/subtitles.cpp b/engines/zvision/text/subtitles.cpp
index fb1edec1751..987bbaa4f9c 100644
--- a/engines/zvision/text/subtitles.cpp
+++ b/engines/zvision/text/subtitles.cpp
@@ -52,7 +52,7 @@ Subtitle::Subtitle(ZVision *engine, const Common::Path &subname, bool upscaleToH
 				Common::File txt;
 				if (_engine->getSearchManager()->openFile(txt, Common::Path(filename))) {
 					while (!txt.eos()) {
-						Common::String txtline = readWideLine(txt);
+						Common::String txtline = readWideLine(txt).encode();
 						sub curSubtitle;
 						curSubtitle.start = -1;
 						curSubtitle.stop = -1;
diff --git a/engines/zvision/text/text.cpp b/engines/zvision/text/text.cpp
index 0b4ebfafbd9..0e1fc69737f 100644
--- a/engines/zvision/text/text.cpp
+++ b/engines/zvision/text/text.cpp
@@ -504,8 +504,8 @@ void TextRenderer::drawTextWithWordWrapping(const Common::String &text, Graphics
 	}
 }
 
-Common::String readWideLine(Common::SeekableReadStream &stream) {
-	Common::String asciiString;
+Common::U32String readWideLine(Common::SeekableReadStream &stream) {
+	Common::U32String asciiString;
 
 	while (true) {
 		uint32 value = stream.readUint16LE();
@@ -519,58 +519,9 @@ Common::String readWideLine(Common::SeekableReadStream &stream) {
 			break;
 		}
 
-		// Crush each octet pair to a UTF-8 sequence
-		if (value < 0x80) {
-			asciiString += (char)(value & 0x7F);
-		} else if (value >= 0x80 && value < 0x800) {
-			asciiString += (char)(0xC0 | ((value >> 6) & 0x1F));
-			asciiString += (char)(0x80 | (value & 0x3F));
-		} else if (value >= 0x800 && value < 0x10000 && value != 0xCCCC) {
-			asciiString += (char)(0xE0 | ((value >> 12) & 0xF));
-			asciiString += (char)(0x80 | ((value >> 6) & 0x3F));
-			asciiString += (char)(0x80 | (value & 0x3F));
-		} else if (value == 0xCCCC) {
-			// Ignore, this character is used as newline sometimes
-		} else if (value >= 0x10000 && value < 0x200000) {
-			asciiString += (char)(0xF0);
-			asciiString += (char)(0x80 | ((value >> 12) & 0x3F));
-			asciiString += (char)(0x80 | ((value >> 6) & 0x3F));
-			asciiString += (char)(0x80 | (value & 0x3F));
-		}
+		asciiString += value;
 	}
-
 	return asciiString;
 }
 
-int8 getUtf8CharSize(char chr) {
-	if ((chr & 0x80) == 0)
-		return 1;
-	else if ((chr & 0xE0) == 0xC0)
-		return 2;
-	else if ((chr & 0xF0) == 0xE0)
-		return 3;
-	else if ((chr & 0xF8) == 0xF0)
-		return 4;
-	else if ((chr & 0xFC) == 0xF8)
-		return 5;
-	else if ((chr & 0xFE) == 0xFC)
-		return 6;
-
-	return 1;
-}
-
-uint16 readUtf8Char(const char *chr) {
-	uint16 result = 0;
-	if ((chr[0] & 0x80) == 0)
-		result = chr[0];
-	else if ((chr[0] & 0xE0) == 0xC0)
-		result = ((chr[0] & 0x1F) << 6) | (chr[1] & 0x3F);
-	else if ((chr[0] & 0xF0) == 0xE0)
-		result = ((chr[0] & 0x0F) << 12) | ((chr[1] & 0x3F) << 6) | (chr[2] & 0x3F);
-	else
-		result = chr[0];
-
-	return result;
-}
-
 } // End of namespace ZVision
diff --git a/engines/zvision/text/text.h b/engines/zvision/text/text.h
index 3451aa010cc..255ad123082 100644
--- a/engines/zvision/text/text.h
+++ b/engines/zvision/text/text.h
@@ -82,9 +82,7 @@ private:
 	ZVision *_engine;
 };
 
-Common::String readWideLine(Common::SeekableReadStream &stream);
-int8 getUtf8CharSize(char chr);
-uint16 readUtf8Char(const char *chr);
+Common::U32String readWideLine(Common::SeekableReadStream &stream);
 
 } // End of namespace ZVision
 


Commit: 0fb9bbd55bb1a2e675c135a6b136a9f0f13e755d
    https://github.com/scummvm/scummvm/commit/0fb9bbd55bb1a2e675c135a6b136a9f0f13e755d
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2024-08-12T23:31:49+03:00

Commit Message:
ZVISION: Support BiDi text in tty

Changed paths:
    engines/zvision/scripting/effects/ttytext_effect.cpp
    engines/zvision/scripting/effects/ttytext_effect.h


diff --git a/engines/zvision/scripting/effects/ttytext_effect.cpp b/engines/zvision/scripting/effects/ttytext_effect.cpp
index c2643ab4d58..eaf21067e96 100644
--- a/engines/zvision/scripting/effects/ttytext_effect.cpp
+++ b/engines/zvision/scripting/effects/ttytext_effect.cpp
@@ -30,6 +30,7 @@
 
 #include "common/stream.h"
 #include "common/file.h"
+#include "common/unicode-bidi.h"
 
 namespace ZVision {
 
@@ -42,6 +43,8 @@ ttyTextNode::ttyTextNode(ZVision *engine, uint32 key, const Common::Path &file,
 	_nexttime = 0;
 	_dx = 0;
 	_dy = 0;
+	_lineStartPos = 0;
+	_startX = 0;
 
 	Common::File *infile = _engine->getSearchManager()->openFile(file);
 	if (infile) {
@@ -55,6 +58,7 @@ ttyTextNode::ttyTextNode(ZVision *engine, uint32 key, const Common::Path &file,
 
 		delete infile;
 	}
+	_isRTL = Common::convertBiDiU32String(_txtbuf).visual != _txtbuf;
 	_img.create(_r.width(), _r.height(), _engine->_resourcePixelFormat);
 	_state._sharp = true;
 	_state.readAllStyles(_txtbuf.encode());
@@ -96,33 +100,57 @@ bool ttyTextNode::process(uint32 deltaTimeInMillis) {
 					Common::String buf;
 					buf = Common::String::format("%d", _engine->getScriptManager()->getStateValue(_state._statebox));
 
-					for (uint8 j = 0; j < buf.size(); j++)
-						outchar(buf[j]);
+					if (_isRTL) {
+						int16 currDx = _dx + _fnt.getStringWidth(buf);
+						_dx = _r.width() - currDx;
+						_isRTL = false;
+						for (uint8 j = 0; j < buf.size(); j++)
+							outchar(buf[j]);
+						_isRTL = true;
+						_dx = currDx;
+					} else {
+						for (uint8 j = 0; j < buf.size(); j++)
+							outchar(buf[j]);
+					}
 				}
 
 				_txtpos++;
+				_lineStartPos = _txtpos;
+				_startX = _dx;
 			} else {
-				uint16 chr = _txtbuf[_txtpos];
+				uint32 pos = _lineStartPos;
+				int16 dx = _startX;
+
+				while (pos < _txtbuf.size() && _txtbuf[pos] != '<') {
+					uint16 chr = _txtbuf[pos];
+
+					if (chr == ' ') {
+						uint32 i = pos + 1;
+						uint16 width = _fnt.getCharWidth(chr);
 
-				if (chr == ' ') {
-					uint32 i = _txtpos + 1;
-					uint16 width = _fnt.getCharWidth(chr);
+						while (i < _txtbuf.size() && _txtbuf[i] != ' ' && _txtbuf[i] != '<') {
 
-					while (i < _txtbuf.size() && _txtbuf[i] != ' ' && _txtbuf[i] != '<') {
+							uint16 uchr = _txtbuf[i];
 
-						uint16 uchr = _txtbuf[i];
+							width += _fnt.getCharWidth(uchr);
 
-						width += _fnt.getCharWidth(uchr);
+							i++;
+						}
 
-						i++;
+						if (dx + width > _r.width())
+							break;
 					}
+					dx += _fnt.getCharWidth(chr);
+					pos++;
+				}
 
-					if (_dx + width > _r.width())
-						newline();
-					else
-						outchar(chr);
-				} else
-					outchar(chr);
+				Common::U32String lineBuffer = Common::convertBiDiU32String(_txtbuf.substr(_lineStartPos, pos - _lineStartPos)).visual;
+				if (pos == _txtpos)
+					newline();
+				else if (_isRTL)
+					outchar(lineBuffer[pos - _txtpos - 1]);
+				else
+					outchar(lineBuffer[_txtpos - _lineStartPos]);
 
 				_txtpos++;
 			}
@@ -150,6 +178,8 @@ void ttyTextNode::scroll() {
 void ttyTextNode::newline() {
 	_dy += _fnt.getFontHeight();
 	_dx = 0;
+	_lineStartPos = _txtpos + 1;
+	_startX = _dx;
 }
 
 void ttyTextNode::outchar(uint16 chr) {
@@ -161,8 +191,10 @@ void ttyTextNode::outchar(uint16 chr) {
 	if (_dy + _fnt.getFontHeight() >= _r.height())
 		scroll();
 
-	_fnt.drawChar(&_img, chr, _dx, _dy, clr);
-
+	if (_isRTL)
+		_fnt.drawChar(&_img, chr, _r.width() - _dx - _fnt.getCharWidth(chr), _dy, clr);
+	else
+		_fnt.drawChar(&_img, chr, _dx, _dy, clr);
 	_dx += _fnt.getCharWidth(chr);
 }
 
diff --git a/engines/zvision/scripting/effects/ttytext_effect.h b/engines/zvision/scripting/effects/ttytext_effect.h
index ed69188137c..1a84716682e 100644
--- a/engines/zvision/scripting/effects/ttytext_effect.h
+++ b/engines/zvision/scripting/effects/ttytext_effect.h
@@ -54,11 +54,14 @@ private:
 	StyledTTFont _fnt;
 	Common::U32String _txtbuf;
 	uint32 _txtpos;
+	uint32 _lineStartPos;
+	bool _isRTL;
 
 	int32 _delay;
 	int32 _nexttime;
 	Graphics::Surface _img;
 	int16 _dx;
+	int16 _startX;
 	int16 _dy;
 private:
 




More information about the Scummvm-git-logs mailing list