From cca24e563202bf3eef24eab31861b4a307df0889 Mon Sep 17 00:00:00 2001 From: florian Date: Fri, 24 Mar 2000 18:18:15 +0000 Subject: [PATCH] * accelerated output of bitmap fonts --- rtl/win32/graph.pp | 140 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 3 deletions(-) diff --git a/rtl/win32/graph.pp b/rtl/win32/graph.pp index a16d29b2ea..3efed16391 100644 --- a/rtl/win32/graph.pp +++ b/rtl/win32/graph.pp @@ -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