#include #include #include #define FILESIZE 2097152 #define X_CHAR 96 #define Y_CHAR 86 #define X_SIZE 24 #define Y_SIZE 24 #define OFFSET 0x100000 // 0x000000:mincho, 0x100000:gothic static uint8_t buf[FILESIZE]; static uint8_t px[Y_CHAR * Y_SIZE][X_CHAR * X_SIZE]; int get_charno(int ku, int ten) { int n; if (ku >= 80) { n = (ku - 80) * 128 + (ten % 32) + 1024 * (ten / 32) + 5120; } else if (ku >= 16) { n = (ku - 16) * 128 + ten + 32; } else if (ku == 13) { if (ten >= 1 && ten <= 5) { n = (ten - 1) + 539; } else if (ten >= 6 && ten <= 20) { n = (ten - 6) + 4608; } else if (ten >= 21 && ten <= 30) { n = (ten - 21) + 3854; } else if (ten >= 32 && ten <= 47) { int t[] = {1, 3, 2, 0, 7, 8, 9, 10, -1, -1, 13, 11, 12, -1, -1, 16}; n = (t[ten - 32] < 0) ? -1 : (t[ten - 32] + 4744); } else if (ten >= 48 && ten <= 49) { n = (ten - 48) + 4638; } else if (ten >= 50 && ten <= 54) { int t[] = {0, 2, 3, 147, 7}; n = (t[ten - 50] < 0) ? -1 : (t[ten - 50] + 7680); } else if (ten >= 66 && ten <= 68) { int t[] = {2, 7, 0}; n = t[ten - 66] + 7689; } else if (ten >= 74 && ten <= 76) { n = (ten - 74) + 4634; } else if (ten == 80) { n = 7708; } else if (ten >= 81 && ten <= 92) { int t[] = {21, 1688, -1, 1689, 1687, 17, 16, -1, -1, 28, 8, 7}; n = (t[ten - 81] < 0) ? -1 : (t[ten - 81] + 640); } else { n = -1; // undefined } } else if (ku >= 8) { n = -1; // 8-15 ku: undefined } else if (ku == 2) { if (ten >= 1 && ten <= 14) { n = (ku + 8) * 128 + (ten % 32) + 1024 * (ten / 32); } else if (ten >= 26 && ten <= 33) { n = (ten - 26) + 641; } else if (ten >= 42 && ten <= 48) { n = (ten - 42) + 649; } else if (ten >= 60 && ten <= 74) { n = (ten - 60) + 656; } else if (ten == 82) { n = 671; } else if (ten >= 83 && ten <= 89) { n = (ten - 83) + 4736; } else { n = -1; // undefined } } else { n = (ku + 8) * 128 + (ten % 32) + 1024 * (ten / 32); } if (n >= 8192) n = -1; return n; } int loadfile(char *filename, int offset) { int i; FILE *fp; fp = fopen(filename, "r"); if (fp == NULL) { printf("loadfile: %s open error\n", filename); return -1; } for (i = 0; i < FILESIZE; i++) { buf[i] = fgetc(fp); } fclose(fp); return 0; } void draw_char(int x, int y, int n, int offset) { int dx, dy; uint32_t d, m; x *= X_SIZE; y *= Y_SIZE; m = 1 << (X_SIZE - 1); for (dy = 0; dy < Y_SIZE; dy++) { if (n >= 0) { d = ((buf[n * 128 + dy * 4 + 0 + offset] << 16) | (buf[n * 128 + dy * 4 + 1 + offset] << 8) | (buf[n * 128 + dy * 4 + 2 + offset] << 0)); } else { d = ~0; } for (dx = 0; dx < X_SIZE; dx++) { if (d & (m >> dx)) { px[y + dy][x + dx] = 1; } else { px[y + dy][x + dx] = 0; } } } return; } int main(int argc, char *argv[]) { int n, x, y, c; loadfile("j8sx0062.bin", 0); for (y = 0; y < Y_CHAR; y++) { for (x = 0; x < X_CHAR; x++) { n = get_charno(y, x); draw_char(x, y, n, OFFSET); } } for (y = 0; y < Y_CHAR * Y_SIZE; y++) { for (x = 0; x < X_CHAR * X_SIZE; x++) { c = px[y][x] ? 0xff : 0x00; putchar(c); putchar(c); putchar(c); } } return 0; }