PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Pristine/V/MASK.C

http://github.com/AnimatorPro/Animator-Pro
C | 242 lines | 208 code | 32 blank | 2 comment | 24 complexity | ef1c17feea69d52ede09ab387b4e80f9 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. /* mask.c - Routines to maintain and select our screen-sized bitplane
  2. used mostly for write-protecting pixels. */
  3. #include "jimk.h"
  4. #include "flicmenu.h"
  5. #include "mask.str"
  6. extern PLANEPTR mask_plane;
  7. save_mask(name)
  8. char *name;
  9. {
  10. if (mask_plane != NULL)
  11. return(write_gulp(name, mask_plane, (long)MASK_SIZE));
  12. }
  13. load_mask(name)
  14. char *name;
  15. {
  16. free_mask();
  17. if (newmask())
  18. {
  19. return(read_gulp(name, mask_plane, (long)MASK_SIZE));
  20. }
  21. return(0);
  22. }
  23. static
  24. free_mask()
  25. {
  26. gentle_freemem(mask_plane);
  27. mask_plane = NULL;
  28. }
  29. static
  30. qfree_mask()
  31. {
  32. free_mask();
  33. vs.make_mask = vs.use_mask = 0;
  34. set_stencil_ast();
  35. }
  36. static
  37. newmask()
  38. {
  39. free_mask();
  40. if ((mask_plane = begmemc(MASK_SIZE)) != NULL)
  41. {
  42. return(1);
  43. }
  44. return(0);
  45. }
  46. static
  47. qcreate_mask()
  48. {
  49. vs.make_mask = !vs.make_mask;
  50. if (vs.make_mask)
  51. {
  52. if (newmask())
  53. {
  54. vs.make_mask = 1;
  55. vs.use_mask = 0;
  56. }
  57. }
  58. set_stencil_ast();
  59. }
  60. quse_mask()
  61. {
  62. vs.use_mask = !vs.use_mask;
  63. if (vs.use_mask)
  64. {
  65. vs.make_mask = 0;
  66. if (mask_plane == NULL)
  67. {
  68. vs.use_mask = 0;
  69. }
  70. }
  71. set_stencil_ast();
  72. }
  73. static
  74. paste1_mask()
  75. {
  76. if (mask_plane != NULL)
  77. {
  78. render_full_screen();
  79. if (make_render_cashes())
  80. {
  81. render_bitmap_blit(XMAX,YMAX,0,0,mask_plane,Mask_line(XMAX),0,0);
  82. free_render_cashes();
  83. return(1);
  84. }
  85. }
  86. return(0);
  87. }
  88. static
  89. qpaste_mask()
  90. {
  91. uzauto(paste1_mask);
  92. }
  93. static
  94. blitmask(color)
  95. int color;
  96. {
  97. a1blit(XMAX,YMAX,0,0,mask_plane,Mask_line(XMAX),
  98. 0,0,render_form->p, BPR,color);
  99. zoom_it();
  100. wait_a_jiffy(10);
  101. }
  102. static
  103. qshow_mask()
  104. {
  105. if (mask_plane != NULL)
  106. {
  107. save_undo();
  108. blitmask(swhite);
  109. blitmask(vs.ccolor);
  110. wait_click();
  111. unundo();
  112. zoom_it();
  113. }
  114. }
  115. static
  116. qinvert_mask()
  117. {
  118. if (mask_plane != NULL)
  119. {
  120. xor_words(0xffff, mask_plane, MASK_SIZE/16);
  121. qshow_mask();
  122. }
  123. }
  124. static
  125. qgrab_mask()
  126. {
  127. register UBYTE *s, m;
  128. UBYTE *d, c;
  129. int i, j;
  130. if (newmask())
  131. {
  132. s = render_form->p;
  133. d = mask_plane;
  134. i = MASK_SIZE;
  135. while (--i >= 0)
  136. {
  137. m = 0x80;
  138. c = 0;
  139. j = 8;
  140. while (--j >= 0)
  141. {
  142. if (*s++ != vs.inks[0])
  143. {
  144. c |= m;
  145. }
  146. m>>=1;
  147. }
  148. *d++ = c;
  149. }
  150. qshow_mask();
  151. }
  152. }
  153. static char *stencil_options[] = {
  154. mask_100 /* " Use" */,
  155. mask_101 /* " Create" */,
  156. mask_102 /* " Clip" */,
  157. mask_103 /* " Invert" */,
  158. mask_104 /* " View" */,
  159. mask_105 /* " Paste" */,
  160. mask_106 /* " Release" */,
  161. mask_107 /* " Files..." */,
  162. mask_108 /* " Exit Menu" */,
  163. };
  164. static
  165. stencil_go_files()
  166. {
  167. go_files(10);
  168. }
  169. extern close_menu(), quse_mask(), qcreate_mask(), qgrab_mask(),
  170. qinvert_mask(), qshow_mask(), qpaste_mask(), qfree_mask(),
  171. stencil_go_files();
  172. static Vector stencil_feelers[] =
  173. {
  174. quse_mask,
  175. qcreate_mask,
  176. qgrab_mask,
  177. qinvert_mask,
  178. qshow_mask,
  179. qpaste_mask,
  180. qfree_mask,
  181. stencil_go_files,
  182. close_menu,
  183. };
  184. static
  185. set_stencil_ast()
  186. {
  187. char *pt;
  188. pt = stencil_options[0];
  189. if (vs.use_mask)
  190. pt[0] = '*';
  191. else
  192. pt[0] = ' ';
  193. pt = stencil_options[1];
  194. if (vs.make_mask)
  195. pt[0] = '*';
  196. else
  197. pt[0] = ' ';
  198. }
  199. qstencil()
  200. {
  201. set_stencil_ast();
  202. qmenu(mask_109 /* "Mask Menu" */, stencil_options, Array_els(stencil_options),
  203. stencil_feelers);
  204. }
  205. mgo_stencil()
  206. {
  207. hide_mp();
  208. qstencil();
  209. draw_mp();
  210. }