Ticket #8240: 2byte_charset.diff

File 2byte_charset.diff, 14.2 KB (added by SF/wonst719, 21 years ago)
  • README

    RCS file: /cvsroot/scummvm/scummvm/README,v
    retrieving revision 1.108
    diff -u -r1.108 README
     
    393393        es  - Spanish
    394394        jp  - Japanese
    395395        zh  - Chinese
    396         ko  - Korean
     396        kr  - Korean
    397397        hb  - Hebrew
    398398
    399399Graphics filters:
  • scumm.dsp

    RCS file: /cvsroot/scummvm/scummvm/scumm.dsp,v
    retrieving revision 1.41
    diff -u -r1.41 scumm.dsp
     
    207207# End Group
    208208
    209209# Begin Source File
    210210
    211211
    212212
     213SOURCE=.\scumm\2byte_charset.cpp
    213214
     215# End Source File
    214216
  • common/gameDetector.cpp

    +# Begin Source File
    
    +
    
     SOURCE=.\scumm\actor.cpp
    
     # End Source File
    
     # Begin Source File
    
    RCS file: /cvsroot/scummvm/scummvm/common/gameDetector.cpp,v
    retrieving revision 1.101
    diff -u -r1.101 gameDetector.cpp
     
    5656        "\t-g<mode>      - graphics mode (normal,2x,3x,2xsai,super2xsai,supereagle,advmame2x,advmame3x,tv2x,dotmatrix)\n"
    5757        "\t-e<mode>      - set music engine (see README for details)\n"
    5858        "\t-a            - specify game is amiga version\n"
    59         "\t-q<lang>      - specify language (en,de,fr,it,pt,es,jp,zh,ko,hb)\n"
     59        "\t-q<lang>      - specify language (en,de,fr,it,pt,es,jp,zh,kr,hb)\n"
    6060        "\n"
    6161        "\t-c<num>       - use cdrom <num> for cd audio\n"
    6262        "\t-m<num>       - set music volume to <num> (0-255)\n"
     
    117117        {"es", "Spanish", ES_ESP},
    118118        {"jp", "Japanese", JA_JPN},
    119119        {"zh", "Chinese (Taiwan)", ZH_TWN},
    120         {"ko", "Korean", KO_KOR},
     120        {"kr", "Korean", KO_KOR},
    121121        {"hb", "Hebrew", HB_HEB},
    122122        {0, 0, 0}
    123123};
  • scumm/charset.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/charset.cpp,v
    retrieving revision 2.35
    diff -u -r2.35 charset.cpp
     
    2323#include "scumm.h"
    2424#include "nut_renderer.h"
    2525
     26bool _2byte_pos_hack;
     27
    2628CharsetRenderer::CharsetRenderer(Scumm *vm) {
    2729
    2830        _nextLeft = 0;
     
    7981
    8082// do spacing for variable width old-style font
    8183int CharsetRendererClassic::getCharWidth(byte chr) {
     84        if(chr >= 0x80 && _CJKMode)
     85                return 6;
    8286        int spacing = 0;
    8387
    8488        int offs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
     
    628632        int offsX, offsY;
    629633        int d;
    630634        VirtScreen *vs;
     635        int is2byte = 0;
    631636
    632637        _vm->checkRange(_vm->_maxCharsets - 1, 1, _curId, "Printing with bad charset %d");
    633638       
     
    640645        _bpp = *_fontPtr;
    641646        _vm->_charsetColorMap[1] = _color;
    642647
    643         uint32 charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4);
     648        is2byte = (chr >= 0x80 && _CJKMode) ? 1 : 0;
     649
     650        uint32 charOffs = READ_LE_UINT32(_fontPtr + (is2byte ? 0x0f : chr) * 4 + 4); //HACK!
    644651
    645652        if (!charOffs)
    646653                return;
     
    649656
    650657        _charPtr = _fontPtr + charOffs;
    651658
    652         width = _charPtr[0];
     659        if(is2byte) width = _charPtr[0] - 1; else width = _charPtr[0]; //HACK!!!
    653660        height = _charPtr[1];
    654661        if (_firstChar) {
    655662                _str.left = 0;
     
    721728                dst = _vm->getResourceAddress(rtBuffer, vs->number + 5)
    722729                        + vs->xstart + drawTop * _vm->_screenWidth + _left;
    723730
    724                 drawBits(vs, dst, mask, drawTop, width, height);
     731                if(is2byte)
     732                        draw2byte(vs, dst, mask, drawTop, chr);
     733                else
     734                        drawBits(vs, dst, mask, drawTop, width, height);
    725735
    726736                int h = height;
    727737                do {
     
    730740                        dst += _vm->_screenWidth;
    731741                } while (--h);
    732742        } else {
    733                 drawBits(vs, dst, mask, drawTop, width, height);
     743                if(is2byte)
     744                        draw2byte(vs, dst, mask, drawTop, chr);
     745                else
     746                        drawBits(vs, dst, mask, drawTop, width, height);
    734747        }
    735748       
    736749        _left += width;
     
    844857        int width = _current->getCharWidth(chr);
    845858        int height = _current->getCharHeight(chr);
    846859
     860        if(chr >= 256 && _CJKMode)
     861                width = 16;
     862
    847863        _hasMask = true;
    848         _current->drawChar((char)chr, _left, _top, _color, !_ignoreCharsetMask);
     864        if(chr >= 256 && _CJKMode)
     865                _current->draw2byte(chr, _left, _top + (_2byte_pos_hack ? 6 : 0), _color, !_ignoreCharsetMask);
     866        else
     867                _current->drawChar((char)chr, _left, _top, _color, !_ignoreCharsetMask);
    849868        _vm->updateDirtyRect(0, _left, _left + width, _top, _top + height, 0);
    850869
    851870        _left += width;
     
    854873
    855874        if (_top + height > _str.bottom)
    856875                _str.bottom = _top + height;
     876
     877        _2byte_pos_hack = false;
    857878}
    858879
  • scumm/charset.h

    RCS file: /cvsroot/scummvm/scummvm/scumm/charset.h,v
    retrieving revision 2.17
    diff -u -r2.17 charset.h
     
    9090        byte *_charPtr;
    9191
    9292        int getCharWidth(byte chr);
     93        void draw2byte(VirtScreen *vs, byte *dst, byte *mask, int drawTop, int idx);
    9394        void drawBits(VirtScreen *vs, byte *dst, byte *mask, int drawTop, int width, int height);
    9495
    9596public:
  • scumm/module.mk

    RCS file: /cvsroot/scummvm/scummvm/scumm/module.mk,v
    retrieving revision 1.18
    diff -u -r1.18 module.mk
     
    11MODULE := scumm
    22
    33SCUMM_OBJS = \
     4        scumm/2byte_charset.o \
    45        scumm/actor.o \
    56        scumm/akos.o \
    67        scumm/base-costume.o \
  • scumm/nut_renderer.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/nut_renderer.cpp,v
    retrieving revision 1.24
    diff -u -r1.24 nut_renderer.cpp
     
    133133                return 0;
    134134        }
    135135
    136         return READ_LE_UINT16(_dataSrc + _offsets[c] + 6);
     136        if(c & 0x80 && _CJKMode)
     137                return 8;
     138        else
     139                return READ_LE_UINT16(_dataSrc + _offsets[c] + 6) + 2;
    137140}
    138141
    139142int32 NutRenderer::getCharHeight(byte c) {
     
    143146                return 0;
    144147        }
    145148
    146         return READ_LE_UINT16(_dataSrc + _offsets[c] + 8);
     149        if(c & 0x80 && _CJKMode)
     150                return 16;
     151        else
     152                return READ_LE_UINT16(_dataSrc + _offsets[c] + 8);
    147153}
    148154
    149155int32 NutRenderer::getStringWidth(const byte *string) {
  • scumm/nut_renderer.h

    RCS file: /cvsroot/scummvm/scummvm/scumm/nut_renderer.h,v
    retrieving revision 1.7
    diff -u -r1.7 nut_renderer.h
     
    4141        ~NutRenderer();
    4242
    4343        bool loadFont(const char *filename, const char *dir);
     44        void draw2byte(int c, int32 x, int32 y, byte color, bool useMask);
    4445        void drawChar(byte c, int32 x, int32 y, byte color, bool useMask);
    4546//      void drawString(const char *string, int32 x, int32 y, byte color, int32 mode);
    4647        int32 getCharWidth(byte c);
  • scumm/script_v8.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
    retrieving revision 2.175
    diff -u -r2.175 script_v8.cpp
     
    599599                        if (c != 0 && c != 0xFF) {
    600600                                _charset->_left = _charset->_nextLeft;
    601601                                _charset->_top = _charset->_nextTop;
    602                                 _charset->printChar(c);
     602                                if(c >= 0x80 && _CJKMode)
     603                                        _charset->printChar(c + (*buf++ * 256));
     604                                else
     605                                        _charset->printChar(c);
    603606                                _charset->_nextLeft = _charset->_left;
    604607                                _charset->_nextTop = _charset->_top;
    605608                        }
  • scumm/scumm.h

    RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
    retrieving revision 1.232
    diff -u -r1.232 scumm.h
     
    10691069
    10701070        void loadLanguageBundle();
    10711071public:
     1072        bool checkCJKLanguage();
    10721073        void translateText(const byte *text, byte *trans_buff); // Used by class ScummDialog
    10731074protected:
    10741075
     
    12021203
    12031204// This is a constant lookup table of reverse bit masks
    12041205extern const byte revBitMask[8];
     1206
     1207//nasty hacks
     1208extern bool _CJKMode;
     1209extern int _gid;
     1210extern char *_2byte;
     1211extern int _2byte_height;
     1212extern int _2byte_width;
     1213extern bool _2byte_pos_hack;
    12051214
    12061215/* Direction conversion functions (between old dir and new dir format) */
    12071216int newDirToOldDir(int dir);
  • scumm/scummvm.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
    retrieving revision 2.199
    diff -u -r2.199 scummvm.cpp
     
    5656Scumm *g_scumm = 0;
    5757ScummDebugger *g_debugger;
    5858
     59int _gid;
     60char *_2byte;
     61int _2byte_width;
     62int _2byte_height;
     63bool _CJKMode;
     64
    5965extern NewGui *g_gui;
    6066extern uint16 _debugLevel;
    6167
     
    634640                _saveLoadCompatible = false;
    635641        }
    636642        loadLanguageBundle();
     643
     644        // Load CJK font
     645        if((_gameId == GID_DIG || _gameId == GID_CMI) && checkCJKLanguage()) {
     646                _gid = _gameId;
     647                File _fp;
     648                char _fontFile[16];
     649                _CJKMode = true;
     650                switch(_language) {
     651                case KO_KOR:
     652                        strcpy(_fontFile, "korean.fnt");
     653                        break;
     654                case JA_JPN:
     655                        strcpy(_fontFile, (_gameId == GID_DIG) ? "kanji16.fnt" : "japanese.fnt");
     656                        break;
     657                case ZH_TWN:
     658                        if(_gameId == GID_CMI)
     659                                strcpy(_fontFile, "chinese.fnt");
     660                        else
     661                                _CJKMode = false;
     662                        break;
     663                }
     664                if(_CJKMode && _fp.open(_fontFile, getGameDataPath(), 1)) {
     665                        debug(2, "Loading CJK Font");
     666                        _fp.seek(2,SEEK_CUR);
     667                        _2byte_width = _fp.readByte(); //FIXME: is this correct?
     668                        _2byte_height = _fp.readByte();
     669
     670                        int numChar = 0;
     671                        switch(_language) {
     672                        case KO_KOR:
     673                                numChar = 2350;
     674                                break;
     675                        case JA_JPN:
     676                                numChar = (_gameId == GID_DIG) ? 1 : 1; //FIXME
     677                                break;
     678                        case ZH_TWN:
     679                                numChar = 1; //FIXME
     680                                break;
     681                        }
     682                        _2byte = new char[2 * _2byte_height * numChar];
     683                        _fp.read(_2byte, 2 * _2byte_height * numChar);
     684                        _fp.close();
     685                }
     686        }
     687
    637688        _audioNames = NULL;
    638689}
    639690
     
    641692{
    642693        delete [] _actors;
    643694       
     695        delete _2byte;
    644696        delete _charset;
    645697        delete _pauseDialog;
    646698        delete _optionsDialog;
  • scumm/string.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/string.cpp,v
    retrieving revision 1.127
    diff -u -r1.127 string.cpp
     
    241241                if (c != 0xFF) {
    242242                        _charset->_left = _charset->_nextLeft;
    243243                        _charset->_top = _charset->_nextTop;
     244                        if(c & 0x80 && _CJKMode) {
     245                                c += *buffer++ * 256;
     246                                if(_gameId == GID_CMI)
     247                                        _2byte_pos_hack = true; //HACK: ¿µ¹®°úÀÇ yÁÂÇ¥°¡ ¸ÂÁö ¾Ê´Ù.
     248                        }
    244249                        if (_features & GF_AFTER_V2 || _features & GF_AFTER_V3) {
    245250                                _charset->printChar(c);
    246251                        } else if (_features & GF_AFTER_V6) {
     
    371376                if (c != 0 && c != 0xFF) {
    372377                        _charset->_left = _charset->_nextLeft;
    373378                        _charset->_top = _charset->_nextTop;
    374                         _charset->printChar(c);
     379                        if(c & 0x80 && _CJKMode)
     380                                _charset->printChar(c + ((*buf++) * 256));
     381                        else
     382                                _charset->printChar(c);
    375383                        _charset->_nextLeft = _charset->_left;
    376384                        _charset->_nextTop = _charset->_top;
    377385                }
     
    477485                                if (_string[a].no_talk_anim == 0)
    478486                                        _charset->_blitAlso = true;
    479487                        }
    480                         _charset->printChar(chr);
     488                        if(chr >= 0x80 && _CJKMode) {
     489                                if(_gameId == GID_CMI)
     490                                        _2byte_pos_hack = true;
     491                                _charset->printChar(chr + (buf[i++] * 256));
     492                        }
     493                        else
     494                                _charset->printChar(chr);
    481495                        _charset->_blitAlso = false;
    482496                }
    483497        }
  • scumm/smush/smush_font.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/smush/smush_font.cpp,v
    retrieving revision 1.2
    diff -u -r1.2 smush_font.cpp
     
    105105}
    106106
    107107int SmushFont::getCharWidth(byte v) {
     108        if(v >= 0x80 && _CJKMode)
     109                return get2byteCharWidth();
     110
    108111        if(v >= _nbChars)
    109112                error("invalid character in SmushFont::charWidth : %d (%d)", v, _nbChars);
    110113
     
    112115}
    113116
    114117int SmushFont::getCharHeight(byte v) {
     118        if(v >= 0x80 && _CJKMode)
     119                return get2byteCharHeight();
     120
    115121        if(v >= _nbChars)
    116122                error("invalid character in SmushFont::charHeight : %d (%d)", v, _nbChars);
    117123
     
    243249}
    244250
    245251void SmushFont::drawSubstring(char *str, byte *buffer, int dst_width, int x, int y) {
    246         for(int i = 0; str[i] != 0; i++)
    247                 x += drawChar(buffer, dst_width, x, y, str[i]);
     252        for(int i = 0; str[i] != 0; i++) {
     253                if((byte)str[i] >= 0x80 && _CJKMode) {
     254                        x += draw2byte(buffer, dst_width, x, y, str[i], str[i+1]);
     255                        i++;
     256                } else
     257                        x += drawChar(buffer, dst_width, x, y, str[i]);
     258        }
    248259}
    249260
    250261void SmushFont::drawStringAbsolute(char *str, byte *buffer, int dst_width, int x, int y) {
  • scumm/smush/smush_font.h

    RCS file: /cvsroot/scummvm/scummvm/scumm/smush/smush_font.h,v
    retrieving revision 1.2
    diff -u -r1.2 smush_font.h
     
    4646
    4747protected:
    4848
     49        int get2byteCharWidth();
     50        int get2byteCharHeight();
    4951        int getCharWidth(byte c);
    5052        int getStringWidth(char *str);
    5153        int getCharHeight(byte c);
    5254        int getStringHeight(char *str);
     55        int draw2byte(byte *buffer, int dst_width, int x, int y, byte fst, byte snd);
    5356        int drawChar(byte *buffer, int dst_width, int x, int y, byte chr);
    5457        void drawSubstring(char *str, byte *buffer, int dst_width, int x, int y);
    5558        void decodeCodec(byte *dst, byte *src, int length);