WWScreen.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /*****************************************************************************/
  2. /* ここから */
  3. /*****************************************************************************/
  4. #include "WWScreenP.h"
  5. #include "WonX.h"
  6. /*****************************************************************************/
  7. /* メンバ関数の定義 */
  8. /*****************************************************************************/
  9. /*===========================================================================*/
  10. /* プライベートなもの */
  11. /*===========================================================================*/
  12. static int WWScreenCharacter_GetHorizontal(WWScreenCharacter sc)
  13. { return (sc->horizontal); }
  14. static int WWScreenCharacter_GetVertical(WWScreenCharacter sc)
  15. { return (sc->vertical); }
  16. static WWPalette WWScreenCharacter_GetPalette(WWScreenCharacter sc)
  17. { return (sc->palette); }
  18. static WWCharacter WWScreenCharacter_GetCharacter(WWScreenCharacter sc)
  19. { return (sc->character); }
  20. static int WWScreenCharacter_SetHorizontal(WWScreenCharacter sc, int f)
  21. { return (sc->horizontal = f); }
  22. static int WWScreenCharacter_SetVertical(WWScreenCharacter sc, int f)
  23. { return (sc->vertical = f); }
  24. static WWPalette WWScreenCharacter_SetPalette(WWScreenCharacter sc,
  25. WWPalette palette)
  26. { return (sc->palette = palette); }
  27. static WWCharacter WWScreenCharacter_SetCharacter(WWScreenCharacter sc,
  28. WWCharacter c)
  29. { return (sc->character = c); }
  30. static WWScreenCharacter WWScreenCharacter_Create(int horizontal, int vertical,
  31. WWPalette palette,
  32. WWCharacter character)
  33. {
  34. WWScreenCharacter screen_character;
  35. screen_character = (WWScreenCharacter)malloc(sizeof(_WWScreenCharacter));
  36. if (screen_character == NULL)
  37. WonX_Error("WWScreenCharacter", "Cannot allocate memory.");
  38. WWScreenCharacter_SetHorizontal(screen_character, horizontal);
  39. WWScreenCharacter_SetVertical(screen_character, vertical);
  40. WWScreenCharacter_SetPalette(screen_character, palette);
  41. WWScreenCharacter_SetCharacter(screen_character, character);
  42. return (screen_character);
  43. }
  44. static WWScreenCharacter WWScreenCharacter_Destroy(WWScreenCharacter
  45. screen_character)
  46. {
  47. if (screen_character == NULL)
  48. WonX_Error("WWScreenCharacter_Destroy", "Object is not created.");
  49. free(screen_character);
  50. return (NULL);
  51. }
  52. static WWScreenCharacter WWScreen_GetScreenCharacter(WWScreen s, int x, int y)
  53. {
  54. return (s->screen_characters[y * WWScreen_GetWidth(s) + x]);
  55. }
  56. static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
  57. WWScreenCharacter sc)
  58. {
  59. return (s->screen_characters[y * WWScreen_GetWidth(s) + x] = sc);
  60. }
  61. /*===========================================================================*/
  62. /* パブリックなもの */
  63. /*===========================================================================*/
  64. int WWScreen_GetHorizontal(WWScreen s, int x, int y)
  65. {
  66. WWScreenCharacter sc;
  67. sc = WWScreen_GetScreenCharacter(s, x, y);
  68. return (WWScreenCharacter_GetHorizontal(sc));
  69. }
  70. int WWScreen_GetVertical(WWScreen s, int x, int y)
  71. {
  72. WWScreenCharacter sc;
  73. sc = WWScreen_GetScreenCharacter(s, x, y);
  74. return (WWScreenCharacter_GetVertical(sc));
  75. }
  76. WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
  77. {
  78. WWScreenCharacter sc;
  79. sc = WWScreen_GetScreenCharacter(s, x, y);
  80. return (WWScreenCharacter_GetPalette(sc));
  81. }
  82. WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
  83. {
  84. WWScreenCharacter sc;
  85. sc = WWScreen_GetScreenCharacter(s, x, y);
  86. return (WWScreenCharacter_GetCharacter(sc));
  87. }
  88. int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
  89. {
  90. WWScreenCharacter sc;
  91. sc = WWScreen_GetScreenCharacter(s, x, y);
  92. return (WWScreenCharacter_SetHorizontal(sc, f));
  93. }
  94. int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
  95. {
  96. WWScreenCharacter sc;
  97. sc = WWScreen_GetScreenCharacter(s, x, y);
  98. return (WWScreenCharacter_SetVertical(sc, f));
  99. }
  100. WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
  101. {
  102. WWScreenCharacter sc;
  103. sc = WWScreen_GetScreenCharacter(s, x, y);
  104. return (WWScreenCharacter_SetPalette(sc, palette));
  105. }
  106. WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
  107. {
  108. WWScreenCharacter sc;
  109. sc = WWScreen_GetScreenCharacter(s, x, y);
  110. return (WWScreenCharacter_SetCharacter(sc, c));
  111. }
  112. int WWScreen_GetNumber(WWScreen s) { return (s->number); }
  113. int WWScreen_GetWidth( WWScreen s) { return (s->width ); }
  114. int WWScreen_GetHeight(WWScreen s) { return (s->height); }
  115. int WWScreen_GetRollX( WWScreen s) { return (s->roll_x); }
  116. int WWScreen_GetRollY( WWScreen s) { return (s->roll_y); }
  117. int WWScreen_GetEnable(WWScreen s) { return (s->enable); }
  118. int WWScreen_GetMode( WWScreen s) { return (s->mode ); }
  119. int WWScreen_GetDrawX( WWScreen s) { return (s->draw_x ); }
  120. int WWScreen_GetDrawY( WWScreen s) { return (s->draw_y ); }
  121. int WWScreen_GetDrawWidth( WWScreen s) { return (s->draw_width ); }
  122. int WWScreen_GetDrawHeight(WWScreen s) { return (s->draw_height); }
  123. int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
  124. int WWScreen_SetWidth( WWScreen s, int n) { return (s->width = n); }
  125. int WWScreen_SetHeight(WWScreen s, int n) { return (s->height = n); }
  126. int WWScreen_SetRollX( WWScreen s, int r) { return (s->roll_x = r); }
  127. int WWScreen_SetRollY( WWScreen s, int r) { return (s->roll_y = r); }
  128. int WWScreen_SetEnable(WWScreen s, int n) { return (s->enable = n); }
  129. int WWScreen_SetMode( WWScreen s, int n) { return (s->mode = n); }
  130. int WWScreen_SetDrawX( WWScreen s, int n) { return (s->draw_x = n); }
  131. int WWScreen_SetDrawY( WWScreen s, int n) { return (s->draw_y = n); }
  132. int WWScreen_SetDrawWidth( WWScreen s, int n) { return (s->draw_width = n); }
  133. int WWScreen_SetDrawHeight(WWScreen s, int n) { return (s->draw_height = n); }
  134. /* カラーマップの色(0~7)を返す(透明色は-1を返す) */
  135. int WWScreen_GetPixel(WWScreen screen, int x, int y,
  136. WWDisplay display, WWCursor cursor)
  137. {
  138. int cx, cy, px, py;
  139. int pixel;
  140. WWCharacter character;
  141. WWPalette palette;
  142. /* x,y 座標が範囲外のときは,ロールオーバーする */
  143. /* (スクリーンの端と端は,つながっている) */
  144. while (x < 0) x += WWScreen_GetWidth( screen) * 8;
  145. while (y < 0) y += WWScreen_GetHeight(screen) * 8;
  146. x = x % (WWScreen_GetWidth( screen) * 8);
  147. y = y % (WWScreen_GetHeight(screen) * 8);
  148. cx = x / 8; cy = y / 8;
  149. px = x % 8; py = y % 8;
  150. if (WWScreen_GetHorizontal(screen, cx, cy)) px = 7 - px;
  151. if (WWScreen_GetVertical( screen, cx, cy)) py = 7 - py;
  152. character = WWScreen_GetCharacter(screen, cx, cy);
  153. /* カーソル表示の処理 */
  154. palette = WWScreen_GetPalette(screen, cx, cy);
  155. if (cursor != NULL) {
  156. if ( WWCursor_IsON(cursor) &&
  157. (cx >= WWCursor_GetX(cursor)) &&
  158. (cx <= WWCursor_GetX(cursor) + WWCursor_GetWidth( cursor) - 1) &&
  159. (cy >= WWCursor_GetY(cursor)) &&
  160. (cy <= WWCursor_GetY(cursor) + WWCursor_GetHeight(cursor) - 1) ) {
  161. palette = WWCursor_GetPalette(cursor);
  162. }
  163. }
  164. pixel = WWCharacter_GetPixel(character, px, py, display);
  165. /* カラー対応 */
  166. switch (WWDisplay_GetColorMode(display)) {
  167. case COLOR_MODE_GRAYSCALE:
  168. /*
  169. * WonX-2.0 以降では,透明色の処理は WWDisplay クラスで行うように
  170. * 変更したので,WWPalette_GetMappedColor() が -1 を返すことは無い.
  171. */
  172. pixel = WWPalette_GetMappedColor(palette, pixel);
  173. break;
  174. case COLOR_MODE_4COLOR:
  175. case COLOR_MODE_16COLOR:
  176. case COLOR_MODE_16PACKED:
  177. pixel =
  178. ((unsigned short int)WWPalette_GetRed( palette, pixel) << 8) |
  179. ((unsigned short int)WWPalette_GetGreen(palette, pixel) << 4) |
  180. ((unsigned short int)WWPalette_GetBlue( palette, pixel) << 0);
  181. break;
  182. default:
  183. WonX_Error("WWScreen_GetPixel", "Unknown color mode.");
  184. }
  185. /* 透明色の場合には -1 を返す */
  186. if (WWDisplay_IsTransparent(display, palette, pixel))
  187. pixel = -1;
  188. return (pixel);
  189. }
  190. WWScreen WWScreen_Create(int number,
  191. int width, int height,
  192. WWPalette initial_palette,
  193. WWCharacter initial_character,
  194. int draw_x, int draw_y,
  195. int draw_width, int draw_height)
  196. {
  197. WWScreen screen;
  198. WWScreenCharacter sc;
  199. int x, y;
  200. screen = (WWScreen)malloc(sizeof(_WWScreen));
  201. if (screen == NULL)
  202. WonX_Error("WWScreen_Create", "Cannot allocate memory.");
  203. WWScreen_SetNumber(screen, number);
  204. WWScreen_SetWidth( screen, width);
  205. WWScreen_SetHeight(screen, height);
  206. WWScreen_SetRollX( screen, 0);
  207. WWScreen_SetRollY( screen, 0);
  208. WWScreen_SetEnable(screen, 1);
  209. WWScreen_SetMode( screen, WW_SCREEN_DRAW_ALL);
  210. WWScreen_SetDrawX( screen, draw_x);
  211. WWScreen_SetDrawY( screen, draw_y);
  212. WWScreen_SetDrawWidth( screen, draw_width);
  213. WWScreen_SetDrawHeight(screen, draw_height);
  214. screen->screen_characters =
  215. (WWScreenCharacter *)malloc(sizeof(WWScreenCharacter) *
  216. screen->width * screen->height);
  217. for (y = 0; y < screen->height; y++) {
  218. for (x = 0; x < screen->width; x++) {
  219. sc = WWScreenCharacter_Create(0, 0, initial_palette, initial_character);
  220. WWScreen_SetScreenCharacter(screen, x, y, sc);
  221. }
  222. }
  223. return (screen);
  224. }
  225. WWScreen WWScreen_Destroy(WWScreen screen)
  226. {
  227. int x, y;
  228. WWScreenCharacter sc;
  229. if (screen == NULL)
  230. WonX_Error("WWScreen_Destroy", "Object is not created.");
  231. for (y = 0; y < screen->height; y++) {
  232. for (x = 0; x < screen->width; x++) {
  233. sc = WWScreen_GetScreenCharacter(screen, x, y);
  234. WWScreen_SetScreenCharacter(screen, x, y, WWScreenCharacter_Destroy(sc));
  235. }
  236. }
  237. if (screen->screen_characters) free(screen->screen_characters);
  238. free(screen);
  239. return (NULL);
  240. }
  241. /*****************************************************************************/
  242. /* ここまで */
  243. /*****************************************************************************/
  244. /*****************************************************************************/
  245. /* End of File. */
  246. /*****************************************************************************/