WWScreen.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*****************************************************************************/
  2. /* ここから */
  3. /*****************************************************************************/
  4. #include "WWScreenP.h"
  5. /*****************************************************************************/
  6. /* メンバ関数の定義 */
  7. /*****************************************************************************/
  8. /*===========================================================================*/
  9. /* プライベートなもの */
  10. /*===========================================================================*/
  11. static int WWScreenCharacter_GetHorizontal(WWScreenCharacter sc)
  12. { return (sc->horizontal); }
  13. static int WWScreenCharacter_GetVertical(WWScreenCharacter sc)
  14. { return (sc->vertical); }
  15. static WWPalette WWScreenCharacter_GetPalette(WWScreenCharacter sc)
  16. { return (sc->palette); }
  17. static WWCharacter WWScreenCharacter_GetCharacter(WWScreenCharacter sc)
  18. { return (sc->character); }
  19. static int WWScreenCharacter_SetHorizontal(WWScreenCharacter sc, int f)
  20. { return (sc->horizontal = f); }
  21. static int WWScreenCharacter_SetVertical(WWScreenCharacter sc, int f)
  22. { return (sc->vertical = f); }
  23. static WWPalette WWScreenCharacter_SetPalette(WWScreenCharacter sc,
  24. WWPalette palette)
  25. { return (sc->palette = palette); }
  26. static WWCharacter WWScreenCharacter_SetCharacter(WWScreenCharacter sc,
  27. WWCharacter c)
  28. { return (sc->character = c); }
  29. static WWScreenCharacter WWScreenCharacter_Create(int horizontal, int vertical,
  30. WWPalette palette,
  31. WWCharacter character)
  32. {
  33. WWScreenCharacter screen_character;
  34. screen_character = (WWScreenCharacter)malloc(sizeof(_WWScreenCharacter));
  35. if (screen_character == NULL)
  36. Error("WWScreenCharacter", "Cannot allocate memory.");
  37. WWScreenCharacter_SetHorizontal(screen_character, horizontal);
  38. WWScreenCharacter_SetVertical(screen_character, vertical);
  39. WWScreenCharacter_SetPalette(screen_character, palette);
  40. WWScreenCharacter_SetCharacter(screen_character, character);
  41. return (screen_character);
  42. }
  43. static WWScreenCharacter WWScreenCharacter_Destroy(WWScreenCharacter
  44. screen_character)
  45. {
  46. if (screen_character == NULL) return (NULL);
  47. free(screen_character);
  48. return (NULL);
  49. }
  50. static WWScreenCharacter WWScreen_GetScreenCharacter(WWScreen s, int x, int y)
  51. {
  52. return (s->screen_characters[y * WWScreen_GetWidth(s) + x]);
  53. }
  54. static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
  55. WWScreenCharacter sc)
  56. {
  57. return (s->screen_characters[y * WWScreen_GetWidth(s) + x] = sc);
  58. }
  59. /*===========================================================================*/
  60. /* パブリックなもの */
  61. /*===========================================================================*/
  62. int WWScreen_GetHorizontal(WWScreen s, int x, int y)
  63. { return (WWScreen_GetScreenCharacter(s, x, y)->horizontal); }
  64. int WWScreen_GetVertical(WWScreen s, int x, int y)
  65. { return (WWScreen_GetScreenCharacter(s, x, y)->vertical); }
  66. WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
  67. { return (WWScreen_GetScreenCharacter(s, x, y)->palette); }
  68. WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
  69. { return (WWScreen_GetScreenCharacter(s, x, y)->character); }
  70. int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
  71. { return (WWScreen_GetScreenCharacter(s, x, y)->horizontal = f); }
  72. int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
  73. { return (WWScreen_GetScreenCharacter(s, x, y)->vertical = f); }
  74. WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
  75. { return (WWScreen_GetScreenCharacter(s, x, y)->palette = palette); }
  76. WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
  77. { return (WWScreen_GetScreenCharacter(s, x, y)->character = c); }
  78. int WWScreen_GetNumber(WWScreen s) { return (s->number); }
  79. int WWScreen_GetWidth( WWScreen s) { return (s->width ); }
  80. int WWScreen_GetHeight(WWScreen s) { return (s->height); }
  81. int WWScreen_GetRollX( WWScreen s) { return (s->roll_x); }
  82. int WWScreen_GetRollY( WWScreen s) { return (s->roll_y); }
  83. int WWScreen_GetEnable(WWScreen s) { return (s->enable); }
  84. int WWScreen_GetMode( WWScreen s) { return (s->mode ); }
  85. int WWScreen_GetDrawX( WWScreen s) { return (s->draw_x ); }
  86. int WWScreen_GetDrawY( WWScreen s) { return (s->draw_y ); }
  87. int WWScreen_GetDrawWidth( WWScreen s) { return (s->draw_width ); }
  88. int WWScreen_GetDrawHeight(WWScreen s) { return (s->draw_height); }
  89. int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
  90. int WWScreen_SetWidth( WWScreen s, int n) { return (s->width = n); }
  91. int WWScreen_SetHeight(WWScreen s, int n) { return (s->height = n); }
  92. int WWScreen_SetRollX( WWScreen s, int r) { return (s->roll_x = r); }
  93. int WWScreen_SetRollY( WWScreen s, int r) { return (s->roll_y = r); }
  94. int WWScreen_SetEnable(WWScreen s, int n) { return (s->enable = n); }
  95. int WWScreen_SetMode( WWScreen s, int n) { return (s->mode = n); }
  96. int WWScreen_SetDrawX( WWScreen s, int n) { return (s->draw_x = n); }
  97. int WWScreen_SetDrawY( WWScreen s, int n) { return (s->draw_y = n); }
  98. int WWScreen_SetDrawWidth( WWScreen s, int n) { return (s->draw_width = n); }
  99. int WWScreen_SetDrawHeight(WWScreen s, int n) { return (s->draw_height = n); }
  100. /* カラーマップの色(0~7)を返す(透明色は-1を返す) */
  101. int WWScreen_GetPixel(WWScreen screen, int x, int y)
  102. {
  103. int cx, cy, px, py;
  104. int pixel;
  105. WWCharacter character;
  106. WWPalette palette;
  107. /* x,y 座標が範囲外のときは,ロールオーバーする */
  108. /* (スクリーンの端と端は,つながっている) */
  109. while (x < 0) x += WWScreen_GetWidth( screen) * 8;
  110. while (y < 0) y += WWScreen_GetHeight(screen) * 8;
  111. x = x % (WWScreen_GetWidth( screen) * 8);
  112. y = y % (WWScreen_GetHeight(screen) * 8);
  113. cx = x / 8; cy = y / 8;
  114. px = x % 8; py = y % 8;
  115. if (WWScreen_GetHorizontal(screen, cx, cy)) px = 7 - px;
  116. if (WWScreen_GetVertical( screen, cx, cy)) py = 7 - py;
  117. character = WWScreen_GetCharacter(screen, cx, cy);
  118. palette = WWScreen_GetPalette(screen, cx, cy);
  119. pixel = WWCharacter_GetPixel(character, px, py);
  120. pixel = WWPalette_GetMappedColor(palette, pixel);
  121. return (pixel);
  122. }
  123. WWScreen WWScreen_Create(int number,
  124. int width, int height,
  125. WWPalette initial_palette,
  126. WWCharacter initial_character,
  127. int draw_x, int draw_y,
  128. int draw_width, int draw_height)
  129. {
  130. WWScreen screen;
  131. WWScreenCharacter sc;
  132. int x, y;
  133. screen = (WWScreen)malloc(sizeof(_WWScreen));
  134. if (screen == NULL) Error("WWScreen_Create", "Cannot allocate memory.");
  135. WWScreen_SetNumber(screen, number);
  136. WWScreen_SetWidth( screen, width);
  137. WWScreen_SetHeight(screen, height);
  138. WWScreen_SetRollX( screen, 0);
  139. WWScreen_SetRollY( screen, 0);
  140. WWScreen_SetEnable(screen, 1);
  141. WWScreen_SetMode( screen, WWSCREEN_DRAW_ALL);
  142. WWScreen_SetDrawX( screen, draw_x);
  143. WWScreen_SetDrawY( screen, draw_y);
  144. WWScreen_SetDrawWidth( screen, draw_width);
  145. WWScreen_SetDrawHeight(screen, draw_height);
  146. screen->screen_characters =
  147. (WWScreenCharacter *)malloc(sizeof(WWScreenCharacter) *
  148. screen->width * screen->height);
  149. for (y = 0; y < screen->height; y++) {
  150. for (x = 0; x < screen->width; x++) {
  151. sc = WWScreenCharacter_Create(0, 0, initial_palette, initial_character);
  152. WWScreen_SetScreenCharacter(screen, x, y, sc);
  153. }
  154. }
  155. return (screen);
  156. }
  157. WWScreen WWScreen_Destroy(WWScreen screen)
  158. {
  159. int x, y;
  160. WWScreenCharacter sc;
  161. if (screen == NULL) return (NULL);
  162. for (y = 0; y < screen->height; y++) {
  163. for (x = 0; x < screen->width; x++) {
  164. sc = WWScreen_GetScreenCharacter(screen, x, y);
  165. WWScreen_SetScreenCharacter(screen, x, y, WWScreenCharacter_Destroy(sc));
  166. }
  167. }
  168. if (screen->screen_characters) free(screen->screen_characters);
  169. free(screen);
  170. return (NULL);
  171. }
  172. /*****************************************************************************/
  173. /* ここまで */
  174. /*****************************************************************************/
  175. /*****************************************************************************/
  176. /* End of File. */
  177. /*****************************************************************************/