ggigraph.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999 by the Free Pascal development team
  5. GGI implementation of graph unit.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$LINKLIB c}
  13. {$PACKRECORDS C}
  14. const
  15. InternalDriverName = 'LinuxGGI';
  16. var
  17. SavePtr: Pointer;
  18. { ---------------------------------------------------------------------
  19. GGI bindings [(c) 1999 Sebastian Guenther]
  20. ---------------------------------------------------------------------}
  21. Const
  22. { Supported modes }
  23. {(sg) GTEXT deactivated because we need mode #0 as default mode}
  24. {GTEXT = 0; Compatible with VGAlib v1.2 }
  25. G320x200x16 = 1;
  26. G640x200x16 = 2;
  27. G640x350x16 = 3;
  28. G640x480x16 = 4;
  29. G320x200x256 = 5;
  30. G320x240x256 = 6;
  31. G320x400x256 = 7;
  32. G360x480x256 = 8;
  33. G640x480x2 = 9;
  34. G640x480x256 = 10;
  35. G800x600x256 = 11;
  36. G1024x768x256 = 12;
  37. G1280x1024x256 = 13; { Additional modes. }
  38. G320x200x32K = 14;
  39. G320x200x64K = 15;
  40. G320x200x16M = 16;
  41. G640x480x32K = 17;
  42. G640x480x64K = 18;
  43. G640x480x16M = 19;
  44. G800x600x32K = 20;
  45. G800x600x64K = 21;
  46. G800x600x16M = 22;
  47. G1024x768x32K = 23;
  48. G1024x768x64K = 24;
  49. G1024x768x16M = 25;
  50. G1280x1024x32K = 26;
  51. G1280x1024x64K = 27;
  52. G1280x1024x16M = 28;
  53. G800x600x16 = 29;
  54. G1024x768x16 = 30;
  55. G1280x1024x16 = 31;
  56. G720x348x2 = 32; { Hercules emulation mode }
  57. G320x200x16M32 = 33; { 32-bit per pixel modes. }
  58. G640x480x16M32 = 34;
  59. G800x600x16M32 = 35;
  60. G1024x768x16M32 = 36;
  61. G1280x1024x16M32 = 37;
  62. { additional resolutions }
  63. G1152x864x16 = 38;
  64. G1152x864x256 = 39;
  65. G1152x864x32K = 40;
  66. G1152x864x64K = 41;
  67. G1152x864x16M = 42;
  68. G1152x864x16M32 = 43;
  69. G1600x1200x16 = 44;
  70. G1600x1200x256 = 45;
  71. G1600x1200x32K = 46;
  72. G1600x1200x64K = 47;
  73. G1600x1200x16M = 48;
  74. G1600x1200x16M32 = 49;
  75. GLASTMODE = 49;
  76. ModeNames: array[0..GLastMode] of PChar =
  77. ('[]', {Let GGI choose a default mode}
  78. 'S320x200[GT_4BIT]',
  79. 'S640x200[GT_4BIT]',
  80. 'S640x350[GT_4BIT]',
  81. 'S640x480[GT_4BIT]',
  82. 'S320x200[GT_8BIT]',
  83. 'S320x240[GT_8BIT]',
  84. 'S320x400[GT_8BIT]',
  85. 'S360x480[GT_8BIT]',
  86. 'S640x480x[GT_1BIT]',
  87. 'S640x480[GT_8BIT]',
  88. 'S800x600[GT_8BIT]',
  89. 'S1024x768[GT_8BIT]',
  90. 'S1280x1024[GT_8BIT]',
  91. 'S320x200[GT_15BIT]',
  92. 'S320x200[GT_16BIT]',
  93. 'S320x200[GT_24BIT]',
  94. 'S640x480[GT_15BIT]',
  95. 'S640x480[GT_16BIT]',
  96. 'S640x480[GT_24BIT]',
  97. 'S800x600[GT_15BIT]',
  98. 'S800x600[GT_16BIT]',
  99. 'S800x600[GT_24BIT]',
  100. 'S1024x768[GT_15BIT]',
  101. 'S1024x768[GT_16BIT]',
  102. 'S1024x768[GT_24BIT]',
  103. 'S1280x1024[GT_15BIT]',
  104. 'S1280x1024[GT_16BIT]',
  105. 'S1280x1024[GT_24BIT]',
  106. 'S800x600[GT_4BIT]',
  107. 'S1024x768[GT_4BIT]',
  108. 'S1280x1024[GT_4BIT]',
  109. 'S720x348x[GT_1BIT]',
  110. 'S320x200[GT_32BIT]',
  111. 'S640x480[GT_32BIT]',
  112. 'S800x600[GT_32BIT]',
  113. 'S1024x768[GT_32BIT]',
  114. 'S1280x1024[GT_32BIT]',
  115. 'S1152x864[GT_4BIT]',
  116. 'S1152x864[gt_8BIT]',
  117. 'S1152x864[GT_15BIT]',
  118. 'S1152x864[GT_16BIT]',
  119. 'S1152x864[GT_24BIT]',
  120. 'S1152x864[GT_32BIT]',
  121. 'S1600x1200[GT_4BIT]',
  122. 'S1600x1200[gt_8BIT]',
  123. 'S1600x1200[GT_15BIT]',
  124. 'S1600x1200[GT_16BIT]',
  125. 'S1600x1200[GT_24BIT]',
  126. 'S1600x1200[GT_32BIT]');
  127. type
  128. TGGIVisual = Pointer;
  129. TGGIResource = Pointer;
  130. TGGICoord = record
  131. x, y: SmallInt;
  132. end;
  133. TGGIPixel = LongWord;
  134. PGGIColor = ^TGGIColor;
  135. TGGIColor = record
  136. r, g, b, a: Word;
  137. end;
  138. PGGIClut = ^TGGIClut;
  139. TGGIClut = record
  140. size: SmallInt;
  141. data: PGGIColor;
  142. end;
  143. TGGIGraphType = LongWord;
  144. TGGIAttr = LongWord;
  145. TGGIMode = record // requested by user and changed by driver
  146. Frames: LongInt; // frames needed
  147. Visible: TGGICoord; // vis. pixels, may change slightly
  148. Virt: TGGICoord; // virtual pixels, may change
  149. Size: TGGICoord; // size of visible in mm
  150. GraphType: TGGIGraphType; // which mode ?
  151. dpp: TGGICoord; // dots per pixel
  152. end;
  153. const
  154. libggi = 'ggi';
  155. function ggiInit: Integer; cdecl; external libggi;
  156. procedure ggiExit; cdecl; external libggi;
  157. function ggiOpen(display: PChar; args: Array of const): TGGIVisual; cdecl; external libggi;
  158. function ggiClose(vis: TGGIVisual): Integer; cdecl; external libggi;
  159. function ggiParseMode(s: PChar; var m: TGGIMode): Integer; cdecl; external libggi;
  160. function ggiSetMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
  161. function ggiGetMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
  162. function ggiCheckMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
  163. function ggiMapColor(vis: TGGIVisual; Color: TGGIColor): TGGIPixel; cdecl; external libggi;
  164. function ggiPutPixel(vis: TGGIVisual; x, y: Integer; pixel: TGGIPixel): Integer; cdecl; external libggi;
  165. function ggiGetPixel(vis: TGGIVisual; x, y: Integer; var pixel: TGGIPixel): Integer; cdecl; external libggi;
  166. function ggiDrawBox(vis: TGGIVisual; x, y, w, h: Integer): Integer; cdecl; external libggi;
  167. function ggiPutBox(vis: TGGIVisual; x, y, w, h: Integer; var buffer): Integer; cdecl; external libggi;
  168. function ggiGetBox(vis: TGGIVisual; x, y, w, h: Integer; var buffer): Integer; cdecl; external libggi;
  169. function ggiGetPalette(vis: TGGIVisual; s, len: Integer; var cmap: TGGIColor): Integer; cdecl; external libggi;
  170. function ggiSetPalette(vis: TGGIVisual; s, len: Integer; var cmap: TGGIColor): Integer; cdecl; external libggi;
  171. var
  172. Visual: TGGIVisual;
  173. CurrentMode, OldMode: TGGIMode;
  174. procedure ggi_savevideostate;
  175. begin
  176. ggiGetMode(Visual, OldMode);
  177. end;
  178. procedure ggi_restorevideostate;
  179. begin
  180. ggiSetMode(Visual, OldMode);
  181. end;
  182. const
  183. BgiColors: array[0..15] of TGGIColor = (
  184. (r: $0000; g: $0000; b: $0000; a: 0),
  185. (r: $0000; g: $0000; b: $8000; a: 0),
  186. (r: $0000; g: $8000; b: $0000; a: 0),
  187. (r: $0000; g: $8000; b: $8000; a: 0),
  188. (r: $8000; g: $0000; b: $0000; a: 0),
  189. (r: $8000; g: $0000; b: $8000; a: 0),
  190. (r: $8000; g: $8000; b: $0000; a: 0),
  191. (r: $C000; g: $C000; b: $C000; a: 0),
  192. (r: $8000; g: $8000; b: $8000; a: 0),
  193. (r: $0000; g: $0000; b: $FFFF; a: 0),
  194. (r: $0000; g: $FFFF; b: $0000; a: 0),
  195. (r: $0000; g: $FFFF; b: $FFFF; a: 0),
  196. (r: $FFFF; g: $0000; b: $0000; a: 0),
  197. (r: $FFFF; g: $0000; b: $FFFF; a: 0),
  198. (r: $FFFF; g: $FFFF; b: $0000; a: 0),
  199. (r: $FFFF; g: $FFFF; b: $FFFF; a: 0));
  200. procedure ggi_initmodeproc;
  201. begin
  202. ggiParseMode(ModeNames[IntCurrentMode], CurrentMode);
  203. ggiSetMode(Visual, CurrentMode);
  204. end;
  205. function ClipCoords(var x, y: Integer): Boolean;
  206. { Adapt to viewport, return TRUE if still in viewport,
  207. false if outside viewport}
  208. begin
  209. x := x + StartXViewPort;
  210. x := y + StartYViewPort;
  211. ClipCoords := not ClipPixels;
  212. if ClipCoords then begin
  213. ClipCoords := (y < StartXViewPort) or (x > (StartXViewPort + ViewWidth));
  214. ClipCoords := ClipCoords or
  215. ((y < StartYViewPort) or (y > (StartYViewPort + ViewHeight)));
  216. ClipCoords := not ClipCoords;
  217. end;
  218. end;
  219. procedure ggi_directpixelproc(X, Y: Integer);
  220. var
  221. Color, CurCol: TGGIPixel;
  222. begin
  223. CurCol := ggiMapColor(Visual, BgiColors[CurrentColor]);
  224. case CurrentWriteMode of
  225. XORPut: begin
  226. { getpixel wants local/relative coordinates }
  227. ggiGetPixel(Visual, x-StartXViewPort, y-StartYViewPort, Color);
  228. Color := CurCol xor Color;
  229. end;
  230. OrPut: begin
  231. { getpixel wants local/relative coordinates }
  232. ggiGetPixel(Visual, x-StartXViewPort, y-StartYViewPort, Color);
  233. Color := CurCol or Color;
  234. end;
  235. AndPut: begin
  236. { getpixel wants local/relative coordinates }
  237. ggiGetPixel(Visual, x-StartXViewPort, y-StartYViewPort, Color);
  238. Color := CurCol and Color;
  239. end;
  240. NotPut:
  241. Color := not Color;
  242. else
  243. Color := CurCol;
  244. end;
  245. ggiPutPixel(Visual, x, y, Color);
  246. end;
  247. procedure ggi_putpixelproc(X,Y: Integer; Color: Word);
  248. begin
  249. If Not ClipCoords(X,Y) Then exit;
  250. ggiputpixel(Visual,x, y, Color);
  251. end;
  252. function ggi_getpixelproc (X,Y: Integer): word;
  253. Var i : TGGIPixel;
  254. begin
  255. ClipCoords(X,Y);
  256. ggigetpixel(Visual,x, y,I);
  257. ggi_getpixelproc:=i;
  258. end;
  259. procedure ggi_clrviewproc;
  260. begin
  261. ggidrawbox(Visual,StartXViewPort,StartYViewPort,ViewWidth,ViewHeight);
  262. end;
  263. { Bitmap utilities }
  264. type
  265. PBitmap = ^TBitmap;
  266. TBitmap = record
  267. Width, Height: longint;
  268. reserved : longint;
  269. Data: record end;
  270. end;
  271. procedure ggi_putimageproc (X,Y: Integer; var Bitmap; BitBlt: Word);
  272. begin
  273. With TBitMap(BitMap) do
  274. ggiputbox(Visual,x, y, width, height, @Data);
  275. end;
  276. procedure ggi_getimageproc (X1,Y1,X2,Y2: Integer; Var Bitmap);
  277. begin
  278. with TBitmap(Bitmap) do
  279. begin
  280. Width := x2 - x1 + 1;
  281. Height := y2 - y1 + 1;
  282. ggigetbox(Visual,x1,y1, x2 - x1 + 1, y2 - y1 + 1, @Data);
  283. end;
  284. end;
  285. function ggi_imagesizeproc (X1,Y1,X2,Y2: Integer): longint;
  286. begin
  287. // 32 bits per pixel -- change ASAP !!
  288. ggi_imagesizeproc := SizeOf(TBitmap) + (x2 - x1 + 1) * (y2 - y1 + 1) * SizeOF(longint);
  289. end;
  290. procedure ggi_hlineproc (x, x2,y : integer);
  291. begin
  292. end;
  293. procedure ggi_vlineproc (x,y,y2: integer);
  294. begin
  295. end;
  296. procedure ggi_patternlineproc (x1,x2,y: integer);
  297. begin
  298. end;
  299. procedure ggi_ellipseproc (X,Y: Integer;XRadius: word;
  300. YRadius:word; stAngle,EndAngle: word; fp: PatternLineProc);
  301. begin
  302. end;
  303. procedure ggi_lineproc (X1, Y1, X2, Y2 : Integer);
  304. begin
  305. end;
  306. procedure ggi_getscanlineproc (X1, X2, Y : integer; var data);
  307. begin
  308. end;
  309. procedure ggi_setactivepageproc (page: word);
  310. begin
  311. end;
  312. procedure ggi_setvisualpageproc (page: word);
  313. begin
  314. end;
  315. procedure ggi_savestateproc;
  316. begin
  317. end;
  318. procedure ggi_restorestateproc;
  319. begin
  320. end;
  321. procedure ggi_setrgbpaletteproc(ColorNum, RedValue, GreenValue, BlueValue: Integer);
  322. Var Col : TGGIcolor;
  323. begin
  324. col.r:=redvalue;
  325. col.g:=greenvalue;
  326. col.b:=bluevalue;
  327. ggisetpalette(Visual,ColorNum,1,col);
  328. end;
  329. procedure ggi_getrgbpaletteproc (ColorNum: integer;
  330. var RedValue, GreenValue, BlueValue: Integer);
  331. Var Col : TGGIColor;
  332. begin
  333. ggigetpalette(Visual,ColorNum,1,col);
  334. RedValue:=Col.R;
  335. GreenValue:=Col.G;
  336. BlueValue:=Col.B;
  337. end;
  338. {************************************************************************}
  339. {* General routines *}
  340. {************************************************************************}
  341. procedure CloseGraph;
  342. begin
  343. if not IsGraphMode then
  344. begin
  345. _graphresult := grnoinitgraph;
  346. exit
  347. end;
  348. RestoreVideoState;
  349. isgraphmode := false;
  350. end;
  351. function QueryAdapterInfo:PModeInfo;
  352. { This routine returns the head pointer to the list }
  353. { of supported graphics modes. }
  354. { Returns nil if no graphics mode supported. }
  355. { This list is READ ONLY! }
  356. var
  357. ModeInfo: TGGIMode;
  358. procedure AddGGIMode(i: Integer); // i is the mode number
  359. var
  360. mode: TModeInfo;
  361. begin
  362. InitMode(Mode);
  363. with Mode do begin
  364. ModeNumber := i;
  365. ModeName := ModeNames[i];
  366. // Pretend we're VGA always.
  367. DriverNumber := VGA;
  368. MaxX := ModeInfo.Visible.X;
  369. MaxY := ModeInfo.Visible.Y;
  370. // MaxColor := ModeInfo.colors;
  371. MaxColor := 255;
  372. PaletteSize := MaxColor;
  373. HardwarePages := 0;
  374. // necessary hooks ...
  375. DirectPutPixel := @ggi_DirectPixelProc;
  376. GetPixel := @ggi_GetPixelProc;
  377. PutPixel := @ggi_PutPixelProc;
  378. SetRGBPalette := @ggi_SetRGBPaletteProc;
  379. GetRGBPalette := @ggi_GetRGBPaletteProc;
  380. ClearViewPort := @ggi_ClrViewProc;
  381. PutImage := @ggi_PutImageProc;
  382. GetImage := @ggi_GetImageProc;
  383. ImageSize := @ggi_ImageSizeProc;
  384. { Add later maybe ?
  385. SetVisualPage := SetVisualPageProc;
  386. SetActivePage := SetActivePageProc;
  387. GetScanLine := @ggi_GetScanLineProc;
  388. Line := @ggi_LineProc;
  389. InternalEllipse:= @ggi_EllipseProc;
  390. PatternLine := @ggi_PatternLineProc;
  391. HLine := @ggi_HLineProc;
  392. VLine := @ggi_VLineProc;
  393. }
  394. InitMode := @ggi_InitModeProc;
  395. end;
  396. AddMode(Mode);
  397. end;
  398. var
  399. i: Integer;
  400. OldMode: TGGIMode;
  401. begin
  402. QueryAdapterInfo := ModeList;
  403. { If the mode listing already exists... }
  404. { simply return it, without changing }
  405. { anything... }
  406. if Assigned(ModeList) then
  407. exit;
  408. SaveVideoState:=ggi_savevideostate;
  409. RestoreVideoState:=ggi_restorevideostate;
  410. If ggiInit <> 0 then begin
  411. _graphresult := grNoInitGraph;
  412. exit;
  413. end;
  414. Visual := ggiOpen(nil, []); // Use default visual
  415. ggiGetMode(Visual, OldMode);
  416. ggiParseMode('', ModeInfo);
  417. ggiSetMode(Visual, ModeInfo);
  418. ggiGetMode(Visual, ModeInfo);
  419. ggiSetMode(Visual, OldMode);
  420. AddGGIMode(0);
  421. for i := 1 to GLastMode do begin
  422. // WriteLn('Testing mode: ', ModeNames[i]);
  423. ggiParseMode(ModeNames[i], ModeInfo);
  424. If ggiCheckMode(visual, ModeInfo) = 0 then begin
  425. Writeln('OK for mode: ', ModeNames[i]);
  426. AddGGIMode(i);
  427. end;
  428. end;
  429. end;
  430. {
  431. $Log$
  432. Revision 1.6 1999-12-11 23:41:39 jonas
  433. * changed definition of getscanlineproc to "getscanline(x1,x2,y:
  434. integer; var data);" so it can be used by getimage too
  435. * changed getimage so it uses getscanline
  436. * changed floodfill, getscanline16 and definitions in Linux
  437. include files so they use this new format
  438. + getscanlineVESA256 for 256 color VESA modes (banked)
  439. Revision 1.5 1999/11/12 02:13:01 carl
  440. * Bugfix if getimage / putimage, format was not standard with FPC
  441. graph.
  442. Revision 1.4 1999/11/10 10:54:24 sg
  443. * Fixed a LOT of bugs:
  444. * - Default mode should be determined by GGI now
  445. * - Colors are working (only the 16 standard VGA colors, though)
  446. Revision 1.3 1999/11/08 20:04:55 sg
  447. * GGI programs must link to libc, or ggiOpen will fail!
  448. * Changed max length of ModeNames string from 18 to 20 chars
  449. Revision 1.2 1999/11/08 00:08:43 michael
  450. * Fist working version of svgalib new graph unit
  451. * Initial implementation of ggi new graph unit
  452. Revision 1.1 1999/11/07 16:57:26 michael
  453. + Start of common graph implementation
  454. }