123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029 |
- #include "vfx.h"
- extern char AlphaTable[];
- extern char SpecialColor[];
- //extern void AG_ellipse_draw(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color);
- //extern void AG_ellipse_fill(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color);
- 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;
- static int DrawRoutine;
- void AG_ellipse_draw(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
- {
- if( width==0 || height==0 )
- {
- VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height, 0, color );
- return;
- }
- DestWidth = pane->window->x_max+1;
- long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
- long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
- long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
- long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
- UBYTE* DestBuffer = pane->window->buffer;
- xc+=paneX0;
- yc+=paneY0;
- _asm{
- mov eax,color
- mov ebx,offset ALPHA_ELLIPSE_PIXELS
- cmp byte ptr SpecialColor[eax],1
- jz ow1
- mov ebx,offset ELLIPSE_PIXELS
- ow1: mov DrawRoutine,ebx
-
- mov x_top,0
- mov eax,height
- mov y_top,eax
- mul eax ;compute B squares
- mov Bsquared,eax
- shl eax,1
- mov TwoBsquared,eax
- mov eax,width ;compute A squares
- mul eax
- mov Asquared,eax
- shl eax,1
- mov TwoAsquared,eax
- mov var_dx,0
- mov eax,TwoAsquared ;dy = TwoAsquared * b
- mul height
- mov var_dy,eax
- mov eax,Asquared
- shr eax,2
- add eax,Bsquared ;eax = Asquared/4 + Bsquared
- mov x_vector,eax ;x_vector= a^2/4 + b^2
- mov eax,Asquared
- mul height
- sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
- mov ebx,height
- __until_pos:
- mov eax,var_dx
- sub eax,var_dy
- jns __dx_ge_dy ;jmp if dx >= dy
- //__plot_neg:
- call DrawRoutine
- cmp x_vector,0
- js __d_neg ;jmp if d < 0
- dec y_top
- dec ebx
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax ;dy -= 2*a^2
- sub x_vector,eax ;x_vector -= dy
- __d_neg:
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax ;dx += 2*b^2
- add eax,Bsquared
- add x_vector,eax ;x_vector += dx + b^2
- jmp __until_pos
- __dx_ge_dy:
- mov eax,Asquared
- sub eax,Bsquared ;eax=a^2-b^2
- mov edx,eax ;edx=a^2-b^2
- sar eax,1 ;eax=(a^2-b^2)/2
- add eax,edx ;eax=3*(a^2-b^2)/2
- sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
- sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
- sar eax,1 ; /2
- add x_vector,eax
- __until_neg:
- call DrawRoutine
- cmp x_vector,0
- jns __d_pos
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax ;dx += 2*b^2
- add x_vector,eax ;x_vector += dx
- __d_pos:
- dec y_top
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax ;dy -= 2*a^2
- sub eax,Asquared ;eax = dy - a^2
- sub x_vector,eax ;x_vector += (-dy + a^2)
- dec ebx
- js __end_ellipse
- jmp __until_neg
- ;
- ;
- ;
- ELLIPSE_PIXELS:
- push ebx
- mov cl,byte ptr color
- mov edi,xc
- add edi,x_top
- mov ebx,yc
- add ebx,y_top
- cmp edi,paneX0
- jl P1
- cmp edi,paneX1
- jg P1
- cmp ebx,paneY0
- jl P1
- cmp ebx,paneY1
- jg P1
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov BYTE PTR [edi+ebx],cl
- P1:
- mov edi,xc
- add edi,x_top
- mov ebx,yc
- sub ebx,y_top
- cmp edi,paneX0
- jl P2
- cmp edi,paneX1
- jg P2
- cmp ebx,paneY0
- jl P2
- cmp ebx,paneY1
- jg P2
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov BYTE PTR [edi+ebx],cl
- P2:
- mov edi,xc
- sub edi,x_top
- mov ebx,yc
- add ebx,y_top
- cmp edi,paneX0
- jl P3
- cmp edi,paneX1
- jg P3
- cmp ebx,paneY0
- jl P3
- cmp ebx,paneY1
- jg P3
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov BYTE PTR [edi+ebx],cl
- P3:
- mov edi,xc
- sub edi,x_top
- mov ebx,yc
- sub ebx,y_top
- cmp edi,paneX0
- jl P4
- cmp edi,paneX1
- jg P4
- cmp ebx,paneY0
- jl P4
- cmp ebx,paneY1
- jg P4
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov BYTE PTR [edi+ebx],cl
- P4:
- pop ebx
- ret
- ;
- ;
- ; Same as above, but allow alpha pixels
- ;
- ;
- ALPHA_ELLIPSE_PIXELS:
- push ebx
- xor ecx,ecx
- mov ch,byte ptr color
- mov edi,xc
- add edi,x_top
- mov ebx,yc
- add ebx,y_top
- cmp edi,paneX0
- jl TP1
- cmp edi,paneX1
- jg TP1
- cmp ebx,paneY0
- jl TP1
- cmp ebx,paneY1
- jg TP1
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov cl,[edi+ebx]
- mov cl,AlphaTable[ecx]
- mov BYTE PTR [edi+ebx],cl
- TP1:
- mov edi,xc
- add edi,x_top
- mov ebx,yc
- sub ebx,y_top
- cmp edi,paneX0
- jl TP2
- cmp edi,paneX1
- jg TP2
- cmp ebx,paneY0
- jl TP2
- cmp ebx,paneY1
- jg TP2
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov cl,[edi+ebx]
- mov cl,AlphaTable[ecx]
- mov BYTE PTR [edi+ebx],cl
- TP2:
- mov edi,xc
- sub edi,x_top
- mov ebx,yc
- add ebx,y_top
- cmp edi,paneX0
- jl TP3
- cmp edi,paneX1
- jg TP3
- cmp ebx,paneY0
- jl TP3
- cmp ebx,paneY1
- jg TP3
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov cl,[edi+ebx]
- mov cl,AlphaTable[ecx]
- mov BYTE PTR [edi+ebx],cl
- TP3:
- mov edi,xc
- sub edi,x_top
- mov ebx,yc
- sub ebx,y_top
- cmp edi,paneX0
- jl TP4
- cmp edi,paneX1
- jg TP4
- cmp ebx,paneY0
- jl TP4
- cmp ebx,paneY1
- jg TP4
- imul ebx,DestWidth
- add ebx,DestBuffer
- mov cl,[edi+ebx]
- mov cl,AlphaTable[ecx]
- mov BYTE PTR [edi+ebx],cl
- TP4:
- pop ebx
- ret
- __end_ellipse:
- }
- }
- void AG_ellipse_fill(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
- {
- if( width==0 || height==0 )
- {
- VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height, 0, color );
- return;
- }
- DestWidth = pane->window->x_max+1;
- long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
- long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
- long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
- long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
- UBYTE* DestBuffer = pane->window->buffer;
- xc+=paneX0;
- yc+=paneY0;
- _asm{
- mov eax,color
- mov ebx,offset ALPHA_ELLIPSE_LINES
- cmp byte ptr SpecialColor[eax],1
- jz ow2
- mov ebx,offset ELLIPSE_LINES
- ow2: mov DrawRoutine,ebx
- mov x_top,0
- mov eax,height
- mov y_top,eax
- mul eax ;compute B squares
- mov Bsquared,eax
- shl eax,1
- mov TwoBsquared,eax
- mov eax,width ;compute A squares
- mul eax
- mov Asquared,eax
- shl eax,1
- mov TwoAsquared,eax
- mov var_dx,0
- mov eax,TwoAsquared ;dy = TwoAsquared * b
- mul height
- mov var_dy,eax
- mov eax,Asquared
- shr eax,2
- add eax,Bsquared ;eax = Asquared/4 + Bsquared
- mov x_vector,eax ;x_vector= a^2/4 + b^2
- mov eax,Asquared
- mul height
- sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
- mov ebx,height
- __until_pos:
- mov eax,var_dx
- sub eax,var_dy
- js __plot_neg
- jmp __dx_ge_dy
- __plot_neg:
- call DrawRoutine
- cmp x_vector,0
- js __d_neg
- dec y_top
- dec ebx
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax
- sub x_vector,eax
- __d_neg:
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax
- add eax,Bsquared
- add x_vector,eax
- jmp __until_pos
- __dx_ge_dy:
- mov eax,Asquared
- sub eax,Bsquared ;eax=a^2-b^2
- mov edx,eax ;edx=a^2-b^2
- sar eax,1 ;eax=(a^2-b^2)/2
- add eax,edx ;eax=3*(a^2-b^2)/2
- sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
- sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
- sar eax,1 ; /2
- add x_vector,eax
- __until_neg:
- call DrawRoutine
- cmp x_vector,0
- jns __d_pos
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax
- add x_vector,eax
- __d_pos:
- dec y_top
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax
- sub eax,Asquared
- sub x_vector,eax
- dec ebx
- js __end_ellipse
- jmp __until_neg
- ELLIPSE_LINES:
- mov edi,xc
- add edi,x_top
- cmp edi,paneX0
- jl LN2 ;;right end to left of window
- cmp edi,paneX1
- jl TR1
- mov edi,paneX1
- TR1:
- mov line_right,edi
- mov edi,xc
- sub edi,x_top
- cmp edi,paneX1
- jg LN2 ;;left end to right of window
- cmp edi,paneX0
- jg TR2
- mov edi,paneX0
- TR2:
- mov line_left,edi
- mov edx,yc
- add edx,y_top
- cmp edx,paneY0
- jl LN2 ;;bottom line above window
- cmp edx,paneY1
- jg LN1
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- mov al,byte ptr color
- lo1: mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz lo1
- LN1:
- mov edi,line_left
- mov edx,yc
- sub edx,y_top
- cmp edx,paneY0
- jl LN2
- cmp edx,paneY1
- jg LN2 ;;top line below window
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- mov al,byte ptr color
- lo2: mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz lo2
- LN2:
- ret
- ;
- ;
- ; Same as above, but with Alpha pixels
- ;
- ;
- ALPHA_ELLIPSE_LINES:
- mov edi,xc
- add edi,x_top
- cmp edi,paneX0
- jl ALN2 ;;right end to left of window
- cmp edi,paneX1
- jl ATR1
- mov edi,paneX1
- ATR1:
- mov line_right,edi
- mov edi,xc
- sub edi,x_top
- cmp edi,paneX1
- jg ALN2 ;;left end to right of window
- cmp edi,paneX0
- jg ATR2
- mov edi,paneX0
- ATR2:
- mov line_left,edi
- mov edx,yc
- add edx,y_top
- cmp edx,paneY0
- jl ALN2 ;;bottom line above window
- cmp edx,paneY1
- jg ALN1
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- xor eax,eax
- mov ah,byte ptr color
- Alo1: mov al,[edi]
- mov al,AlphaTable[eax]
- mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz Alo1
- ALN1:
- mov edi,line_left
- mov edx,yc
- sub edx,y_top
- cmp edx,paneY0
- jl ALN2
- cmp edx,paneY1
- jg ALN2 ;;top line below window
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- xor eax,eax
- mov ah,byte ptr color
- Alo2: mov al,[edi]
- mov al,AlphaTable[eax]
- mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz Alo2
- ALN2:
- ret
- __end_ellipse:
- }
- }
- PANE *xorgPane = 0;
- unsigned char gColor = 0;
- void orLineCallback (int x, int y)
- {
- long result = VFX_pixel_read(xorgPane,x,y);
- result |= gColor;
- VFX_pixel_write(xorgPane,x,y,result);
- }
- void AG_ellipse_fillOr(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
- {
- if( width==0 || height==0 )
- {
- xorgPane = pane;
- gColor = (unsigned char)color;
- VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height,LD_EXECUTE,(long)(&orLineCallback) );
- return;
- }
- DestWidth = pane->window->x_max+1;
- long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
- long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
- long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
- long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
- UBYTE* DestBuffer = pane->window->buffer;
- xc+=paneX0;
- yc+=paneY0;
- _asm{
- mov eax,color
- mov ebx,offset XOR_ELLIPSE_LINES
- mov DrawRoutine,ebx
- mov x_top,0
- mov eax,height
- mov y_top,eax
- mul eax ;compute B squares
- mov Bsquared,eax
- shl eax,1
- mov TwoBsquared,eax
- mov eax,width ;compute A squares
- mul eax
- mov Asquared,eax
- shl eax,1
- mov TwoAsquared,eax
- mov var_dx,0
- mov eax,TwoAsquared ;dy = TwoAsquared * b
- mul height
- mov var_dy,eax
- mov eax,Asquared
- shr eax,2
- add eax,Bsquared ;eax = Asquared/4 + Bsquared
- mov x_vector,eax ;x_vector= a^2/4 + b^2
- mov eax,Asquared
- mul height
- sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
- mov ebx,height
- __until_pos:
- mov eax,var_dx
- sub eax,var_dy
- js __plot_neg
- jmp __dx_ge_dy
- __plot_neg:
- call DrawRoutine
- cmp x_vector,0
- js __d_neg
- dec y_top
- dec ebx
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax
- sub x_vector,eax
- __d_neg:
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax
- add eax,Bsquared
- add x_vector,eax
- jmp __until_pos
- __dx_ge_dy:
- mov eax,Asquared
- sub eax,Bsquared ;eax=a^2-b^2
- mov edx,eax ;edx=a^2-b^2
- sar eax,1 ;eax=(a^2-b^2)/2
- add eax,edx ;eax=3*(a^2-b^2)/2
- sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
- sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
- sar eax,1 ; /2
- add x_vector,eax
- __until_neg:
- call DrawRoutine
- cmp x_vector,0
- jns __d_pos
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax
- add x_vector,eax
- __d_pos:
- dec y_top
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax
- sub eax,Asquared
- sub x_vector,eax
- dec ebx
- js __end_ellipse
- jmp __until_neg
- XOR_ELLIPSE_LINES:
- mov edi,xc
- add edi,x_top
- cmp edi,paneX0
- jl LN2 ;;right end to left of window
- cmp edi,paneX1
- jl TR1
- mov edi,paneX1
- TR1:
- mov line_right,edi
- mov edi,xc
- sub edi,x_top
- cmp edi,paneX1
- jg LN2 ;;left end to right of window
- cmp edi,paneX0
- jg TR2
- mov edi,paneX0
- TR2:
- mov line_left,edi
- mov edx,yc
- add edx,y_top
- cmp edx,paneY0
- jl LN2 ;;bottom line above window
- cmp edx,paneY1
- jg LN1
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- lo1: mov al, byte ptr [edi]
- or al, byte ptr color
- mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz lo1
- LN1:
- mov edi,line_left
- mov edx,yc
- sub edx,y_top
- cmp edx,paneY0
- jl LN2
- cmp edx,paneY1
- jg LN2 ;;top line below window
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- lo2: mov al, byte ptr [edi]
- or al, byte ptr color
- mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz lo2
- LN2:
- ret
- __end_ellipse:
- }
- }
- void andLineCallback (int x, int y)
- {
- long result = VFX_pixel_read(xorgPane,x,y);
- result &= gColor;
- VFX_pixel_write(xorgPane,x,y,result);
- }
- void AG_ellipse_fillXor(PANE *pane, LONG xc, LONG yc, LONG width, LONG height, LONG color)
- {
- long xorResult = color ^ 0xff;
- unsigned char xorColor = (unsigned char)xorResult;
-
- if( width==0 || height==0 )
- {
- xorgPane = pane;
- gColor = (unsigned char)color;
- VFX_line_draw( pane, xc-width, yc-height, xc+width, yc+height, LD_EXECUTE,(long)(&andLineCallback) );
- return;
- }
- DestWidth = pane->window->x_max+1;
- long paneX0 = (pane->x0 < 0) ? 0 : pane->x0;
- long paneY0 = (pane->y0 < 0) ? 0 : pane->y0;
- long paneX1 = (pane->x1 >= DestWidth) ? pane->window->x_max : pane->x1;
- long paneY1 = (pane->y1 >= (pane->window->y_max+1)) ? pane->window->y_max : pane->y1;
- UBYTE* DestBuffer = pane->window->buffer;
- xc+=paneX0;
- yc+=paneY0;
- _asm{
- mov eax,color
- mov ebx,offset XOR_ELLIPSE_LINES
- mov DrawRoutine,ebx
- mov x_top,0
- mov eax,height
- mov y_top,eax
- mul eax ;compute B squares
- mov Bsquared,eax
- shl eax,1
- mov TwoBsquared,eax
- mov eax,width ;compute A squares
- mul eax
- mov Asquared,eax
- shl eax,1
- mov TwoAsquared,eax
- mov var_dx,0
- mov eax,TwoAsquared ;dy = TwoAsquared * b
- mul height
- mov var_dy,eax
- mov eax,Asquared
- shr eax,2
- add eax,Bsquared ;eax = Asquared/4 + Bsquared
- mov x_vector,eax ;x_vector= a^2/4 + b^2
- mov eax,Asquared
- mul height
- sub x_vector,eax ;x_vector=a^2/4+b^2-a^2*b
- mov ebx,height
- __until_pos:
- mov eax,var_dx
- sub eax,var_dy
- js __plot_neg
- jmp __dx_ge_dy
- __plot_neg:
- call DrawRoutine
- cmp x_vector,0
- js __d_neg
- dec y_top
- dec ebx
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax
- sub x_vector,eax
- __d_neg:
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax
- add eax,Bsquared
- add x_vector,eax
- jmp __until_pos
- __dx_ge_dy:
- mov eax,Asquared
- sub eax,Bsquared ;eax=a^2-b^2
- mov edx,eax ;edx=a^2-b^2
- sar eax,1 ;eax=(a^2-b^2)/2
- add eax,edx ;eax=3*(a^2-b^2)/2
- sub eax,var_dx ;eax=3*(a^2-b^2)/2 - dx
- sub eax,var_dy ;eax=3*(a^2-b^2)/2 - (dx+dy)
- sar eax,1 ; /2
- add x_vector,eax
- __until_neg:
- call DrawRoutine
- cmp x_vector,0
- jns __d_pos
- inc x_top
- mov eax,var_dx
- add eax,TwoBsquared
- mov var_dx,eax
- add x_vector,eax
- __d_pos:
- dec y_top
- mov eax,var_dy
- sub eax,TwoAsquared
- mov var_dy,eax
- sub eax,Asquared
- sub x_vector,eax
- dec ebx
- js __end_ellipse
- jmp __until_neg
- XOR_ELLIPSE_LINES:
- mov edi,xc
- add edi,x_top
- cmp edi,paneX0
- jl LN2 ;;right end to left of window
- cmp edi,paneX1
- jl TR1
- mov edi,paneX1
- TR1:
- mov line_right,edi
- mov edi,xc
- sub edi,x_top
- cmp edi,paneX1
- jg LN2 ;;left end to right of window
- cmp edi,paneX0
- jg TR2
- mov edi,paneX0
- TR2:
- mov line_left,edi
- mov edx,yc
- add edx,y_top
- cmp edx,paneY0
- jl LN2 ;;bottom line above window
- cmp edx,paneY1
- jg LN1
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- lo1: mov al, byte ptr [edi]
- and al, xorColor
- mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz lo1
- LN1:
- mov edi,line_left
- mov edx,yc
- sub edx,y_top
- cmp edx,paneY0
- jl LN2
- cmp edx,paneY1
- jg LN2 ;;top line below window
- imul edx,DestWidth
- add edx,DestBuffer
- add edi,edx
- mov ecx,line_right
- sub ecx,line_left
- inc ecx
- lo2: mov al, byte ptr [edi]
- and al, xorColor
- mov byte ptr [edi],al
- inc edi
- dec ecx
- jnz lo2
- LN2:
- ret
- __end_ellipse:
- }
- }
|