mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-21 16:41:45 +02:00
* accelerated output of bitmap fonts
This commit is contained in:
parent
fe462795f6
commit
cca24e5632
@ -253,6 +253,114 @@ procedure DirectPutPixel16Win32GUI(x,y : integer);
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
bitmapfontcache : array[0..255] of HBITMAP;
|
||||
|
||||
procedure DrawBitmapCharHorizWin32GUI(x,y : longint;charsize : word;const s : string);
|
||||
|
||||
var
|
||||
cnt1,cnt2,cnt3,cnt4,j,k,c,xpos,i : longint;
|
||||
fontbitmap : TBitmapChar;
|
||||
bitmap,oldbitmap : HBITMAP;
|
||||
chardc : HDC;
|
||||
color : longint;
|
||||
brushwin,oldbrushwin,brushbitmap,oldbrushbitmap : HBRUSH;
|
||||
bitmaprgn,winrgn : HRGN;
|
||||
|
||||
begin
|
||||
EnterCriticalSection(graphdrawing);
|
||||
c:=length(s);
|
||||
chardc:=CreateCompatibleDC(windc);
|
||||
if currentcolor<>white then
|
||||
begin
|
||||
color:=RGB(pal[currentcolor].red,pal[currentcolor].green,
|
||||
pal[currentcolor].blue);
|
||||
brushwin:=CreateSolidBrush(color);
|
||||
oldbrushwin:=SelectObject(windc,brushwin);
|
||||
brushbitmap:=CreateSolidBrush(color);
|
||||
oldbrushbitmap:=SelectObject(windc,brushbitmap);
|
||||
end;
|
||||
inc(x,startxviewport);
|
||||
inc(y,startyviewport);
|
||||
{ let windows do the clipping }
|
||||
bitmaprgn:=CreateRectRgn(startxviewport,startyviewport,
|
||||
startxviewport+viewwidth+1,startyviewport+viewheight+1);
|
||||
winrgn:=CreateRectRgn(startxviewport,startyviewport,
|
||||
startxviewport+viewwidth+1,startyviewport+viewheight+1);
|
||||
SelectClipRgn(bitmapdc,bitmaprgn);
|
||||
SelectClipRgn(windc,winrgn);
|
||||
for i:=0 to c-1 do
|
||||
begin
|
||||
xpos:=x+(i*8)*Charsize;
|
||||
if bitmapfontcache[byte(s[i+1])]=0 then
|
||||
begin
|
||||
bitmap:=CreateCompatibleBitmap(windc,8,8);
|
||||
oldbitmap:=SelectObject(chardc,bitmap);
|
||||
Fontbitmap:=TBitmapChar(DefaultFontData[s[i+1]]);
|
||||
|
||||
for j:=0 to 7 do
|
||||
for k:=0 to 7 do
|
||||
if Fontbitmap[j,k]<>0 then
|
||||
SetPixel(chardc,k,j,$ffffff)
|
||||
else
|
||||
SetPixel(chardc,k,j,0);
|
||||
bitmapfontcache[byte(s[i+1])]:=bitmap;
|
||||
SelectObject(chardc,oldbitmap);
|
||||
end;
|
||||
oldbitmap:=SelectObject(chardc,bitmapfontcache[byte(s[i+1])]);
|
||||
if CharSize=1 then
|
||||
begin
|
||||
if currentcolor=white then
|
||||
begin
|
||||
BitBlt(windc,xpos,y,8,8,chardc,0,0,SRCPAINT);
|
||||
BitBlt(bitmapdc,xpos,y,8,8,chardc,0,0,SRCPAINT);
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ could we do this with one pattern operation ?? }
|
||||
{ we would need something like DSnaSPao }
|
||||
// ROP $00220326=DSna
|
||||
BitBlt(windc,xpos,y,8,8,chardc,0,0,$00220326);
|
||||
BitBlt(bitmapdc,xpos,y,8,8,chardc,0,0,$00220326);
|
||||
// ROP $00EA02E9 = DPSao
|
||||
BitBlt(windc,xpos,y,8,8,chardc,0,0,$00EA02E9);
|
||||
BitBlt(bitmapdc,xpos,y,8,8,chardc,0,0,$00EA02E9);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if currentcolor=white then
|
||||
begin
|
||||
StretchBlt(windc,xpos,y,8*charsize,8*charsize,chardc,0,0,8,8,SRCPAINT);
|
||||
StretchBlt(bitmapdc,xpos,y,8*charsize,8*charsize,chardc,0,0,8,8,SRCPAINT);
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ could we do this with one pattern operation ?? }
|
||||
{ we would need something like DSnaSPao }
|
||||
// ROP $00220326=DSna
|
||||
StretchBlt(windc,xpos,y,8*charsize,8*charsize,chardc,0,0,8,8,$00220326);
|
||||
StretchBlt(bitmapdc,xpos,y,8*charsize,8*charsize,chardc,0,0,8,8,$00220326);
|
||||
// ROP $00EA02E9 = DPSao
|
||||
StretchBlt(windc,xpos,y,8*charsize,8*charsize,chardc,0,0,8,8,$00EA02E9);
|
||||
StretchBlt(bitmapdc,xpos,y,8*charsize,8*charsize,chardc,0,0,8,8,$00EA02E9);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if currentcolor<>white then
|
||||
begin
|
||||
SelectObject(windc,oldbrushwin);
|
||||
DeleteObject(brushwin);
|
||||
SelectObject(bitmapdc,oldbrushbitmap);
|
||||
DeleteObject(brushbitmap);
|
||||
end;
|
||||
{ release clip regions }
|
||||
SelectClipRgn(bitmapdc,0);
|
||||
SelectClipRgn(windc,0);
|
||||
DeleteDC(chardc);
|
||||
LeaveCriticalSection(graphdrawing);
|
||||
end;
|
||||
|
||||
procedure HLine16Win32GUI(x,x2,y: integer);
|
||||
|
||||
var
|
||||
@ -391,6 +499,7 @@ function WindowProc(Window: HWnd; AMessage, WParam,
|
||||
r : rect;
|
||||
oldbrush : hbrush;
|
||||
oldpen : hpen;
|
||||
i : longint;
|
||||
|
||||
begin
|
||||
WindowProc := 0;
|
||||
@ -458,18 +567,20 @@ begin
|
||||
ReleaseDC(window,dc);
|
||||
oldbitmap:=SelectObject(bitmapdc,savedscreen);
|
||||
windc:=GetDC(window);
|
||||
{ clear everything }
|
||||
// clear everything
|
||||
oldpen:=SelectObject(bitmapdc,GetStockObject(BLACK_PEN));
|
||||
oldbrush:=SelectObject(bitmapdc,GetStockObject(BLACK_BRUSH));
|
||||
Windows.Rectangle(bitmapdc,0,0,maxx,maxy);
|
||||
SelectObject(bitmapdc,oldpen);
|
||||
SelectObject(bitmapdc,oldbrush);
|
||||
{ ... the window too }
|
||||
// ... the window too
|
||||
oldpen:=SelectObject(windc,GetStockObject(BLACK_PEN));
|
||||
oldbrush:=SelectObject(windc,GetStockObject(BLACK_BRUSH));
|
||||
Windows.Rectangle(windc,0,0,maxx,maxy);
|
||||
SelectObject(windc,oldpen);
|
||||
SelectObject(windc,oldbrush);
|
||||
// clear font cache
|
||||
fillchar(bitmapfontcache,sizeof(bitmapfontcache),0);
|
||||
LeaveCriticalSection(graphdrawing);
|
||||
end;
|
||||
wm_Destroy:
|
||||
@ -480,6 +591,11 @@ begin
|
||||
SelectObject(bitmapdc,oldbitmap);
|
||||
DeleteObject(savedscreen);
|
||||
DeleteDC(bitmapdc);
|
||||
// release font cache
|
||||
for i:=0 to 255 do
|
||||
if bitmapfontcache[i]<>0 then
|
||||
DeleteObject(bitmapfontcache[i]);
|
||||
|
||||
LeaveCriticalSection(graphdrawing);
|
||||
{$ifdef DEBUG_WM_PAINT}
|
||||
close(graphdebug);
|
||||
@ -703,6 +819,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -729,6 +846,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -754,6 +872,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -779,6 +898,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -804,6 +924,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -830,6 +951,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -852,6 +974,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -878,6 +1001,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -900,6 +1024,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -926,6 +1051,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -948,6 +1074,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -972,6 +1099,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -994,6 +1122,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -1017,6 +1146,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -1039,6 +1169,7 @@ function queryadapterinfo : pmodeinfo;
|
||||
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI;
|
||||
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI;
|
||||
mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors;
|
||||
mode.DrawBitmapCharHoriz:={$ifdef fpc}@{$endif}DrawBitmapCharHorizWin32GUI;
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
AddMode(mode);
|
||||
@ -1049,7 +1180,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 2000-03-24 12:57:41 florian
|
||||
Revision 1.4 2000-03-24 18:18:15 florian
|
||||
* accelerated output of bitmap fonts
|
||||
|
||||
Revision 1.3 2000/03/24 12:57:41 florian
|
||||
* the window is now cleared by wm_create
|
||||
* default mode is again 640x480x16
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user