WWDisplay.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*****************************************************************************/
  2. /* ここから */
  3. /*****************************************************************************/
  4. #include "WWDisplayP.h"
  5. /*****************************************************************************/
  6. /* メンバ関数の定義 */
  7. /*****************************************************************************/
  8. /*===========================================================================*/
  9. /* メンバの取得 */
  10. /*===========================================================================*/
  11. WWColorMap WWDisplay_GetColorMap(WWDisplay d) { return (d->color_map); }
  12. WWPalette WWDisplay_GetPalette(WWDisplay d, int n) { return (d->palette[n]); }
  13. WWCharacter WWDisplay_GetCharacter(WWDisplay d, int n)
  14. { return (d->character[n]); }
  15. WWSprite WWDisplay_GetSprite(WWDisplay d, int n) { return (d->sprite[n]); }
  16. WWScreen WWDisplay_GetScreen(WWDisplay d, int n) { return (d->screen[n]); }
  17. WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d) { return (d->lcd_panel); }
  18. int WWDisplay_GetScreenEnable(WWDisplay d, int n)
  19. { return (d->screen_enable[n]); }
  20. int WWDisplay_GetSpriteEnable(WWDisplay d) { return (d->sprite_enable); }
  21. int WWDisplay_GetSpriteWindowEnable(WWDisplay d)
  22. { return (d->sprite_window_enable); }
  23. int WWDisplay_GetScreen2WindowMode(WWDisplay d)
  24. { return (d->screen2_window_mode); }
  25. int WWDisplay_GetBorder(WWDisplay d) { return (d->border); }
  26. int WWDisplay_GetForegroundColor(WWDisplay d) { return (d->foreground_color); }
  27. int WWDisplay_GetBackgroundColor(WWDisplay d) { return (d->background_color); }
  28. int WWDisplay_GetSpriteStart(WWDisplay d) { return (d->sprite_start); }
  29. int WWDisplay_GetSpriteCount(WWDisplay d) { return (d->sprite_count); }
  30. /*===========================================================================*/
  31. /* メンバの設定 */
  32. /*===========================================================================*/
  33. WWColorMap WWDisplay_SetColorMap(WWDisplay d, WWColorMap cm)
  34. { return (d->color_map = cm); }
  35. WWPalette WWDisplay_SetPalette(WWDisplay d, int n, WWPalette p)
  36. { return (d->palette[n] = p); }
  37. WWCharacter WWDisplay_SetCharacter(WWDisplay d, int n, WWCharacter c)
  38. { return (d->character[n] = c); }
  39. WWSprite WWDisplay_SetSprite(WWDisplay d, int n, WWSprite s)
  40. { return (d->sprite[n] = s); }
  41. WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s)
  42. { return (d->screen[n] = s); }
  43. WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p)
  44. { return (d->lcd_panel = p); }
  45. int WWDisplay_SetScreenEnable(WWDisplay d, int n, int f)
  46. { return (d->screen_enable[n] = f); }
  47. int WWDisplay_SetSpriteEnable(WWDisplay d, int f)
  48. { return (d->sprite_enable = f); }
  49. int WWDisplay_SetSpriteWindowEnable(WWDisplay d, int f)
  50. { return (d->sprite_window_enable = f); }
  51. int WWDisplay_SetScreen2WindowMode(WWDisplay d, int mode)
  52. { return (d->screen2_window_mode = mode); }
  53. int WWDisplay_SetBorder(WWDisplay d, int b) { return (d->border = b); }
  54. int WWDisplay_SetForegroundColor(WWDisplay d, int c)
  55. { return (d->foreground_color = c); }
  56. int WWDisplay_SetBackgroundColor(WWDisplay d, int c)
  57. { return (d->background_color = c); }
  58. int WWDisplay_SetSpriteStart(WWDisplay d, int n)
  59. { return (d->sprite_start = n); }
  60. int WWDisplay_SetSpriteCount(WWDisplay d, int n)
  61. { return (d->sprite_count = n); }
  62. /*===========================================================================*/
  63. /* オブジェクトの生成と消去 */
  64. /*===========================================================================*/
  65. WWDisplay WWDisplay_Create(int lcd_panel_width, int lcd_panel_height,
  66. int screen_width, int screen_height)
  67. {
  68. WWDisplay display;
  69. int i;
  70. display = (WWDisplay)malloc(sizeof(_WWDisplay));
  71. if (display == NULL) Error("WWDisplay_Create", "Cannot allocate memory.");
  72. WWDisplay_SetColorMap(display, WWColorMap_Create(NULL));
  73. for (i = 0; i < 16; i++) {
  74. WWDisplay_SetPalette(display, i,
  75. WWPalette_Create(i, NULL, ((i / 4) % 2) ? 1 : 0));
  76. }
  77. for (i = 0; i < 512; i++) {
  78. WWDisplay_SetCharacter(display, i, WWCharacter_Create(i, NULL));
  79. }
  80. for (i = 0; i < 128; i++) {
  81. WWDisplay_SetSprite(display, i,
  82. WWSprite_Create(i, 0, 0, 0, 0, 0, 0,
  83. WWDisplay_GetPalette(display, 0),
  84. WWDisplay_GetCharacter(display, 0)));
  85. }
  86. for (i = 0; i < 2; i++) {
  87. WWDisplay_SetScreen(display, i,
  88. WWScreen_Create(i, screen_width, screen_height,
  89. WWDisplay_GetPalette(display, 0),
  90. WWDisplay_GetCharacter(display, 0)));
  91. }
  92. WWDisplay_SetLCDPanel(display, WWLCDPanel_Create(lcd_panel_width,
  93. lcd_panel_height));
  94. WWDisplay_SetScreenEnable(display, 0, 0);
  95. WWDisplay_SetScreenEnable(display, 1, 0);
  96. WWDisplay_SetSpriteEnable(display, 0);
  97. WWDisplay_SetSpriteWindowEnable(display, 0);
  98. WWDisplay_SetScreen2WindowMode(display, 0);
  99. WWDisplay_SetBorder(display, 0);
  100. WWDisplay_SetForegroundColor(display, 3);
  101. WWDisplay_SetBackgroundColor(display, 0);
  102. WWDisplay_SetSpriteStart(display, 0);
  103. WWDisplay_SetSpriteCount(display, 0);
  104. return (display);
  105. }
  106. WWDisplay WWDisplay_Destroy(WWDisplay display)
  107. {
  108. int i;
  109. if (display == NULL) return (NULL);
  110. if (WWDisplay_GetColorMap(display) != NULL)
  111. WWDisplay_SetColorMap(display,
  112. WWColorMap_Destroy(WWDisplay_GetColorMap(display)));
  113. for (i = 0; i < 16; i++) {
  114. if (WWDisplay_GetPalette(display, i) != NULL)
  115. WWDisplay_SetPalette(display, i,
  116. WWPalette_Destroy(WWDisplay_GetPalette(display, i))
  117. );
  118. }
  119. for (i = 0; i < 512; i++) {
  120. if (WWDisplay_GetCharacter(display, i) != NULL)
  121. WWDisplay_SetCharacter(display, i,
  122. WWCharacter_Destroy(WWDisplay_GetCharacter(display
  123. , i)));
  124. }
  125. for (i = 0; i < 128; i++) {
  126. if (WWDisplay_GetSprite(display, i) != NULL)
  127. WWDisplay_SetSprite(display, i,
  128. WWSprite_Destroy(WWDisplay_GetSprite(display, i)));
  129. }
  130. for (i = 0; i < 2; i++) {
  131. if (WWDisplay_GetScreen(display, i) != NULL)
  132. WWDisplay_SetScreen(display, i,
  133. WWScreen_Destroy(WWDisplay_GetScreen(display, i)));
  134. }
  135. if (WWDisplay_GetLCDPanel(display) != NULL)
  136. WWDisplay_SetLCDPanel(display,
  137. WWLCDPanel_Destroy(WWDisplay_GetLCDPanel(display)));
  138. free(display);
  139. return (NULL);
  140. }
  141. /*===========================================================================*/
  142. /* LCDパネルの描画 */
  143. /*===========================================================================*/
  144. static int WWDisplay_DrawScreen(WWDisplay display, WWScreen screen)
  145. {
  146. WWLCDPanel lcd_panel;
  147. int lcd_panel_width;
  148. int lcd_panel_height;
  149. int pixel;
  150. int x, y, px, py;
  151. lcd_panel = WWDisplay_GetLCDPanel(display);
  152. lcd_panel_width = WWLCDPanel_GetWidth( lcd_panel);
  153. lcd_panel_height = WWLCDPanel_GetHeight(lcd_panel);
  154. for (y = 0; y < lcd_panel_height; y++) {
  155. for (x = 0; x < lcd_panel_width; x++) {
  156. px = x + WWScreen_GetRollX(screen);
  157. py = y + WWScreen_GetRollY(screen);
  158. pixel = WWScreen_GetPixel(screen, px, py);
  159. /* 透明色の場合 */
  160. if (pixel == -1) continue;
  161. pixel = WWColorMap_GetLCDColor(WWDisplay_GetColorMap(display), pixel);
  162. WWLCDPanel_SetPixel(lcd_panel, x, y, pixel);
  163. }
  164. }
  165. return (0);
  166. }
  167. static int WWDisplay_DrawSprite(WWDisplay display, WWSprite sprite)
  168. {
  169. int x, y;
  170. int pixel;
  171. for (y = 0; y < 8; y++) {
  172. for (x = 0; x < 8; x++) {
  173. pixel = WWSprite_GetPixel(sprite, x, y);
  174. /* 透明色の場合 */
  175. if (pixel == -1) continue;
  176. pixel = WWColorMap_GetLCDColor(WWDisplay_GetColorMap(display), pixel);
  177. WWLCDPanel_SetPixel(WWDisplay_GetLCDPanel(display),
  178. WWSprite_GetX(sprite) + x,
  179. WWSprite_GetY(sprite) + y,
  180. pixel);
  181. }
  182. }
  183. return (0);
  184. }
  185. int WWDisplay_DrawLCDPanel(WWDisplay display)
  186. {
  187. WWLCDPanel lcd_panel;
  188. WWScreen screen;
  189. int x, y, i;
  190. int lcd_panel_width;
  191. int lcd_panel_height;
  192. WWColorMap color_map;
  193. int border;
  194. WWSprite sprite;
  195. lcd_panel = WWDisplay_GetLCDPanel(display);
  196. lcd_panel_width = WWLCDPanel_GetWidth(lcd_panel);
  197. lcd_panel_height = WWLCDPanel_GetHeight(lcd_panel);
  198. color_map = WWDisplay_GetColorMap(display);
  199. border = WWDisplay_GetBorder(display);
  200. /* ボーダーカラーで埋める */
  201. for (x = 0; x < lcd_panel_width; x++) {
  202. for (y = 0; y < lcd_panel_height; y++) {
  203. WWLCDPanel_SetPixel(lcd_panel, x, y,
  204. WWColorMap_GetLCDColor(color_map, border));
  205. }
  206. }
  207. /* スクリーン1描画 */
  208. WWDisplay_DrawScreen(display, WWDisplay_GetScreen(display, 0));
  209. /* スプライト描画(スクリーン2より優先でないもの) */
  210. for (i = 0; i < WWDisplay_GetSpriteCount(display); i++) {
  211. sprite = WWDisplay_GetSprite(display,
  212. i + WWDisplay_GetSpriteStart(display));
  213. if (!WWSprite_GetPriority(sprite)) {
  214. WWDisplay_DrawSprite(display, sprite);
  215. }
  216. }
  217. /* スクリーン2描画 */
  218. WWDisplay_DrawScreen(display, WWDisplay_GetScreen(display, 1));
  219. /* スプライト描画(スクリーン2より優先なもの) */
  220. for (i = 0; i < WWDisplay_GetSpriteCount(display); i++) {
  221. sprite = WWDisplay_GetSprite(display,
  222. i + WWDisplay_GetSpriteStart(display));
  223. if (WWSprite_GetPriority(sprite)) {
  224. WWDisplay_DrawSprite(display, sprite);
  225. }
  226. }
  227. /*
  228. for (x = 0; x < lcd_panel_width; x++) {
  229. for (y = 0; y < lcd_panel_height; y++) {
  230. printf("%d", WWLCDPanel_GetPixel(lcd_panel, x, y));
  231. }
  232. }
  233. */
  234. return (0);
  235. }
  236. /*****************************************************************************/
  237. /* ここまで */
  238. /*****************************************************************************/
  239. /*****************************************************************************/
  240. /* End of File. */
  241. /*****************************************************************************/