[Scummvm-git-logs] scummvm branch-2-2 -> 72b0e48678e761633503a63208fd8005ed29c512

sev- sev at scummvm.org
Mon Aug 31 21:46:21 UTC 2020


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

Summary:
b0c2bbb789 GRAPHICS: Expose SJIS font chunk calculation
72b0e48678 SCUMM: Reuse common sjis.cpp code for chunk calculation


Commit: b0c2bbb789ad062ec636e05a7ca3b79c5d5deced
    https://github.com/scummvm/scummvm/commit/b0c2bbb789ad062ec636e05a7ca3b79c5d5deced
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-31T23:45:19+02:00

Commit Message:
GRAPHICS: Expose SJIS font chunk calculation

Changed paths:
    graphics/sjis.cpp
    graphics/sjis.h


diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp
index 847c25db12..13f0fca20b 100644
--- a/graphics/sjis.cpp
+++ b/graphics/sjis.cpp
@@ -344,100 +344,104 @@ bool FontTowns::loadData() {
 	return retValue;
 }
 
-const uint8 *FontTowns::getCharData(uint16 ch) const {
-	if (ch < kFont8x16Chars) {
-		return _fontData8x16 + ch * 16;
-	} else {
-		uint8 f = ch & 0xFF;
-		uint8 s = ch >> 8;
-
-		// moved from scumm\charset.cpp
-		enum {
-			KANA = 0,
-			KANJI = 1,
-			EKANJI = 2
-		};
-
-		int base = s - ((s + 1) % 32);
-		int c = 0, p = 0, chunk_f = 0, chunk = 0, cr = 0, kanjiType = KANA;
-
-		if (f >= 0x81 && f <= 0x84) kanjiType = KANA;
-		if (f >= 0x88 && f <= 0x9f) kanjiType = KANJI;
-		if (f >= 0xe0 && f <= 0xea) kanjiType = EKANJI;
-
-		if ((f > 0xe8 || (f == 0xe8 && base >= 0x9f)) || (f > 0x90 || (f == 0x90 && base >= 0x9f))) {
-			c = 48; // correction
-			p = -8; // correction
-		}
+int FontTowns::getCharFMTChunk(uint16 ch) {
+	uint8 f = ch & 0xFF;
+	uint8 s = ch >> 8;
+
+	// moved from scumm\charset.cpp
+	enum {
+		KANA = 0,
+		KANJI = 1,
+		EKANJI = 2
+	};
 
-		if (kanjiType == KANA) {
-			chunk_f = (f - 0x81) * 2;
-		} else if (kanjiType == KANJI) { // Standard Kanji
-			p += f - 0x88;
-			chunk_f = c + 2 * p;
-		} else if (kanjiType == EKANJI) { // Enhanced Kanji
-			p += f - 0xe0;
-			chunk_f = c + 2 * p;
-		}
+	int base = s - ((s + 1) % 32);
+	int c = 0, p = 0, chunk_f = 0, chunk = 0, cr = 0, kanjiType = KANA;
 
-		// Base corrections
-		if (base == 0x7f && s == 0x7f)
-			base -= 0x20;
-		if (base == 0x9f && s == 0xbe)
-			base += 0x20;
-		if (base == 0xbf && s == 0xde)
-			base += 0x20;
-		//if (base == 0x7f && s == 0x9e)
-		//	base += 0x20;
-
-		switch (base) {
-		case 0x3f:
-			cr = 0; // 3f
-			if (kanjiType == KANA) chunk = 1;
-			else if (kanjiType == KANJI) chunk = 31;
-			else if (kanjiType == EKANJI) chunk = 111;
-			break;
-		case 0x5f:
-			cr = 0; // 5f
-			if (kanjiType == KANA) chunk = 17;
-			else if (kanjiType == KANJI) chunk = 47;
-			else if (kanjiType == EKANJI) chunk = 127;
-			break;
-		case 0x7f:
-			cr = -1; // 80
-			if (kanjiType == KANA) chunk = 9;
-			else if (kanjiType == KANJI) chunk = 63;
-			else if (kanjiType == EKANJI) chunk = 143;
-			break;
-		case 0x9f:
-			cr = 1; // 9e
-			if (kanjiType == KANA) chunk = 2;
-			else if (kanjiType == KANJI) chunk = 32;
-			else if (kanjiType == EKANJI) chunk = 112;
-			break;
-		case 0xbf:
-			cr = 1; // be
-			if (kanjiType == KANA) chunk = 18;
-			else if (kanjiType == KANJI) chunk = 48;
-			else if (kanjiType == EKANJI) chunk = 128;
-			break;
-		case 0xdf:
-			cr = 1; // de
-			if (kanjiType == KANA) chunk = 10;
-			else if (kanjiType == KANJI) chunk = 64;
-			else if (kanjiType == EKANJI) chunk = 144;
-			break;
-		default:
-			debug(4, "Invalid Char! f %x s %x base %x c %d p %d", f, s, base, c, p);
-		}
+	if (f >= 0x81 && f <= 0x84) kanjiType = KANA;
+	if (f >= 0x88 && f <= 0x9f) kanjiType = KANJI;
+	if (f >= 0xe0 && f <= 0xea) kanjiType = EKANJI;
 
-		debug(6, "Kanji: %c%c f 0x%x s 0x%x base 0x%x c %d p %d chunk %d cr %d index %d", f, s, f, s, base, c, p, chunk, cr, ((chunk_f + chunk) * 32 + (s - base)) + cr);
-		const int chunkNum = (((chunk_f + chunk) * 32 + (s - base)) + cr);
-		if (chunkNum < 0 || chunkNum >= kFont16x16Chars)
-			return 0;
-		else
-			return _fontData16x16 + chunkNum * 32;
+	if ((f > 0xe8 || (f == 0xe8 && base >= 0x9f)) || (f > 0x90 || (f == 0x90 && base >= 0x9f))) {
+		c = 48; // correction
+		p = -8; // correction
 	}
+
+	if (kanjiType == KANA) {
+		chunk_f = (f - 0x81) * 2;
+	} else if (kanjiType == KANJI) { // Standard Kanji
+		p += f - 0x88;
+		chunk_f = c + 2 * p;
+	} else if (kanjiType == EKANJI) { // Enhanced Kanji
+		p += f - 0xe0;
+		chunk_f = c + 2 * p;
+	}
+
+	// Base corrections
+	if (base == 0x7f && s == 0x7f)
+		base -= 0x20;
+	if (base == 0x9f && s == 0xbe)
+		base += 0x20;
+	if (base == 0xbf && s == 0xde)
+		base += 0x20;
+	//if (base == 0x7f && s == 0x9e)
+	//	base += 0x20;
+
+	switch (base) {
+	case 0x3f:
+		cr = 0; // 3f
+		if (kanjiType == KANA) chunk = 1;
+		else if (kanjiType == KANJI) chunk = 31;
+		else if (kanjiType == EKANJI) chunk = 111;
+		break;
+	case 0x5f:
+		cr = 0; // 5f
+		if (kanjiType == KANA) chunk = 17;
+		else if (kanjiType == KANJI) chunk = 47;
+		else if (kanjiType == EKANJI) chunk = 127;
+		break;
+	case 0x7f:
+		cr = -1; // 80
+		if (kanjiType == KANA) chunk = 9;
+		else if (kanjiType == KANJI) chunk = 63;
+		else if (kanjiType == EKANJI) chunk = 143;
+		break;
+	case 0x9f:
+		cr = 1; // 9e
+		if (kanjiType == KANA) chunk = 2;
+		else if (kanjiType == KANJI) chunk = 32;
+		else if (kanjiType == EKANJI) chunk = 112;
+		break;
+	case 0xbf:
+		cr = 1; // be
+		if (kanjiType == KANA) chunk = 18;
+		else if (kanjiType == KANJI) chunk = 48;
+		else if (kanjiType == EKANJI) chunk = 128;
+		break;
+	case 0xdf:
+		cr = 1; // de
+		if (kanjiType == KANA) chunk = 10;
+		else if (kanjiType == KANJI) chunk = 64;
+		else if (kanjiType == EKANJI) chunk = 144;
+		break;
+	default:
+		debug(4, "Invalid Char! f %x s %x base %x c %d p %d", f, s, base, c, p);
+	}
+
+	debug(6, "Kanji: %c%c f 0x%x s 0x%x base 0x%x c %d p %d chunk %d cr %d index %d", f, s, f, s, base, c, p, chunk, cr, ((chunk_f + chunk) * 32 + (s - base)) + cr);
+	return (((chunk_f + chunk) * 32 + (s - base)) + cr);
+}
+
+const uint8 *FontTowns::getCharData(uint16 ch) const {
+	if (ch < kFont8x16Chars)
+		return _fontData8x16 + ch * 16;
+
+	int chunkNum = getCharFMTChunk(ch);
+
+	if (chunkNum < 0 || chunkNum >= kFont16x16Chars)
+		return 0;
+	else
+		return _fontData16x16 + chunkNum * 32;
 }
 
 bool FontTowns::hasFeature(int feat) const {
diff --git a/graphics/sjis.h b/graphics/sjis.h
index d06d20e44d..f1b4d9a05d 100644
--- a/graphics/sjis.h
+++ b/graphics/sjis.h
@@ -208,6 +208,9 @@ public:
 	 * Loads the ROM data from "FMT_FNT.ROM".
 	 */
 	bool loadData();
+
+	static int getCharFMTChunk(uint16 ch);
+
 private:
 	enum {
 		kFont16x16Chars = 7808,


Commit: 72b0e48678e761633503a63208fd8005ed29c512
    https://github.com/scummvm/scummvm/commit/72b0e48678e761633503a63208fd8005ed29c512
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-31T23:45:44+02:00

Commit Message:
SCUMM: Reuse common sjis.cpp code for chunk calculation

Changed paths:
    engines/scumm/charset.cpp


diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp
index a5875bc7f2..b89ce446c2 100644
--- a/engines/scumm/charset.cpp
+++ b/engines/scumm/charset.cpp
@@ -155,90 +155,6 @@ void ScummEngine::loadCJKFont() {
 	}
 }
 
-static int SJIStoFMTChunk(int f, int s) { //converts sjis code to fmt font offset
-	enum {
-		KANA = 0,
-		KANJI = 1,
-		EKANJI = 2
-	};
-	int base = s - ((s + 1) % 32);
-	int c = 0, p = 0, chunk_f = 0, chunk = 0, cr = 0, kanjiType = KANA;
-
-	if (f >= 0x81 && f <= 0x84) kanjiType = KANA;
-	if (f >= 0x88 && f <= 0x9f) kanjiType = KANJI;
-	if (f >= 0xe0 && f <= 0xea) kanjiType = EKANJI;
-
-	if ((f > 0xe8 || (f == 0xe8 && base >= 0x9f)) || (f > 0x90 || (f == 0x90 && base >= 0x9f))) {
-		c = 48; //correction
-		p = -8; //correction
-	}
-
-	if (kanjiType == KANA) {//Kana
-		chunk_f = (f - 0x81) * 2;
-	} else if (kanjiType == KANJI) {//Standard Kanji
-		p += f - 0x88;
-		chunk_f = c + 2 * p;
-	} else if (kanjiType == EKANJI) {//Enhanced Kanji
-		p += f - 0xe0;
-		chunk_f = c + 2 * p;
-	}
-
-	// Base corrections
-	if (base == 0x7f && s == 0x7f)
-		base -= 0x20;
-	if (base == 0x9f && s == 0xbe)
-		base += 0x20;
-	if (base == 0xbf && s == 0xde)
-		base += 0x20;
-	//if (base == 0x7f && s == 0x9e)
-	//	base += 0x20;
-
-	switch (base) {
-	case 0x3f:
-		cr = 0; //3f
-		if (kanjiType == KANA) chunk = 1;
-		else if (kanjiType == KANJI) chunk = 31;
-		else if (kanjiType == EKANJI) chunk = 111;
-		break;
-	case 0x5f:
-		cr = 0; //5f
-		if (kanjiType == KANA) chunk = 17;
-		else if (kanjiType == KANJI) chunk = 47;
-		else if (kanjiType == EKANJI) chunk = 127;
-		break;
-	case 0x7f:
-		cr = -1; //80
-		if (kanjiType == KANA) chunk = 9;
-		else if (kanjiType == KANJI) chunk = 63;
-		else if (kanjiType == EKANJI) chunk = 143;
-		break;
-	case 0x9f:
-		cr = 1; //9e
-		if (kanjiType == KANA) chunk = 2;
-		else if (kanjiType == KANJI) chunk = 32;
-		else if (kanjiType == EKANJI) chunk = 112;
-		break;
-	case 0xbf:
-		cr = 1; //be
-		if (kanjiType == KANA) chunk = 18;
-		else if (kanjiType == KANJI) chunk = 48;
-		else if (kanjiType == EKANJI) chunk = 128;
-		break;
-	case 0xdf:
-		cr = 1; //de
-		if (kanjiType == KANA) chunk = 10;
-		else if (kanjiType == KANJI) chunk = 64;
-		else if (kanjiType == EKANJI) chunk = 144;
-		break;
-	default:
-		debug(4, "Invalid Char! f %x s %x base %x c %d p %d", f, s, base, c, p);
-		return 0;
-	}
-
-	debug(6, "Kanji: %c%c f 0x%x s 0x%x base 0x%x c %d p %d chunk %d cr %d index %d", f, s, f, s, base, c, p, chunk, cr, ((chunk_f + chunk) * 32 + (s - base)) + cr);
-	return ((chunk_f + chunk) * 32 + (s - base)) + cr;
-}
-
 byte *ScummEngine::get2byteCharPtr(int idx) {
 	if (_game.platform == Common::kPlatformFMTowns || _game.platform == Common::kPlatformPCEngine)
 		return 0;
@@ -261,7 +177,7 @@ byte *ScummEngine::get2byteCharPtr(int idx) {
 
 			idx = (SWAP_CONSTANT_16(idx) & 0x7fff) - 1;
 		} else {
-			idx = SJIStoFMTChunk((idx % 256), (idx / 256));
+			idx = Graphics::FontTowns::getCharFMTChunk(idx);
 		}
 
 		break;




More information about the Scummvm-git-logs mailing list