graph.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Florian Klaempfl
  5. This file implements the linux GGI support for the 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. unit Graph;
  13. interface
  14. {$i graphh.inc}
  15. Const
  16. { Supported modes }
  17. {(sg) GTEXT deactivated because we need mode #0 as default mode}
  18. {GTEXT = 0; Compatible with VGAlib v1.2 }
  19. G320x200x16 = 1;
  20. G640x200x16 = 2;
  21. G640x350x16 = 3;
  22. G640x480x16 = 4;
  23. G320x200x256 = 5;
  24. G320x240x256 = 6;
  25. G320x400x256 = 7;
  26. G360x480x256 = 8;
  27. G640x480x2 = 9;
  28. G640x480x256 = 10;
  29. G800x600x256 = 11;
  30. G1024x768x256 = 12;
  31. G1280x1024x256 = 13; { Additional modes. }
  32. G320x200x32K = 14;
  33. G320x200x64K = 15;
  34. G320x200x16M = 16;
  35. G640x480x32K = 17;
  36. G640x480x64K = 18;
  37. G640x480x16M = 19;
  38. G800x600x32K = 20;
  39. G800x600x64K = 21;
  40. G800x600x16M = 22;
  41. G1024x768x32K = 23;
  42. G1024x768x64K = 24;
  43. G1024x768x16M = 25;
  44. G1280x1024x32K = 26;
  45. G1280x1024x64K = 27;
  46. G1280x1024x16M = 28;
  47. G800x600x16 = 29;
  48. G1024x768x16 = 30;
  49. G1280x1024x16 = 31;
  50. G720x348x2 = 32; { Hercules emulation mode }
  51. G320x200x16M32 = 33; { 32-bit per pixel modes. }
  52. G640x480x16M32 = 34;
  53. G800x600x16M32 = 35;
  54. G1024x768x16M32 = 36;
  55. G1280x1024x16M32 = 37;
  56. { additional resolutions }
  57. G1152x864x16 = 38;
  58. G1152x864x256 = 39;
  59. G1152x864x32K = 40;
  60. G1152x864x64K = 41;
  61. G1152x864x16M = 42;
  62. G1152x864x16M32 = 43;
  63. G1600x1200x16 = 44;
  64. G1600x1200x256 = 45;
  65. G1600x1200x32K = 46;
  66. G1600x1200x64K = 47;
  67. G1600x1200x16M = 48;
  68. G1600x1200x16M32 = 49;
  69. implementation
  70. uses
  71. Unix;
  72. const
  73. InternalDriverName = 'LinuxVGA';
  74. {$i graph.inc}
  75. type
  76. PByte = ^Byte;
  77. PLongInt = ^LongInt;
  78. PByteArray = ^TByteArray;
  79. TByteArray = array [0..MAXINT - 1] of Byte;
  80. { ---------------------------------------------------------------------
  81. SVGA bindings.
  82. ---------------------------------------------------------------------}
  83. { Link with VGA, gl and c libraries }
  84. {$linklib vga}
  85. {$linklib c}
  86. Const
  87. { Text }
  88. WRITEMODE_OVERWRITE = 0;
  89. WRITEMODE_MASKED = 1;
  90. FONT_EXPANDED = 0;
  91. FONT_COMPRESSED = 2;
  92. { Types }
  93. type
  94. pvga_modeinfo = ^vga_modeinfo;
  95. vga_modeinfo = record
  96. width,
  97. height,
  98. bytesperpixel,
  99. colors,
  100. linewidth, { scanline width in bytes }
  101. maxlogicalwidth, { maximum logical scanline width }
  102. startaddressrange, { changeable bits set }
  103. maxpixels, { video memory / bytesperpixel }
  104. haveblit, { mask of blit functions available }
  105. flags: Longint; { other flags }
  106. { Extended fields: }
  107. chiptype, { Chiptype detected }
  108. memory, { videomemory in KB }
  109. linewidth_unit: Longint; { Use only a multiple of this as parameter for set_displaystart }
  110. linear_aperture: PChar; { points to mmap secondary mem aperture of card }
  111. aperture_size: Longint; { size of aperture in KB if size>=videomemory.}
  112. set_aperture_page: procedure (page: Longint);
  113. { if aperture_size<videomemory select a memory page }
  114. extensions: Pointer; { points to copy of eeprom for mach32 }
  115. { depends from actual driver/chiptype.. etc. }
  116. end;
  117. PGraphicsContext = ^TGraphicsContext;
  118. TGraphicsContext = record
  119. ModeType: Byte;
  120. ModeFlags: Byte;
  121. Dummy: Byte;
  122. FlipPage: Byte;
  123. Width: LongInt;
  124. Height: LongInt;
  125. BytesPerPixel: LongInt;
  126. Colors: LongInt;
  127. BitsPerPixel: LongInt;
  128. ByteWidth: LongInt;
  129. VBuf: pointer;
  130. Clip: LongInt;
  131. ClipX1: LongInt;
  132. ClipY1: LongInt;
  133. ClipX2: LongInt;
  134. ClipY2: LongInt;
  135. ff: pointer;
  136. end;
  137. Const
  138. GLASTMODE = 49;
  139. ModeNames : Array[0..GLastMode] of string [18] =
  140. ('Text',
  141. 'G320x200x16',
  142. 'G640x200x16',
  143. 'G640x350x16',
  144. 'G640x480x16',
  145. 'G320x200x256',
  146. 'G320x240x256',
  147. 'G320x400x256',
  148. 'G360x480x256',
  149. 'G640x480x2',
  150. 'G640x480x256',
  151. 'G800x600x256',
  152. 'G1024x768x256',
  153. 'G1280x1024x256',
  154. 'G320x200x32K',
  155. 'G320x200x64K',
  156. 'G320x200x16M',
  157. 'G640x480x32K',
  158. 'G640x480x64K',
  159. 'G640x480x16M',
  160. 'G800x600x32K',
  161. 'G800x600x64K',
  162. 'G800x600x16M',
  163. 'G1024x768x32K',
  164. 'G1024x768x64K',
  165. 'G1024x768x16M',
  166. 'G1280x1024x32K',
  167. 'G1280x1024x64K',
  168. 'G1280x1024x16M',
  169. 'G800x600x16',
  170. '1024x768x16',
  171. '1280x1024x16',
  172. 'G720x348x2',
  173. 'G320x200x16M32',
  174. 'G640x480x16M32',
  175. 'G800x600x16M32',
  176. 'G1024x768x16M32',
  177. 'G1280x1024x16M32',
  178. 'G1152x864x16',
  179. 'G1152x864x256',
  180. 'G1152x864x32K',
  181. 'G1152x864x64K',
  182. 'G1152x864x16M',
  183. 'G1152x864x16M32',
  184. 'G1600x1200x16',
  185. 'G1600x1200x256',
  186. 'G1600x1200x32K',
  187. 'G1600x1200x64K',
  188. 'G1600x1200x16M',
  189. 'G1600x1200x16M32');
  190. {var
  191. PhysicalScreen: PGraphicsContext; }
  192. { vga functions }
  193. Function vga_init: Longint; Cdecl; External;
  194. Function vga_hasmode(mode: Longint): Boolean; Cdecl; External;
  195. Function vga_getmodeinfo(mode: Longint): pvga_modeinfo; Cdecl; External;
  196. Function vga_setmode(mode: Longint): Longint; Cdecl; External;
  197. Function vga_getcolors: Longint; cdecl;external;
  198. Function vga_setpalette(index: Longint; red: Longint; green: Longint; blue: Longint) : longint; cdecl;external;
  199. Function vga_getpalette(index: Longint; var red: Longint; var green: Longint; var blue: Longint): Longint; cdecl;external;
  200. Function vga_setegacolor(Color: Longint) : longint; cdecl;external;
  201. Function vga_setcolor(color: Longint): Longint; cdecl;external;
  202. Function vga_drawpixel(x, y: Longint): Longint; cdecl;external;
  203. Function vga_getpixel(x, y: Longint): Longint; cdecl;external;
  204. Function vga_drawline(x1, y1, x2, y2: Longint): Longint; cdecl;external;
  205. function vga_screenoff: Longint; Cdecl; External;
  206. function vga_screenon: Longint; Cdecl; External;
  207. function vga_getgraphmem: PByteArray; cdecl; external;
  208. var
  209. OldIO : TermIos;
  210. Procedure SetRawMode(b:boolean);
  211. Var
  212. Tio : Termios;
  213. Begin
  214. if b then
  215. begin
  216. TCGetAttr(1,Tio);
  217. OldIO:=Tio;
  218. CFMakeRaw(Tio);
  219. end
  220. else
  221. Tio:=OldIO;
  222. TCSetAttr(1,TCSANOW,Tio);
  223. End;
  224. { ---------------------------------------------------------------------
  225. Required procedures
  226. ---------------------------------------------------------------------}
  227. {$INCLUDE graph16.inc} // Include graphic functions for 16 colours modes
  228. var
  229. LastColor: Integer; {Cache the last set color to improve speed}
  230. procedure SetEGAColor(color: Integer);
  231. begin
  232. if color <> LastColor then begin
  233. LastColor := color;
  234. if maxcolor = 16 then
  235. vga_setegacolor(color)
  236. else vga_setcolor(color);
  237. end;
  238. end;
  239. procedure libvga_savevideostate;
  240. begin
  241. end;
  242. procedure libvga_restorevideostate;
  243. begin
  244. vga_setmode(0);
  245. end;
  246. {
  247. const
  248. BgiColors: array[0..15] of LongInt
  249. = ($000000, $000020, $002000, $002020,
  250. $200000, $200020, $202000, $303030,
  251. $202020, $00003F, $003F00, $003F3F,
  252. $3F0000, $3F003F, $3F3F00, $3F3F3F);
  253. }
  254. procedure InitColors(nrColors: longint);
  255. var
  256. i: Integer;
  257. begin
  258. for i:=0 to nrColors do
  259. vga_setpalette(I,DefaultColors[i].red shr 2,
  260. DefaultColors[i].green shr 2,DefaultColors[i].blue shr 2)
  261. end;
  262. procedure libvga_initmodeproc;
  263. Var Nrcolors : Longint;
  264. begin
  265. vga_setmode(IntCurrentMode);
  266. vga_screenon;
  267. VidMem := vga_getgraphmem;
  268. nrColors:=vga_getcolors;
  269. if (nrColors=16) or (nrcolors=256) then
  270. InitColors(nrColors);
  271. SetRawMode(True);
  272. end;
  273. Function ClipCoords (Var X,Y : Integer) : Boolean;
  274. { Adapt to viewport, return TRUE if still in viewport,
  275. false if outside viewport}
  276. begin
  277. X:= X + StartXViewPort;
  278. Y:= Y + StartYViewPort;
  279. ClipCoords:=Not ClipPixels;
  280. if ClipPixels then
  281. Begin
  282. ClipCoords:=(X < StartXViewPort) or (X > (StartXViewPort + ViewWidth));
  283. ClipCoords:=ClipCoords or
  284. ((Y < StartYViewPort) or (Y > (StartYViewPort + ViewHeight)));
  285. ClipCoords:=Not ClipCoords;
  286. end;
  287. end;
  288. procedure libvga_directpixelproc(X,Y: Integer);
  289. Var Color : Word;
  290. begin
  291. case CurrentWriteMode of
  292. XORPut:
  293. begin
  294. { getpixel wants local/relative coordinates }
  295. Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
  296. Color := CurrentColor Xor Color;
  297. end;
  298. OrPut:
  299. begin
  300. { getpixel wants local/relative coordinates }
  301. Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
  302. Color := CurrentColor Or Color;
  303. end;
  304. AndPut:
  305. begin
  306. { getpixel wants local/relative coordinates }
  307. Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
  308. Color := CurrentColor And Color;
  309. end;
  310. NotPut:
  311. begin
  312. Color := Not Color;
  313. end
  314. else
  315. Color:=CurrentColor;
  316. end;
  317. SetEGAColor(Color);
  318. vga_drawpixel(x, y);
  319. end;
  320. procedure libvga_putpixelproc(X,Y: Integer; Color: Word);
  321. begin
  322. If Not ClipCoords(X,Y) Then exit;
  323. SetEGAColor(Color);
  324. vga_drawpixel(x, y);
  325. end;
  326. function libvga_getpixelproc (X,Y: Integer): word;
  327. begin
  328. ClipCoords(X,Y);
  329. libvga_getpixelproc:=vga_getpixel(x, y);
  330. end;
  331. procedure libvga_clrviewproc;
  332. Var I,Xmax : longint;
  333. begin
  334. SetEGAColor(CurrentBkColor);
  335. Xmax:=StartXViewPort+ViewWidth-1;
  336. For i:=StartYViewPort to StartYViewPort+ViewHeight-1 do
  337. vga_drawline(StartXViewPort,I,Xmax,I);
  338. end;
  339. { Bitmap utilities }
  340. {type
  341. PBitmap = ^TBitmap;
  342. TBitmap = record
  343. Width, Height: Integer;
  344. Data: record end;
  345. end;
  346. }
  347. procedure libvga_putimageproc (X,Y: Integer; var Bitmap; BitBlt: Word);
  348. begin
  349. {
  350. With TBitMap(BitMap) do
  351. gl_putbox(x, y, width, height, @Data);
  352. }
  353. end;
  354. procedure libvga_getimageproc (X1,Y1,X2,Y2: Integer; Var Bitmap);
  355. begin
  356. { with TBitmap(Bitmap) do
  357. begin
  358. Width := x2 - x1 + 1;
  359. Height := y2 - y1 + 1;
  360. gl_getbox(x1,y1, x2 - x1 + 1, y2 - y1 + 1, @Data);
  361. end;
  362. }
  363. end;
  364. {
  365. function libvga_imagesizeproc (X1,Y1,X2,Y2: Integer): longint;
  366. begin
  367. libvga_imagesizeproc := SizeOf(TBitmap) + (x2 - x1 + 1) * (y2 - y1 + 1) * PhysicalScreen^.BytesPerPixel;
  368. end;
  369. }
  370. procedure libvga_hlineproc (x, x2,y : integer);
  371. begin
  372. end;
  373. procedure libvga_vlineproc (x,y,y2: integer);
  374. begin
  375. end;
  376. procedure libvga_patternlineproc (x1,x2,y: integer);
  377. begin
  378. end;
  379. procedure libvga_ellipseproc (X,Y: Integer;XRadius: word;
  380. YRadius:word; stAngle,EndAngle: word; fp: PatternLineProc);
  381. begin
  382. end;
  383. procedure libvga_lineproc (X1, Y1, X2, Y2 : Integer);
  384. begin
  385. end;
  386. procedure libvga_getscanlineproc (X1,X2,Y : integer; var data);
  387. begin
  388. end;
  389. procedure libvga_setactivepageproc (page: word);
  390. begin
  391. end;
  392. procedure libvga_setvisualpageproc (page: word);
  393. begin
  394. end;
  395. procedure libvga_savestateproc;
  396. begin
  397. end;
  398. procedure libvga_restorestateproc;
  399. begin
  400. end;
  401. procedure libvga_setrgbpaletteproc(ColorNum, RedValue, GreenValue, BlueValue: Integer);
  402. begin
  403. vga_setpalette(ColorNum,RedValue shr 2,GreenValue shr 2,BlueValue shr 2);
  404. end;
  405. procedure libvga_getrgbpaletteproc (ColorNum: integer;
  406. var RedValue, GreenValue, BlueValue: Integer);
  407. Var R,G,B : longint;
  408. begin
  409. vga_getpalette(ColorNum,R,G,B);
  410. RedValue:=R * 255 div 63;
  411. GreenValue:=G * 255 div 63;
  412. BlueValue:=B * 255 div 63;
  413. end;
  414. {************************************************************************}
  415. {* General routines *}
  416. {************************************************************************}
  417. procedure CloseGraph;
  418. Begin
  419. If not isgraphmode then
  420. begin
  421. _graphresult := grnoinitgraph;
  422. exit
  423. end;
  424. SetRawMode(False);
  425. RestoreVideoState;
  426. isgraphmode := false;
  427. end;
  428. function QueryAdapterInfo:PModeInfo;
  429. { This routine returns the head pointer to the list }
  430. { of supported graphics modes. }
  431. { Returns nil if no graphics mode supported. }
  432. { This list is READ ONLY! }
  433. var
  434. mode: TModeInfo;
  435. modeinfo : vga_modeinfo;
  436. i : longint;
  437. begin
  438. QueryAdapterInfo := ModeList;
  439. { If the mode listing already exists... }
  440. { simply return it, without changing }
  441. { anything... }
  442. if assigned(ModeList) then
  443. exit;
  444. SaveVideoState:=libvga_savevideostate;
  445. RestoreVideoState:=libvga_restorevideostate;
  446. vga_init;
  447. For I:=0 to GLastMode do
  448. begin
  449. If vga_hasmode(I) then
  450. begin
  451. ModeInfo:=vga_getmodeinfo(i)^;
  452. InitMode(Mode);
  453. With Mode do
  454. begin
  455. ModeNumber:=I;
  456. ModeName:=ModeNames[i];
  457. // Pretend we are VGA always.
  458. DriverNumber := VGA;
  459. // MaxX is number of pixels in X direction - 1
  460. MaxX:=ModeInfo.Width-1;
  461. // same for MaxY
  462. MaxY:=ModeInfo.Height-1;
  463. MaxColor := ModeInfo.colors;
  464. PaletteSize := MaxColor;
  465. HardwarePages := 0;
  466. // necessary hooks ...
  467. if (MaxColor = 16) and
  468. (LongInt(ModeInfo.Width) * LongInt(ModeInfo.Height) < 65536*4*2) then
  469. begin
  470. // Use optimized graphics routines for 4 bit EGA/VGA modes
  471. ScrWidth := ModeInfo.Width div 8;
  472. DirectPutPixel := @DirectPutPixel16;
  473. PutPixel := @PutPixel16;
  474. GetPixel := @GetPixel16;
  475. HLine := @HLine16;
  476. VLine := @VLine16;
  477. GetScanLine := @GetScanLine16;
  478. end
  479. else
  480. begin
  481. DirectPutPixel := @libvga_DirectPixelProc;
  482. GetPixel := @libvga_GetPixelProc;
  483. PutPixel := @libvga_PutPixelProc;
  484. { May be implemented later:
  485. HLine := @libvga_HLineProc;
  486. VLine := @libvga_VLineProc;
  487. GetScanLine := @libvga_GetScanLineProc;}
  488. ClearViewPort := @libvga_ClrViewProc;
  489. end;
  490. SetRGBPalette := @libvga_SetRGBPaletteProc;
  491. GetRGBPalette := @libvga_GetRGBPaletteProc;
  492. { These are not really implemented yet:
  493. PutImage := @libvga_PutImageProc;
  494. GetImage := @libvga_GetImageProc;}
  495. { If you use the default getimage/putimage, you also need the default
  496. imagesize! (JM)
  497. ImageSize := @libvga_ImageSizeProc; }
  498. { Add later maybe ?
  499. SetVisualPage := SetVisualPageProc;
  500. SetActivePage := SetActivePageProc;
  501. Line := @libvga_LineProc;
  502. InternalEllipse:= @libvga_EllipseProc;
  503. PatternLine := @libvga_PatternLineProc;
  504. }
  505. InitMode := @libvga_InitModeProc;
  506. end;
  507. AddMode(Mode);
  508. end;
  509. end;
  510. end;
  511. initialization
  512. InitializeGraph;
  513. end.
  514. {
  515. $Log$
  516. Revision 1.4 2001-01-21 20:21:40 marco
  517. * Rename fest II. Rtl OK
  518. Revision 1.3 2000/10/12 09:38:34 peter
  519. * renamed to be 8.3
  520. Revision 1.2 2000/09/18 13:14:50 marco
  521. * Global Linux +bsd to (rtl/freebsd rtl/unix rtl/linux structure)
  522. Revision 1.4 2000/08/25 12:31:05 jonas
  523. * fixed problem with messed-up terminal after exiting (merged from
  524. fixes branch)
  525. Revision 1.3 2000/07/31 12:30:54 jonas
  526. * You can now set colors > 15 (merged from fixes branch)
  527. Revision 1.2 2000/07/13 11:33:48 michael
  528. + removed logs
  529. }