WWScreen.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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) return (NULL);
  48. free(screen_character);
  49. return (NULL);
  50. }
  51. static WWScreenCharacter WWScreen_GetScreenCharacter(WWScreen s, int x, int y)
  52. {
  53. return (s->screen_characters[y * WWScreen_GetWidth(s) + x]);
  54. }
  55. static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
  56. WWScreenCharacter sc)
  57. {
  58. return (s->screen_characters[y * WWScreen_GetWidth(s) + x] = sc);
  59. }
  60. /*===========================================================================*/
  61. /* パブリックなもの */
  62. /*===========================================================================*/
  63. int WWScreen_GetHorizontal(WWScreen s, int x, int y)
  64. {
  65. WWScreenCharacter sc;
  66. sc = WWScreen_GetScreenCharacter(s, x, y);
  67. return (WWScreenCharacter_GetHorizontal(sc));
  68. }
  69. int WWScreen_GetVertical(WWScreen s, int x, int y)
  70. {
  71. WWScreenCharacter sc;
  72. sc = WWScreen_GetScreenCharacter(s, x, y);
  73. return (WWScreenCharacter_GetVertical(sc));
  74. }
  75. WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
  76. {
  77. WWScreenCharacter sc;
  78. sc = WWScreen_GetScreenCharacter(s, x, y);
  79. return (WWScreenCharacter_GetPalette(sc));
  80. }
  81. WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
  82. {
  83. WWScreenCharacter sc;
  84. sc = WWScreen_GetScreenCharacter(s, x, y);
  85. return (WWScreenCharacter_GetCharacter(sc));
  86. }
  87. int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
  88. {
  89. WWScreenCharacter sc;
  90. sc = WWScreen_GetScreenCharacter(s, x, y);
  91. return (WWScreenCharacter_SetHorizontal(sc, f));
  92. }
  93. int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
  94. {
  95. WWScreenCharacter sc;
  96. sc = WWScreen_GetScreenCharacter(s, x, y);
  97. return (WWScreenCharacter_SetVertical(sc, f));
  98. }
  99. WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
  100. {
  101. WWScreenCharacter sc;
  102. sc = WWScreen_GetScreenCharacter(s, x, y);
  103. return (WWScreenCharacter_SetPalette(sc, palette));
  104. }
  105. WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
  106. {
  107. WWScreenCharacter sc;
  108. sc = WWScreen_GetScreenCharacter(s, x, y);
  109. return (WWScreenCharacter_SetCharacter(sc, c));
  110. }
  111. int WWScreen_GetNumber(WWScreen s) { return (s->number); }
  112. int WWScreen_GetWidth( WWScreen s) { return (s->width ); }
  113. int WWScreen_GetHeight(WWScreen s) { return (s->height); }
  114. int WWScreen_GetRollX( WWScreen s) { return (s->roll_x); }
  115. int WWScreen_GetRollY( WWScreen s) { return (s->roll_y); }
  116. int WWScreen_GetEnable(WWScreen s) { return (s->enable); }
  117. int WWScreen_GetMode( WWScreen s) { return (s->mode ); }
  118. int WWScreen_GetDrawX( WWScreen s) { return (s->draw_x ); }
  119. int WWScreen_GetDrawY( WWScreen s) { return (s->draw_y ); }
  120. int WWScreen_GetDrawWidth( WWScreen s) { return (s->draw_width ); }
  121. int WWScreen_GetDrawHeight(WWScreen s) { return (s->draw_height); }
  122. int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
  123. int WWScreen_SetWidth( WWScreen s, int n) { return (s->width = n); }
  124. int WWScreen_SetHeight(WWScreen s, int n) { return (s->height = n); }
  125. int WWScreen_SetRollX( WWScreen s, int r) { return (s->roll_x = r); }
  126. int WWScreen_SetRollY( WWScreen s, int r) { return (s->roll_y = r); }
  127. int WWScreen_SetEnable(WWScreen s, int n) { return (s->enable = n); }
  128. int WWScreen_SetMode( WWScreen s, int n) { return (s->mode = n); }
  129. int WWScreen_SetDrawX( WWScreen s, int n) { return (s->draw_x = n); }
  130. int WWScreen_SetDrawY( WWScreen s, int n) { return (s->draw_y = n); }
  131. int WWScreen_SetDrawWidth( WWScreen s, int n) { return (s->draw_width = n); }
  132. int WWScreen_SetDrawHeight(WWScreen s, int n) { return (s->draw_height = n); }
  133. /* カラーマップの色(0~7)を返す(透明色は-1を返す) */
  134. int WWScreen_GetPixel(WWScreen screen, int x, int y, WWCursor cursor)
  135. {
  136. int cx, cy, px, py;
  137. int pixel;
  138. WWCharacter character;
  139. WWPalette palette;
  140. /* x,y 座標が範囲外のときは,ロールオーバーする */
  141. /* (スクリーンの端と端は,つながっている) */
  142. while (x < 0) x += WWScreen_GetWidth( screen) * 8;
  143. while (y < 0) y += WWScreen_GetHeight(screen) * 8;
  144. x = x % (WWScreen_GetWidth( screen) * 8);
  145. y = y % (WWScreen_GetHeight(screen) * 8);
  146. cx = x / 8; cy = y / 8;
  147. px = x % 8; py = y % 8;
  148. if (WWScreen_GetHorizontal(screen, cx, cy)) px = 7 - px;
  149. if (WWScreen_GetVertical( screen, cx, cy)) py = 7 - py;
  150. character = WWScreen_GetCharacter(screen, cx, cy);
  151. /* カーソル表示の処理 */
  152. palette = WWScreen_GetPalette(screen, cx, cy);
  153. if (cursor != NULL) {
  154. if ( WWCursor_IsON(cursor) &&
  155. (cx >= WWCursor_GetX(cursor)) &&
  156. (cx <= WWCursor_GetX(cursor) + WWCursor_GetWidth( cursor) - 1) &&
  157. (cy >= WWCursor_GetY(cursor)) &&
  158. (cy <= WWCursor_GetY(cursor) + WWCursor_GetHeight(cursor) - 1) ) {
  159. palette = WWCursor_GetPalette(cursor);
  160. }
  161. }
  162. pixel = WWCharacter_GetPixel(character, px, py);
  163. pixel = WWPalette_GetMappedColor(palette, pixel); /*透明色は-1が返ってくる*/
  164. return (pixel);
  165. }
  166. WWScreen WWScreen_Create(int number,
  167. int width, int height,
  168. WWPalette initial_palette,
  169. WWCharacter initial_character,
  170. int draw_x, int draw_y,
  171. int draw_width, int draw_height)
  172. {
  173. WWScreen screen;
  174. WWScreenCharacter sc;
  175. int x, y;
  176. screen = (WWScreen)malloc(sizeof(_WWScreen));
  177. if (screen == NULL)
  178. WonX_Error("WWScreen_Create", "Cannot allocate memory.");
  179. WWScreen_SetNumber(screen, number);
  180. WWScreen_SetWidth( screen, width);
  181. WWScreen_SetHeight(screen, height);
  182. WWScreen_SetRollX( screen, 0);
  183. WWScreen_SetRollY( screen, 0);
  184. WWScreen_SetEnable(screen, 1);
  185. WWScreen_SetMode( screen, WW_SCREEN_DRAW_ALL);
  186. WWScreen_SetDrawX( screen, draw_x);
  187. WWScreen_SetDrawY( screen, draw_y);
  188. WWScreen_SetDrawWidth( screen, draw_width);
  189. WWScreen_SetDrawHeight(screen, draw_height);
  190. screen->screen_characters =
  191. (WWScreenCharacter *)malloc(sizeof(WWScreenCharacter) *
  192. screen->width * screen->height);
  193. for (y = 0; y < screen->height; y++) {
  194. for (x = 0; x < screen->width; x++) {
  195. sc = WWScreenCharacter_Create(0, 0, initial_palette, initial_character);
  196. WWScreen_SetScreenCharacter(screen, x, y, sc);
  197. }
  198. }
  199. return (screen);
  200. }
  201. WWScreen WWScreen_Destroy(WWScreen screen)
  202. {
  203. int x, y;
  204. WWScreenCharacter sc;
  205. if (screen == NULL) return (NULL);
  206. for (y = 0; y < screen->height; y++) {
  207. for (x = 0; x < screen->width; x++) {
  208. sc = WWScreen_GetScreenCharacter(screen, x, y);
  209. WWScreen_SetScreenCharacter(screen, x, y, WWScreenCharacter_Destroy(sc));
  210. }
  211. }
  212. if (screen->screen_characters) free(screen->screen_characters);
  213. free(screen);
  214. return (NULL);
  215. }
  216. /*****************************************************************************/
  217. /* ここまで */
  218. /*****************************************************************************/
  219. /*****************************************************************************/
  220. /* End of File. */
  221. /*****************************************************************************/