PageRenderTime 37ms CodeModel.GetById 8ms RepoModel.GetById 1ms app.codeStats 0ms

/files/v/avs/QBLOCK.C

http://github.com/AnimatorPro/Animator-Pro
C | 373 lines | 330 code | 36 blank | 7 comment | 60 complexity | a91f5dc1b4997ec98c1d3761d39538c3 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. /* Audio-Video Sequencer */
  2. /* Copyright 1988 Antic Publishing */
  3. /* by Jim Kent */
  4. #include "flicker.h"
  5. extern char *qfile();
  6. struct track *block_buf;
  7. int block_count;
  8. int lowest_b()
  9. {
  10. struct track *t;
  11. int i, lo;
  12. if ((t = block_buf) == NULL)
  13. return(0);
  14. i = block_count;
  15. lo = t->start;
  16. t++;
  17. while (--i > 0)
  18. {
  19. if (t->start < lo)
  20. lo = t->start;
  21. }
  22. return(lo);
  23. }
  24. free_block()
  25. {
  26. int i;
  27. struct track *t;
  28. if ((t = block_buf) != NULL)
  29. {
  30. i = block_count;
  31. while (--block_count >= 0)
  32. {
  33. unlink_track(t++);
  34. }
  35. freemem(block_buf);
  36. block_buf = NULL;
  37. block_count = 0;
  38. }
  39. }
  40. qfree_block()
  41. {
  42. if (yes_no_line("Free Block Memory?") )
  43. free_block();
  44. }
  45. qload_block()
  46. {
  47. int i;
  48. struct track **btracks;
  49. if (cyr_name("Load .AVS file into block"))
  50. {
  51. free_block();
  52. if ((btracks = begmem(TRACKS*sizeof(*btracks) )) == NULL)
  53. goto OUT;
  54. if ((block_buf = begzeros(TRACKS*sizeof(*block_buf))) == NULL)
  55. {
  56. freemem(btracks);
  57. goto OUT;
  58. }
  59. for (i=0; i<TRACKS; i++)
  60. {
  61. btracks[i] = block_buf+i;
  62. block_buf[i].type = TR_NONE;
  63. block_buf[i].start = BIG_SHORT;
  64. }
  65. block_count = qld(btracks);
  66. freemem(btracks);
  67. }
  68. OUT:
  69. hide_mouse();
  70. redraw_frame();
  71. show_mouse();
  72. }
  73. snip_block(start, count)
  74. int start, count;
  75. {
  76. struct track **s;
  77. register struct track *d;
  78. struct tlib *tl;
  79. free_block();
  80. if ((d = begmem(count*sizeof(*d))) == NULL)
  81. return(0);
  82. block_buf = d;
  83. block_count = count;
  84. s = tracks + start;
  85. while (--count >= 0)
  86. {
  87. copy_structure(*s++, d, sizeof(*d) );
  88. if ((tl = d->lib) != NULL)
  89. tl->links++;
  90. d++;
  91. }
  92. return(1);
  93. }
  94. int x1, y1, x2, y2, x0, y0, dx, dy;
  95. int tr1, tr2, tr0, dtr;
  96. int tik1, tik2, tik0, dtik;
  97. arrow_wait()
  98. {
  99. for (;;)
  100. {
  101. check_input();
  102. if (key_hit)
  103. arrow_keys();
  104. if (RJSTDN)
  105. return(0);
  106. if (PJSTDN)
  107. return(1);
  108. }
  109. }
  110. define_block()
  111. {
  112. top_message("Select start of block...");
  113. if (!arrow_wait())
  114. return(0);
  115. x1 = mouse_x;
  116. y1 = mouse_y;
  117. tr1 = which_t(mouse_y);
  118. if (tr1 < 0)
  119. return(0);
  120. tik1 = tik_pos(mouse_x);
  121. top_message("Select end of block...");
  122. if (!arrow_wait())
  123. return(0);
  124. x2 = mouse_x;
  125. y2 = mouse_y;
  126. tr2 = which_t(mouse_y);
  127. if (tr2 < 0)
  128. return(0);
  129. tik2 = tik_pos(mouse_x);
  130. tik0 = tik1;
  131. if (x1 < x2)
  132. {
  133. x0 = x1;
  134. dx = x2 - x1;
  135. dtik = tik2 - tik1;
  136. }
  137. else
  138. {
  139. x0 = x2;
  140. dx = x1 - x2;
  141. tik0 = tik2;
  142. dtik = 0;
  143. }
  144. if (y1 < y2)
  145. {
  146. y0 = y1;
  147. dy = y2 - y1;
  148. tr0 = tr1;
  149. dtr = tr2 - tr1;
  150. }
  151. else
  152. {
  153. y0 = y2;
  154. dy = y1 - y2;
  155. tr0 = tr2;
  156. dtr = tr1 - tr2;
  157. }
  158. return(1);
  159. }
  160. qcapture_block()
  161. {
  162. capture_block();
  163. hide_mouse();
  164. refresh_pull();
  165. show_mouse();
  166. }
  167. capture_block()
  168. {
  169. int t1, t2, swap;
  170. if (define_block())
  171. {
  172. if (snip_block( tr0, dtr+1))
  173. return(1);
  174. }
  175. return(0);
  176. }
  177. erase_block_pos()
  178. {
  179. int i;
  180. for (i=tr0; i<=tr0+dtr; i++)
  181. {
  182. free_track(tracks[i]);
  183. hide_mouse();
  184. redraw_track(i);
  185. }
  186. }
  187. qcut_block()
  188. {
  189. if (capture_block())
  190. {
  191. erase_block_pos();
  192. }
  193. hide_mouse();
  194. refresh_pull();
  195. show_mouse();
  196. }
  197. add_toff_t(t, off)
  198. struct track *t;
  199. int off;
  200. {
  201. t->start += off;
  202. if (t->start < 0)
  203. t->start = 0;
  204. }
  205. qpb()
  206. {
  207. int i, dtr, tik, toff;
  208. struct track *t;
  209. top_message("Click on start of where to paste block...");
  210. wait_click();
  211. if (!PJSTDN)
  212. {
  213. return;
  214. }
  215. dtr = which_t(mouse_y);
  216. if (dtr < 0)
  217. {
  218. return(0);
  219. }
  220. tik = tik_pos(mouse_x);
  221. if (tik < 0)
  222. tik = 0;
  223. toff = tik - lowest_b();
  224. t = block_buf;
  225. hide_mouse();
  226. for (i=dtr; i<block_count+dtr && i < TRACKS; i++)
  227. {
  228. free_track(tracks[i]);
  229. copy_structure(t, tracks[i], sizeof(*t) );
  230. if (t->lib != NULL)
  231. {
  232. t->lib->links++;
  233. add_toff_t(tracks[i], toff);
  234. }
  235. redraw_track(i);
  236. t++;
  237. }
  238. }
  239. qpaste_block()
  240. {
  241. qpb();
  242. hide_mouse();
  243. refresh_pull();
  244. show_mouse();
  245. }
  246. qdelete_block()
  247. {
  248. int i;
  249. struct track *t;
  250. struct track **tbuf, **tt;
  251. if (define_block())
  252. {
  253. if ((tbuf = begmem((dtr+1)*sizeof(*tbuf))) != NULL)
  254. {
  255. for (i=tr0; i<=tr0+dtr; i++) /* mark tracks as free and save them */
  256. {
  257. t = tracks[i];
  258. free_track(t);
  259. tbuf[i-tr0] = t;
  260. }
  261. for (i=tr0; i<TRACKS - dtr - 1; i++) /* move tracks after block up */
  262. {
  263. tracks[i] = tracks[i+dtr+1];
  264. }
  265. tt = tbuf;
  266. for (i=TRACKS-dtr-1; i<TRACKS; i++) /* put deleted tracks at end */
  267. {
  268. tracks[i] = *tt++;
  269. }
  270. for (i=0; i<TRACKS; i++) /* add time offset of deleted block to
  271. later blocks */
  272. {
  273. t = tracks[i];
  274. if (t->start >= tik0)
  275. add_toff_t(t, -dtik);
  276. }
  277. freemem(tbuf);
  278. time_ticks -= dtik;
  279. sound_ticks -= dtik;
  280. video_ticks -= dtik;
  281. }
  282. }
  283. hide_mouse();
  284. redraw_frame();
  285. show_mouse();
  286. }
  287. qinsert_block()
  288. {
  289. int i;
  290. struct track *t;
  291. struct track **tbuf, **tt;
  292. if (define_block())
  293. {
  294. for (i=TRACKS-dtr-1; i<TRACKS; i++) /* see if would kill tracks at end*/
  295. {
  296. t = tracks[i];
  297. if (t->type != TR_NONE) /* if any let user say NO! */
  298. {
  299. if (!yes_no_line("Delete tracks at end?") )
  300. goto OUT;
  301. }
  302. }
  303. if ((tbuf = begmem((dtr+1)*sizeof(*tbuf))) != NULL)
  304. {
  305. tt = tbuf;
  306. /* mark end tracks as free and save em*/
  307. for (i=TRACKS-dtr-1; i<TRACKS; i++)
  308. {
  309. t = tracks[i];
  310. free_track(t);
  311. *tt++ = t;
  312. }
  313. /* move tracks */
  314. copy_pointers(tracks+tr0, tracks+tr0+dtr+1, TRACKS-tr0-dtr-1);
  315. tt = tbuf;
  316. for (i=tr0; i<=tr0+dtr; i++) /* put free tracks in middle */
  317. {
  318. tracks[i] = *tt++;
  319. }
  320. for (i=0; i<TRACKS; i++) /* add time offset of inserted block to
  321. later blocks */
  322. {
  323. t = tracks[i];
  324. if (t->start >= tik0)
  325. add_toff_t(t, dtik);
  326. }
  327. freemem(tbuf);
  328. time_ticks += dtik;
  329. sound_ticks = tik0;
  330. video_ticks = tik0;
  331. }
  332. }
  333. OUT:
  334. hide_mouse();
  335. redraw_frame();
  336. show_mouse();
  337. }