123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1993,97 by the Free Pascal development team
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- procedure Arc(x,y,alpha,beta:Integer;Radius:word);
- const i:Array[0..20]of Byte=
- (0,3,0, 2,3,1, 2,1,0, 0,1,1, 0,3,0, 2,3,1, 2,1,0);
- var counter,index,ofs : integer;
- xa,ya,xe,ye : Array[0..2]of Integer;
- xp,yp : integer;
- xradius,yradius : word;
- first,ready : Boolean;
- procedure DrawArc(index1,index2,index3:byte);
- var ende,incr:integer;
- begin
- if index3=0 then begin
- counter:=index;
- ende:=0;
- incr:=-4;
- end else begin
- counter:=-4;
- ende:=index-4;
- incr:=4;
- end;
- if first then begin
- repeat
- first:=false;
- counter:=counter+incr;
- xp:=PInteger(BufferMem)[counter+index1];
- yp:=PInteger(BufferMem)[counter+index2];
- until (counter=ende) or
- (((xp=xa[0]) or (xp=xa[1]) or (xp=xa[2])) and
- ((yp=ya[0]) or (yp=ya[1]) or (yp=ya[2])));
- if Counter=Ende then exit else putpixel(xp,yp,aktcolor);
- end;
- repeat
- if (((xp=xe[0]) or (xp=xe[1]) or (xp=xe[2])) and
- ((yp=ye[0]) or (yp=ye[1]) or (yp=ye[2]))) then
- begin
- ready:=true;
- exit;
- end;
- counter:=counter+incr;
- xp:=PInteger(BufferMem)[counter+index1];
- yp:=PInteger(BufferMem)[counter+index2];
- putpixel(xp,yp,aktcolor);
- until counter=Ende;
- end;
- begin
- first:=true; ready:=false;
- XRadius:=Radius; YRadius:=Radius;
- alpha:=alpha mod 360; beta:=beta mod 360;
- case alpha of
- 0.. 89 : ofs:=0;
- 90..179 : ofs:=1;
- 180..269 : ofs:=2;
- 270..359 : ofs:=3;
- end;
- x:=x+aktviewport.x1; y:=y+aktviewport.y1;
- xa[1]:=x+round(sin((alpha+90)*Pi/180) * XRadius);
- ya[1]:=y+round(cos((alpha+90)*Pi/180) * YRadius);
- xe[1]:=x+round(sin((beta+90)*Pi/180) * XRadius);
- ye[1]:=y+round(cos((beta+90)*Pi/180) * YRadius);
- xa[0]:=xa[1]-1; xa[2]:=xa[1]+1; ya[0]:=ya[1]-1; ya[2]:=ya[1]+1;
- xe[0]:=xe[1]-1; xe[2]:=xe[1]+1; ye[0]:=ye[1]-1; ye[2]:=ye[1]+1;
- index:=Calcellipse(x,y,Radius,Radius);
- repeat
- DrawArc(i[ofs*3],i[ofs*3+1],i[ofs*3+2]);
- ofs:=(ofs+1) mod 7;
- until ready;
- end;
- {
- $Log$
- Revision 1.1 1998-03-25 11:18:42 root
- Initial revision
- Revision 1.3 1998/01/26 11:58:53 michael
- + Added log at the end
-
- Working file: rtl/dos/ppi/arc.ppi
- description:
- ----------------------------
- revision 1.2
- date: 1997/12/01 12:21:27; author: michael; state: Exp; lines: +13 -0
- + added copyright reference in header.
- ----------------------------
- revision 1.1
- date: 1997/11/27 08:33:51; author: michael; state: Exp;
- Initial revision
- ----------------------------
- revision 1.1.1.1
- date: 1997/11/27 08:33:51; author: michael; state: Exp; lines: +0 -0
- FPC RTL CVS start
- =============================================================================
- }
|