CANVAS.C 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. #include <stdlib.h>
  14. #include <malloc.h>
  15. #include <stdio.h>
  16. #include "pa_enabl.h" //$$POLY_ACC
  17. #include "mem.h"
  18. #include "error.h"
  19. #include "gr.h"
  20. #include "grdef.h"
  21. #if defined(POLY_ACC)
  22. #include "poly_acc.h"
  23. #endif
  24. grs_canvas * grd_curcanv=NULL; //active canvas
  25. grs_screen * grd_curscreen=NULL; //active screen
  26. grs_canvas *gr_create_canvas(int w, int h)
  27. {
  28. unsigned char * data;
  29. grs_canvas *new;
  30. new = (grs_canvas *)malloc( sizeof(grs_canvas) );
  31. data = (unsigned char *)malloc(w*h);
  32. new->cv_bitmap.bm_x = 0;
  33. new->cv_bitmap.bm_y = 0;
  34. new->cv_bitmap.bm_w = w;
  35. new->cv_bitmap.bm_h = h;
  36. new->cv_bitmap.bm_flags = 0;
  37. new->cv_bitmap.bm_type = BM_LINEAR;
  38. new->cv_bitmap.bm_rowsize = w;
  39. new->cv_bitmap.bm_data = data;
  40. new->cv_color = 0;
  41. new->cv_drawmode = 0;
  42. new->cv_font = NULL;
  43. new->cv_font_fg_color = 0;
  44. new->cv_font_bg_color = 0;
  45. return new;
  46. }
  47. #if defined(POLY_ACC)
  48. grs_canvas *gr_create_canvas2(int w, int h, int type)
  49. {
  50. unsigned char * data;
  51. grs_canvas *new;
  52. new = (grs_canvas *)malloc( sizeof(grs_canvas) );
  53. if(type == BM_LINEAR)
  54. data = (unsigned char *)malloc(w*h);
  55. else if(type == BM_LINEAR15)
  56. data = (unsigned char *)malloc(w*h*PA_BPP);
  57. new->cv_bitmap.bm_x = 0;
  58. new->cv_bitmap.bm_y = 0;
  59. new->cv_bitmap.bm_w = w;
  60. new->cv_bitmap.bm_h = h;
  61. new->cv_bitmap.bm_flags = 0;
  62. new->cv_bitmap.bm_type = type;
  63. new->cv_bitmap.bm_rowsize = type==BM_LINEAR?w:w*PA_BPP;
  64. new->cv_bitmap.bm_data = data;
  65. new->cv_color = 0;
  66. new->cv_drawmode = 0;
  67. new->cv_font = NULL;
  68. new->cv_font_fg_color = 0;
  69. new->cv_font_bg_color = 0;
  70. return new;
  71. }
  72. #endif
  73. grs_canvas *gr_create_sub_canvas(grs_canvas *canv, int x, int y, int w, int h)
  74. {
  75. grs_canvas *new;
  76. if (x+w > canv->cv_bitmap.bm_w) {Int3(); w=canv->cv_bitmap.bm_w-x;}
  77. if (y+h > canv->cv_bitmap.bm_h) {Int3(); h=canv->cv_bitmap.bm_h-y;}
  78. new = (grs_canvas *)malloc( sizeof(grs_canvas) );
  79. new->cv_bitmap.bm_x = x+canv->cv_bitmap.bm_x;
  80. new->cv_bitmap.bm_y = y+canv->cv_bitmap.bm_y;
  81. new->cv_bitmap.bm_w = w;
  82. new->cv_bitmap.bm_h = h;
  83. new->cv_bitmap.bm_flags = 0;
  84. new->cv_bitmap.bm_type = canv->cv_bitmap.bm_type;
  85. new->cv_bitmap.bm_rowsize = canv->cv_bitmap.bm_rowsize;
  86. new->cv_bitmap.bm_data = canv->cv_bitmap.bm_data;
  87. new->cv_bitmap.bm_data += y*canv->cv_bitmap.bm_rowsize;
  88. #if defined(POLY_ACC)
  89. new->cv_bitmap.bm_data += canv->cv_bitmap.bm_type==BM_LINEAR?x:x*PA_BPP; //$$POLY_ACC
  90. #else
  91. new->cv_bitmap.bm_data += x;
  92. #endif
  93. new->cv_color = canv->cv_color;
  94. new->cv_drawmode = canv->cv_drawmode;
  95. new->cv_font = canv->cv_font;
  96. new->cv_font_fg_color = canv->cv_font_fg_color;
  97. new->cv_font_bg_color = canv->cv_font_bg_color;
  98. return new;
  99. }
  100. void gr_init_canvas(grs_canvas *canv, unsigned char * pixdata, int pixtype, int w, int h)
  101. {
  102. canv->cv_color = 0;
  103. canv->cv_drawmode = 0;
  104. canv->cv_font = NULL;
  105. canv->cv_font_fg_color = 0;
  106. canv->cv_font_bg_color = 0;
  107. canv->cv_bitmap.bm_x = 0;
  108. canv->cv_bitmap.bm_y = 0;
  109. if (pixtype==BM_MODEX)
  110. canv->cv_bitmap.bm_rowsize = w / 4;
  111. #if defined(POLY_ACC)
  112. else if(pixtype==BM_LINEAR15)
  113. #ifdef PA_3DFX_VOODOO
  114. canv->cv_bitmap.bm_rowsize = 2048;
  115. #else
  116. canv->cv_bitmap.bm_rowsize = w*PA_BPP;
  117. #endif
  118. #endif
  119. else
  120. canv->cv_bitmap.bm_rowsize = w;
  121. canv->cv_bitmap.bm_w = w;
  122. canv->cv_bitmap.bm_h = h;
  123. canv->cv_bitmap.bm_flags = 0;
  124. canv->cv_bitmap.bm_type = pixtype;
  125. canv->cv_bitmap.bm_data = pixdata;
  126. }
  127. void gr_init_sub_canvas(grs_canvas *new, grs_canvas *src, int x, int y, int w, int h)
  128. {
  129. new->cv_color = src->cv_color;
  130. new->cv_drawmode = src->cv_drawmode;
  131. new->cv_font = src->cv_font;
  132. new->cv_font_fg_color = src->cv_font_fg_color;
  133. new->cv_font_bg_color = src->cv_font_bg_color;
  134. new->cv_bitmap.bm_x = src->cv_bitmap.bm_x+x;
  135. new->cv_bitmap.bm_y = src->cv_bitmap.bm_y+y;
  136. new->cv_bitmap.bm_w = w;
  137. new->cv_bitmap.bm_h = h;
  138. new->cv_bitmap.bm_flags = 0;
  139. new->cv_bitmap.bm_type = src->cv_bitmap.bm_type;
  140. new->cv_bitmap.bm_rowsize = src->cv_bitmap.bm_rowsize;
  141. new->cv_bitmap.bm_data = src->cv_bitmap.bm_data;
  142. new->cv_bitmap.bm_data += y*src->cv_bitmap.bm_rowsize;
  143. #if defined(POLY_ACC)
  144. new->cv_bitmap.bm_data += src->cv_bitmap.bm_type==BM_LINEAR?x:x*PA_BPP;
  145. #else
  146. new->cv_bitmap.bm_data += x;
  147. #endif
  148. }
  149. void gr_free_canvas(grs_canvas *canv)
  150. {
  151. if (canv == grd_curcanv) { //bad!! freeing current canvas!
  152. Int3();
  153. gr_set_current_canvas(NULL);
  154. }
  155. #if defined(POLY_ACC) && !defined(MACINTOSH)
  156. //
  157. // prevents freeing the VIRGE framebuffer. This is only a concern in two places in game.c
  158. //
  159. if(canv->cv_bitmap.bm_data != pa_get_buffer_address(0) &&
  160. canv->cv_bitmap.bm_data != pa_get_buffer_address(1) )
  161. {
  162. free(canv->cv_bitmap.bm_data );
  163. }
  164. #else
  165. free(canv->cv_bitmap.bm_data );
  166. #endif
  167. free(canv);
  168. }
  169. void gr_free_sub_canvas(grs_canvas *canv)
  170. {
  171. free(canv);
  172. }
  173. int gr_wait_for_retrace = 1;
  174. void gr_show_canvas( grs_canvas *canv )
  175. {
  176. if (canv->cv_bitmap.bm_type == BM_MODEX )
  177. gr_modex_setstart( canv->cv_bitmap.bm_x, canv->cv_bitmap.bm_y, gr_wait_for_retrace );
  178. else if (canv->cv_bitmap.bm_type == BM_SVGA )
  179. gr_vesa_setstart( canv->cv_bitmap.bm_x, canv->cv_bitmap.bm_y );
  180. // else if (canv->cv_bitmap.bm_type == BM_LINEAR )
  181. // Int3(); // Get JOHN!
  182. //gr_linear_movsd( canv->cv_bitmap.bm_data, (void *)0xA0000, 320*200);
  183. #if defined(POLY_ACC)
  184. else if (canv->cv_bitmap.bm_type == BM_LINEAR15)
  185. Int3(); // hurray, this got called, now write some code to support it.
  186. #endif
  187. }
  188. void gr_set_current_canvas( grs_canvas *canv )
  189. {
  190. if (canv==NULL)
  191. grd_curcanv = &(grd_curscreen->sc_canvas);
  192. else
  193. grd_curcanv = canv;
  194. #ifndef MACINTOSH // these variables are undefined on mac -- not used.
  195. if ( (grd_curcanv->cv_color >= 0) && (grd_curcanv->cv_color <= 255) ) {
  196. gr_var_color = grd_curcanv->cv_color;
  197. } else
  198. gr_var_color = 0;
  199. gr_var_bitmap = grd_curcanv->cv_bitmap.bm_data;
  200. gr_var_bwidth = grd_curcanv->cv_bitmap.bm_rowsize;
  201. #endif
  202. }
  203. void gr_clear_canvas(int color)
  204. {
  205. gr_setcolor(color);
  206. gr_rect(0,0,WIDTH-1,HEIGHT-1);
  207. }
  208. void gr_setcolor(int color)
  209. {
  210. grd_curcanv->cv_color=color;
  211. #ifndef MACINTOSH
  212. gr_var_color = color;
  213. #endif
  214. }