kanjifont.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <stdio.h>
  2. #include "kanjifont.h"
  3. #define NUM_OF_KANJIFONT 6877
  4. #define KANJIFONT_SIZE 8
  5. static unsigned char kfonts[NUM_OF_KANJIFONT * KANJIFONT_SIZE];
  6. static unsigned char notfound[KANJIFONT_SIZE] = {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55};
  7. static int font_loaded;
  8. int InitKanjiFont(char *fontfile) {
  9. FILE *fp;
  10. int c, i;
  11. font_loaded = 0;
  12. fp = fopen(fontfile, "rb");
  13. if(fp != NULL) {
  14. i = 0;
  15. while((c = fgetc(fp)) >= 0) {
  16. kfonts[i++] = (unsigned char)c;
  17. }
  18. if(i == NUM_OF_KANJIFONT * KANJIFONT_SIZE)
  19. font_loaded = 1;
  20. }
  21. return font_loaded;
  22. }
  23. unsigned char *GetKanjiFont(int u, int d) {
  24. int c;
  25. if (u > 0x9f) u -= 0x40;
  26. if (d > 0x7f) d--;
  27. d -= 0x40;
  28. u -= 0x81;
  29. c = u * 0xbc + d;
  30. if(!font_loaded)
  31. return notfound;
  32. if (c >= 7806) {
  33. c = -1;
  34. } else if(c >= 4418) { /* 第二水準漢字 */
  35. c = c + (0xda1 - 4418);
  36. } else if (c >= 4375) { /* なし */
  37. c = -1;
  38. } else if (c >= 1410) { /* 第一水準漢字 */
  39. c = c + (0x20c - 1410);
  40. } else if (c >= 690) { /* 禁止領域の文字 */
  41. c = -1;
  42. } else if (c >= 658) { /* 罫線素 */
  43. c = c + (0x1ec - 658);
  44. } else if (c >= 612) { /* ロシア小 */
  45. c = c + (0x1cb - 612);
  46. } else if (c >= 564) { /* ロシア大 */
  47. c = c + (0x1aa - 564);
  48. } else if (c >= 502) { /* ギリシャ小 */
  49. c = c + (0x192 - 502);
  50. } else if (c >= 470) { /* ギリシャ大*/
  51. c = c + (0x17a - 470);
  52. } else if (c >= 376) { /* カタカナ */
  53. c = c + (0x124 - 376);
  54. } else if (c >= 282) { /* ひらがな */
  55. c = c + (0xd1 - 282);
  56. } else if (c >= 252) { /* 英小文字 */
  57. c = c + (0xb7 - 252);
  58. } else if (c >= 220) { /* 英大文字 */
  59. c = c + (0x9d - 220);
  60. } else if (c >= 203) { /* 数字 */
  61. c = c + (0x93 - 203);
  62. } else if (c >= 187) { /* 記号(◯) */
  63. c = 0x92;
  64. } else if (c >= 175) { /* 記号(ʼn♯♭♪†‡¶) */
  65. c = c + (0x8a - 203);
  66. } else if (c >= 153) { /* 記号(∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬) */
  67. c = c + (0x7b - 153);
  68. } else if (c >= 135) { /* 記号(∧∨¬⇒⇔∀∃) */
  69. c = c + (0x74 - 135);
  70. } else if (c >= 119) { /* 記号(∈∋⊆⊇⊂⊃∪∩) */
  71. c = c + (0x6c - 119);
  72. } // else {} /* 記号(その他) */
  73. if(c == -1)
  74. return notfound;
  75. else
  76. return kfonts + (c * KANJIFONT_SIZE);
  77. }
  78. void GetKanjiFont16(int code, unsigned char *font) {
  79. unsigned char *font8;
  80. int i, j;
  81. font8 = GetKanjiFont((code >> 8) & 0xff, code & 0xff);
  82. for(i = 0; i < 8; i++) {
  83. font[i * 2 + 1] = 0;
  84. for(j = 0; j < 4; j++) {
  85. font[i * 2 + 1] <<= 2;
  86. if((font8[i] >> j) & 1)
  87. font[i * 2 + 1] |= 3; // (11)2
  88. }
  89. font[i * 2] = 0;
  90. for(j = 4; j < 8; j++) {
  91. font[i * 2] <<= 2;
  92. if((font8[i] >> j) & 1)
  93. font[i * 2] |= 3; // (11)2
  94. }
  95. }
  96. }