vfx_ellipse.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. #include "vfx.h"
  2. extern char AlphaTable[];
  3. extern char SpecialColor[];
  4. //extern void AG_ellipse_draw(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color);
  5. //extern void AG_ellipse_fill(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color);
  6. static signed int paneY0,paneY1,paneX0,paneX1,DestWidth,DestBuffer,x_top,y_top,Bsquared,TwoBsquared,Asquared,TwoAsquared,var_dx,var_dy,x_vector,line_left,line_right;
  7. static int DrawRoutine;
  8. void AG_ellipse_draw(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
  9. {
  10. if( width==0 || height==0 )
  11. {
  12. VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height, 0, color );
  13. return;
  14. }
  15. DestWidth = pane->window->x_max+1;
  16. long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
  17. long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
  18. long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
  19. long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
  20. UBYTE* DestBuffer = pane->window->buffer;
  21. xc+=paneX0;
  22. yc+=paneY0;
  23. _asm{
  24. mov eax,color
  25. mov ebx,offset ALPHA_ELLIPSE_PIXELS
  26. cmp byte ptr SpecialColor[eax],1
  27. jz ow1
  28. mov ebx,offset ELLIPSE_PIXELS
  29. ow1: mov DrawRoutine,ebx
  30. mov x_top,0
  31. mov eax,height
  32. mov y_top,eax
  33. mul eax ;compute B squares
  34. mov Bsquared,eax
  35. shl eax,1
  36. mov TwoBsquared,eax
  37. mov eax,width ;compute A squares
  38. mul eax
  39. mov Asquared,eax
  40. shl eax,1
  41. mov TwoAsquared,eax
  42. mov var_dx,0
  43. mov eax,TwoAsquared ;dy = TwoAsquared * b
  44. mul height
  45. mov var_dy,eax
  46. mov eax,Asquared
  47. shr eax,2
  48. add eax,Bsquared ;eax = Asquared/4 + Bsquared
  49. mov x_vector,eax ;x_vector= a^2/4 + b^2
  50. mov eax,Asquared
  51. mul height
  52. sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
  53. mov ebx,height
  54. __until_pos:
  55. mov eax,var_dx
  56. sub eax,var_dy
  57. jns __dx_ge_dy ;jmp if dx >= dy
  58. //__plot_neg:
  59. call DrawRoutine
  60. cmp x_vector,0
  61. js __d_neg ;jmp if d < 0
  62. dec y_top
  63. dec ebx
  64. mov eax,var_dy
  65. sub eax,TwoAsquared
  66. mov var_dy,eax ;dy -= 2*a^2
  67. sub x_vector,eax ;x_vector -= dy
  68. __d_neg:
  69. inc x_top
  70. mov eax,var_dx
  71. add eax,TwoBsquared
  72. mov var_dx,eax ;dx += 2*b^2
  73. add eax,Bsquared
  74. add x_vector,eax ;x_vector += dx + b^2
  75. jmp __until_pos
  76. __dx_ge_dy:
  77. mov eax,Asquared
  78. sub eax,Bsquared ;eax=a^2-b^2
  79. mov edx,eax ;edx=a^2-b^2
  80. sar eax,1 ;eax=(a^2-b^2)/2
  81. add eax,edx ;eax=3*(a^2-b^2)/2
  82. sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
  83. sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
  84. sar eax,1 ; /2
  85. add x_vector,eax
  86. __until_neg:
  87. call DrawRoutine
  88. cmp x_vector,0
  89. jns __d_pos
  90. inc x_top
  91. mov eax,var_dx
  92. add eax,TwoBsquared
  93. mov var_dx,eax ;dx += 2*b^2
  94. add x_vector,eax ;x_vector += dx
  95. __d_pos:
  96. dec y_top
  97. mov eax,var_dy
  98. sub eax,TwoAsquared
  99. mov var_dy,eax ;dy -= 2*a^2
  100. sub eax,Asquared ;eax = dy - a^2
  101. sub x_vector,eax ;x_vector += (-dy + a^2)
  102. dec ebx
  103. js __end_ellipse
  104. jmp __until_neg
  105. ;
  106. ;
  107. ;
  108. ELLIPSE_PIXELS:
  109. push ebx
  110. mov cl,byte ptr color
  111. mov edi,xc
  112. add edi,x_top
  113. mov ebx,yc
  114. add ebx,y_top
  115. cmp edi,paneX0
  116. jl P1
  117. cmp edi,paneX1
  118. jg P1
  119. cmp ebx,paneY0
  120. jl P1
  121. cmp ebx,paneY1
  122. jg P1
  123. imul ebx,DestWidth
  124. add ebx,DestBuffer
  125. mov BYTE PTR [edi+ebx],cl
  126. P1:
  127. mov edi,xc
  128. add edi,x_top
  129. mov ebx,yc
  130. sub ebx,y_top
  131. cmp edi,paneX0
  132. jl P2
  133. cmp edi,paneX1
  134. jg P2
  135. cmp ebx,paneY0
  136. jl P2
  137. cmp ebx,paneY1
  138. jg P2
  139. imul ebx,DestWidth
  140. add ebx,DestBuffer
  141. mov BYTE PTR [edi+ebx],cl
  142. P2:
  143. mov edi,xc
  144. sub edi,x_top
  145. mov ebx,yc
  146. add ebx,y_top
  147. cmp edi,paneX0
  148. jl P3
  149. cmp edi,paneX1
  150. jg P3
  151. cmp ebx,paneY0
  152. jl P3
  153. cmp ebx,paneY1
  154. jg P3
  155. imul ebx,DestWidth
  156. add ebx,DestBuffer
  157. mov BYTE PTR [edi+ebx],cl
  158. P3:
  159. mov edi,xc
  160. sub edi,x_top
  161. mov ebx,yc
  162. sub ebx,y_top
  163. cmp edi,paneX0
  164. jl P4
  165. cmp edi,paneX1
  166. jg P4
  167. cmp ebx,paneY0
  168. jl P4
  169. cmp ebx,paneY1
  170. jg P4
  171. imul ebx,DestWidth
  172. add ebx,DestBuffer
  173. mov BYTE PTR [edi+ebx],cl
  174. P4:
  175. pop ebx
  176. ret
  177. ;
  178. ;
  179. ; Same as above, but allow alpha pixels
  180. ;
  181. ;
  182. ALPHA_ELLIPSE_PIXELS:
  183. push ebx
  184. xor ecx,ecx
  185. mov ch,byte ptr color
  186. mov edi,xc
  187. add edi,x_top
  188. mov ebx,yc
  189. add ebx,y_top
  190. cmp edi,paneX0
  191. jl TP1
  192. cmp edi,paneX1
  193. jg TP1
  194. cmp ebx,paneY0
  195. jl TP1
  196. cmp ebx,paneY1
  197. jg TP1
  198. imul ebx,DestWidth
  199. add ebx,DestBuffer
  200. mov cl,[edi+ebx]
  201. mov cl,AlphaTable[ecx]
  202. mov BYTE PTR [edi+ebx],cl
  203. TP1:
  204. mov edi,xc
  205. add edi,x_top
  206. mov ebx,yc
  207. sub ebx,y_top
  208. cmp edi,paneX0
  209. jl TP2
  210. cmp edi,paneX1
  211. jg TP2
  212. cmp ebx,paneY0
  213. jl TP2
  214. cmp ebx,paneY1
  215. jg TP2
  216. imul ebx,DestWidth
  217. add ebx,DestBuffer
  218. mov cl,[edi+ebx]
  219. mov cl,AlphaTable[ecx]
  220. mov BYTE PTR [edi+ebx],cl
  221. TP2:
  222. mov edi,xc
  223. sub edi,x_top
  224. mov ebx,yc
  225. add ebx,y_top
  226. cmp edi,paneX0
  227. jl TP3
  228. cmp edi,paneX1
  229. jg TP3
  230. cmp ebx,paneY0
  231. jl TP3
  232. cmp ebx,paneY1
  233. jg TP3
  234. imul ebx,DestWidth
  235. add ebx,DestBuffer
  236. mov cl,[edi+ebx]
  237. mov cl,AlphaTable[ecx]
  238. mov BYTE PTR [edi+ebx],cl
  239. TP3:
  240. mov edi,xc
  241. sub edi,x_top
  242. mov ebx,yc
  243. sub ebx,y_top
  244. cmp edi,paneX0
  245. jl TP4
  246. cmp edi,paneX1
  247. jg TP4
  248. cmp ebx,paneY0
  249. jl TP4
  250. cmp ebx,paneY1
  251. jg TP4
  252. imul ebx,DestWidth
  253. add ebx,DestBuffer
  254. mov cl,[edi+ebx]
  255. mov cl,AlphaTable[ecx]
  256. mov BYTE PTR [edi+ebx],cl
  257. TP4:
  258. pop ebx
  259. ret
  260. __end_ellipse:
  261. }
  262. }
  263. void AG_ellipse_fill(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
  264. {
  265. if( width==0 || height==0 )
  266. {
  267. VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height, 0, color );
  268. return;
  269. }
  270. DestWidth = pane->window->x_max+1;
  271. long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
  272. long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
  273. long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
  274. long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
  275. UBYTE* DestBuffer = pane->window->buffer;
  276. xc+=paneX0;
  277. yc+=paneY0;
  278. _asm{
  279. mov eax,color
  280. mov ebx,offset ALPHA_ELLIPSE_LINES
  281. cmp byte ptr SpecialColor[eax],1
  282. jz ow2
  283. mov ebx,offset ELLIPSE_LINES
  284. ow2: mov DrawRoutine,ebx
  285. mov x_top,0
  286. mov eax,height
  287. mov y_top,eax
  288. mul eax ;compute B squares
  289. mov Bsquared,eax
  290. shl eax,1
  291. mov TwoBsquared,eax
  292. mov eax,width ;compute A squares
  293. mul eax
  294. mov Asquared,eax
  295. shl eax,1
  296. mov TwoAsquared,eax
  297. mov var_dx,0
  298. mov eax,TwoAsquared ;dy = TwoAsquared * b
  299. mul height
  300. mov var_dy,eax
  301. mov eax,Asquared
  302. shr eax,2
  303. add eax,Bsquared ;eax = Asquared/4 + Bsquared
  304. mov x_vector,eax ;x_vector= a^2/4 + b^2
  305. mov eax,Asquared
  306. mul height
  307. sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
  308. mov ebx,height
  309. __until_pos:
  310. mov eax,var_dx
  311. sub eax,var_dy
  312. js __plot_neg
  313. jmp __dx_ge_dy
  314. __plot_neg:
  315. call DrawRoutine
  316. cmp x_vector,0
  317. js __d_neg
  318. dec y_top
  319. dec ebx
  320. mov eax,var_dy
  321. sub eax,TwoAsquared
  322. mov var_dy,eax
  323. sub x_vector,eax
  324. __d_neg:
  325. inc x_top
  326. mov eax,var_dx
  327. add eax,TwoBsquared
  328. mov var_dx,eax
  329. add eax,Bsquared
  330. add x_vector,eax
  331. jmp __until_pos
  332. __dx_ge_dy:
  333. mov eax,Asquared
  334. sub eax,Bsquared ;eax=a^2-b^2
  335. mov edx,eax ;edx=a^2-b^2
  336. sar eax,1 ;eax=(a^2-b^2)/2
  337. add eax,edx ;eax=3*(a^2-b^2)/2
  338. sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
  339. sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
  340. sar eax,1 ; /2
  341. add x_vector,eax
  342. __until_neg:
  343. call DrawRoutine
  344. cmp x_vector,0
  345. jns __d_pos
  346. inc x_top
  347. mov eax,var_dx
  348. add eax,TwoBsquared
  349. mov var_dx,eax
  350. add x_vector,eax
  351. __d_pos:
  352. dec y_top
  353. mov eax,var_dy
  354. sub eax,TwoAsquared
  355. mov var_dy,eax
  356. sub eax,Asquared
  357. sub x_vector,eax
  358. dec ebx
  359. js __end_ellipse
  360. jmp __until_neg
  361. ELLIPSE_LINES:
  362. mov edi,xc
  363. add edi,x_top
  364. cmp edi,paneX0
  365. jl LN2 ;;right end to left of window
  366. cmp edi,paneX1
  367. jl TR1
  368. mov edi,paneX1
  369. TR1:
  370. mov line_right,edi
  371. mov edi,xc
  372. sub edi,x_top
  373. cmp edi,paneX1
  374. jg LN2 ;;left end to right of window
  375. cmp edi,paneX0
  376. jg TR2
  377. mov edi,paneX0
  378. TR2:
  379. mov line_left,edi
  380. mov edx,yc
  381. add edx,y_top
  382. cmp edx,paneY0
  383. jl LN2 ;;bottom line above window
  384. cmp edx,paneY1
  385. jg LN1
  386. imul edx,DestWidth
  387. add edx,DestBuffer
  388. add edi,edx
  389. mov ecx,line_right
  390. sub ecx,line_left
  391. inc ecx
  392. mov al,byte ptr color
  393. lo1: mov byte ptr [edi],al
  394. inc edi
  395. dec ecx
  396. jnz lo1
  397. LN1:
  398. mov edi,line_left
  399. mov edx,yc
  400. sub edx,y_top
  401. cmp edx,paneY0
  402. jl LN2
  403. cmp edx,paneY1
  404. jg LN2 ;;top line below window
  405. imul edx,DestWidth
  406. add edx,DestBuffer
  407. add edi,edx
  408. mov ecx,line_right
  409. sub ecx,line_left
  410. inc ecx
  411. mov al,byte ptr color
  412. lo2: mov byte ptr [edi],al
  413. inc edi
  414. dec ecx
  415. jnz lo2
  416. LN2:
  417. ret
  418. ;
  419. ;
  420. ; Same as above, but with Alpha pixels
  421. ;
  422. ;
  423. ALPHA_ELLIPSE_LINES:
  424. mov edi,xc
  425. add edi,x_top
  426. cmp edi,paneX0
  427. jl ALN2 ;;right end to left of window
  428. cmp edi,paneX1
  429. jl ATR1
  430. mov edi,paneX1
  431. ATR1:
  432. mov line_right,edi
  433. mov edi,xc
  434. sub edi,x_top
  435. cmp edi,paneX1
  436. jg ALN2 ;;left end to right of window
  437. cmp edi,paneX0
  438. jg ATR2
  439. mov edi,paneX0
  440. ATR2:
  441. mov line_left,edi
  442. mov edx,yc
  443. add edx,y_top
  444. cmp edx,paneY0
  445. jl ALN2 ;;bottom line above window
  446. cmp edx,paneY1
  447. jg ALN1
  448. imul edx,DestWidth
  449. add edx,DestBuffer
  450. add edi,edx
  451. mov ecx,line_right
  452. sub ecx,line_left
  453. inc ecx
  454. xor eax,eax
  455. mov ah,byte ptr color
  456. Alo1: mov al,[edi]
  457. mov al,AlphaTable[eax]
  458. mov byte ptr [edi],al
  459. inc edi
  460. dec ecx
  461. jnz Alo1
  462. ALN1:
  463. mov edi,line_left
  464. mov edx,yc
  465. sub edx,y_top
  466. cmp edx,paneY0
  467. jl ALN2
  468. cmp edx,paneY1
  469. jg ALN2 ;;top line below window
  470. imul edx,DestWidth
  471. add edx,DestBuffer
  472. add edi,edx
  473. mov ecx,line_right
  474. sub ecx,line_left
  475. inc ecx
  476. xor eax,eax
  477. mov ah,byte ptr color
  478. Alo2: mov al,[edi]
  479. mov al,AlphaTable[eax]
  480. mov byte ptr [edi],al
  481. inc edi
  482. dec ecx
  483. jnz Alo2
  484. ALN2:
  485. ret
  486. __end_ellipse:
  487. }
  488. }
  489. PANE *xorgPane = 0;
  490. unsigned char gColor = 0;
  491. void orLineCallback (int x, int y)
  492. {
  493. long result = VFX_pixel_read(xorgPane,x,y);
  494. result |= gColor;
  495. VFX_pixel_write(xorgPane,x,y,result);
  496. }
  497. void AG_ellipse_fillOr(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
  498. {
  499. if( width==0 || height==0 )
  500. {
  501. xorgPane = pane;
  502. gColor = (unsigned char)color;
  503. VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height,LD_EXECUTE,(long)(&orLineCallback) );
  504. return;
  505. }
  506. DestWidth = pane->window->x_max+1;
  507. long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
  508. long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
  509. long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
  510. long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
  511. UBYTE* DestBuffer = pane->window->buffer;
  512. xc+=paneX0;
  513. yc+=paneY0;
  514. _asm{
  515. mov eax,color
  516. mov ebx,offset XOR_ELLIPSE_LINES
  517. mov DrawRoutine,ebx
  518. mov x_top,0
  519. mov eax,height
  520. mov y_top,eax
  521. mul eax ;compute B squares
  522. mov Bsquared,eax
  523. shl eax,1
  524. mov TwoBsquared,eax
  525. mov eax,width ;compute A squares
  526. mul eax
  527. mov Asquared,eax
  528. shl eax,1
  529. mov TwoAsquared,eax
  530. mov var_dx,0
  531. mov eax,TwoAsquared ;dy = TwoAsquared * b
  532. mul height
  533. mov var_dy,eax
  534. mov eax,Asquared
  535. shr eax,2
  536. add eax,Bsquared ;eax = Asquared/4 + Bsquared
  537. mov x_vector,eax ;x_vector= a^2/4 + b^2
  538. mov eax,Asquared
  539. mul height
  540. sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
  541. mov ebx,height
  542. __until_pos:
  543. mov eax,var_dx
  544. sub eax,var_dy
  545. js __plot_neg
  546. jmp __dx_ge_dy
  547. __plot_neg:
  548. call DrawRoutine
  549. cmp x_vector,0
  550. js __d_neg
  551. dec y_top
  552. dec ebx
  553. mov eax,var_dy
  554. sub eax,TwoAsquared
  555. mov var_dy,eax
  556. sub x_vector,eax
  557. __d_neg:
  558. inc x_top
  559. mov eax,var_dx
  560. add eax,TwoBsquared
  561. mov var_dx,eax
  562. add eax,Bsquared
  563. add x_vector,eax
  564. jmp __until_pos
  565. __dx_ge_dy:
  566. mov eax,Asquared
  567. sub eax,Bsquared ;eax=a^2-b^2
  568. mov edx,eax ;edx=a^2-b^2
  569. sar eax,1 ;eax=(a^2-b^2)/2
  570. add eax,edx ;eax=3*(a^2-b^2)/2
  571. sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
  572. sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
  573. sar eax,1 ; /2
  574. add x_vector,eax
  575. __until_neg:
  576. call DrawRoutine
  577. cmp x_vector,0
  578. jns __d_pos
  579. inc x_top
  580. mov eax,var_dx
  581. add eax,TwoBsquared
  582. mov var_dx,eax
  583. add x_vector,eax
  584. __d_pos:
  585. dec y_top
  586. mov eax,var_dy
  587. sub eax,TwoAsquared
  588. mov var_dy,eax
  589. sub eax,Asquared
  590. sub x_vector,eax
  591. dec ebx
  592. js __end_ellipse
  593. jmp __until_neg
  594. XOR_ELLIPSE_LINES:
  595. mov edi,xc
  596. add edi,x_top
  597. cmp edi,paneX0
  598. jl LN2 ;;right end to left of window
  599. cmp edi,paneX1
  600. jl TR1
  601. mov edi,paneX1
  602. TR1:
  603. mov line_right,edi
  604. mov edi,xc
  605. sub edi,x_top
  606. cmp edi,paneX1
  607. jg LN2 ;;left end to right of window
  608. cmp edi,paneX0
  609. jg TR2
  610. mov edi,paneX0
  611. TR2:
  612. mov line_left,edi
  613. mov edx,yc
  614. add edx,y_top
  615. cmp edx,paneY0
  616. jl LN2 ;;bottom line above window
  617. cmp edx,paneY1
  618. jg LN1
  619. imul edx,DestWidth
  620. add edx,DestBuffer
  621. add edi,edx
  622. mov ecx,line_right
  623. sub ecx,line_left
  624. inc ecx
  625. lo1: mov al, byte ptr [edi]
  626. or al, byte ptr color
  627. mov byte ptr [edi],al
  628. inc edi
  629. dec ecx
  630. jnz lo1
  631. LN1:
  632. mov edi,line_left
  633. mov edx,yc
  634. sub edx,y_top
  635. cmp edx,paneY0
  636. jl LN2
  637. cmp edx,paneY1
  638. jg LN2 ;;top line below window
  639. imul edx,DestWidth
  640. add edx,DestBuffer
  641. add edi,edx
  642. mov ecx,line_right
  643. sub ecx,line_left
  644. inc ecx
  645. lo2: mov al, byte ptr [edi]
  646. or al, byte ptr color
  647. mov byte ptr [edi],al
  648. inc edi
  649. dec ecx
  650. jnz lo2
  651. LN2:
  652. ret
  653. __end_ellipse:
  654. }
  655. }
  656. void andLineCallback (int x, int y)
  657. {
  658. long result = VFX_pixel_read(xorgPane,x,y);
  659. result &= gColor;
  660. VFX_pixel_write(xorgPane,x,y,result);
  661. }
  662. void AG_ellipse_fillXor(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
  663. {
  664. long xorResult = color ^ 0xff;
  665. unsigned char xorColor = (unsigned char)xorResult;
  666. if( width==0 || height==0 )
  667. {
  668. xorgPane = pane;
  669. gColor = (unsigned char)color;
  670. VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height, LD_EXECUTE,(long)(&andLineCallback) );
  671. return;
  672. }
  673. DestWidth = pane->window->x_max+1;
  674. long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
  675. long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
  676. long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
  677. long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
  678. UBYTE* DestBuffer = pane->window->buffer;
  679. xc+=paneX0;
  680. yc+=paneY0;
  681. _asm{
  682. mov eax,color
  683. mov ebx,offset XOR_ELLIPSE_LINES
  684. mov DrawRoutine,ebx
  685. mov x_top,0
  686. mov eax,height
  687. mov y_top,eax
  688. mul eax ;compute B squares
  689. mov Bsquared,eax
  690. shl eax,1
  691. mov TwoBsquared,eax
  692. mov eax,width ;compute A squares
  693. mul eax
  694. mov Asquared,eax
  695. shl eax,1
  696. mov TwoAsquared,eax
  697. mov var_dx,0
  698. mov eax,TwoAsquared ;dy = TwoAsquared * b
  699. mul height
  700. mov var_dy,eax
  701. mov eax,Asquared
  702. shr eax,2
  703. add eax,Bsquared ;eax = Asquared/4 + Bsquared
  704. mov x_vector,eax ;x_vector= a^2/4 + b^2
  705. mov eax,Asquared
  706. mul height
  707. sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
  708. mov ebx,height
  709. __until_pos:
  710. mov eax,var_dx
  711. sub eax,var_dy
  712. js __plot_neg
  713. jmp __dx_ge_dy
  714. __plot_neg:
  715. call DrawRoutine
  716. cmp x_vector,0
  717. js __d_neg
  718. dec y_top
  719. dec ebx
  720. mov eax,var_dy
  721. sub eax,TwoAsquared
  722. mov var_dy,eax
  723. sub x_vector,eax
  724. __d_neg:
  725. inc x_top
  726. mov eax,var_dx
  727. add eax,TwoBsquared
  728. mov var_dx,eax
  729. add eax,Bsquared
  730. add x_vector,eax
  731. jmp __until_pos
  732. __dx_ge_dy:
  733. mov eax,Asquared
  734. sub eax,Bsquared ;eax=a^2-b^2
  735. mov edx,eax ;edx=a^2-b^2
  736. sar eax,1 ;eax=(a^2-b^2)/2
  737. add eax,edx ;eax=3*(a^2-b^2)/2
  738. sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
  739. sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
  740. sar eax,1 ; /2
  741. add x_vector,eax
  742. __until_neg:
  743. call DrawRoutine
  744. cmp x_vector,0
  745. jns __d_pos
  746. inc x_top
  747. mov eax,var_dx
  748. add eax,TwoBsquared
  749. mov var_dx,eax
  750. add x_vector,eax
  751. __d_pos:
  752. dec y_top
  753. mov eax,var_dy
  754. sub eax,TwoAsquared
  755. mov var_dy,eax
  756. sub eax,Asquared
  757. sub x_vector,eax
  758. dec ebx
  759. js __end_ellipse
  760. jmp __until_neg
  761. XOR_ELLIPSE_LINES:
  762. mov edi,xc
  763. add edi,x_top
  764. cmp edi,paneX0
  765. jl LN2 ;;right end to left of window
  766. cmp edi,paneX1
  767. jl TR1
  768. mov edi,paneX1
  769. TR1:
  770. mov line_right,edi
  771. mov edi,xc
  772. sub edi,x_top
  773. cmp edi,paneX1
  774. jg LN2 ;;left end to right of window
  775. cmp edi,paneX0
  776. jg TR2
  777. mov edi,paneX0
  778. TR2:
  779. mov line_left,edi
  780. mov edx,yc
  781. add edx,y_top
  782. cmp edx,paneY0
  783. jl LN2 ;;bottom line above window
  784. cmp edx,paneY1
  785. jg LN1
  786. imul edx,DestWidth
  787. add edx,DestBuffer
  788. add edi,edx
  789. mov ecx,line_right
  790. sub ecx,line_left
  791. inc ecx
  792. lo1: mov al, byte ptr [edi]
  793. and al, xorColor
  794. mov byte ptr [edi],al
  795. inc edi
  796. dec ecx
  797. jnz lo1
  798. LN1:
  799. mov edi,line_left
  800. mov edx,yc
  801. sub edx,y_top
  802. cmp edx,paneY0
  803. jl LN2
  804. cmp edx,paneY1
  805. jg LN2 ;;top line below window
  806. imul edx,DestWidth
  807. add edx,DestBuffer
  808. add edi,edx
  809. mov ecx,line_right
  810. sub ecx,line_left
  811. inc ecx
  812. lo2: mov al, byte ptr [edi]
  813. and al, xorColor
  814. mov byte ptr [edi],al
  815. inc edi
  816. dec ecx
  817. jnz lo2
  818. LN2:
  819. ret
  820. __end_ellipse:
  821. }
  822. }