* Fist working version of svgalib new graph unit

* Initial implementation of ggi new graph unit
This commit is contained in:
michael 1999-11-08 00:08:43 +00:00
parent aa99cfa4d0
commit 1bb66bbb68
4 changed files with 527 additions and 316 deletions

View File

@ -42,6 +42,16 @@ UNITPREFIX=rtl
# Default library name
LIBNAME=fprtl
#
# Use new Graph unit ?
#
NEWGRAPH=YES
#
# Use LibGGI ?
#
ifndef USELIBGGI
USELIBGGI=NO
endif
#####################################################################
# Own defaults
@ -260,6 +270,12 @@ graph$(PPUEXT) : graph.pp linux$(PPUEXT) objects$(PPUEXT)
else
include $(GRAPHDIR)/makefile.inc
GRAPHINCDEPS=$(addprefix $(GRAPHDIR)/,$(GRAPHINCNAMES))
ifeq ($(USELIBGGI),YES)
GRAPHINCDEPS+=ggigraph.inc
override COMPILER+=-dUSEGGI -S2
else
GRAPHINCDEPS+=vgagraph.inc
endif
graph$(PPUEXT) : $(GRAPHDIR)/graph.pp $(SYSTEMPPU) $(GRAPHINCDEPS) graph.inc
$(COMPILER) -I$(GRAPHDIR) $(GRAPHDIR)/graph.pp $(REDIR)
endif
@ -307,7 +323,11 @@ ipc$(PPUEXT) : ipc.pp linux$(PPUEXT) $(SYSTEMPPU)
#
# $Log$
# Revision 1.32 1999-11-07 16:57:26 michael
# Revision 1.33 1999-11-08 00:08:43 michael
# * Fist working version of svgalib new graph unit
# * Initial implementation of ggi new graph unit
#
# Revision 1.32 1999/11/07 16:57:26 michael
# + Start of common graph implementation
#
# Revision 1.31 1999/08/04 11:30:05 michael

View File

@ -1,78 +1,30 @@
{
$Id$
}
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999 by the Free Pascal development team
svgalib implementation of graph unit.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program 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.
**********************************************************************}
const
InternalDriverName = 'LinuxGX';
InternalDriverName = 'LinuxVGA';
var SavePtr : Pointer;
{ ---------------------------------------------------------------------
SVGA bindings.
GGI bindings.
---------------------------------------------------------------------}
{ Link with VGA, gl and c libraries }
{$linklib vga}
{$linklib vgagl}
{$linklib c}
Const
{ Text }
WRITEMODE_OVERWRITE = 0;
WRITEMODE_MASKED = 1;
FONT_EXPANDED = 0;
FONT_COMPRESSED = 2;
{ Types }
type
pvga_modeinfo = ^vga_modeinfo;
vga_modeinfo = record
width,
height,
bytesperpixel,
colors,
linewidth, { scanline width in bytes }
maxlogicalwidth, { maximum logical scanline width }
startaddressrange, { changeable bits set }
maxpixels, { video memory / bytesperpixel }
haveblit, { mask of blit functions available }
flags: Longint; { other flags }
{ Extended fields: }
chiptype, { Chiptype detected }
memory, { videomemory in KB }
linewidth_unit: Longint; { Use only a multiple of this as parameter for set_displaystart }
linear_aperture: PChar; { points to mmap secondary mem aperture of card }
aperture_size: Longint; { size of aperture in KB if size>=videomemory.}
set_aperture_page: procedure (page: Longint);
{ if aperture_size<videomemory select a memory page }
extensions: Pointer; { points to copy of eeprom for mach32 }
{ depends from actual driver/chiptype.. etc. }
end;
PGraphicsContext = ^TGraphicsContext;
TGraphicsContext = record
ModeType: Byte;
ModeFlags: Byte;
Dummy: Byte;
FlipPage: Byte;
Width: LongInt;
Height: LongInt;
BytesPerPixel: LongInt;
Colors: LongInt;
BitsPerPixel: LongInt;
ByteWidth: LongInt;
VBuf: pointer;
Clip: LongInt;
ClipX1: LongInt;
ClipY1: LongInt;
ClipX2: LongInt;
ClipY2: LongInt;
ff: pointer;
end;
Const
{ VGA modes }
{ Supported modes }
GTEXT = 0; { Compatible with VGAlib v1.2 }
G320x200x16 = 1;
G640x200x16 = 2;
@ -134,179 +86,307 @@ Const
G1600x1200x16M32 = 49;
GLASTMODE = 49;
ModeNames : Array[1..GLastMode] of string [20] =
('G320x200x16',
'G640x200x16',
'G640x350x16',
'G640x480x16',
'G320x200x256',
'G320x240x256',
'G320x400x256',
'G360x480x256',
'G640x480x2',
'G640x480x256',
'G800x600x256',
'G1024x768x256',
'G1280x1024x256',
'G320x200x32K',
'G320x200x64K',
'G320x200x16M',
'G640x480x32K',
'G640x480x64K',
'G640x480x16M',
'G800x600x32K',
'G800x600x64K',
'G800x600x16M',
'G1024x768x32K',
'G1024x768x64K',
'G1024x768x16M',
'G1280x1024x32K',
'G1280x1024x64K',
'G1280x1024x16M',
'G800x600x16',
'1024x768x16',
'1280x1024x16',
'G720x348x2',
'G320x200x16M32',
'G640x480x16M32',
'G800x600x16M32',
'G1024x768x16M32',
'G1280x1024x16M32',
'G1152x864x16',
'G1152x864x256',
'G1152x864x32K',
'G1152x864x64K',
'G1152x864x16M',
'G1152x864x16M32',
'G1600x1200x16',
'G1600x1200x256',
'G1600x1200x32K',
'G1600x1200x64K',
'G1600x1200x16M',
'G1600x1200x16M32');
ModeNames : Array[0..GLastMode] of string [18] =
('80x40[T]',
'S320x200[GT_4BIT]',
'S640x200[GT_4BIT]',
'S640x350[GT_4BIT]',
'S640x480[GT_4BIT]',
'S320x200[GT_8BIT]',
'S320x240[GT_8BIT]',
'S320x400[GT_8BIT]',
'S360x480[GT_8BIT]',
'S640x480x[GT_1BIT]',
'S640x480[GT_8BIT]',
'S800x600[GT_8BIT]',
'S1024x768[GT_8BIT]',
'S1280x1024[GT_8BIT]',
'S320x200[GT_15BIT]',
'S320x200[GT_16BIT]',
'S320x200[GT_24BIT]',
'S640x480[GT_15BIT]',
'S640x480[GT_16BIT]',
'S640x480[GT_24BIT]',
'S800x600[GT_15BIT]',
'S800x600[GT_16BIT]',
'S800x600[GT_24BIT]',
'S1024x768[GT_15BIT]',
'S1024x768[GT_16BIT]',
'S1024x768[GT_24BIT]',
'S1280x1024[GT_15BIT]',
'S1280x1024[GT_16BIT]',
'S1280x1024[GT_24BIT]',
'S800x600[GT_4BIT]',
'S1024x768[GT_4BIT]',
'S1280x1024[GT_4BIT]',
'S720x348x[GT_1BIT]',
'S320x200[GT_32BIT]',
'S640x480[GT_32BIT]',
'S800x600[GT_32BIT]',
'S1024x768[GT_32BIT]',
'S1280x1024[GT_32BIT]',
'S1152x864[GT_4BIT]',
'S1152x864[gt_8BIT]',
'S1152x864[GT_15BIT]',
'S1152x864[GT_16BIT]',
'S1152x864[GT_24BIT]',
'S1152x864[GT_32BIT]',
'S1600x1200[GT_4BIT]',
'S1600x1200[gt_8BIT]',
'S1600x1200[GT_15BIT]',
'S1600x1200[GT_16BIT]',
'S1600x1200[GT_24BIT]',
'S1600x1200[GT_32BIT]');
{ vga functions }
Function vga_init: Longint; Cdecl; External;
Function vga_getdefaultmode: Longint; Cdecl; External;
type
TGGIVisual = Pointer;
TGGIResource = Pointer;
TGGICoord = record
x, y: Integer;
end;
TGGIPixel = LongWord;
PGGIColor = ^TGGIColor;
TGGIColor = record
r, g, b, a: Integer;
end;
PGGIClut = ^TGGIClut;
TGGIClut = record
size: Integer;
data: PGGIColor;
end;
TGGIGraphType = LongWord;
TGGIAttr = LongWord;
TGGIMode = record // requested by user and changed by driver
Frames: LongInt; // frames needed
Visible: TGGICoord; // vis. pixels, may change slightly
Virt: TGGICoord; // virtual pixels, may change
Size: TGGICoord; // size of visible in mm
GraphType: TGGIGraphType; // which mode ?
dpp: TGGICoord; // dots per pixel
end;
Function vga_hasmode(mode: Longint): Boolean; Cdecl; External;
Const
libggi = 'ggi';
function ggiInit: Integer; cdecl; external libggi;
procedure ggiExit; cdecl; external libggi;
function ggiOpen(display: PChar; args: Array of const): TGGIVisual; cdecl; external libggi;
function ggiClose(vis: TGGIVisual): Integer; cdecl; external libggi;
function ggiParseMode(s: PChar; var m: TGGIMode): Integer; cdecl; external libggi;
function ggiSetMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
function ggiGetMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
function ggiCheckMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
Function vga_getmodeinfo(mode: Longint): pvga_modeinfo; Cdecl; External;
Function vga_setmode(mode: Longint): Longint; Cdecl; External;
Function vga_getxdim : Longint; cdecl;external;
Function vga_getydim : longint; cdecl;external;
function ggiPutPixel(vis: TGGIVisual; x, y: Integer; pixel: TGGIPixel): Integer; cdecl; external libggi;
function ggiGetPixel(vis: TGGIVisual; x, y: Integer; var pixel: TGGIPixel): Integer; cdecl; external libggi;
function ggiDrawBox(vis: TGGIVisual; x, y, w, h: Integer): Integer; cdecl; external libggi;
function ggiPutBox(vis: TGGIVisual; x, y, w, h: Integer; var buffer): Integer; cdecl; external libggi;
function ggiGetBox(vis: TGGIVisual; x, y, w, h: Integer; var buffer): Integer; cdecl; external libggi;
{ gl functions }
procedure gl_setpixel(x, y, c: LongInt); Cdecl; External;
function gl_getpixel(x, y: LongInt): LongInt; cdecl; external;
procedure gl_line(x1, y1, x2, y2, c: LongInt); Cdecl; External;
procedure gl_fillbox(x, y, w, h, c: LongInt); Cdecl; External;
procedure gl_circle(x, y, r, c: LongInt ); Cdecl; External;
procedure gl_getbox(x, y, w, h: LongInt; dp: pointer); Cdecl; External;
procedure gl_putbox(x, y, w, h: LongInt; dp: pointer); Cdecl; External;
procedure gl_disableclipping; Cdecl; External;
procedure gl_enableclipping; Cdecl; External;
procedure gl_putboxpart(x, y, w, h, bw, bh: LongInt; b: pointer; xo, yo: LongInt); Cdecl; External;
function gl_rgbcolor(r, g, b: LongInt): LongInt; Cdecl; External;
function gl_setcontextvga(m: LongInt): LongInt; Cdecl; External;
function gl_allocatecontext: PGraphicsContext; Cdecl; External;
procedure gl_getcontext(gc: PGraphicsContext); Cdecl; External;
procedure gl_setrgbpalette; Cdecl; External;
procedure gl_freecontext(gc: PGraphicsContext); Cdecl; External;
procedure gl_setclippingwindow(x1, y1, x2, y2: LongInt); Cdecl; External;
procedure gl_setwritemode(wm: LongInt); Cdecl; External;
procedure gl_setfontcolors(bg, fg: LongInt); Cdecl; External;
procedure gl_writen(x, y, n: LongInt; s: PChar); Cdecl; External;
procedure gl_setfont(fw, fh: LongInt; fdp: pointer); Cdecl; External;
procedure gl_copyboxfromcontext(var gc: TGraphicsContext; x1, y1, w, h, x2, y2: LongInt); Cdecl; External;
procedure gl_setcontext(gc: PGraphicsContext); Cdecl; External;
function gl_setcontextvgavirtual(m: LongInt): LongInt; cdecl; external;
procedure gl_font8x8; Cdecl; External;
function ggiGetPalette(vis: TGGIVisual; s, len: Integer; var cmap: TGGIColor): Integer; cdecl; external libggi;
function ggiSetPalette(vis: TGGIVisual; s, len: Integer; var cmap: TGGIColor): Integer; cdecl; external libggi;
{ ---------------------------------------------------------------------
Required procedures
---------------------------------------------------------------------}
procedure libvga_initmodeproc;
var
Visual: TGGIVisual;
CurrentMode : TGGIMode;
procedure ggi_savevideostate;
begin
vga_setmode(IntCurrentMode);
end;
procedure ggi_restorevideostate;
Var mode : TGGIMode;
begin
ggiparsemode(@ModeNames[Gtext][1],Mode);
ggisetmode(Visual,Mode);
end;
const
BgiColors: array[0..15] of LongInt
= ($000000, $000080, $008000, $008080,
$800000, $800080, $808000, $C0C0C0,
$808080, $0000FF, $00FF00, $00FFFF,
$FF0000, $FF00FF, $FFFF00, $FFFFFF);
procedure ggi_initmodeproc;
Var
ModeName : string[20];
begin
ggiparsemode(@ModeNames[IntCurrentMode][1],CurrentMode);
ggisetmode(Visual,CurrentMode);
end;
Function ClipCoords (Var X,Y : Integer) : Boolean;
{ Adapt to viewport, return TRUE if still in viewport,
false if outside viewport}
function libvga_getpixelproc (X,Y: Integer): word;
begin
X:= X + StartXViewPort;
Y:= Y + StartYViewPort;
ClipCoords:=Not ClipPixels;
if ClipCoords then
Begin
ClipCoords:=(X < StartXViewPort) or (X > (StartXViewPort + ViewWidth));
ClipCoords:=ClipCoords or
((Y < StartYViewPort) or (Y > (StartYViewPort + ViewHeight)));
ClipCoords:=Not ClipCoords;
end;
end;
procedure ggi_directpixelproc(X,Y: Integer);
Var Color : Word;
begin
case CurrentWriteMode of
XORPut:
begin
{ getpixel wants local/relative coordinates }
Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
Color := CurrentColor Xor Color;
end;
OrPut:
begin
{ getpixel wants local/relative coordinates }
Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
Color := CurrentColor Or Color;
end;
AndPut:
begin
{ getpixel wants local/relative coordinates }
Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
Color := CurrentColor And Color;
end;
NotPut:
begin
Color := Not Color;
end
else
Color:=CurrentColor;
end;
ggiPutPixel(Visual,x, y, Color);
end;
procedure ggi_putpixelproc(X,Y: Integer; Color: Word);
begin
If Not ClipCoords(X,Y) Then exit;
ggiputpixel(Visual,x, y, Color);
end;
function ggi_getpixelproc (X,Y: Integer): word;
Var i : TGGIPixel;
begin
ClipCoords(X,Y);
ggigetpixel(Visual,x, y,I);
ggi_getpixelproc:=i;
end;
procedure ggi_clrviewproc;
begin
ggidrawbox(Visual,StartXViewPort,StartYViewPort,ViewWidth,ViewHeight);
end;
{ Bitmap utilities }
type
PBitmap = ^TBitmap;
TBitmap = record
Width, Height: Integer;
Data: record end;
end;
procedure ggi_putimageproc (X,Y: Integer; var Bitmap; BitBlt: Word);
begin
With TBitMap(BitMap) do
ggiputbox(Visual,x, y, width, height, @Data);
end;
procedure ggi_getimageproc (X1,Y1,X2,Y2: Integer; Var Bitmap);
begin
with TBitmap(Bitmap) do
begin
Width := x2 - x1 + 1;
Height := y2 - y1 + 1;
ggigetbox(Visual,x1,y1, x2 - x1 + 1, y2 - y1 + 1, @Data);
end;
end;
function ggi_imagesizeproc (X1,Y1,X2,Y2: Integer): longint;
begin
// 32 bits per pixel -- change ASAP !!
ggi_imagesizeproc := SizeOf(TBitmap) + (x2 - x1 + 1) * (y2 - y1 + 1) * SizeOF(longint);
end;
procedure ggi_hlineproc (x, x2,y : integer);
begin
end;
procedure libvga_putpixelproc(X,Y: Integer; Color: Word);
procedure ggi_vlineproc (x,y,y2: integer);
begin
end;
procedure libvga_clrviewproc;
procedure ggi_patternlineproc (x1,x2,y: integer);
begin
end;
procedure libvga_putimageproc (X,Y: Integer; var Bitmap; BitBlt: Word);
begin
end;
procedure libvga_getimageproc (X1,Y1,X2,Y2: Integer; Var Bitmap);
begin
end;
function libvga_imagesizeproc (X1,Y1,X2,Y2: Integer): longint;
begin
end;
procedure libvga_hlineproc (x, x2,y : integer);
begin
end;
procedure libvga_vlineproc (x,y,y2: integer);
begin
end;
procedure libvga_patternlineproc (x1,x2,y: integer);
begin
end;
procedue libvga_ellipseproc (X,Y: Integer;XRadius: word;
procedure ggi_ellipseproc (X,Y: Integer;XRadius: word;
YRadius:word; stAngle,EndAngle: word; fp: PatternLineProc);
begin
end;
procedure libvga_lineproc (X1, Y1, X2, Y2 : Integer);
procedure ggi_lineproc (X1, Y1, X2, Y2 : Integer);
begin
end;
procedure libvga_getscanlineproc = procedure (Y : integer; var data);
procedure ggi_getscanlineproc (Y : integer; var data);
begin
end;
procedure libvga_setactivepageproc (page: word);
procedure ggi_setactivepageproc (page: word);
begin
end;
procedure libvga_setvisualpageproc (page: word);
procedure ggi_setvisualpageproc (page: word);
begin
end;
procedure libvga_savestateproc;
procedure ggi_savestateproc;
begin
end;
procedure libvga_restorestateproc;
procedure ggi_restorestateproc;
begin
end;
procedure libvga_setrgbpaletteproc(ColorNum, RedValue, GreenValue, BlueValue: Integer);
procedure ggi_setrgbpaletteproc(ColorNum, RedValue, GreenValue, BlueValue: Integer);
Var Col : TGGIcolor;
begin
col.r:=redvalue;
col.g:=greenvalue;
col.b:=bluevalue;
ggisetpalette(Visual,ColorNum,1,col);
end;
procedure libvga_getrgbpaletteproc =(ColorNum: integer; var
RedValue, GreenValue, BlueValue: Integer);
procedure ggi_getrgbpaletteproc (ColorNum: integer;
var RedValue, GreenValue, BlueValue: Integer);
Var Col : TGGIColor;
begin
ggigetpalette(Visual,ColorNum,1,col);
RedValue:=Col.R;
GreenValue:=Col.G;
BlueValue:=Col.B;
end;
{************************************************************************}
@ -330,8 +410,9 @@ end;
{ Returns nil if no graphics mode supported. }
{ This list is READ ONLY! }
var
modename : string[20];
mode: TModeInfo;
modeinfo : vga_modeinfo;
modeinfo : TGGImode;
i : longint;
begin
@ -341,65 +422,71 @@ end;
{ anything... }
if assigned(ModeList) then
exit;
vga_init;
For I:=1 to GLastMode do
If vga_hasmode(I) then
SaveVideoState:=ggi_savevideostate;
RestoreVideoState:=ggi_restorevideostate;
Writeln ('ggiInit');
If ggiInit<>0 then
begin
_graphresult:=grNoInitGraph;
exit;
end;
Writeln ('ggiOPen');
Visual:=ggiOpen(nil, []); // Use default visual
For I:=0 to GLastMode do
begin
Writeln(' testing mode : ',Modenames[I]);
modename:=ModeNames[I]+#0;
ggiparsemode(@ModeName[1],modeinfo);
If ggiCheckMode(visual,modeinfo)=0 then
begin
ModeInfo:=vga_getmodeinfo(i)^;
Writeln('OK for mode : ',Modenames[I]);
InitMode(Mode);
With Mode,ModeInfo do
With Mode do
begin
ModeNumber:=I;
ModeName:=ModeNames[i];
DriverNumber := 0;
MaxX:=Width;
MaxY:=height;
MaxColor := colors;
// Pretend we're VGA always.
DriverNumber := VGA;
MaxX:=ModeInfo.Visible.X;
MaxY:=ModeInfo.Visible.Y;
// MaxColor := ModeInfo.colors;
MaxColor:=255;
PaletteSize := MaxColor;
HardwarePages := 0;
{
// necessary hooks ...
DirectPutPixel : DefPixelProc;
GetPixel : GetPixelProc;
PutPixel : PutPixelProc;
SetRGBPalette : SetRGBPaletteProc;
GetRGBPalette : GetRGBPaletteProc;
// defaults possible ...
SetVisualPage : SetVisualPageProc;
SetActivePage : SetActivePageProc;
ClearViewPort : ClrViewProc;
PutImage : PutImageProc;
GetImage : GetImageProc;
ImageSize : ImageSizeProc;
GetScanLine : GetScanLineProc;
Line : LineProc;
InternalEllipse: EllipseProc;
PatternLine : PatternLineProc;
HLine : HLineProc;
VLine : VLineProc;
InitMode : InitModeProc;
next: PModeInfo;
DirectPutPixel:={$ifdef fpc}@{$endif}DirectPutPixVESA256;
PutPixel:={$ifdef fpc}@{$endif}PutPixVESA256;
GetPixel:={$ifdef fpc}@{$endif}GetPixVESA256;
SetRGBPalette := {$ifdef fpc}@{$endif}SetVESARGBPalette;
GetRGBPalette := {$ifdef fpc}@{$endif}GetVESARGBPalette;
InitMode := {$ifdef fpc}@{$endif}Init640x480x256;
SetVisualPage := {$ifdef fpc}@{$endif}SetVisualVESA;
SetActivePage := {$ifdef fpc}@{$endif}SetActiveVESA;
hline := {$ifdef fpc}@{$endif}HLineVESA256;
hline := {$ifdef fpc}@{$endif}HLineVESA256;
XAspect := 10000;
YAspect := 10000;
DirectPutPixel := @ggi_DirectPixelProc;
GetPixel := @ggi_GetPixelProc;
PutPixel := @ggi_PutPixelProc;
SetRGBPalette := @ggi_SetRGBPaletteProc;
GetRGBPalette := @ggi_GetRGBPaletteProc;
ClearViewPort := @ggi_ClrViewProc;
PutImage := @ggi_PutImageProc;
GetImage := @ggi_GetImageProc;
ImageSize := @ggi_ImageSizeProc;
{ Add later maybe ?
SetVisualPage := SetVisualPageProc;
SetActivePage := SetActivePageProc;
GetScanLine := @ggi_GetScanLineProc;
Line := @ggi_LineProc;
InternalEllipse:= @ggi_EllipseProc;
PatternLine := @ggi_PatternLineProc;
HLine := @ggi_HLineProc;
VLine := @ggi_VLineProc;
}
InitMode := @ggi_InitModeProc;
end;
AddMode(Mode);
end;
end;
end;
{
$Log$
Revision 1.1 1999-11-07 16:57:26 michael
Revision 1.2 1999-11-08 00:08:43 michael
* Fist working version of svgalib new graph unit
* Initial implementation of ggi new graph unit
Revision 1.1 1999/11/07 16:57:26 michael
+ Start of common graph implementation
}

View File

@ -3,7 +3,7 @@
This file is part of the Free Pascal run time library.
Copyright (c) 1998 by the Free Pascal development team
<What does this file>
Graph include file for linux.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
@ -15,7 +15,6 @@
**********************************************************************}
{ decide what to load }
{$ifdef USEGGI}
{ use GGI libs }
{$i ggigraph.inc}

View File

@ -1,8 +1,21 @@
{
$Id$
}
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999 by the Free Pascal development team
svgalib implementation of graph unit.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program 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.
**********************************************************************}
const
InternalDriverName = 'LinuxGX';
InternalDriverName = 'LinuxVGA';
var SavePtr : Pointer;
@ -134,8 +147,9 @@ Const
G1600x1200x16M32 = 49;
GLASTMODE = 49;
ModeNames : Array[1..GLastMode] of string [20] =
('G320x200x16',
ModeNames : Array[0..GLastMode] of string [18] =
('Text',
'G320x200x16',
'G640x200x16',
'G640x350x16',
'G640x480x16',
@ -184,78 +198,166 @@ Const
'G1600x1200x64K',
'G1600x1200x16M',
'G1600x1200x16M32');
var
PhysicalScreen: PGraphicsContext;
{ vga functions }
Function vga_init: Longint; Cdecl; External;
Function vga_getdefaultmode: Longint; Cdecl; External;
Function vga_hasmode(mode: Longint): Boolean; Cdecl; External;
Function vga_getmodeinfo(mode: Longint): pvga_modeinfo; Cdecl; External;
Function vga_setmode(mode: Longint): Longint; Cdecl; External;
Function vga_getxdim : Longint; cdecl;external;
Function vga_getydim : longint; cdecl;external;
{ gl functions }
procedure gl_setpixel(x, y, c: LongInt); Cdecl; External;
function gl_getpixel(x, y: LongInt): LongInt; cdecl; external;
procedure gl_line(x1, y1, x2, y2, c: LongInt); Cdecl; External;
procedure gl_fillbox(x, y, w, h, c: LongInt); Cdecl; External;
procedure gl_circle(x, y, r, c: LongInt ); Cdecl; External;
procedure gl_getbox(x, y, w, h: LongInt; dp: pointer); Cdecl; External;
procedure gl_putbox(x, y, w, h: LongInt; dp: pointer); Cdecl; External;
procedure gl_disableclipping; Cdecl; External;
procedure gl_enableclipping; Cdecl; External;
procedure gl_putboxpart(x, y, w, h, bw, bh: LongInt; b: pointer; xo, yo: LongInt); Cdecl; External;
function gl_rgbcolor(r, g, b: LongInt): LongInt; Cdecl; External;
function gl_setcontextvga(m: LongInt): LongInt; Cdecl; External;
function gl_allocatecontext: PGraphicsContext; Cdecl; External;
procedure gl_getcontext(gc: PGraphicsContext); Cdecl; External;
procedure gl_setrgbpalette; Cdecl; External;
procedure gl_freecontext(gc: PGraphicsContext); Cdecl; External;
procedure gl_setclippingwindow(x1, y1, x2, y2: LongInt); Cdecl; External;
procedure gl_setwritemode(wm: LongInt); Cdecl; External;
procedure gl_setfontcolors(bg, fg: LongInt); Cdecl; External;
procedure gl_writen(x, y, n: LongInt; s: PChar); Cdecl; External;
procedure gl_setfont(fw, fh: LongInt; fdp: pointer); Cdecl; External;
procedure gl_copyboxfromcontext(var gc: TGraphicsContext; x1, y1, w, h, x2, y2: LongInt); Cdecl; External;
procedure gl_setcontext(gc: PGraphicsContext); Cdecl; External;
function gl_setcontextvgavirtual(m: LongInt): LongInt; cdecl; external;
procedure gl_font8x8; Cdecl; External;
Procedure gl_setpalettecolor(c, r, b, g: LongInt); cdecl;external;
Procedure gl_getpalettecolor(c: LongInt; var r, b, g: LongInt); cdecl;external;
{ ---------------------------------------------------------------------
Required procedures
---------------------------------------------------------------------}
procedure libvga_savevideostate;
begin
end;
procedure libvga_restorevideostate;
begin
vga_setmode(Gtext);
end;
const
BgiColors: array[0..15] of LongInt
= ($000000, $000080, $008000, $008080,
$800000, $800080, $808000, $C0C0C0,
$808080, $0000FF, $00FF00, $00FFFF,
$FF0000, $FF00FF, $FFFF00, $FFFFFF);
procedure InitColors;
var
i: Integer;
begin
for i:=0 to 15 do
gl_setpalettecolor(I,BgiColors[i] shr 16,
(BgiColors[i] shr 8) and 255,
BgiColors[i] and 255)
end;
procedure libvga_initmodeproc;
begin
vga_setmode(IntCurrentMode);
gl_setcontextvga(IntCurrentMode);
PhysicalScreen := gl_allocatecontext;
gl_getcontext(PhysicalScreen);
if (PhysicalScreen^.colors = 256) then gl_setrgbpalette;
InitColors;
end;
Function ClipCoords (Var X,Y : Integer) : Boolean;
{ Adapt to viewport, return TRUE if still in viewport,
false if outside viewport}
function libvga_getpixelproc (X,Y: Integer): word;
begin
X:= X + StartXViewPort;
Y:= Y + StartYViewPort;
ClipCoords:=Not ClipPixels;
if ClipCoords then
Begin
ClipCoords:=(X < StartXViewPort) or (X > (StartXViewPort + ViewWidth));
ClipCoords:=ClipCoords or
((Y < StartYViewPort) or (Y > (StartYViewPort + ViewHeight)));
ClipCoords:=Not ClipCoords;
end;
end;
procedure libvga_directpixelproc(X,Y: Integer);
Var Color : Word;
begin
case CurrentWriteMode of
XORPut:
begin
{ getpixel wants local/relative coordinates }
Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
Color := CurrentColor Xor Color;
end;
OrPut:
begin
{ getpixel wants local/relative coordinates }
Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
Color := CurrentColor Or Color;
end;
AndPut:
begin
{ getpixel wants local/relative coordinates }
Color := GetPixel(x-StartXViewPort,y-StartYViewPort);
Color := CurrentColor And Color;
end;
NotPut:
begin
Color := Not Color;
end
else
Color:=CurrentColor;
end;
gl_setpixel(x, y, Color);
end;
procedure libvga_putpixelproc(X,Y: Integer; Color: Word);
begin
If Not ClipCoords(X,Y) Then exit;
gl_setpixel(x, y, Color);
end;
function libvga_getpixelproc (X,Y: Integer): word;
begin
ClipCoords(X,Y);
libvga_getpixelproc:=gl_getpixel(x, y);
end;
procedure libvga_clrviewproc;
begin
gl_fillbox(StartXViewPort,StartYViewPort,ViewWidth,ViewHeight,CurrentBkColor);
end;
{ Bitmap utilities }
type
PBitmap = ^TBitmap;
TBitmap = record
Width, Height: Integer;
Data: record end;
end;
procedure libvga_putimageproc (X,Y: Integer; var Bitmap; BitBlt: Word);
begin
With TBitMap(BitMap) do
gl_putbox(x, y, width, height, @Data);
end;
procedure libvga_getimageproc (X1,Y1,X2,Y2: Integer; Var Bitmap);
begin
with TBitmap(Bitmap) do
begin
Width := x2 - x1 + 1;
Height := y2 - y1 + 1;
gl_getbox(x1,y1, x2 - x1 + 1, y2 - y1 + 1, @Data);
end;
end;
function libvga_imagesizeproc (X1,Y1,X2,Y2: Integer): longint;
begin
libvga_imagesizeproc := SizeOf(TBitmap) + (x2 - x1 + 1) * (y2 - y1 + 1) * PhysicalScreen^.BytesPerPixel;
end;
procedure libvga_hlineproc (x, x2,y : integer);
@ -270,7 +372,7 @@ procedure libvga_patternlineproc (x1,x2,y: integer);
begin
end;
procedue libvga_ellipseproc (X,Y: Integer;XRadius: word;
procedure libvga_ellipseproc (X,Y: Integer;XRadius: word;
YRadius:word; stAngle,EndAngle: word; fp: PatternLineProc);
begin
end;
@ -279,7 +381,7 @@ procedure libvga_lineproc (X1, Y1, X2, Y2 : Integer);
begin
end;
procedure libvga_getscanlineproc = procedure (Y : integer; var data);
procedure libvga_getscanlineproc (Y : integer; var data);
begin
end;
@ -302,11 +404,19 @@ end;
procedure libvga_setrgbpaletteproc(ColorNum, RedValue, GreenValue, BlueValue: Integer);
begin
gl_setpalettecolor(ColorNum,RedValue,GreenValue,BlueValue);
end;
procedure libvga_getrgbpaletteproc =(ColorNum: integer; var
RedValue, GreenValue, BlueValue: Integer);
procedure libvga_getrgbpaletteproc (ColorNum: integer;
var RedValue, GreenValue, BlueValue: Integer);
Var R,G,B : longint;
begin
gl_getpalettecolor(ColorNum,R,G,B);
RedValue:=R;
GreenValue:=G;
BlueValue:=B;
end;
{************************************************************************}
@ -341,65 +451,60 @@ end;
{ anything... }
if assigned(ModeList) then
exit;
SaveVideoState:=libvga_savevideostate;
RestoreVideoState:=libvga_restorevideostate;
vga_init;
For I:=1 to GLastMode do
For I:=0 to GLastMode do
begin
If vga_hasmode(I) then
begin
ModeInfo:=vga_getmodeinfo(i)^;
InitMode(Mode);
With Mode,ModeInfo do
With Mode do
begin
ModeNumber:=I;
ModeName:=ModeNames[i];
DriverNumber := 0;
MaxX:=Width;
MaxY:=height;
MaxColor := colors;
// Pretend we're VGA always.
DriverNumber := VGA;
MaxX:=ModeInfo.Width;
MaxY:=ModeInfo.height;
MaxColor := ModeInfo.colors;
PaletteSize := MaxColor;
HardwarePages := 0;
{
// necessary hooks ...
DirectPutPixel : DefPixelProc;
GetPixel : GetPixelProc;
PutPixel : PutPixelProc;
SetRGBPalette : SetRGBPaletteProc;
GetRGBPalette : GetRGBPaletteProc;
// defaults possible ...
SetVisualPage : SetVisualPageProc;
SetActivePage : SetActivePageProc;
ClearViewPort : ClrViewProc;
PutImage : PutImageProc;
GetImage : GetImageProc;
ImageSize : ImageSizeProc;
GetScanLine : GetScanLineProc;
Line : LineProc;
InternalEllipse: EllipseProc;
PatternLine : PatternLineProc;
HLine : HLineProc;
VLine : VLineProc;
InitMode : InitModeProc;
next: PModeInfo;
DirectPutPixel:={$ifdef fpc}@{$endif}DirectPutPixVESA256;
PutPixel:={$ifdef fpc}@{$endif}PutPixVESA256;
GetPixel:={$ifdef fpc}@{$endif}GetPixVESA256;
SetRGBPalette := {$ifdef fpc}@{$endif}SetVESARGBPalette;
GetRGBPalette := {$ifdef fpc}@{$endif}GetVESARGBPalette;
InitMode := {$ifdef fpc}@{$endif}Init640x480x256;
SetVisualPage := {$ifdef fpc}@{$endif}SetVisualVESA;
SetActivePage := {$ifdef fpc}@{$endif}SetActiveVESA;
hline := {$ifdef fpc}@{$endif}HLineVESA256;
hline := {$ifdef fpc}@{$endif}HLineVESA256;
XAspect := 10000;
YAspect := 10000;
DirectPutPixel := @libvga_DirectPixelProc;
GetPixel := @Libvga_GetPixelProc;
PutPixel := @libvga_PutPixelProc;
SetRGBPalette := @libvga_SetRGBPaletteProc;
GetRGBPalette := @libvga_GetRGBPaletteProc;
ClearViewPort := libvga_ClrViewProc;
PutImage := @Libvga_PutImageProc;
GetImage := @libvga_GetImageProc;
ImageSize := @libvga_ImageSizeProc;
{ Add later maybe ?
SetVisualPage := SetVisualPageProc;
SetActivePage := SetActivePageProc;
GetScanLine := @libvga_GetScanLineProc;
Line := @libvga_LineProc;
InternalEllipse:= @libvga_EllipseProc;
PatternLine := @libvga_PatternLineProc;
HLine := @libvga_HLineProc;
VLine := @libvga_VLineProc;
}
InitMode := @libvga_InitModeProc;
end;
AddMode(Mode);
end;
end;
end;
{
$Log$
Revision 1.1 1999-11-07 16:57:26 michael
Revision 1.2 1999-11-08 00:08:43 michael
* Fist working version of svgalib new graph unit
* Initial implementation of ggi new graph unit
Revision 1.1 1999/11/07 16:57:26 michael
+ Start of common graph implementation
}