modes.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by the Free Pascal development team
  5. This include implements video mode management.
  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. {-----------------------------------------------------------------------}
  13. { Internal routines }
  14. {-----------------------------------------------------------------------}
  15. {$ifdef newmodes}
  16. procedure res2Mode(x, y, maxColor: longint; var driver,mode: smallInt);
  17. var
  18. l: longint;
  19. begin
  20. case maxColor of
  21. 2: driver := D1bit;
  22. 4: driver := D2bit;
  23. 16: driver := D4bit;
  24. 64: driver := D6bit;
  25. 256: driver := D8bit;
  26. 4096: driver := D12bit;
  27. 32768: driver := D15bit;
  28. 65536: driver := D16bit;
  29. { not yet supported
  30. 65536*256: driver := D24bit;
  31. 65536*65536: driver := D32bit;}
  32. else
  33. begin
  34. driver := maxsmallint;
  35. exit;
  36. end;
  37. end;
  38. { Check whether this is known/predefined mode }
  39. for l := lowNewMode to highNewMode do
  40. if (resolutions[l].x = x) and
  41. (resolutions[l].y = y) then
  42. begin
  43. { Found! }
  44. mode := l;
  45. exit;
  46. end;
  47. { Not Found }
  48. mode := maxsmallint;
  49. end;
  50. function mode2res(modeNr: smallInt; var x,y: longint): boolean;
  51. begin
  52. if (modeNr < lowNewMode) or
  53. (modeNr > highNewMode) then
  54. begin
  55. mode2res := false;
  56. exit;
  57. end;
  58. mode2res := true;
  59. x := resolutions[modeNr].x;
  60. y := resolutions[modeNr].y;
  61. end;
  62. {$endif newmodes}
  63. procedure addmode(const mode: TModeInfo);
  64. {********************************************************}
  65. { Procedure AddMode() }
  66. {--------------------------------------------------------}
  67. { This routine adds <mode> to the list of recognized }
  68. { modes. Duplicates are allowed. }
  69. {********************************************************}
  70. var
  71. {$ifdef newmodes}
  72. driverNr, modeNr: smallint;
  73. prev: PModeInfo;
  74. {$endif newmodes}
  75. list: PModeInfo;
  76. newlst : PModeInfo;
  77. begin
  78. {$ifdef newmodes}
  79. res2Mode(mode.maxx+1,mode.maxy+1,mode.maxColor,driverNr,ModeNr);
  80. { bitdepth supported? }
  81. if (driverNr <> maxsmallint) then
  82. { Yes, add the mode }
  83. if not assigned(newModeList.modeinfo[driverNr]) then
  84. begin
  85. {$ifdef logging}
  86. logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr));
  87. {$endif logging}
  88. new(newModeList.modeinfo[driverNr]);
  89. newModeList.modeinfo[driverNr]^ := mode;
  90. with newModeList.modeinfo[driverNr]^ do
  91. begin
  92. driverNumber := driverNr;
  93. modeNumber := 1;
  94. next := nil;
  95. end;
  96. newModeList.loHiModeNr[driverNr].lo := 1;
  97. newModeList.loHiModeNr[driverNr].hi := 1;
  98. end
  99. else
  100. begin
  101. prev := nil;
  102. list := newModeList.modeinfo[driverNr];
  103. { sort first by x resolution, then by yresolution }
  104. while assigned(list) and
  105. ((list^.maxx < mode.maxx) or
  106. ((list^.maxx = mode.maxx) and
  107. (list^.maxy < mode.maxy))) do
  108. begin
  109. prev := list;
  110. list := list^.next;
  111. end;
  112. { mode already exists? -> replace (assume later added modes are }
  113. { better) }
  114. if assigned(list) and
  115. (list^.maxx = mode.maxx) and
  116. (list^.maxy = mode.maxy) then
  117. begin
  118. {$ifdef logging}
  119. logln('replacing resolution '+strf(modenr)+' for drivernr '+strf(drivernr));
  120. {$endif logging}
  121. { save/restore next, drivernr and drivermode in list }
  122. driverNr := list^.driverNumber;
  123. modeNr := list^.modeNumber;
  124. prev := list^.next;
  125. list^ := mode;
  126. list^.driverNumber := driverNr;
  127. list^.modeNumber := modeNr;
  128. list^.next := prev;
  129. end
  130. else
  131. begin
  132. new(newLst);
  133. { Increase the number of modes for this driver }
  134. inc(newModeList.loHiModeNr[driverNr].hi);
  135. newLst^ := mode;
  136. newLst^.driverNumber := driverNr;
  137. {$ifdef logging}
  138. logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr));
  139. {$endif logging}
  140. if assigned(list) then
  141. newLst^.next := list^.next
  142. else
  143. newLst^.next := nil;
  144. if assigned(prev) then
  145. begin
  146. prev^.next := newLst;
  147. newLst^.modeNumber := succ(prev^.modeNumber)
  148. end
  149. else
  150. begin
  151. newModeList.modeinfo[driverNr] := newLst;
  152. newLst^.modeNumber := 1;
  153. end;
  154. { Increase the modenumbers of all modes coming after this one }
  155. { with 1 }
  156. newLst := newLst^.next;
  157. while assigned(newLst) do
  158. begin
  159. inc(newLst^.modeNumber);
  160. newLst := newLst^.next;
  161. end;
  162. end;
  163. end;
  164. {$endif newmodes}
  165. { TP-like mode stuff }
  166. if not assigned(ModeList) then
  167. begin
  168. new(ModeList);
  169. move(mode, ModeList^, sizeof(Mode));
  170. end
  171. else
  172. begin
  173. list := ModeList;
  174. { go to the end of the list }
  175. while assigned(list^.next) do
  176. list:=list^.next;
  177. new(NewLst);
  178. list^.next := NewLst;
  179. move(mode, NewLst^, sizeof(Mode));
  180. end;
  181. end;
  182. procedure initmode(var mode: TModeInfo);
  183. {********************************************************}
  184. { Procedure InitMode() }
  185. {--------------------------------------------------------}
  186. { This routine initialized the mode to default values. }
  187. {********************************************************}
  188. begin
  189. FillChar(mode,sizeof(Mode),#0);
  190. end;
  191. function searchmode(ReqDriver : smallint; var reqmode: smallint): PModeInfo;
  192. {********************************************************}
  193. { Procedure SearchMode() }
  194. {--------------------------------------------------------}
  195. { This routine searches the list of recognized modes, }
  196. { and tries to find the <reqmode> in the <reqdriver> }
  197. { return nil if not found, otherwise returns the found }
  198. { structure. }
  199. { note: if reqmode = -32768, the first mode available }
  200. { for reqdriver is returned (JM) }
  201. { if reqmode = -32767, the last mode available }
  202. { for reqdriver is returned (JM) }
  203. {********************************************************}
  204. var
  205. list, lastModeInfo: PModeInfo;
  206. {$ifdef newmodes}
  207. x,y: longint;
  208. {$endif}
  209. begin
  210. {$ifdef logging}
  211. LogLn('Searching for driver '+strf(reqdriver)+' and mode '+strf(reqmode));
  212. {$endif logging}
  213. {$ifdef newmodes}
  214. if (reqDriver >= lowNewDriver) and
  215. (reqDriver <= highNewDriver) then
  216. begin
  217. case reqMode of
  218. -32768:
  219. begin
  220. reqMode := newModeList.loHiModeNr[reqDriver].lo;
  221. searchMode := newModeList.modeinfo[reqDriver];
  222. end;
  223. -32767:
  224. begin
  225. reqMode := newModeList.loHiModeNr[reqDriver].hi;
  226. searchMode := nil;
  227. { Are there any modes available for this driver? }
  228. if reqMode <> -1 then
  229. begin
  230. list := newModeList.modeinfo[reqDriver];
  231. while assigned(list^.next) do
  232. list := list^.next;
  233. searchMode := list;
  234. end;
  235. end;
  236. else
  237. begin
  238. list := newModeList.modeinfo[reqDriver];
  239. searchMode := nil;
  240. if not assigned(list) then
  241. exit;
  242. if mode2res(reqMode,x,y) then
  243. begin
  244. x := pred(x);
  245. y := pred(y);
  246. while assigned(list) and
  247. ((list^.maxx < x) or
  248. ((list^.maxx = x) and
  249. (list^.maxy < y))) do
  250. list := list^.next;
  251. if not assigned(list) or
  252. (list^.maxx <> x) or
  253. (list^.maxy <> y) then
  254. list := nil;
  255. searchmode := list;
  256. end
  257. else
  258. begin
  259. while assigned(list) and
  260. (list^.modeNumber <> reqMode) do
  261. list := list^.next;
  262. searchMode := list;
  263. end;
  264. end;
  265. end;
  266. exit;
  267. end;
  268. {$endif newmodes}
  269. searchmode := nil;
  270. list := ModeList;
  271. If assigned(list) then
  272. lastModeInfo := list;
  273. { go to the end of the list }
  274. while assigned(list) do
  275. begin
  276. {$ifdef logging}
  277. Log('Found driver '+strf(list^.DriverNumber)+
  278. ' and mode $'+hexstr(list^.ModeNumber,4)+'... ');
  279. {$endif logging}
  280. if ((list^.DriverNumber = ReqDriver) and
  281. ((list^.ModeNumber = ReqMode) or
  282. { search for lowest mode }
  283. (reqMode = -32768))) or
  284. { search for highest mode }
  285. ((reqMode = -32767) and
  286. (lastModeInfo^.driverNumber = reqDriver) and
  287. ((list^.driverNumber <> lastModeInfo^.driverNumber) or
  288. not(assigned(list^.next)))) then
  289. begin
  290. {$ifdef logging}
  291. LogLn('Accepted!');
  292. {$endif logging}
  293. searchmode := list;
  294. If reqMode = -32768 then
  295. reqMode := list^.modeNumber
  296. else if reqMode = -32767 then
  297. begin
  298. reqMode := lastModeInfo^.modeNumber;
  299. searchMode := lastModeInfo;
  300. end;
  301. exit;
  302. end;
  303. {$ifdef logging}
  304. LogLn('Rejected.');
  305. {$endif logging}
  306. lastModeInfo := list;
  307. list:=list^.next;
  308. end;
  309. end;
  310. {-----------------------------------------------------------------------}
  311. { External routines }
  312. {-----------------------------------------------------------------------}
  313. function GetModeName(ModeNumber: smallint): string;
  314. {********************************************************}
  315. { Function GetModeName() }
  316. {--------------------------------------------------------}
  317. { Checks the known video list, and returns ModeName }
  318. { string. On error returns an empty string. }
  319. {********************************************************}
  320. var
  321. mode: PModeInfo;
  322. begin
  323. mode:=nil;
  324. GetModeName:='';
  325. { only search in the current driver modes ... }
  326. mode:=SearchMode(IntCurrentDriver,ModeNumber);
  327. if assigned(mode) then
  328. GetModeName:=Mode^.ModeName
  329. else
  330. _GraphResult := grInvalidMode;
  331. end;
  332. function GetGraphMode: smallint;
  333. begin
  334. GetGraphMode := IntCurrentMode;
  335. end;
  336. function GetMaxMode: word;
  337. { I know , i know, this routine is very slow, and it would }
  338. { be much easier to sort the linked list of possible modes }
  339. { instead of doing this, but I'm lazy!! And anyways, the }
  340. { speed of the routine here is not that important.... }
  341. var
  342. i: word;
  343. mode: PModeInfo;
  344. begin
  345. mode:=nil;
  346. i:=0;
  347. repeat
  348. inc(i);
  349. { mode 0 always exists... }
  350. { start search at 1.. }
  351. mode:=SearchMode(IntCurrentDriver,i);
  352. until not assigned(mode);
  353. GetMaxMode:=i;
  354. end;
  355. procedure GetModeRange(GraphDriver: smallint; var LoMode,
  356. HiMode: smallint);
  357. var
  358. mode : PModeInfo;
  359. begin
  360. {$ifdef logging}
  361. LogLn('GetModeRange : Enter ('+strf(GraphDriver)+')');
  362. {$endif}
  363. HiMode:=-1;
  364. mode := nil;
  365. { First search if the graphics driver is supported .. }
  366. { since mode zero is always supported.. if that driver }
  367. { is supported it should return something... }
  368. { not true, e.g. VESA doesn't have a mode 0. Changed so}
  369. { -32768 means "return lowest mode in second parameter }
  370. { also, under VESA some modes may not be supported }
  371. { (e.g. $108 here) while some with a higher number can }
  372. { be supported ($112 and onward), so I also added that }
  373. { -32767 means "return highest mode in second parameter}
  374. { This whole system should be overhauled though to work}
  375. { without such hacks (JM) }
  376. loMode := -32768;
  377. mode := SearchMode(GraphDriver, loMode);
  378. { driver not supported...}
  379. if not assigned(mode) then
  380. begin
  381. loMode := -1;
  382. exit;
  383. end;
  384. {$ifdef logging}
  385. LogLn('GetModeRange : Mode '+strf(lomode)+' found');
  386. {$endif}
  387. { now it exists... find highest available mode... }
  388. hiMode := -32767;
  389. mode:=SearchMode(GraphDriver,hiMode);
  390. end;
  391. procedure SetGraphMode(mode: smallint);
  392. var
  393. modeinfo: PModeInfo;
  394. begin
  395. { check if the mode exists... }
  396. modeinfo := searchmode(IntcurrentDriver,mode);
  397. if not assigned(modeinfo) then
  398. begin
  399. {$ifdef logging}
  400. LogLn('Mode setting failed in setgraphmode pos 1');
  401. {$endif logging}
  402. _GraphResult := grInvalidMode;
  403. exit;
  404. end;
  405. { reset all hooks...}
  406. DefaultHooks;
  407. { arccall not reset - tested against VGA BGI driver }
  408. { Setup all hooks if none, keep old defaults...}
  409. { required hooks - returns error if no hooks to these }
  410. { routines. }
  411. if assigned(modeinfo^.DirectPutPixel) then
  412. DirectPutPixel := modeinfo^.DirectPutPixel
  413. else
  414. begin
  415. {$ifdef logging}
  416. LogLn('Mode setting failed in setgraphmode pos 2');
  417. {$endif logging}
  418. _Graphresult := grInvalidMode;
  419. exit;
  420. end;
  421. if assigned(modeinfo^.PutPixel) then
  422. PutPixel := modeinfo^.PutPixel
  423. else
  424. begin
  425. {$ifdef logging}
  426. LogLn('Mode setting failed in setgraphmode pos 3');
  427. {$endif logging}
  428. _Graphresult := grInvalidMode;
  429. exit;
  430. end;
  431. if assigned(modeinfo^.GetPixel) then
  432. GetPixel := modeinfo^.GetPixel
  433. else
  434. begin
  435. {$ifdef logging}
  436. LogLn('Mode setting failed in setgraphmode pos 4');
  437. {$endif logging}
  438. _Graphresult := grInvalidMode;
  439. exit;
  440. end;
  441. if assigned(modeinfo^.SetRGBPalette) then
  442. SetRGBPalette := modeinfo^.SetRGBPalette
  443. else
  444. begin
  445. {$ifdef logging}
  446. LogLn('Mode setting failed in setgraphmode pos 5');
  447. {$endif logging}
  448. _Graphresult := grInvalidMode;
  449. exit;
  450. end;
  451. if assigned(modeinfo^.GetRGBPalette) then
  452. GetRGBPalette := modeinfo^.GetRGBPalette
  453. else
  454. begin
  455. {$ifdef logging}
  456. LogLn('Mode setting failed in setgraphmode pos 6');
  457. {$endif logging}
  458. _Graphresult := grInvalidMode;
  459. exit;
  460. end;
  461. { optional hooks. }
  462. if assigned(modeinfo^.ClearViewPort) then
  463. ClearViewPort := modeinfo^.ClearViewPort;
  464. if assigned(modeinfo^.PutImage) then
  465. PutImage := modeinfo^.PutImage;
  466. if assigned(modeinfo^.GetImage) then
  467. GetImage := modeinfo^.GetImage;
  468. if assigned(modeinfo^.ImageSize) then
  469. ImageSize := modeinfo^.ImageSize;
  470. if assigned(modeinfo^.GetScanLine) then
  471. GetScanLine := modeinfo^.GetScanLine;
  472. if assigned(modeinfo^.Line) then
  473. Line := modeinfo^.Line;
  474. if assigned(modeinfo^.InternalEllipse) then
  475. InternalEllipse := modeinfo^.InternalEllipse;
  476. if assigned(modeinfo^.PatternLine) then
  477. PatternLine := modeinfo^.PatternLine;
  478. if assigned(modeinfo^.HLine) then
  479. Hline := modeinfo^.Hline;
  480. if assigned(modeinfo^.Vline) then
  481. VLine := modeinfo^.VLine;
  482. if assigned(modeInfo^.SetVisualPage) then
  483. SetVisualPage := modeInfo^.SetVisualPage;
  484. if assigned(modeInfo^.SetActivePage) then
  485. SetActivePage := modeInfo^.SetActivePage;
  486. if assigned(modeInfo^.OutTextXY) then
  487. OutTextXY:=modeInfo^.OutTextXY;
  488. IntCurrentMode := modeinfo^.ModeNumber;
  489. IntCurrentDriver := modeinfo^.DriverNumber;
  490. XAspect := modeinfo^.XAspect;
  491. YAspect := modeinfo^.YAspect;
  492. MaxX := modeinfo^.MaxX;
  493. MaxY := modeinfo^.MaxY;
  494. {$ifdef logging}
  495. logln('maxx = '+strf(maxx)+', maxy = '+strf(maxy));
  496. {$endif logging}
  497. HardwarePages := modeInfo^.HardwarePages;
  498. MaxColor := modeinfo^.MaxColor;
  499. PaletteSize := modeinfo^.PaletteSize;
  500. { is this a direct color mode? }
  501. DirectColor := modeinfo^.DirectColor;
  502. { now actually initialize the video mode...}
  503. { check first if the routine exists }
  504. if not assigned(modeinfo^.InitMode) then
  505. begin
  506. {$ifdef logging}
  507. LogLn('Mode setting failed in setgraphmode pos 7');
  508. {$endif logging}
  509. _GraphResult := grInvalidMode;
  510. exit;
  511. end;
  512. modeinfo^.InitMode;
  513. if _GraphResult <> grOk then exit;
  514. isgraphmode := true;
  515. { It is very important that this call be made }
  516. { AFTER the other variables have been setup. }
  517. { Since it calls some routines which rely on }
  518. { those variables. }
  519. SetActivePage(0);
  520. SetVisualPage(0);
  521. SetViewPort(0,0,MaxX,MaxY,TRUE);
  522. GraphDefaults;
  523. end;
  524. procedure RestoreCrtMode;
  525. {********************************************************}
  526. { Procedure RestoreCRTMode() }
  527. {--------------------------------------------------------}
  528. { Returns to the video mode which was set before the }
  529. { InitGraph. Hardware state is set to the old values. }
  530. {--------------------------------------------------------}
  531. { NOTE: - }
  532. { - }
  533. {********************************************************}
  534. begin
  535. isgraphmode := false;
  536. RestoreVideoState;
  537. end;
  538. {
  539. $Log$
  540. Revision 1.27 2000-06-23 19:56:38 jonas
  541. * setviewport was sometimes called with parameters from the previous
  542. active mode, either directly from setgraphmode or from
  543. setbkcolor
  544. Revision 1.26 2000/06/22 18:36:19 peter
  545. * removed notes
  546. Revision 1.25 2000/06/19 01:18:49 carl
  547. + added modes for Atari/Amiga and bit depth also
  548. Revision 1.24 2000/06/18 14:59:39 jonas
  549. * changed maxint -> maxsmallint (range error because of objpas mod
  550. somewhere)
  551. Revision 1.23 2000/06/17 19:09:23 jonas
  552. * new platform independent mode handling (between -dnewmodes)
  553. Revision 1.22 2000/04/02 12:13:37 florian
  554. * some more procedures can be now hooked by the OS specific implementation
  555. Revision 1.21 2000/03/24 18:16:33 florian
  556. * introduce a DrawBitmapCharHoriz procedure variable to accelerate output on
  557. win32
  558. Revision 1.20 2000/03/24 13:01:15 florian
  559. * ClearViewPort fixed
  560. Revision 1.19 2000/01/07 16:41:39 daniel
  561. * copyright 2000
  562. Revision 1.18 2000/01/07 16:32:26 daniel
  563. * copyright 2000 added
  564. Revision 1.17 2000/01/02 19:02:39 jonas
  565. * removed/commented out (inited but) unused vars and unused types
  566. Revision 1.16 1999/12/21 17:42:18 jonas
  567. * changed vesa.inc do it doesn't try to use linear modes anymore (doesn't work
  568. yet!!)
  569. * fixed mode detection so the low modenumber of a driver doesn't have to be zero
  570. anymore (so VESA autodetection now works)
  571. Revision 1.15 1999/12/20 11:22:36 peter
  572. * integer -> smallint to overcome -S2 switch needed for ggi version
  573. Revision 1.14 1999/12/04 21:20:04 michael
  574. + Additional logging
  575. Revision 1.13 1999/11/28 16:13:55 jonas
  576. * corrected misplacement of call to initvars in initgraph
  577. + some extra debugging commands (for -dlogging) in the mode functions
  578. Revision 1.12 1999/09/28 13:56:31 jonas
  579. * reordered some local variables (first 4 byte vars, then 2 byte vars
  580. etc)
  581. * font data is now disposed in exitproc, exitproc is now called
  582. GraphExitProc (was CleanModes) and resides in graph.pp instead of in
  583. modes.inc
  584. Revision 1.11 1999/09/26 13:31:07 jonas
  585. * changed name of modeinfo variable to vesamodeinfo and fixed
  586. associated errors (fillchar(modeinfo,sizeof(tmodeinfo),#0) instead
  587. of sizeof(TVesamodeinfo) etc)
  588. * changed several sizeof(type) to sizeof(varname) to avoid similar
  589. errors in the future
  590. Revision 1.10 1999/09/24 22:52:39 jonas
  591. * optimized patternline a bit (always use hline when possible)
  592. * isgraphmode stuff cleanup
  593. * vesainfo.modelist now gets disposed in cleanmode instead of in
  594. closegraph (required moving of some declarations from vesa.inc to
  595. new vesah.inc)
  596. * queryadapter gets no longer called from initgraph (is called from
  597. initialization of graph unit)
  598. * bugfix for notput in 32k and 64k vesa modes
  599. * a div replaced by / in fillpoly
  600. Revision 1.9 1999/09/22 13:13:36 jonas
  601. * renamed text.inc -> gtext.inc to avoid conflict with system unit
  602. * fixed textwidth
  603. * isgraphmode now gets properly updated, so mode restoring works
  604. again
  605. Revision 1.8 1999/09/18 22:21:11 jonas
  606. + hlinevesa256 and vlinevesa256
  607. + support for not/xor/or/andput in vesamodes with 32k/64k colors
  608. * lots of changes to avoid warnings under FPC
  609. Revision 1.7 1999/07/12 13:27:14 jonas
  610. + added Log and Id tags
  611. * added first FPC support, only VGA works to some extend for now
  612. * use -dasmgraph to use assembler routines, otherwise Pascal
  613. equivalents are used
  614. * use -dsupportVESA to support VESA (crashes under FPC for now)
  615. * only dispose vesainfo at closegrph if a vesa card was detected
  616. * changed int32 to longint (int32 is not declared under FPC)
  617. * changed the declaration of almost every procedure in graph.inc to
  618. "far;" becquse otherwise you can't assign them to procvars under TP
  619. real mode (but unexplainable "data segnment too large" errors prevent
  620. it from working under real mode anyway)
  621. }