2020-11-03 12:11:22 +09:00
|
|
|
/* 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.
|
2020-10-28 01:40:42 +09:00
|
|
|
*
|
|
|
|
* 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
|
2020-11-03 12:11:22 +09:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2020-10-28 01:40:42 +09:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "graphics/font.h"
|
|
|
|
#include "graphics/korfont.h"
|
2020-11-03 14:29:13 +09:00
|
|
|
|
2020-10-28 01:40:42 +09:00
|
|
|
#include "common/file.h"
|
|
|
|
|
|
|
|
namespace Graphics {
|
|
|
|
|
2020-11-03 12:11:22 +09:00
|
|
|
bool checkKorCode(byte hi, byte lo)
|
|
|
|
{
|
|
|
|
// hi: xx
|
|
|
|
// lo: yy
|
|
|
|
if ((0xA1 > lo) || (0xFE < lo)) {
|
2020-10-28 01:40:42 +09:00
|
|
|
return false;
|
|
|
|
}
|
2020-11-03 12:11:22 +09:00
|
|
|
if ((hi >= 0xB0) && (hi <= 0xC8)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2020-10-28 01:40:42 +09:00
|
|
|
|
2020-11-03 14:29:13 +09:00
|
|
|
// KS (EUC-KR) to UCS-2 table
|
|
|
|
static const uint16 _ksToUcs2Table[2350] = {
|
|
|
|
0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10, 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19,
|
|
|
|
0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d, 0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b,
|
|
|
|
0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77, 0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86,
|
|
|
|
0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d, 0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf,
|
|
|
|
0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4, 0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7,
|
|
|
|
0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5, 0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06, 0xad0c, 0xad0d,
|
|
|
|
0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad28, 0xad2c, 0xad2d, 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45, 0xad47, 0xad49,
|
|
|
|
0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c, 0xad6d, 0xad70, 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c, 0xad7d, 0xad7f,
|
|
|
|
0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90, 0xad9c, 0xad9d, 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8, 0xadd0, 0xadd1,
|
|
|
|
0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9, 0xadfc, 0xadff, 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d, 0xae14, 0xae30,
|
|
|
|
0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40, 0xae41, 0xae43, 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e, 0xae50, 0xae54,
|
|
|
|
0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61, 0xae65, 0xae68, 0xae69, 0xae6c, 0xae70, 0xae78, 0xae79, 0xae7b, 0xae7c, 0xae7d,
|
|
|
|
0xae84, 0xae85, 0xae8c, 0xaebc, 0xaebd, 0xaebe, 0xaec0, 0xaec4, 0xaecc, 0xaecd, 0xaecf, 0xaed0, 0xaed1, 0xaed8, 0xaed9, 0xaedc,
|
|
|
|
0xaee8, 0xaeeb, 0xaeed, 0xaef4, 0xaef8, 0xaefc, 0xaf07, 0xaf08, 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d, 0xaf30, 0xaf32, 0xaf34, 0xaf3c,
|
|
|
|
0xaf3d, 0xaf3f, 0xaf41, 0xaf42, 0xaf43, 0xaf48, 0xaf49, 0xaf50, 0xaf5c, 0xaf5d, 0xaf64, 0xaf65, 0xaf79, 0xaf80, 0xaf84, 0xaf88,
|
|
|
|
0xaf90, 0xaf91, 0xaf95, 0xaf9c, 0xafb8, 0xafb9, 0xafbc, 0xafc0, 0xafc7, 0xafc8, 0xafc9, 0xafcb, 0xafcd, 0xafce, 0xafd4, 0xafdc,
|
|
|
|
0xafe8, 0xafe9, 0xaff0, 0xaff1, 0xaff4, 0xaff8, 0xb000, 0xb001, 0xb004, 0xb00c, 0xb010, 0xb014, 0xb01c, 0xb01d, 0xb028, 0xb044,
|
|
|
|
0xb045, 0xb048, 0xb04a, 0xb04c, 0xb04e, 0xb053, 0xb054, 0xb055, 0xb057, 0xb059, 0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c,
|
|
|
|
0xb08d, 0xb08f, 0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f, 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad,
|
|
|
|
0xb0ae, 0xb0af, 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc, 0xb0c4, 0xb0c5, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4,
|
|
|
|
0xb0d8, 0xb0e0, 0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110, 0xb112, 0xb113, 0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123,
|
|
|
|
0xb124, 0xb125, 0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138, 0xb139, 0xb140, 0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154,
|
|
|
|
0xb155, 0xb158, 0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180, 0xb182, 0xb188, 0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194,
|
|
|
|
0xb198, 0xb19c, 0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd, 0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd,
|
|
|
|
0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217, 0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268,
|
|
|
|
0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290, 0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3,
|
|
|
|
0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9, 0xb2cc, 0xb2d0, 0xb2d6, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2,
|
|
|
|
0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa,
|
|
|
|
0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311, 0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358,
|
|
|
|
0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365, 0xb367, 0xb369, 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378, 0xb380, 0xb381,
|
|
|
|
0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394, 0xb3a0, 0xb3a1, 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb, 0xb3cc, 0xb3ce,
|
|
|
|
0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db, 0xb3dd, 0xb3e0, 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c, 0xb420, 0xb428,
|
|
|
|
0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454, 0xb458, 0xb460, 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488, 0xb49d, 0xb4a4,
|
|
|
|
0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0, 0xb4c4, 0xb4c8, 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3, 0xb4e4, 0xb4e6,
|
|
|
|
0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514, 0xb515, 0xb518, 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528, 0xb529, 0xb52a,
|
|
|
|
0xb530, 0xb531, 0xb534, 0xb538, 0xb540, 0xb541, 0xb543, 0xb544, 0xb545, 0xb54b, 0xb54c, 0xb54d, 0xb550, 0xb554, 0xb55c, 0xb55d,
|
|
|
|
0xb55f, 0xb560, 0xb561, 0xb5a0, 0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa, 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc,
|
|
|
|
0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc, 0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d8, 0xb5ec, 0xb610, 0xb611, 0xb614, 0xb618, 0xb625, 0xb62c,
|
|
|
|
0xb634, 0xb648, 0xb664, 0xb668, 0xb69c, 0xb69d, 0xb6a0, 0xb6a4, 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4, 0xb6f0, 0xb6f4, 0xb6f8, 0xb700,
|
|
|
|
0xb701, 0xb705, 0xb728, 0xb729, 0xb72c, 0xb72f, 0xb730, 0xb738, 0xb739, 0xb73b, 0xb744, 0xb748, 0xb74c, 0xb754, 0xb755, 0xb760,
|
|
|
|
0xb764, 0xb768, 0xb770, 0xb771, 0xb773, 0xb775, 0xb77c, 0xb77d, 0xb780, 0xb784, 0xb78c, 0xb78d, 0xb78f, 0xb790, 0xb791, 0xb792,
|
|
|
|
0xb796, 0xb797, 0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9,
|
|
|
|
0xb7ec, 0xb7ed, 0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800, 0xb801, 0xb807, 0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819,
|
|
|
|
0xb81b, 0xb81d, 0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835, 0xb837, 0xb838, 0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c,
|
|
|
|
0xb85d, 0xb860, 0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878, 0xb87c, 0xb88d, 0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1,
|
|
|
|
0xb8c3, 0xb8c5, 0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1, 0xb8e8, 0xb8e9, 0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd,
|
|
|
|
0xb904, 0xb918, 0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c, 0xb94f, 0xb951, 0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969,
|
|
|
|
0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985, 0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0,
|
|
|
|
0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc, 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db,
|
|
|
|
0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec, 0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01,
|
|
|
|
0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48, 0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58,
|
|
|
|
0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71, 0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8,
|
|
|
|
0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb, 0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc, 0xbb00, 0xbb04,
|
|
|
|
0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20, 0xbb29, 0xbb2b, 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e,
|
|
|
|
0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f, 0xbb50, 0xbb54, 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c, 0xbb90, 0xbba4,
|
|
|
|
0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4, 0xbbc8, 0xbbd0, 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00, 0xbc02, 0xbc08,
|
|
|
|
0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11, 0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f,
|
|
|
|
0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30, 0xbc31, 0xbc34, 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45, 0xbc49, 0xbc4c,
|
|
|
|
0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88, 0xbc8b, 0xbc8c, 0xbc8e, 0xbc94, 0xbc95, 0xbc97, 0xbc99, 0xbc9a, 0xbca0, 0xbca1,
|
|
|
|
0xbca4, 0xbca7, 0xbca8, 0xbcb0, 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4, 0xbccd, 0xbccf, 0xbcd0, 0xbcd1,
|
|
|
|
0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc, 0xbd04, 0xbd05, 0xbd07, 0xbd09, 0xbd10, 0xbd14, 0xbd24, 0xbd2c,
|
|
|
|
0xbd40, 0xbd48, 0xbd49, 0xbd4c, 0xbd50, 0xbd58, 0xbd59, 0xbd64, 0xbd68, 0xbd80, 0xbd81, 0xbd84, 0xbd87, 0xbd88, 0xbd89, 0xbd8a,
|
|
|
|
0xbd90, 0xbd91, 0xbd93, 0xbd95, 0xbd99, 0xbd9a, 0xbd9c, 0xbda4, 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5, 0xbdd8, 0xbddc, 0xbde9, 0xbdf0,
|
|
|
|
0xbdf4, 0xbdf8, 0xbe00, 0xbe03, 0xbe05, 0xbe0c, 0xbe0d, 0xbe10, 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f, 0xbe44, 0xbe45, 0xbe48, 0xbe4c,
|
|
|
|
0xbe4e, 0xbe54, 0xbe55, 0xbe57, 0xbe59, 0xbe5a, 0xbe5b, 0xbe60, 0xbe61, 0xbe64, 0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74,
|
|
|
|
0xbe75, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d, 0xbe8f, 0xbe90, 0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1,
|
|
|
|
0xbed4, 0xbed7, 0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec, 0xbf01, 0xbf08, 0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d,
|
|
|
|
0xbf40, 0xbf41, 0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94, 0xbfb0, 0xbfc5, 0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf,
|
|
|
|
0xbfe1, 0xc03c, 0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069, 0xc090, 0xc091, 0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5,
|
|
|
|
0xc0ac, 0xc0ad, 0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0bc, 0xc0bd, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9,
|
|
|
|
0xc0cc, 0xc0d0, 0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4, 0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100,
|
|
|
|
0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f, 0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f,
|
|
|
|
0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148, 0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c,
|
|
|
|
0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178, 0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c,
|
|
|
|
0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0, 0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0,
|
|
|
|
0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200, 0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c,
|
|
|
|
0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d, 0xc22f, 0xc231, 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254, 0xc258, 0xc260,
|
|
|
|
0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c, 0xc27d, 0xc27f, 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b, 0xc29d, 0xc2a4,
|
|
|
|
0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5, 0xc2b7, 0xc2b9, 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb, 0xc2ec, 0xc2ed,
|
|
|
|
0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb, 0xc2fc, 0xc300, 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314, 0xc315, 0xc318,
|
|
|
|
0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345, 0xc368, 0xc369, 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c, 0xc37d, 0xc384,
|
|
|
|
0xc388, 0xc38c, 0xc399, 0xc3d8, 0xc3d9, 0xc3dc, 0xc3df, 0xc3e0, 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5, 0xc3f8, 0xc408,
|
|
|
|
0xc410, 0xc424, 0xc42c, 0xc430, 0xc434, 0xc43c, 0xc43d, 0xc448, 0xc464, 0xc465, 0xc468, 0xc46c, 0xc474, 0xc475, 0xc479, 0xc480,
|
|
|
|
0xc494, 0xc49c, 0xc4b8, 0xc4bc, 0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4, 0xc4f8, 0xc4fa, 0xc4ff, 0xc500, 0xc501, 0xc50c, 0xc510, 0xc514,
|
|
|
|
0xc51c, 0xc528, 0xc529, 0xc52c, 0xc530, 0xc538, 0xc539, 0xc53b, 0xc53d, 0xc544, 0xc545, 0xc548, 0xc549, 0xc54a, 0xc54c, 0xc54d,
|
|
|
|
0xc54e, 0xc553, 0xc554, 0xc555, 0xc557, 0xc558, 0xc559, 0xc55d, 0xc55e, 0xc560, 0xc561, 0xc564, 0xc568, 0xc570, 0xc571, 0xc573,
|
|
|
|
0xc574, 0xc575, 0xc57c, 0xc57d, 0xc580, 0xc584, 0xc587, 0xc58c, 0xc58d, 0xc58f, 0xc591, 0xc595, 0xc597, 0xc598, 0xc59c, 0xc5a0,
|
|
|
|
0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8, 0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca,
|
|
|
|
0xc5cc, 0xc5ce, 0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1, 0xc5e3, 0xc5e5, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6,
|
|
|
|
0xc5f7, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605, 0xc606, 0xc607, 0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b,
|
|
|
|
0xc61c, 0xc624, 0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630, 0xc633, 0xc634, 0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641,
|
|
|
|
0xc644, 0xc648, 0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c, 0xc65d, 0xc660, 0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c,
|
|
|
|
0xc680, 0xc688, 0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698, 0xc69c, 0xc6a4, 0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4,
|
|
|
|
0xc6b8, 0xc6b9, 0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc, 0xc6cd, 0xc6d0, 0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8,
|
|
|
|
0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705, 0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721,
|
|
|
|
0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c, 0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751,
|
|
|
|
0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c, 0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d,
|
|
|
|
0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a,
|
|
|
|
0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad, 0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8,
|
|
|
|
0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8, 0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a, 0xc810, 0xc811,
|
|
|
|
0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820, 0xc824, 0xc82c, 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840, 0xc848, 0xc849,
|
|
|
|
0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874, 0xc878, 0xc87a, 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887, 0xc88b, 0xc88c,
|
|
|
|
0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8, 0xc8bc, 0xc8bd, 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7, 0xc8d9, 0xc8e0,
|
|
|
|
0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900, 0xc904, 0xc905, 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918, 0xc92c, 0xc934,
|
|
|
|
0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961, 0xc963, 0xc96c, 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c, 0xc990, 0xc998,
|
|
|
|
0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4, 0xc9c7, 0xc9c8, 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3, 0xc9d5, 0xc9d6, 0xc9d9, 0xc9da,
|
|
|
|
0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2, 0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8, 0xc9f9, 0xc9fc, 0xca00, 0xca08,
|
|
|
|
0xca09, 0xca0b, 0xca0c, 0xca0d, 0xca14, 0xca18, 0xca29, 0xca4c, 0xca4d, 0xca50, 0xca54, 0xca5c, 0xca5d, 0xca5f, 0xca60, 0xca61,
|
|
|
|
0xca68, 0xca7d, 0xca84, 0xca98, 0xcabc, 0xcabd, 0xcac0, 0xcac4, 0xcacc, 0xcacd, 0xcacf, 0xcad1, 0xcad3, 0xcad8, 0xcad9, 0xcae0,
|
|
|
|
0xcaec, 0xcaf4, 0xcb08, 0xcb10, 0xcb14, 0xcb18, 0xcb20, 0xcb21, 0xcb41, 0xcb48, 0xcb49, 0xcb4c, 0xcb50, 0xcb58, 0xcb59, 0xcb5d,
|
|
|
|
0xcb64, 0xcb78, 0xcb79, 0xcb9c, 0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7, 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10, 0xcc14, 0xcc1c, 0xcc1d, 0xcc21,
|
|
|
|
0xcc22, 0xcc27, 0xcc28, 0xcc29, 0xcc2c, 0xcc2e, 0xcc30, 0xcc38, 0xcc39, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48,
|
|
|
|
0xcc4c, 0xcc54, 0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64, 0xcc66, 0xcc68, 0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0,
|
|
|
|
0xcca8, 0xcca9, 0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8, 0xccbc, 0xccc4, 0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4,
|
|
|
|
0xccec, 0xccf0, 0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18, 0xcd19, 0xcd1b, 0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c,
|
|
|
|
0xcd60, 0xcd64, 0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88, 0xcd94, 0xcd95, 0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9,
|
|
|
|
0xcdb0, 0xcdc4, 0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8, 0xcdf9, 0xcdfb, 0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19,
|
|
|
|
0xce20, 0xce21, 0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35, 0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69,
|
|
|
|
0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85, 0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1,
|
|
|
|
0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5, 0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9,
|
|
|
|
0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15, 0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31,
|
|
|
|
0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67, 0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c,
|
|
|
|
0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8, 0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011,
|
|
|
|
0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c, 0xd044, 0xd045, 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060, 0xd06c, 0xd06d,
|
|
|
|
0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4, 0xd0a5, 0xd0a8, 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0, 0xd0c1, 0xd0c4,
|
|
|
|
0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0dc, 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef, 0xd0f0, 0xd0f1,
|
|
|
|
0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138, 0xd13a, 0xd140, 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d, 0xd150, 0xd154,
|
|
|
|
0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c, 0xd17c, 0xd184, 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0, 0xd1b1, 0xd1b3,
|
|
|
|
0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4, 0xd1f8, 0xd207, 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234, 0xd23c, 0xd23d,
|
|
|
|
0xd23f, 0xd241, 0xd248, 0xd25c, 0xd264, 0xd280, 0xd281, 0xd284, 0xd288, 0xd290, 0xd291, 0xd295, 0xd29c, 0xd2a0, 0xd2a4, 0xd2ac,
|
|
|
|
0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc, 0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8, 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8, 0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0,
|
|
|
|
0xd2f1, 0xd2f4, 0xd2f8, 0xd300, 0xd301, 0xd303, 0xd305, 0xd30c, 0xd30d, 0xd30e, 0xd310, 0xd314, 0xd316, 0xd31c, 0xd31d, 0xd31f,
|
|
|
|
0xd320, 0xd321, 0xd325, 0xd328, 0xd329, 0xd32c, 0xd330, 0xd338, 0xd339, 0xd33b, 0xd33c, 0xd33d, 0xd344, 0xd345, 0xd37c, 0xd37d,
|
|
|
|
0xd380, 0xd384, 0xd38c, 0xd38d, 0xd38f, 0xd390, 0xd391, 0xd398, 0xd399, 0xd39c, 0xd3a0, 0xd3a8, 0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4,
|
|
|
|
0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5, 0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8, 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed, 0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd,
|
|
|
|
0xd3ff, 0xd401, 0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460, 0xd464, 0xd46d, 0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480,
|
|
|
|
0xd482, 0xd488, 0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc, 0xd4d0, 0xd4d4, 0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8,
|
|
|
|
0xd4fb, 0xd4fd, 0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517, 0xd53c, 0xd53d, 0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551,
|
|
|
|
0xd558, 0xd559, 0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b, 0xd56d, 0xd574, 0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587,
|
|
|
|
0xd588, 0xd589, 0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0, 0xd5d2, 0xd5d8, 0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8,
|
|
|
|
0xd5ec, 0xd5f4, 0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604, 0xd608, 0xd610, 0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620,
|
|
|
|
0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648, 0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c,
|
|
|
|
0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c, 0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac,
|
|
|
|
0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1, 0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5,
|
|
|
|
0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c, 0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738,
|
|
|
|
0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756, 0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769,
|
|
|
|
0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789, 0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d
|
|
|
|
};
|
|
|
|
|
|
|
|
uint16 ConvertKSToUCS2(uint16 code) {
|
|
|
|
uint16 c1 = code & 0xff;
|
|
|
|
uint16 c2 = code >> 8;
|
|
|
|
uint16 index = (c1 - 0xb0) * 94 + c2 - 0xa1;
|
|
|
|
assert(index < 2350);
|
|
|
|
|
|
|
|
return _ksToUcs2Table[index];
|
2020-10-28 01:40:42 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
FontKorean *FontKorean::createFont(const char * fontFile) {
|
|
|
|
FontKorean *ret = 0;
|
|
|
|
|
|
|
|
// Try ScummVM's font.
|
|
|
|
ret = new FontKoreanSVM();
|
|
|
|
if (ret->loadData(fontFile))
|
|
|
|
return ret;
|
|
|
|
delete ret;
|
|
|
|
|
|
|
|
// Try Wansung font.
|
|
|
|
ret = new FontKoreanWansung();
|
|
|
|
if (ret->loadData(fontFile))
|
|
|
|
return ret;
|
|
|
|
delete ret;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FontKorean::drawChar(Graphics::Surface &dst, uint16 ch, int x, int y, uint32 c1, uint32 c2) const {
|
|
|
|
drawChar(dst.getBasePtr(x, y), ch, dst.pitch, dst.format.bytesPerPixel, c1, c2, dst.w - x, dst.h - y);
|
|
|
|
}
|
|
|
|
|
|
|
|
FontKoreanBase::FontKoreanBase()
|
|
|
|
: _drawMode(kDefaultMode), _flippedMode(false), _fontWidth(16), _fontHeight(16) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void FontKoreanBase::setDrawingMode(DrawingMode mode) {
|
|
|
|
if (hasFeature(1 << mode))
|
|
|
|
_drawMode = mode;
|
|
|
|
else
|
|
|
|
warning("Unsupported drawing mode selected");
|
|
|
|
}
|
|
|
|
|
|
|
|
void FontKoreanBase::toggleFlippedMode(bool enable) {
|
|
|
|
if (hasFeature(kFeatFlipped))
|
|
|
|
_flippedMode = enable;
|
|
|
|
else
|
|
|
|
warning("Flipped mode unsupported by this font");
|
|
|
|
}
|
|
|
|
|
|
|
|
uint FontKoreanBase::getFontHeight() const {
|
|
|
|
switch (_drawMode) {
|
|
|
|
case kOutlineMode:
|
|
|
|
return _fontHeight + 2;
|
|
|
|
|
|
|
|
case kDefaultMode:
|
|
|
|
return _fontHeight;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return _fontHeight + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint FontKoreanBase::getMaxFontWidth() const {
|
|
|
|
switch (_drawMode) {
|
|
|
|
case kOutlineMode:
|
|
|
|
return _fontWidth + 2;
|
|
|
|
|
|
|
|
case kDefaultMode:
|
|
|
|
return _fontWidth;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return _fontWidth + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint FontKoreanBase::getCharWidth(uint16 ch) const {
|
|
|
|
if (isASCII(ch))
|
|
|
|
return ((_drawMode == kOutlineMode) ? _fontWidth / 2 + 2 : (_drawMode == kDefaultMode ? _fontWidth / 2 : _fontWidth / 2 + 1));
|
|
|
|
else
|
|
|
|
return getMaxFontWidth();
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename Color>
|
|
|
|
void FontKoreanBase::blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c) const {
|
|
|
|
uint8 bitPos = 0;
|
|
|
|
uint8 mask = 0;
|
|
|
|
|
|
|
|
for (int y = 0; y < h; ++y) {
|
|
|
|
Color *d = (Color *)dst;
|
|
|
|
dst += pitch;
|
|
|
|
|
|
|
|
bitPos &= _bitPosNewLineMask;
|
|
|
|
for (int x = 0; x < w; ++x) {
|
|
|
|
if (!(bitPos % 8))
|
|
|
|
mask = *glyph++;
|
|
|
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
*d = c;
|
|
|
|
|
|
|
|
++d;
|
|
|
|
++bitPos;
|
|
|
|
mask <<= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FontKoreanBase::createOutline(uint8 *outline, const uint8 *glyph, const int w, const int h) const {
|
|
|
|
const int glyphPitch = (w + 7) / 8;
|
|
|
|
const int outlinePitch = (w + 9) / 8;
|
|
|
|
|
|
|
|
uint8 *line1 = outline + 0 * outlinePitch;
|
|
|
|
uint8 *line2 = outline + 1 * outlinePitch;
|
|
|
|
uint8 *line3 = outline + 2 * outlinePitch;
|
|
|
|
|
|
|
|
for (int y = 0; y < h; ++y) {
|
|
|
|
for (int x = 0; x < glyphPitch; ++x) {
|
|
|
|
const uint8 mask = *glyph++;
|
|
|
|
|
|
|
|
const uint8 b1 = mask | (mask >> 1) | (mask >> 2);
|
|
|
|
const uint8 b2 = (mask << 7) | ((mask << 6) & 0xC0);
|
|
|
|
|
|
|
|
line1[x] |= b1;
|
|
|
|
line2[x] |= b1;
|
|
|
|
line3[x] |= b1;
|
|
|
|
|
|
|
|
if (x + 1 < outlinePitch) {
|
|
|
|
line1[x + 1] |= b2;
|
|
|
|
line2[x + 1] |= b2;
|
|
|
|
line3[x + 1] |= b2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
line1 += outlinePitch;
|
|
|
|
line2 += outlinePitch;
|
|
|
|
line3 += outlinePitch;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FontKoreanBase::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;
|
|
|
|
int outlineExtraWidth = 2, outlineExtraHeight = 2;
|
|
|
|
int outlineXOffset = 0, outlineYOffset = 0;
|
|
|
|
|
|
|
|
if (isASCII(ch)) {
|
|
|
|
glyphSource = getCharData(ch);
|
|
|
|
//width = 8;
|
|
|
|
width = _fontWidth / 2;
|
|
|
|
height = _fontHeight;
|
|
|
|
} else {
|
|
|
|
glyphSource = getCharData(ch);
|
|
|
|
width = _fontWidth;
|
|
|
|
height = _fontHeight;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (maxW != -1 && maxW < width) {
|
|
|
|
width = maxW;
|
|
|
|
outlineExtraWidth = 0;
|
|
|
|
outlineXOffset = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (maxH != -1 && maxH < height) {
|
|
|
|
height = maxH;
|
|
|
|
outlineExtraHeight = 0;
|
|
|
|
outlineYOffset = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (width <= 0 || height <= 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!glyphSource) {
|
|
|
|
warning("FontKoreanBase::drawChar: Font does not offer data for %02X %02X", ch & 0xFF, ch >> 8);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8 outline[18 * 18];
|
|
|
|
if (_drawMode == kOutlineMode) {
|
|
|
|
memset(outline, 0, sizeof(outline));
|
|
|
|
createOutline(outline, glyphSource, width, height);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bpp == 1) {
|
|
|
|
if (_drawMode == kOutlineMode) {
|
|
|
|
blitCharacter<uint8>(outline, width + outlineExtraWidth, height + outlineExtraHeight, (uint8 *)dst, pitch, c2);
|
|
|
|
blitCharacter<uint8>(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 1, pitch, c1);
|
|
|
|
} else {
|
|
|
|
if (_drawMode != kDefaultMode) {
|
|
|
|
blitCharacter<uint8>(glyphSource, width - outlineXOffset, height, ((uint8 *)dst) + 1, pitch, c2);
|
|
|
|
blitCharacter<uint8>(glyphSource, width, height - outlineYOffset, ((uint8 *)dst) + pitch, pitch, c2);
|
|
|
|
if (_drawMode == kShadowMode)
|
|
|
|
blitCharacter<uint8>(glyphSource, width - outlineXOffset, height - outlineYOffset, ((uint8 *)dst) + pitch + 1, pitch, c2);
|
|
|
|
}
|
|
|
|
|
|
|
|
blitCharacter<uint8>(glyphSource, width, height, (uint8 *)dst, pitch, c1);
|
|
|
|
}
|
|
|
|
} else if (bpp == 2) {
|
|
|
|
if (_drawMode == kOutlineMode) {
|
|
|
|
blitCharacter<uint16>(outline, width + outlineExtraWidth, height + outlineExtraHeight, (uint8 *)dst, pitch, c2);
|
|
|
|
blitCharacter<uint16>(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 2, pitch, c1);
|
|
|
|
} else {
|
|
|
|
if (_drawMode != kDefaultMode) {
|
|
|
|
blitCharacter<uint16>(glyphSource, width - outlineXOffset, height, ((uint8 *)dst) + 2, pitch, c2);
|
|
|
|
blitCharacter<uint16>(glyphSource, width, height - outlineYOffset, ((uint8 *)dst) + pitch, pitch, c2);
|
|
|
|
if (_drawMode == kShadowMode)
|
|
|
|
blitCharacter<uint16>(glyphSource, width - outlineXOffset, height - outlineYOffset, ((uint8 *)dst) + pitch + 2, pitch, c2);
|
|
|
|
}
|
|
|
|
|
|
|
|
blitCharacter<uint16>(glyphSource, width, height, (uint8 *)dst, pitch, c1);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
error("FontKoreanBase::drawChar: unsupported bpp: %d", bpp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool FontKoreanBase::isASCII(uint16 ch) const {
|
|
|
|
if (ch >= 0xFF)
|
|
|
|
return false;
|
|
|
|
else if (ch <= 0x7F)
|
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ScummVM Korean font
|
|
|
|
|
|
|
|
FontKoreanSVM::FontKoreanSVM()
|
|
|
|
: _fontData16x16(0), _fontData16x16Size(0), _fontData8x16(0), _fontData8x16Size(0),
|
|
|
|
_fontData8x8(0), _fontData8x8Size(0) {
|
|
|
|
|
|
|
|
//_fontWidth = 16;
|
|
|
|
//_fontHeight = 16;
|
|
|
|
}
|
|
|
|
|
|
|
|
FontKoreanSVM::~FontKoreanSVM() {
|
|
|
|
delete[] _fontData16x16;
|
|
|
|
delete[] _fontData8x16;
|
|
|
|
delete[] _fontData8x8;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool FontKoreanSVM::loadData(const char *fontFile) {
|
|
|
|
Common::SeekableReadStream *data = SearchMan.createReadStreamForMember(fontFile);
|
|
|
|
if (!data)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
uint32 magic1 = data->readUint32BE();
|
|
|
|
uint32 magic2 = data->readUint32BE();
|
|
|
|
|
|
|
|
if (magic1 != MKTAG('S', 'C', 'V', 'M') || magic2 != MKTAG('S', 'J', 'I', 'S')) {
|
|
|
|
delete data;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32 version = data->readUint32BE();
|
|
|
|
if (version != kKoreanFontVersion) {
|
|
|
|
warning("Korean font version mismatch, expected: %d found: %u", kKoreanFontVersion, version);
|
|
|
|
delete data;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
uint numChars16x16 = data->readUint16BE();
|
|
|
|
uint numChars8x16 = data->readUint16BE();
|
|
|
|
uint numChars8x8 = data->readUint16BE();
|
|
|
|
|
|
|
|
if (_fontWidth == 16) {
|
|
|
|
_fontData16x16Size = numChars16x16 * 32;
|
|
|
|
_fontData16x16 = new uint8[_fontData16x16Size];
|
|
|
|
assert(_fontData16x16);
|
|
|
|
data->read(_fontData16x16, _fontData16x16Size);
|
|
|
|
|
|
|
|
_fontData8x16Size = numChars8x16 * 16;
|
|
|
|
_fontData8x16 = new uint8[numChars8x16 * 16];
|
|
|
|
assert(_fontData8x16);
|
|
|
|
for (uint i=0; i < _fontData8x16Size; i++)
|
|
|
|
data->read(&_fontData8x16[i], 2);
|
|
|
|
} else {
|
|
|
|
data->skip(numChars16x16 * 32);
|
|
|
|
data->skip(numChars8x16 * 32);
|
|
|
|
|
|
|
|
_fontData8x8Size = numChars8x8 * 8;
|
|
|
|
_fontData8x8 = new uint8[_fontData8x8Size];
|
|
|
|
assert(_fontData8x8);
|
|
|
|
data->read(_fontData8x8, _fontData8x8Size);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool retValue = !data->err();
|
|
|
|
delete data;
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
const uint8 *FontKoreanSVM::getCharData(uint16 c) const {
|
|
|
|
if (_fontWidth == 8)
|
|
|
|
return getCharDataPCE(c);
|
|
|
|
else
|
|
|
|
return getCharDataDefault(c);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool FontKoreanSVM::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 features8 = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow;
|
|
|
|
return (((_fontWidth == 8) ? features8 : features16) & feat) ? true : false;
|
|
|
|
}
|
|
|
|
|
2020-11-03 14:29:13 +09:00
|
|
|
// FIXME: Unused?
|
2020-10-28 01:40:42 +09:00
|
|
|
const uint8 *FontKoreanSVM::getCharDataPCE(uint16 c) const {
|
|
|
|
if (isASCII(c))
|
|
|
|
return 0;
|
|
|
|
|
2020-11-03 14:29:13 +09:00
|
|
|
if (!checkKorCode(c % 256, c / 256))
|
2020-10-28 01:40:42 +09:00
|
|
|
return 0;
|
2020-11-03 14:29:13 +09:00
|
|
|
uint16 uc = ConvertKSToUCS2(c);
|
2020-10-28 01:40:42 +09:00
|
|
|
|
|
|
|
const uint offset = (uc - 0xAC00) * 8;
|
|
|
|
assert(offset + 96 <= _fontData8x8Size); // 11184 * 8
|
|
|
|
return _fontData8x8 + offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
const uint8 *FontKoreanSVM::getCharDataDefault(uint16 c) const {
|
|
|
|
if (isASCII(c)) {
|
|
|
|
const uint offset = c * 16;
|
|
|
|
assert(offset <= _fontData8x16Size);
|
|
|
|
return _fontData8x16 + offset;
|
|
|
|
} else {
|
2020-11-03 14:29:13 +09:00
|
|
|
if (!checkKorCode(c % 256, c / 256))
|
2020-10-28 01:40:42 +09:00
|
|
|
return 0;
|
2020-11-03 14:29:13 +09:00
|
|
|
uint16 uc = ConvertKSToUCS2(c);
|
2020-10-28 01:40:42 +09:00
|
|
|
|
|
|
|
const uint offset = (uc - 0xAC00) * 32;
|
|
|
|
assert(offset + 384 <= _fontData16x16Size); // 11184 * 32
|
|
|
|
return _fontData16x16 + offset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Korean Wansung font
|
|
|
|
|
|
|
|
bool FontKoreanWansung::loadData(const char *fontFile) {
|
|
|
|
Common::SeekableReadStream *data = SearchMan.createReadStreamForMember(fontFile);
|
|
|
|
if (!data)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
data->skip(1);
|
|
|
|
_fontShadow = data->readByte();
|
|
|
|
_fontWidth = data->readByte();
|
|
|
|
_fontHeight = data->readByte();
|
|
|
|
_fontDataSize = ((_fontWidth + 7) / 8) * _fontHeight * kFontNumChars;
|
|
|
|
_fontData = new byte[_fontDataSize];
|
|
|
|
data->read(_fontData, _fontDataSize);
|
|
|
|
|
|
|
|
englishLoadData("english.fnt");
|
|
|
|
|
|
|
|
bool retValue = !data->err();
|
|
|
|
delete data;
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
const uint8 *FontKoreanWansung::getCharData(uint16 ch) const {
|
|
|
|
if (isASCII(ch) && _englishFontData) {
|
|
|
|
const uint offset = ((_englishFontWidth + 7) / 8) * _englishFontHeight * (ch & 0xFF);
|
|
|
|
assert(offset <= _englishFontDataSize);
|
|
|
|
return _englishFontData + offset;
|
|
|
|
} else {
|
|
|
|
int idx = ((ch % 256) - 0xb0) * 94 + (ch / 256) - 0xa1;
|
|
|
|
return _fontData + ((_fontWidth + 7) / 8) * _fontHeight * idx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool FontKoreanWansung::hasFeature(int feat) const {
|
|
|
|
static const int features = kFeatDefault | kFeatOutline | kFeatShadow | kFeatFMTownsShadow | kFeatFlipped;
|
|
|
|
return (features & feat) ? true : false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// English font
|
|
|
|
|
|
|
|
bool FontKoreanWansung::englishLoadData(const char *fontFile) {
|
|
|
|
Common::SeekableReadStream *data = SearchMan.createReadStreamForMember(fontFile);
|
|
|
|
if (!data)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
data->skip(2);
|
|
|
|
_englishFontWidth = data->readByte();
|
|
|
|
_englishFontHeight = data->readByte();
|
|
|
|
_englishFontDataSize = ((_englishFontWidth + 7) / 8) * _englishFontHeight * eFontNumChars;
|
|
|
|
_englishFontData = new byte[_englishFontDataSize];
|
|
|
|
data->read(_englishFontData, _englishFontDataSize);
|
|
|
|
|
|
|
|
bool retValue = !data->err();
|
|
|
|
delete data;
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // End of namespace Graphics
|