mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 09:32:00 +01: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
	 florian
						florian