* accelerated output of bitmap fonts

This commit is contained in:
florian 2000-03-24 18:18:15 +00:00
parent fe462795f6
commit cca24e5632

View File

@ -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