// --- public domain, no warranty. #include #include #include #define XCHAR_SIZE 16 // 文字幅(X) #define YCHAR_SIZE 16 // 文字幅(Y) #define XCHARS 96 // 並べる文字の数(X) #define YCHARS 96 // 並べる文字の数(Y) #define X_PIXEL (XCHAR_SIZE * XCHARS) // 画素数(X) #define Y_PIXEL (YCHAR_SIZE * YCHARS) // 画素数(Y) #define ROMBUF_SIZE (Y_PIXEL * X_PIXEL / 8) static unsigned char PixBuf0[Y_PIXEL][X_PIXEL]; static unsigned char PixBuf1[Y_PIXEL][X_PIXEL]; static unsigned char PixBuf2[Y_PIXEL][X_PIXEL]; static unsigned char RomBuf0[ROMBUF_SIZE]; static unsigned char RomBuf1[ROMBUF_SIZE]; static unsigned char RomBuf2[ROMBUF_SIZE]; // デコード結果の表示 static void display_result(void) { int x, y; printf("# ImageMagick pixel enumeration: %d,%d,255,RGB\n", X_PIXEL, Y_PIXEL); for (y = 0; y < Y_PIXEL; y++) { for (x = 0; x < X_PIXEL; x++) { printf("%d,%d: ", x, y); printf("(%d,%d,%d)\n", PixBuf0[y][x] ? 255 : 0, PixBuf1[y][x] ? 255 : 0, PixBuf2[y][x] ? 255 : 0); } } return; } // 8x8単位のデコード static unsigned char *decode_8x8(unsigned char *c, int dest_y, int dest_x, unsigned char pixbuf[][X_PIXEL]) { int x, y, mask; for (y = 0; y < 8; y++) { for (x = 0, mask = 0x80; x < 8; x++, mask >>= 1) { pixbuf[dest_y + y][dest_x + x] = *c & mask; } c++; } return c; } // 1文字単位のデコード static void decode_char(unsigned char *c, int dest_y, int dest_x, unsigned char pixbuf[][X_PIXEL]) { c = decode_8x8(c, dest_y + 0, dest_x + 0, pixbuf); // 左上 c = decode_8x8(c, dest_y + 0, dest_x + 8, pixbuf); // 右上 c = decode_8x8(c, dest_y + 8, dest_x + 0, pixbuf); // 左下 c = decode_8x8(c, dest_y + 8, dest_x + 8, pixbuf); // 右下 return; } // 全文字のデコード static void decode_all(unsigned char *c0, unsigned char *c1, unsigned char *c2) { int x, y, idx; for (y = 0; y < YCHARS; y++) { for (x = 0; x < XCHARS; x++) { idx = y * XCHARS + x; decode_char(c0 + idx * (XCHAR_SIZE * YCHAR_SIZE / 8), y * 16, x * 16, PixBuf0); decode_char(c1 + idx * (XCHAR_SIZE * YCHAR_SIZE / 8), y * 16, x * 16, PixBuf1); decode_char(c2 + idx * (XCHAR_SIZE * YCHAR_SIZE / 8), y * 16, x * 16, PixBuf2); } } return; } int main(int argc, char *argv[]) { FILE *fp0, *fp1, *fp2; fp0 = (argc >= 2) ? fopen(argv[1], "rb") : NULL; fp1 = (argc >= 3) ? fopen(argv[2], "rb") : NULL; fp2 = (argc >= 4) ? fopen(argv[3], "rb") : NULL; if (fp0 == NULL) { printf("usage: %s [filename]\n", argv[0]); goto fin0; } if (fp0 != NULL) { memset(RomBuf0, ~0, sizeof(RomBuf0)); fread(RomBuf0, 1, sizeof(RomBuf0), fp0); } else { memset(RomBuf0, 0, sizeof(RomBuf0)); } if (fp1 != NULL) { memset(RomBuf1, ~0, sizeof(RomBuf1)); fread(RomBuf1, 1, sizeof(RomBuf1), fp1); } else { memset(RomBuf1, 0, sizeof(RomBuf1)); } if (fp2 != NULL) { memset(RomBuf2, ~0, sizeof(RomBuf2)); fread(RomBuf2, 1, sizeof(RomBuf2), fp2); } else { memset(RomBuf2, 0, sizeof(RomBuf2)); } decode_all(RomBuf0, RomBuf1, RomBuf2); display_result(); fin0: if (fp2 != NULL) fclose(fp2); if (fp1 != NULL) fclose(fp1); if (fp0 != NULL) fclose(fp0); return 0; }