123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797 |
- unit Graph;
- { *********************************************************************
- Info:
- This units mimics some parts of borland's graph unit for
- Amiga.
- You have to use crt for readln, readkey and stuff like
- that for your programs. When the show is over you should
- just press a key or hit return to close everything down.
- If that doesn't work just flip the screens with left-Amiga n
- and activate the shell you started from.
- I have compiled and run mandel.pp without any problems.
- This version requires Free Pascal 0.99.5c or higher.
- It will also use some amigaunits, when the unit gets
- better we can remove those units.
- Large parts have not yet been implemented or tested.
- [email protected] (Nils Sjoholm)
- History:
- Date Version Who Comments
- ---------- -------- ------- -------------------------------------
- 27-Nov-98 0.1 nsjoholm Initial version.
- License Conditions:
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
- This library 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. See the GNU
- Library General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *********************************************************************}
- interface
- uses Exec, Intuition, Graphics, Utility;
- { ---------------------------------------------------------------------
- Constants
- ---------------------------------------------------------------------}
- const
- NormalPut = 0;
- CopyPut = 0;
- XORPut = 1;
- ORPut = 2;
- ANDPut = 3;
- NotPut = 4;
- BackPut = 8;
- Black = 0;
- Blue = 1;
- Green = 2;
- Cyan = 3;
- Red = 4;
- Magenta = 5;
- Brown = 6;
- LightGray = 7;
- DarkGray = 8;
- LightBlue = 9;
- LightGreen = 10;
- LightCyan = 11;
- LightRed = 12;
- LightMagenta = 13;
- Yellow = 14;
- White = 15;
- Border = 16;
- SolidLn = 0;
- DottedLn = 1;
- CenterLn = 2;
- DashedLn = 3;
- UserBitLn = 4;
- EmptyFill = 0;
- SolidFill = 1;
- LineFill = 2;
- LtSlashFill = 3;
- SlashFill = 4;
- BkSlashFill = 5;
- LtBkSlashFill = 6;
- HatchFill = 7;
- XHatchFill = 8;
- InterleaveFill = 9;
- WideDotFill = 10;
- CloseDotFill = 11;
- UserFill = 12;
- NormWidth = 1;
- ThickWidth = 3;
- const
- LeftText = 0;
- CenterText = 1;
- RightText = 2;
- BottomText = 0;
- TopText = 2;
- BaseLine = 3;
- LeadLine = 4;
- const
- { Error codes }
- grOK = 0;
- grNoInitGraph = -1;
- grNotDetected = -2;
- grFileNotFound = -3;
- grInvalidDriver = -4;
- grNoLOadMem = -5;
- grNoScanMem = -6;
- grNoFloodMem = -7;
- grFontNotFound = -8;
- grNoFontMem = -9;
- grInvalidmode = -10;
- grError = -11;
- grIOerror = -12;
- grInvalidFont = -13;
- grInvalidFontNum = -14;
- Type
- FillPatternType = array[1..8] of byte;
- ArcCoordsType = record
- x,y : integer;
- xstart,ystart : integer;
- xend,yend : integer;
- end;
- RGBColor = record
- r,g,b,i : byte;
- end;
- PaletteType = record
- Size : integer;
- Colors : array[0..767]of Byte;
- end;
- LineSettingsType = record
- linestyle : word;
- pattern : word;
- thickness : word;
- end;
- TextSettingsType = record
- font : word;
- direction : word;
- charsize : word;
- horiz : word;
- vert : word;
- end;
- FillSettingsType = record
- pattern : word;
- color : longint;
- end;
- PointType = record
- x,y : integer;
- end;
- ViewPortType = record
- x1,y1,x2,y2 : integer;
- Clip : boolean;
- end;
- const
- fillpattern : array[0..12] of FillPatternType = (
- ($00,$00,$00,$00,$00,$00,$00,$00), { Hintergrundfarbe }
- ($ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff), { Vordergrundfarbe }
- ($ff,$ff,$00,$00,$ff,$ff,$00,$00), { === }
- ($01,$02,$04,$08,$10,$20,$40,$80), { /// }
- ($07,$0e,$1c,$38,$70,$e0,$c1,$83), { /// als dicke Linien }
- ($07,$83,$c1,$e0,$70,$38,$1c,$0e), { \\\ als dicke Linien }
- ($5a,$2d,$96,$4b,$a5,$d2,$69,$b4), { \ \\ \ }
- ($ff,$88,$88,$88,$ff,$88,$88,$88), { K„stchen }
- ($18,$24,$42,$81,$81,$42,$24,$18), { Rauten }
- ($cc,$33,$cc,$33,$cc,$33,$cc,$33), { "Mauermuster" }
- ($80,$00,$08,$00,$80,$00,$08,$00), { weit auseinanderliegende Punkte }
- ($88,$00,$22,$00,$88,$00,$22,$00), { dichte Punkte}
- (0,0,0,0,0,0,0,0) { benutzerdefiniert }
- );
- { ---------------------------------------------------------------------
- Function Declarations
- ---------------------------------------------------------------------}
- { Retrieving coordinates }
- function GetX: Integer;
- function GetY: Integer;
- { Pixel-oriented routines }
- procedure PutPixel(X, Y: Integer; Pixel: Word);
- function GetPixel(X, Y: Integer): Integer;
- { Line-oriented primitives }
- procedure LineTo(X, Y: Integer);
- procedure LineRel(Dx, Dy: Integer);
- procedure MoveTo(X, Y: Integer);
- procedure MoveRel(Dx, Dy: Integer);
- procedure Line(x1, y1, x2, y2: Integer);
- { Linearly bounded primitives }
- procedure Rectangle(x1, y1, x2, y2: Integer);
- procedure Bar(x1, y1, x2, y2: Integer);
- procedure Bar3D(x1, y1, x2, y2: Integer; Depth: Word; Top: Boolean);
- procedure FloodFill(X, Y: Integer; Border: Word);
- { Nonlinearly bounded primitives }
- procedure Arc(X, Y: Integer; StAngle, EndAngle, Radius: Word);
- procedure GetArcCoords(var ArcCoords: ArcCoordsType);
- procedure Circle(X, Y: Integer; Radius: Word);
- procedure Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius : Word);
- procedure FillEllipse(X, Y: Integer; XRadius, YRadius : Word);
- procedure SetAspectRatio(Xasp, Yasp: Word);
- procedure PieSlice(X, Y: Integer; StAngle, EndAngle, Radius: Word);
- procedure Sector(X, Y: Integer; StAngle, EndAngle, XRadius, YRadius: Word);
- { Color routines }
- procedure SetBkColor(ColorNum: Word);
- procedure SetColor(Color: Word);
- Function GetBkColor : Word;
- Function GetColor : Word;
- function GetMaxColor : Word;
- function GetMaxX : Integer;
- function GetMAxY : Integer;
- function GetAspect: Real;
- procedure GetAspectRatio(var x,y : Word);
- { Graph clipping method }
- Procedure ClearViewPort;
- function GraphResult: Integer;
- { For compatibility }
- Procedure InitGraph (Var Driver,Mode : Integer;DriverPath : String);
- Procedure CloseGraph;
- const
- NoGraphics: Boolean = false;
- { VGA modes }
- GTEXT = 0; { Compatible with VGAlib v1.2 }
- G320x200x16 = 1;
- G640x200x16 = 2;
- G640x350x16 = 3;
- G640x480x16 = 4;
- G320x200x256 = 5;
- G320x240x256 = 6;
- G320x400x256 = 7;
- G360x480x256 = 8;
- G640x480x2 = 9;
- G640x480x256 = 10;
- G800x600x256 = 11;
- G1024x768x256 = 12;
- G1280x1024x256 = 13; { Additional modes. }
- G320x200x32K = 14;
- G320x200x64K = 15;
- G320x200x16M = 16;
- G640x480x32K = 17;
- G640x480x64K = 18;
- G640x480x16M = 19;
- G800x600x32K = 20;
- G800x600x64K = 21;
- G800x600x16M = 22;
- G1024x768x32K = 23;
- G1024x768x64K = 24;
- G1024x768x16M = 25;
- G1280x1024x32K = 26;
- G1280x1024x64K = 27;
- G1280x1024x16M = 28;
- G800x600x16 = 29;
- G1024x768x16 = 30;
- G1280x1024x16 = 31;
- G720x348x2 = 32; { Hercules emulation mode }
- G320x200x16M32 = 33; { 32-bit per pixel modes. }
- G640x480x16M32 = 34;
- G800x600x16M32 = 35;
- G1024x768x16M32 = 36;
- G1280x1024x16M32 = 37;
- { additional resolutions }
- G1152x864x16 = 38;
- G1152x864x256 = 39;
- G1152x864x32K = 40;
- G1152x864x64K = 41;
- G1152x864x16M = 42;
- G1152x864x16M32 = 43;
- G1600x1200x16 = 44;
- G1600x1200x256 = 45;
- G1600x1200x32K = 46;
- G1600x1200x64K = 47;
- G1600x1200x16M = 48;
- G1600x1200x16M32 = 49;
- GLASTMODE = 49;
- implementation
- {$I tagutils.inc}
- { ---------------------------------------------------------------------
- Types, constants and variables
- ---------------------------------------------------------------------}
- VAR GraphScr :pScreen;
- GraphWin :pWindow;
- CurrentRastPort : pRastPort;
- TheAspect : Real;
- GraphResultCode : Integer;
- Msg :pIntuiMessage;
- Ende :Boolean;
- var
- DrawDelta: TPoint;
- CurX, CurY: Integer;
- TheColor, TheFillColor: LongInt;
- IsVirtual: Boolean;
- ColorTable: array[0..15] of LongInt;
- TheFillPattern : FillPatternType;
- TheLineSettings : LineSettingsType;
- ThePalette : PaletteType;
- TheTextSettings : TextSettingsType;
- TheFillSettings : FillSettingsType;
- const
- BgiColors: array[0..15] of LongInt
- = ($000000, $000080, $008000, $008080,
- $800000, $800080, $808000, $C0C0C0,
- $808080, $0000FF, $00FF00, $00FFFF,
- $FF0000, $FF00FF, $FFFF00, $FFFFFF);
- const
- DoUseMarker: Boolean = true;
- TheMarker: Char = '~';
- TextColor: LongInt = 15;
- MarkColor: LongInt = 15;
- BackColor: LongInt = 0;
- FontWidth: Integer = 8;
- FontHeight: Integer = 8;
- var
- sHoriz, sVert: Word;
- { initialisierte Variablen }
- const
- SourcePage: Word = 0;
- DestPage: Word = 0;
- { Retrieves the capabilities for the current mode }
- const
- vmcImage = 1;
- vmcCopy = 2;
- vmcSaveRestore = 4;
- vmcBuffer = 8;
- vmcBackPut = 16;
- { ---------------------------------------------------------------------
- Graphics Vision Layer
- ---------------------------------------------------------------------}
- { Types and constants }
- var
- SizeX, SizeY: Word;
- { Font attributes }
- const
- ftNormal = 0;
- ftBold = 1;
- ftThin = 2;
- ftItalic = 4;
- var
- sFont, sColor:Word;
- sCharSpace: Integer;
- { Not used
- sMarker: Char;
- sAttr: Word; }
- { Bitmap utilities }
- type
- PBitmap = ^TBitmap;
- TBitmap = record
- Width, Height: Integer;
- Data: record end;
- end;
- const
- pbNone = 0;
- pbCopy = 1;
- pbClear = 2;
- procedure SetColors;
- begin
- SetRGB4(@GraphScr^.ViewPort, Black , 0,0,0);
- SetRGB4(@GraphScr^.ViewPort, Blue , 0,0,15);
- SetRGB4(@GraphScr^.ViewPort, Green , 0,15,0);
- SetRGB4(@GraphScr^.ViewPort, Cyan , 0,15,15);
- SetRGB4(@GraphScr^.ViewPort, Red , 15,0,0);
- SetRGB4(@GraphScr^.ViewPort, Magenta , 15,0,15);
- SetRGB4(@GraphScr^.ViewPort, Brown , 6,2,0);
- SetRGB4(@GraphScr^.ViewPort, LightGray, 13,13,13);
- SetRGB4(@GraphScr^.ViewPort, DarkGray , 4,4,4);
- SetRGB4(@GraphScr^.ViewPort, LightBlue, 5,5,5);
- SetRGB4(@GraphScr^.ViewPort, LightGreen ,9,15,1);
- SetRGB4(@GraphScr^.ViewPort, LightRed ,14,5,0);
- SetRGB4(@GraphScr^.ViewPort, LightMagenta ,0,15,8);
- SetRGB4(@GraphScr^.ViewPort, Yellow ,15,15,0);
- SetRGB4(@GraphScr^.ViewPort, White ,15,15,15);
- end;
- { ---------------------------------------------------------------------
- Real graph implementation
- ---------------------------------------------------------------------}
- function GraphResult: Integer;
- begin
- GraphResult := GraphResultCode;
- end;
- Procedure ClearViewPort;
- begin
- SetRast(CurrentRastPort,Black);
- end;
- function GetX: Integer;
- begin
- GetX := CurX;
- end;
- function GetY: Integer;
- begin
- GetY := CurY;
- end;
- function GetAspect: Real;
- begin
- GetAspect := GetMaxY/GetMaxX;
- end;
- procedure GetAspectRatio(var x,y : Word);
- begin
- x := GetMaxX;
- y := GetMaxY;
- end;
- { Pixel-oriented routines }
- procedure PutPixel(x,y : Integer; Pixel : Word);
- begin
- SetAPen(CurrentRastPort,Pixel);
- WritePixel(CurrentRastPort,x,y);
- CurX := x;
- CurY := y;
- end;
- function GetPixel(X, Y: Integer): Integer;
- begin
- GetPixel := ReadPixel(CurrentRastPort,X,Y);
- end;
- { Line-oriented primitives }
- procedure LineTo(X, Y: Integer);
- begin
- Draw(CurrentRastPort,X,Y);
- CurX := X;
- CurY := Y;
- end;
- procedure LineRel(Dx, Dy: Integer);
- begin
- CurX := CurX + Dx;
- CurY := CurY + Dy;
- Draw(CurrentRastPort, Curx, CurY);
- end;
- procedure MoveTo(X, Y: Integer);
- begin
- Move(CurrentRastPort, X , Y);
- CurX := X;
- CurY := Y;
- end;
- procedure MoveRel(Dx, Dy: Integer);
- begin
- CurX := CurX + Dx;
- CurY := CurY + Dy;
- Move(CurrentRastPort, Curx, CurY);
- end;
- procedure Line(x1,y1,x2,y2: Integer);
- begin
- Move(CurrentRastPort,x1,y1);
- Draw(CurrentRastPort,x2,y2);
- Move(CurrentRastPort,CurX, CurY);
- end;
- procedure Rectangle(x1, y1, x2, y2: Integer);
- begin
- Move(CurrentRastPort, x1, y1);
- Draw(CurrentRastPort, x2, y1);
- Draw(CurrentRastPort, x2, y2);
- Draw(CurrentRastPort, x1, y2);
- Draw(CurrentRastPort, x1, y1);
- CurX := x1;
- CurY := y1;
- end;
- procedure Bar(x1, y1, x2, y2: Integer);
- begin
- RectFill(CurrentRastPort, x1, y1, x2, y2);
- CurX := x1;
- CurY := y1;
- end;
- procedure Bar3D(x1, y1, x2, y2: Integer; Depth: Word; Top: Boolean);
- begin
- Bar(x1,y1,x2,y2);
- Rectangle(x1,y1,x2,y2);
- if top then begin
- Moveto(x1,y1);
- Lineto(x1+depth,y1-depth);
- Lineto(x2+depth,y1-depth);
- Lineto(x2,y1);
- end;
- Moveto(x2+depth,y1-depth);
- Lineto(x2+depth,y2-depth);
- Lineto(x2,y2);
- end;
- procedure FloodFill(X, Y: Integer; Border: Word);
- begin
- end;
- Var LastArcCoords : ArcCoordsType;
- procedure SetArcCoords (X,y,xradius,yradius,Stangle,endangle : integer);
- begin
- LastArcCoords.X:=X;
- LastArccOords.y:=y;
- Lastarccoords.xstart:=x+round(xradius*cos(stangle*pi/180));
- Lastarccoords.ystart:=y-round(yradius*sin(stangle*pi/180));
- LastArccoords.xend:=x+round(xradius*cos(endangle*pi/180));
- LastArccoords.yend:=y-round(yradius*sin(endangle*pi/180));
- end;
- procedure GetArcCoords(var ArcCoords: ArcCoordsType);
- begin
- ArcCoords:=LastArcCoords;
- end;
- procedure Arc(X, Y: Integer; StAngle, EndAngle, Radius: Word);
- begin
- Ellipse (X,y,stangle,endangle,Radius,radius);
- end;
- procedure Circle(X, Y: Integer; Radius: Word);
- begin
- DrawEllipse(CurrentRastPort, x, y, Round(Radius * TheAspect), Radius);
- end;
- procedure Ellipse(X, Y: Integer;
- StAngle, EndAngle: Word; XRadius, YRadius : Word);
- Var I : longint;
- tmpang : real;
- begin
- SetArcCoords (X,Y,xradius,yradius,Stangle,EndAngle);
- For i:= StAngle To EndAngle Do
- Begin
- tmpAng:= i*Pi/180;
- curX:= X + Round (xRadius*Cos (tmpAng));
- curY:= Y - Round (YRadius*Sin (tmpAng));
- PutPixel (curX, curY, TheColor);
- End;
- end;
- procedure FillEllipse(X, Y: Integer; XRadius, YRadius : Word);
- Var I,tmpcolor : longint;
- tmpang : real;
- tmpx,tmpy : Integer;
- begin
- tmpcolor:=Thecolor;
- SetColor(TheFillColor);
- For i:= 0 to 180 Do
- Begin
- tmpAng:= i*Pi/180;
- curX:= Round (xRadius*Cos (tmpAng));
- curY:= Round (YRadius*Sin (tmpAng));
- tmpX:= X - curx;
- tmpy:= Y + cury;
- curx:=x+curx;
- cury:=y-cury;
- Line (curX, curY,tmpx,tmpy);
- PutPixel (curx,cury,tmpcolor);
- PutPixel (tmpx,tmpy,tmpcolor);
- End;
- SetColor(tmpcolor);
- end;
- procedure SetAspectRatio(Xasp, Yasp: Word);
- begin
- //!! Needs implementing.
- end;
- procedure PieSlice(X, Y: Integer; StAngle, EndAngle, Radius: Word);
- Begin
- sector (x,y,stangle,endangle,radius,radius);
- end;
- procedure Sector(X, Y: Integer;
- StAngle, EndAngle, XRadius, YRadius: Word);
- Var I,tmpcolor : longint;
- tmpang : real;
- ac : arccoordstype;
- begin
- tmpcolor:=Thecolor;
- SetColor(TheFillColor);
- For i:= stangle to endangle Do
- Begin
- tmpAng:= i*Pi/180;
- curX:= x+Round (xRadius*Cos (tmpAng));
- curY:= y-Round (YRadius*Sin (tmpAng));
- Line (x,y,curX, curY);
- PutPixel (curx,cury,tmpcolor);
- End;
- SetColor(tmpcolor);
- getarccoords(ac);
- Line (x,y,ac.xstart,ac.ystart);
- Line (x,y,ac.xend,ac.yend);
- end;
- { Color routines
- }
- procedure SetBkColor(ColorNum: Word);
- begin
- SetBPen(CurrentRastPort, ColorNum);
- BackColor := ColorNum;
- end;
- Function GetBkColor : Word;
- begin
- GetBkColor:=BackColor;
- end;
- Function GetColor : Word;
- begin
- GetColor:=TheColor;
- end;
- procedure SetColor(color : Word);
- begin
- SetAPen(CurrentRastPort,color);
- TheColor := color;
- end;
- function GetMaxColor: word;
- begin
- GetMaxColor := 15;
- end;
- function GetMaxX: Integer;
- begin
- GetMaxX := GraphWin^.Width;
- end;
- function GetMaxY: Integer;
- begin
- GetMaxY := GraphWin^.Height;
- end;
- Procedure InitGraph (Var Driver,Mode : Integer;DriverPath : String);
- var
- thetags : array[0..3] of tTagItem;
- BEGIN
- GraphResultCode := grOK;
- GfxBase := OpenLibrary(GRAPHICSNAME,0);
- if GfxBase = nil then begin
- GraphResultCode := grNoInitGraph;
- Exit;
- end;
- GraphScr:=Nil; GraphWin:=Nil;
- { Will open an hires interlace screen, if you
- want just an hires screen change HIRESLACE_KEY
- to HIRES_KEY
- }
- thetags[0] := TagItem(SA_Depth, 4);
- thetags[1] := TagItem(SA_DisplayID, HIRESLACE_KEY);
- thetags[2].ti_Tag := TAG_END;
- GraphScr := OpenScreenTagList(NIL,@thetags);
- If GraphScr=Nil Then begin
- GraphResultCode := grNoInitGraph;
- Exit;
- end;
- thetags[0] := TagItem(WA_Flags, WFLG_BORDERLESS);
- thetags[1] := TagItem(WA_IDCMP, IDCMP_MOUSEBUTTONS);
- thetags[2] := TagItem(WA_CustomScreen, Longint(GraphScr));
- thetags[3].ti_Tag := TAG_DONE;
- GraphWin:=OpenWindowTagList(Nil, @thetags);
- If GraphWin=Nil Then CloseGraph;
- CurrentRastPort := GraphWin^.RPort;
- SetColors;
- TheAspect := GetAspect;
- END;
- PROCEDURE CloseGraph;
- BEGIN
- { Ende:=false;
- Repeat
- Msg:=pIntuiMessage(GetMsg(GraphWin^.UserPort));
- If Msg<>Nil Then Begin
- ReplyMsg(Pointer(Msg));
- Ende:=true;
- End;
- Until Ende;}
- If GraphWin<>Nil Then
- CloseWindow(GraphWin);
- If (GraphScr<>Nil) then CloseScreen(GraphScr);
- if GfxBase <> nil then CloseLibrary(GfxBase);
- Halt;
- END;
- begin
- CurX := 0;
- CurY := 0;
- end.
- $Log$
- Revision 1.3 2002-09-07 16:01:16 peter
- * old logs removed and tabs fixed
- }
|