Changeset 114


Ignore:
Timestamp:
04/15/07 05:11:26 (6 years ago)
Author:
GrAnd
Message:

+ Codepage translation for TextReader?

Location:
branches/grand
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/grand/core/conf.c

    r113 r114  
    103103    CONF_INFO( 44, conf.reader_autoscroll_delay, CONF_DEF_VALUE, i:5, NULL), 
    104104    CONF_INFO( 45, conf.reader_rbf_file,        CONF_DEF_PTR,   ptr:"", NULL), 
     105    CONF_INFO( 46, conf.reader_codepage,        CONF_DEF_VALUE, i:FONT_CP_WIN, NULL), 
    105106}; 
    106107#define CONF_NUM (sizeof(conf_info)/sizeof(conf_info[0])) 
  • branches/grand/core/gui.c

    r113 r114  
    5858static const char* gui_raw_prefix_enum(int change, int arg); 
    5959static const char* gui_raw_ext_enum(int change, int arg); 
     60static const char* gui_reader_codepage_enum(int change, int arg); 
    6061 
    6162// Menu callbacks 
     
    9899    {"Open new file...",            MENUITEM_PROC,    (int*)gui_draw_read }, 
    99100    {"Open last opened file",       MENUITEM_PROC,    (int*)gui_draw_read_last }, 
     101    {"Select RBF font",             MENUITEM_PROC,    (int*)gui_draw_load_rbf }, 
     102    {"Codepage",                    MENUITEM_ENUM,    (int*)gui_reader_codepage_enum }, 
    100103    {"Enable autoscroll",           MENUITEM_BOOL,    &conf.reader_autoscroll }, 
    101104    {"Autoscroll delay (sec)",      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.reader_autoscroll_delay, MENU_MINMAX(0, 60) }, 
    102     {"Select RBF font",             MENUITEM_PROC,    (int*)gui_draw_load_rbf }, 
    103105    {"<- Back",                     MENUITEM_UP }, 
    104106    {0} 
     
    328330 
    329331    return exts[conf.raw_ext]; 
     332} 
     333 
     334//------------------------------------------------------------------- 
     335const char* gui_reader_codepage_enum(int change, int arg) { 
     336    static const char* cps[]={ "Win1251", "DOS"}; 
     337 
     338    conf.reader_codepage+=change; 
     339    if (conf.reader_codepage<0) 
     340        conf.reader_codepage=(sizeof(cps)/sizeof(cps[0]))-1; 
     341    else if (conf.reader_codepage>=(sizeof(cps)/sizeof(cps[0]))) 
     342        conf.reader_codepage=0; 
     343 
     344    return cps[conf.reader_codepage]; 
    330345} 
    331346 
     
    858873        if (!rbf_load(conf.reader_rbf_file)) 
    859874            rbf_load_from_8x16(current_font); 
     875        rbf_set_codepage(conf.reader_codepage); 
    860876        gui_mode = GUI_MODE_READ; 
    861877        gui_read_init(fn); 
  • branches/grand/include/conf.h

    r113 r114  
    5656 
    5757    char reader_file[100]; 
    58     int reader_pos; 
    59     int reader_autoscroll; 
    60     int reader_autoscroll_delay; 
     58    int  reader_pos; 
     59    int  reader_autoscroll; 
     60    int  reader_autoscroll_delay; 
    6161    char reader_rbf_file[100]; 
     62    int  reader_codepage; 
    6263 
    6364    int sokoban_level; 
  • branches/grand/include/font.h

    r113 r114  
    1010#define FONT_KEYRUS     3 
    1111 
     12#define FONT_CP_WIN     0 
     13#define FONT_CP_DOS     1 
     14 
    1215//------------------------------------------------------------------- 
    1316extern const unsigned char *current_font; 
     
    2023extern int rbf_font_height(); 
    2124extern int rbf_char_width(int ch); 
     25extern void rbf_set_codepage(int codepage); 
    2226extern int rbf_draw_char(int x, int y, int ch, color cl); 
    2327 
  • branches/grand/lib/font/rbf_font.c

    r113 r114  
    11#include "stdlib.h" 
    22#include "gui.h" 
     3#include "font.h" 
    34 
    45//------------------------------------------------------------------- 
     
    89//------------------------------------------------------------------- 
    910const char *RBF_HDR_MAGIC = "\xE0\x0E\xF0\x0D\x03\x00\x00\x00"; 
    10  
     11/* 
     12const char tbl_dos2win[] = { 
     13    192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 
     14    208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 
     15    224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 
     16    136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151, 
     17    152,153,154,129,156,157,158,159,160,161,162,163,164,165,166,167, 
     18    168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183, 
     19    240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, 
     20    130,132,135,134,128,133,131,155,184,185,186,187,188,189,190,191 
     21}; 
     22*/ 
    1123static struct { 
    1224     char name[RBF_MAX_NAME]; 
     
    2537     int _unknown4; 
    2638} rbf_font; 
    27 static int need_free=0;; 
     39static int need_free    = 0; 
     40static int rbf_codepage = FONT_CP_WIN;  
    2841 
    2942//------------------------------------------------------------------- 
    3043static int win2dos(int ch) { 
    31     if (ch>=192 && ch<=255) { 
    32        if (ch<=239) ch-=64; 
    33        else         ch-=16; 
    34     } 
    35     return ch; 
     44    switch (ch) { 
     45        case 0xAA: return 0xF2;  // ò 
     46        case 0xBA: return 0xF3;  // ó 
     47        case 0xAF: return 0xF4;  // ô 
     48        case 0xBF: return 0xF5;  // õ 
     49        default: 
     50            if (ch>=192 && ch<=255) { 
     51               if (ch<=239) ch-=64; 
     52               else         ch-=16; 
     53            } 
     54            return ch; 
     55    } 
     56} 
     57 
     58//------------------------------------------------------------------- 
     59static int dos2win(int ch) { 
     60    switch (ch) { 
     61        case 0xF2: return 0xAA;  // ò 
     62        case 0xF3: return 0xBA;  // ó 
     63        case 0xF4: return 0xAF;  // ô 
     64        case 0xF5: return 0xBF;  // õ 
     65        default: 
     66            if (ch>=128 && ch<=175) { 
     67               ch+=64; 
     68            } else if (ch>=224 && ch<=239) { 
     69               ch+=16; 
     70            } 
     71            return ch; 
     72    } 
    3673} 
    3774 
     
    89126        lseek(fd, rbf_font._wmapAddr, SEEK_SET); 
    90127        for (i=rbf_font.charFirst; i<=rbf_font.charLast; ++i) { 
    91             read(fd, &rbf_font.wTable[win2dos(i)], 1); 
     128            read(fd, &rbf_font.wTable[i], 1); 
    92129        } 
    93130 
    94131        lseek(fd, rbf_font._cmapAddr, SEEK_SET); 
    95132        for (i=rbf_font.charFirst; i<=rbf_font.charLast; ++i) { 
    96             rbf_font.cTable[win2dos(i)]=malloc(rbf_font.charSize); 
    97             read(fd, rbf_font.cTable[win2dos(i)], rbf_font.charSize); 
     133            rbf_font.cTable[i]=malloc(rbf_font.charSize); 
     134            read(fd, rbf_font.cTable[i], rbf_font.charSize); 
    98135        } 
    99136        need_free = 1; 
     
    129166 
    130167    for (i=rbf_font.charFirst; i<=rbf_font.charLast; ++i) { 
    131         rbf_font.cTable[i]=malloc(rbf_font.charSize); 
    132         memcpy(rbf_font.cTable[i], font+i*rbf_font.charSize, rbf_font.charSize); 
     168        rbf_font.cTable[dos2win(i)]=malloc(rbf_font.charSize); 
     169        memcpy(rbf_font.cTable[dos2win(i)], font+i*rbf_font.charSize, rbf_font.charSize); 
    133170    } 
    134171    need_free = 1; 
     172} 
     173 
     174//------------------------------------------------------------------- 
     175void rbf_set_codepage(int codepage) { 
     176    rbf_codepage = codepage; 
    135177} 
    136178 
     
    142184//------------------------------------------------------------------- 
    143185int rbf_char_width(int ch) { 
     186    switch (rbf_codepage) { 
     187        case FONT_CP_WIN:  
     188            break; 
     189        case FONT_CP_DOS:  
     190            ch = dos2win(ch);  
     191            break; 
     192    } 
    144193    return rbf_font.wTable[ch]; 
    145194} 
     
    149198    int xx, yy; 
    150199 
    151     for (yy=0; yy<rbf_font.height; ++yy){ 
    152         for (xx=0; xx<rbf_font.wTable[ch]; ++xx){ 
     200    switch (rbf_codepage) { 
     201        case FONT_CP_WIN:  
     202            break; 
     203        case FONT_CP_DOS:  
     204            ch = dos2win(ch);  
     205            break; 
     206    } 
     207 
     208    for (yy=0; yy<rbf_font.height; ++yy) { 
     209        for (xx=0; xx<rbf_font.wTable[ch]; ++xx) { 
    153210            draw_pixel(x+xx ,y+yy, (rbf_font.cTable[ch][yy*rbf_font.width/8+xx/8] & (1<<(xx%8)))? cl&0xff : cl>>8); 
    154211        } 
    155212    } 
    156     return rbf_char_width(ch); 
    157 } 
    158  
    159 //------------------------------------------------------------------- 
     213    return rbf_font.wTable[ch]; 
     214} 
     215 
     216//------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.