From 1fe77932889db2388affa8538c2e5d8af64ff581 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 8 Dec 1999 09:09:34 +0000 Subject: [PATCH] + add VESA compatible mode in 16 and 256 colors --- rtl/win32/graph.inc | 108 ++++++++++++++++++++++++++++++++++++++++++- rtl/win32/graphh.inc | 38 ++++++++++++++- 2 files changed, 143 insertions(+), 3 deletions(-) diff --git a/rtl/win32/graph.inc b/rtl/win32/graph.inc index 5bb647f940..fe43455acc 100644 --- a/rtl/win32/graph.inc +++ b/rtl/win32/graph.inc @@ -40,6 +40,9 @@ var graphdrawing : tcriticalsection; {$ifdef DEBUG_WM_PAINT} graphdebug : text; +const + wm_paint_count : longint = 0; +var {$endif DEBUG_WM_PAINT} bitmapdc : hdc; oldbitmap : hgdiobj; @@ -65,6 +68,8 @@ function GetPaletteEntry(r,g,b : word) : word; begin index:=i; dist:=currentdist; + if dist=0 then + break; end; end; GetPaletteEntry:=index; @@ -342,6 +347,9 @@ begin WindowProc:=charmessagehandler(window,amessage,wparam,lparam); wm_paint: begin +{$ifdef DEBUG_WM_PAINT} + inc(wm_paint_count); +{$endif DEBUG_WM_PAINT} if not GetUpdateRect(Window,@r,false) then exit; EnterCriticalSection(graphdrawing); @@ -534,10 +542,13 @@ function queryadapterinfo : pmodeinfo; var mode: TModeInfo; + ScreenWidth,ScreenHeight : longint; begin SaveVideoState:=savestate; RestoreVideoState:=restorestate; + ScreenWidth:=GetSystemMetrics(SM_CXSCREEN); + ScreenHeight:=GetSystemMetrics(SM_CYSCREEN); QueryAdapterInfo := ModeList; { If the mode listing already exists... } { simply return it, without changing } @@ -611,11 +622,106 @@ function queryadapterinfo : pmodeinfo; mode.XAspect := 10000; mode.YAspect := 10000; AddMode(mode); + InitMode(mode); + mode.DriverNumber:= VESA; + mode.HardwarePages:= 0; + mode.ModeNumber:=m640x400x256; + mode.ModeName:='640 x 400 x 256 Win32GUI'; + mode.MaxColor := 256; + mode.PaletteSize := mode.MaxColor; + mode.DirectColor := FALSE; + mode.MaxX := 639; + mode.MaxY := 399; + mode.DirectPutPixel:={$ifdef fpc}@{$endif}DirectPutPixel16Win32GUI; + mode.PutPixel:={$ifdef fpc}@{$endif}PutPixel16Win32GUI; + mode.GetPixel:={$ifdef fpc}@{$endif}GetPixel16Win32GUI; + mode.HLine := {$ifdef fpc}@{$endif}HLine16Win32GUI; + mode.SetRGBPalette := {$ifdef fpc}@{$endif}SetRGBPaletteWin32GUI; + mode.GetRGBPalette := {$ifdef fpc}@{$endif}GetRGBPaletteWin32GUI; + mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI; + mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI; + mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors; + mode.XAspect := 10000; + mode.YAspect := 10000; + AddMode(mode); + InitMode(mode); + mode.DriverNumber:= VESA; + mode.HardwarePages:= 0; + mode.ModeNumber:=m640x480x256; + mode.ModeName:='640 x 480 x 256 Win32GUI'; + mode.MaxColor := 256; + mode.PaletteSize := mode.MaxColor; + mode.DirectColor := FALSE; + mode.MaxX := 639; + mode.MaxY := 479; + mode.DirectPutPixel:={$ifdef fpc}@{$endif}DirectPutPixel16Win32GUI; + mode.PutPixel:={$ifdef fpc}@{$endif}PutPixel16Win32GUI; + mode.GetPixel:={$ifdef fpc}@{$endif}GetPixel16Win32GUI; + mode.HLine := {$ifdef fpc}@{$endif}HLine16Win32GUI; + mode.SetRGBPalette := {$ifdef fpc}@{$endif}SetRGBPaletteWin32GUI; + mode.GetRGBPalette := {$ifdef fpc}@{$endif}GetRGBPaletteWin32GUI; + mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI; + mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI; + mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors; + mode.XAspect := 10000; + mode.YAspect := 10000; + AddMode(mode); + { add 800x600 only if screen is large enough } + If (ScreenWidth>=800) and (ScreenHeight>=600) then + begin + InitMode(mode); + mode.DriverNumber:= VESA; + mode.HardwarePages:= 0; + mode.ModeNumber:=m800x600x16; + mode.ModeName:='800 x 600 x 16 Win32GUI'; + mode.MaxColor := 16; + mode.PaletteSize := mode.MaxColor; + mode.DirectColor := FALSE; + mode.MaxX := 799; + mode.MaxY := 599; + mode.DirectPutPixel:={$ifdef fpc}@{$endif}DirectPutPixel16Win32GUI; + mode.PutPixel:={$ifdef fpc}@{$endif}PutPixel16Win32GUI; + mode.GetPixel:={$ifdef fpc}@{$endif}GetPixel16Win32GUI; + mode.HLine := {$ifdef fpc}@{$endif}HLine16Win32GUI; + mode.SetRGBPalette := {$ifdef fpc}@{$endif}SetRGBPaletteWin32GUI; + mode.GetRGBPalette := {$ifdef fpc}@{$endif}GetRGBPaletteWin32GUI; + mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI; + mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI; + mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors; + mode.XAspect := 10000; + mode.YAspect := 10000; + AddMode(mode); + InitMode(mode); + mode.DriverNumber:= VESA; + mode.HardwarePages:= 0; + mode.ModeNumber:=m800x600x256; + mode.ModeName:='800 x 600 x 256 Win32GUI'; + mode.MaxColor := 256; + mode.PaletteSize := mode.MaxColor; + mode.DirectColor := FALSE; + mode.MaxX := 799; + mode.MaxY := 599; + mode.DirectPutPixel:={$ifdef fpc}@{$endif}DirectPutPixel16Win32GUI; + mode.PutPixel:={$ifdef fpc}@{$endif}PutPixel16Win32GUI; + mode.GetPixel:={$ifdef fpc}@{$endif}GetPixel16Win32GUI; + mode.HLine := {$ifdef fpc}@{$endif}HLine16Win32GUI; + mode.SetRGBPalette := {$ifdef fpc}@{$endif}SetRGBPaletteWin32GUI; + mode.GetRGBPalette := {$ifdef fpc}@{$endif}GetRGBPaletteWin32GUI; + mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualWin32GUI; + mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveWin32GUI; + mode.InitMode := {$ifdef fpc}@{$endif}InitWin32GUI16colors; + mode.XAspect := 10000; + mode.YAspect := 10000; + AddMode(mode); + end; end; { $Log$ - Revision 1.4 1999-12-02 00:24:36 pierre + Revision 1.5 1999-12-08 09:09:34 pierre + + add VESA compatible mode in 16 and 256 colors + + Revision 1.4 1999/12/02 00:24:36 pierre * local var col was undefined + 640x200 and 640x350 modes added (VGALo and VGAMed) * WM_PAINT better handled (only requested region written) diff --git a/rtl/win32/graphh.inc b/rtl/win32/graphh.inc index 369c9e3b60..587e8e1826 100644 --- a/rtl/win32/graphh.inc +++ b/rtl/win32/graphh.inc @@ -27,11 +27,45 @@ const { predefined window style } graphwindowstyle : DWord = cs_hRedraw or cs_vRedraw; - + +CONST + + m640x200x16 = VGALo; + m640x400x16 = VGAMed; + m640x480x16 = VGAHi; + + { VESA Specific video modes. } + m320x200x32k = $10D; + m320x200x64k = $10E; + + m640x400x256 = $100; + + m640x480x256 = $101; + m640x480x32k = $110; + m640x480x64k = $111; + + m800x600x16 = $102; + m800x600x256 = $103; + m800x600x32k = $113; + m800x600x64k = $114; + + m1024x768x16 = $104; + m1024x768x256 = $105; + m1024x768x32k = $116; + m1024x768x64k = $117; + + m1280x1024x16 = $106; + m1280x1024x256 = $107; + m1280x1024x32k = $119; + m1280x1024x64k = $11A; + { $Log$ - Revision 1.2 1999-11-29 22:03:39 florian + Revision 1.3 1999-12-08 09:09:34 pierre + + add VESA compatible mode in 16 and 256 colors + + Revision 1.2 1999/11/29 22:03:39 florian * first implementation of winmouse unit Revision 1.1 1999/11/08 15:01:39 peter