gfvgraph.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. { $Id$ }
  2. {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
  3. { }
  4. { System independent GFV GRAPHICS UNIT }
  5. { }
  6. { Copyright (c) 1999, 2000 by Leon de Boer }
  7. { [email protected] - primary e-mail address }
  8. { [email protected] - backup e-mail address }
  9. { }
  10. { This unit provides the interlink between the graphics }
  11. { used in GFV and the graphics API for the different }
  12. { operating systems. }
  13. { }
  14. {****************[ THIS CODE IS FREEWARE ]*****************}
  15. { }
  16. { This sourcecode is released for the purpose to }
  17. { promote the pascal language on all platforms. You may }
  18. { redistribute it and/or modify with the following }
  19. { DISCLAIMER. }
  20. { }
  21. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  22. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  23. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  24. { }
  25. {*****************[ SUPPORTED PLATFORMS ]******************}
  26. { 16 and 32 Bit compilers }
  27. { WINDOWS - Turbo Pascal 7.0 + (16 Bit) }
  28. { - Delphi 1.0+ (16 Bit) }
  29. { WIN95/NT - Delphi 2.0+ (32 Bit) }
  30. { - Virtual Pascal 2.0+ (32 Bit) }
  31. { - Speedsoft Sybil 2.0+ (32 Bit) }
  32. { - FPC 0.9912+ (32 Bit) }
  33. { OS2 - Virtual Pascal 1.0+ (32 Bit) }
  34. { - Speed Pascal 1.0+ (32 Bit) }
  35. { }
  36. {*****************[ REVISION HISTORY ]*********************}
  37. { Version Date Fix }
  38. { ------- --------- ---------------------------------- }
  39. { 1.00 26 Nov 99 Unit started from relocated code }
  40. { originally from views.pas }
  41. { 1.01 21 May 00 GetMaxX and GetMaxY added. }
  42. { 1.02 05 Dec 00 Fixed DOS/DPMI implementation. }
  43. {**********************************************************}
  44. UNIT GFVGraph;
  45. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  46. INTERFACE
  47. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  48. {====Include file to sort compiler platform out =====================}
  49. {$I Platform.inc}
  50. {====================================================================}
  51. {==== Compiler directives ===========================================}
  52. {$IFNDEF PPC_FPC} { FPC doesn't support these switches }
  53. {$F-} { Near far calls are okay }
  54. {$A+} { Word Align Data }
  55. {$B-} { Allow short circuit boolean evaluations }
  56. {$O+} { This unit may be overlaid }
  57. {$G+} { 286 Code optimization - if you're on an 8088 get a real computer }
  58. {$E+} { Emulation is on }
  59. {$N-} { No 80x87 code generation }
  60. {$ENDIF}
  61. {$X+} { Extended syntax is ok }
  62. {$R-} { Disable range checking }
  63. {$S-} { Disable Stack Checking }
  64. {$I-} { Disable IO Checking }
  65. {$Q-} { Disable Overflow Checking }
  66. {$V-} { Turn off strict VAR strings }
  67. {====================================================================}
  68. {$IFDEF GRAPH_API} { GRAPH CODE }
  69. USES Graph; { Standard unit }
  70. {$ENDIF}
  71. {***************************************************************************}
  72. { PUBLIC CONSTANTS }
  73. {***************************************************************************}
  74. {---------------------------------------------------------------------------}
  75. { STANDARD COLOUR CONSTANTS }
  76. {---------------------------------------------------------------------------}
  77. CONST
  78. Black = 0; { Black }
  79. Blue = 1; { Blue }
  80. Green = 2; { Green }
  81. Cyan = 3; { Cyan }
  82. Red = 4; { Red }
  83. Magenta = 5; { Magenta }
  84. Brown = 6; { Brown }
  85. LightGray = 7; { Light grey }
  86. DarkGray = 8; { Dark grey }
  87. LightBlue = 9; { Light blue }
  88. LightGreen = 10; { Light green }
  89. LightCyan = 11; { Light cyan }
  90. LightRed = 12; { Light red }
  91. LightMagenta = 13; { Light magenta }
  92. Yellow = 14; { Yellow }
  93. White = 15; { White }
  94. {---------------------------------------------------------------------------}
  95. { WRITE MODE CONSTANTS }
  96. {---------------------------------------------------------------------------}
  97. CONST
  98. NormalPut = 0; { Normal overwrite }
  99. CopyPut = 0; { Normal put image }
  100. AndPut = 1; { AND colour write }
  101. OrPut = 2; { OR colour write }
  102. XorPut = 3; { XOR colour write }
  103. NotPut = 4; { NOT colour write }
  104. {---------------------------------------------------------------------------}
  105. { CLIP CONTROL CONSTANTS }
  106. {---------------------------------------------------------------------------}
  107. CONST
  108. ClipOn = True; { Clipping on }
  109. ClipOff = False; { Clipping off }
  110. {---------------------------------------------------------------------------}
  111. { VIDEO CARD DETECTION CONSTANTS }
  112. {---------------------------------------------------------------------------}
  113. CONST
  114. Detect = 0; { Detect video }
  115. {$IFDEF GRAPH_API} { DOS CODE ONLY }
  116. {---------------------------------------------------------------------------}
  117. { DOS GRAPHICS SOLID FILL BAR AREA CONSTANT }
  118. {---------------------------------------------------------------------------}
  119. CONST
  120. SolidFill = Graph.SolidFill;
  121. {$ELSE not GRAPH_API }
  122. CONST
  123. SolidFill = 0;
  124. {$ENDIF not GRAPH_API}
  125. {***************************************************************************}
  126. { PUBLIC TYPE DEFINITIONS }
  127. {***************************************************************************}
  128. {---------------------------------------------------------------------------}
  129. { ViewPortType RECORD DEFINITION }
  130. {---------------------------------------------------------------------------}
  131. TYPE
  132. ViewPortType = PACKED RECORD
  133. X1, Y1, X2, Y2: Integer; { Corners of viewport }
  134. Clip : Boolean; { Clip status }
  135. END;
  136. {***************************************************************************}
  137. { INTERFACE ROUTINES }
  138. {***************************************************************************}
  139. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  140. { GRAPHICS MODE CONTROL ROUTINES }
  141. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  142. {-SetWriteMode-------------------------------------------------------
  143. Sets the current write mode constant all subsequent draws etc. are
  144. then via the set mode.
  145. 26Nov99 LdB
  146. ---------------------------------------------------------------------}
  147. PROCEDURE SetWriteMode (Mode: Byte; TextMode: Boolean);
  148. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  149. { VIEWPORT CONTROL ROUTINES }
  150. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  151. {-GetViewSettings----------------------------------------------------
  152. Returns the current viewport and clip parameters in the variable.
  153. 26Nov99 LdB
  154. ---------------------------------------------------------------------}
  155. PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType; TextMode: Boolean);
  156. {-SetViewPort--------------------------------------------------------
  157. Set the current viewport and clip parameters to that requested.
  158. 26Nov99 LdB
  159. ---------------------------------------------------------------------}
  160. PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip, TextMode: Boolean);
  161. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  162. { GRAPHICS DEVICE CAPACITY ROUTINES }
  163. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  164. {-GetMaxX------------------------------------------------------------
  165. Returns X coordinate of maximum value that can be entered in any
  166. graphics routine, that is the actual screen width in pixels - 1.
  167. 21May2000 LdB
  168. ---------------------------------------------------------------------}
  169. FUNCTION GetMaxX (TextMode: Boolean): Integer;
  170. {-GetMaxY------------------------------------------------------------
  171. Returns Y coordinate of maximum value that can be entered in any
  172. graphics routine, that is the actual screen height in pixels - 1.
  173. 21May2000 LdB
  174. ---------------------------------------------------------------------}
  175. FUNCTION GetMaxY (TextMode: Boolean): Integer;
  176. PROCEDURE SetColor(Color: Word);
  177. PROCEDURE SetFillStyle (Pattern: Word; Color: Word);
  178. PROCEDURE Bar (X1, Y1, X2, Y2: Integer);
  179. PROCEDURE Line(X1, Y1, X2, Y2: Integer);
  180. PROCEDURE Rectangle(X1, Y1, X2, Y2: Integer);
  181. PROCEDURE OutTextXY(X,Y: Integer; TextString: String);
  182. {***************************************************************************}
  183. { INITIALIZED PUBLIC VARIABLES }
  184. {***************************************************************************}
  185. {---------------------------------------------------------------------------}
  186. { INITIALIZED DOS/DPMI/WIN/NT/OS2 VARIABLES }
  187. {---------------------------------------------------------------------------}
  188. CONST
  189. WriteMode : Byte = 0; { Current write mode }
  190. SysScreenWidth : Integer = 640; { Default screen width }
  191. SysScreenHeight: Integer = 480; { Default screen height}
  192. {$ifdef DEBUG}
  193. const
  194. WriteDebugInfo : boolean = false;
  195. {$endif DEBUG}
  196. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  197. IMPLEMENTATION
  198. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  199. {***************************************************************************}
  200. { PRIVATE INITIALIZED VARIABLES }
  201. {***************************************************************************}
  202. {---------------------------------------------------------------------------}
  203. { DOS/DPMI/WIN/NT/OS2 INITIALIZED VARIABLES }
  204. {---------------------------------------------------------------------------}
  205. CONST
  206. FillCol : Integer = 0;
  207. Cxp : Integer = 0; { Current x position }
  208. Cyp : Integer = 0; { Current y position }
  209. ViewPort: ViewPortType = (X1:0; Y1:0; X2: 639;
  210. Y2: 479; Clip: True); { Default viewport }
  211. {***************************************************************************}
  212. { INTERFACE ROUTINES }
  213. {***************************************************************************}
  214. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  215. { GRAPHICS MODE CONTROL ROUTINES }
  216. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  217. {---------------------------------------------------------------------------}
  218. { SetWriteMode -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  219. {---------------------------------------------------------------------------}
  220. PROCEDURE SetWriteMode (Mode: Byte; TextMode: Boolean);
  221. BEGIN
  222. {$IFDEF GRAPH_API} { GRAPH CODE }
  223. If TextMode Then
  224. WriteMode := Mode { Hold write mode }
  225. Else Graph.SetWriteMode(Mode); { Call graph proc }
  226. {$ELSE not GRAPH_API}
  227. WriteMode := Mode; { Hold write mode }
  228. {$ENDIF not GRAPH_API}
  229. END;
  230. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  231. { VIEW PORT CONTROL ROUTINES }
  232. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  233. {---------------------------------------------------------------------------}
  234. { GetViewSettings -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  235. {---------------------------------------------------------------------------}
  236. PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType; TextMode: Boolean);
  237. {$IFDEF GRAPH_API}
  238. VAR Ts: Graph.ViewPortType;
  239. {$ENDIF GRAPH_API}
  240. BEGIN
  241. {$IFNDEF GRAPH_API}
  242. CurrentViewPort := ViewPort; { Textmode viewport }
  243. {$ELSE GRAPH_API}
  244. If TextMode Then CurrentViewPort := ViewPort { Textmode viewport }
  245. Else Begin
  246. Graph.GetViewSettings(Ts); { Get graph settings }
  247. CurrentViewPort.X1 := Ts.X1; { Transfer X1 }
  248. CurrentViewPort.Y1 := Ts.Y1; { Transfer Y1 }
  249. CurrentViewPort.X2 := Ts.X2; { Transfer X2 }
  250. CurrentViewPort.Y2 := Ts.Y2; { Transfer Y2 }
  251. CurrentViewPort.Clip := Ts.Clip; { Transfer clip mask }
  252. End;
  253. {$ENDIF GRAPH_API}
  254. END;
  255. {---------------------------------------------------------------------------}
  256. { SetViewPort -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  257. {---------------------------------------------------------------------------}
  258. PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip, TextMode: Boolean);
  259. BEGIN
  260. {$IFDEF GRAPH_API}
  261. If TextMode Then Begin { TEXT MODE GFV }
  262. {$ENDIF GRAPH_API}
  263. If (X1 < 0) Then X1 := 0; { X1 negative fix }
  264. If (X1 >SysScreenWidth) Then
  265. X1 := SysScreenWidth; { X1 off screen fix }
  266. If (Y1 < 0) Then Y1 := 0; { Y1 negative fix }
  267. If (Y1 > SysScreenHeight) Then
  268. Y1 := SysScreenHeight; { Y1 off screen fix }
  269. If (X2 < 0) Then X2 := 0; { X2 negative fix }
  270. If (X2 > SysScreenWidth) Then
  271. X2 := SysScreenWidth; { X2 off screen fix }
  272. If (Y2 < 0) Then Y2 := 0; { Y2 negative fix }
  273. If (Y2 > SysScreenHeight) Then
  274. Y2 := SysScreenHeight; { Y2 off screen fix }
  275. ViewPort.X1 := X1; { Set X1 port value }
  276. ViewPort.Y1 := Y1; { Set Y1 port value }
  277. ViewPort.X2 := X2; { Set X2 port value }
  278. ViewPort.Y2 := Y2; { Set Y2 port value }
  279. ViewPort.Clip := Clip; { Set port clip value }
  280. {$ifdef DEBUG}
  281. If WriteDebugInfo then
  282. Writeln(stderr,'New ViewPort(',X1,',',Y1,',',X2,',',Y2,')');
  283. {$endif DEBUG}
  284. Cxp := X1; { Set current x pos }
  285. Cyp := Y1; { Set current y pos }
  286. {$IFDEF GRAPH_API}
  287. End Else Begin { GRAPHICS MODE GFV }
  288. Graph.SetViewPort(X1, Y1, X2, Y2, Clip); { Call graph proc }
  289. End;
  290. {$ENDIF GRAPH_API}
  291. END;
  292. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  293. { GRAPHICS DEVICE CAPACITY ROUTINES }
  294. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  295. {---------------------------------------------------------------------------}
  296. { GetMaxX - Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  297. {---------------------------------------------------------------------------}
  298. FUNCTION GetMaxX (TextMode: Boolean): Integer;
  299. BEGIN
  300. {$IFDEF GRAPH_API}
  301. If TextMode Then
  302. {$ENDIF GRAPH_API}
  303. GetMaxX := SysScreenWidth-1 { Screen width }
  304. {$IFDEF GRAPH_API}
  305. Else GetMaxX := Graph.GetMaxX; { Call graph func }
  306. {$ENDIF GRAPH_API}
  307. END;
  308. {---------------------------------------------------------------------------}
  309. { GetMaxY - Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  310. {---------------------------------------------------------------------------}
  311. FUNCTION GetMaxY (TextMode: Boolean): Integer;
  312. BEGIN
  313. {$IFDEF GRAPH_API}
  314. If TextMode Then
  315. {$ENDIF GRAPH_API}
  316. GetMaxY := SysScreenHeight-1 { Screen height }
  317. {$IFDEF GRAPH_API}
  318. Else GetMaxY := Graph.GetMaxY; { Call graph func }
  319. {$ENDIF GRAPH_API}
  320. END;
  321. PROCEDURE SetColor(Color: Word);
  322. BEGIN
  323. {$IFDEF GRAPH_API}
  324. Graph.SetColor(Color); { Call graph proc }
  325. {$ENDIF GRAPH_API}
  326. END;
  327. PROCEDURE SetFillStyle (Pattern: Word; Color: Word);
  328. BEGIN
  329. {$IFDEF GRAPH_API}
  330. Graph.SetFillStyle(Pattern, Color); { Call graph proc }
  331. {$ENDIF GRAPH_API}
  332. END;
  333. PROCEDURE Bar (X1, Y1, X2, Y2: Integer);
  334. BEGIN
  335. {$IFDEF GRAPH_API}
  336. Graph.Bar(X1, Y1, X2, Y2); { Call graph proc }
  337. {$ENDIF GRAPH_API}
  338. END;
  339. PROCEDURE Line(X1, Y1, X2, Y2: Integer);
  340. BEGIN
  341. {$IFDEF GRAPH_API}
  342. Graph.Line(X1, Y1, X2, Y2); { Call graph proc }
  343. {$ENDIF GRAPH_API}
  344. END;
  345. PROCEDURE Rectangle(X1, Y1, X2, Y2: Integer);
  346. BEGIN
  347. {$IFDEF GRAPH_API}
  348. Graph.Rectangle(X1, Y1, X2, Y2); { Call graph proc }
  349. {$ENDIF GRAPH_API}
  350. END;
  351. PROCEDURE OutTextXY(X,Y: Integer; TextString: string);
  352. BEGIN
  353. {$IFDEF GRAPH_API}
  354. Graph.OutTextXY(X, Y, TextString); { Call graph proc }
  355. {$ENDIF GRAPH_API}
  356. END;
  357. END.
  358. {
  359. $Log$
  360. Revision 1.9 2001-05-31 21:40:10 pierre
  361. * some debug stuff changed
  362. Revision 1.8 2001/05/10 16:46:28 pierre
  363. + some improovements made
  364. Revision 1.7 2001/05/07 23:36:35 pierre
  365. NO_WINDOW cond removed
  366. Revision 1.6 2001/05/07 22:22:03 pierre
  367. * removed NO_WINDOW cond, added GRAPH_API
  368. Revision 1.5 2001/05/04 15:43:45 pierre
  369. * several more fixes
  370. Revision 1.4 2001/04/10 21:57:55 pierre
  371. + first adds for Use_API define
  372. Revision 1.3 2001/04/10 21:29:55 pierre
  373. * import of Leon de Boer's files
  374. Revision 1.2 2000/08/24 12:00:21 marco
  375. * CVS log and ID tags
  376. }