mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-03 11:37:21 +01:00
openglcontrol: added Red,Green,Blue bits for target gtk
git-svn-id: trunk@40229 -
This commit is contained in:
parent
043dd66828
commit
14423ccd1a
@ -149,7 +149,8 @@ function LOpenGLMakeCurrent(Handle: HWND): boolean;
|
|||||||
function LOpenGLCreateContext(AWinControl: TWinControl;
|
function LOpenGLCreateContext(AWinControl: TWinControl;
|
||||||
WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
|
WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
|
||||||
DoubleBuffered, RGBA: boolean;
|
DoubleBuffered, RGBA: boolean;
|
||||||
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
|
const RedBits, GreenBits, BlueBits,
|
||||||
|
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
|
||||||
const AParams: TCreateParams): HWND;
|
const AParams: TCreateParams): HWND;
|
||||||
procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
|
procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
|
||||||
|
|
||||||
@ -158,7 +159,8 @@ procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
|
|||||||
already checked that GLX_ARB_multisample is available. }
|
already checked that GLX_ARB_multisample is available. }
|
||||||
function CreateOpenGLContextAttrList(DoubleBuffered: boolean;
|
function CreateOpenGLContextAttrList(DoubleBuffered: boolean;
|
||||||
RGBA: boolean;
|
RGBA: boolean;
|
||||||
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal): PInteger;
|
const RedBits, GreenBits, BlueBits,
|
||||||
|
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal): PInteger;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -830,7 +832,8 @@ end;
|
|||||||
function LOpenGLCreateContextCore(AWinControl: TWinControl;
|
function LOpenGLCreateContextCore(AWinControl: TWinControl;
|
||||||
WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
|
WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
|
||||||
DoubleBuffered, RGBA: boolean;
|
DoubleBuffered, RGBA: boolean;
|
||||||
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
|
const RedBits, GreenBits, BlueBits,
|
||||||
|
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
|
||||||
const AParams: TCreateParams): HWND;
|
const AParams: TCreateParams): HWND;
|
||||||
var
|
var
|
||||||
NewWidget: PGtkWidget;
|
NewWidget: PGtkWidget;
|
||||||
@ -838,8 +841,8 @@ var
|
|||||||
AttrList: PInteger;
|
AttrList: PInteger;
|
||||||
begin
|
begin
|
||||||
if WSPrivate=nil then ;
|
if WSPrivate=nil then ;
|
||||||
AttrList:=CreateOpenGLContextAttrList(DoubleBuffered,RGBA,MultiSampling,
|
AttrList:=CreateOpenGLContextAttrList(DoubleBuffered,RGBA,RedBits,GreenBits,
|
||||||
AlphaBits,DepthBits,StencilBits,AUXBuffers);
|
BlueBits,MultiSampling,AlphaBits,DepthBits,StencilBits,AUXBuffers);
|
||||||
try
|
try
|
||||||
if SharedControl<>nil then begin
|
if SharedControl<>nil then begin
|
||||||
SharedArea:={%H-}PGtkGLArea(PtrUInt(SharedControl.Handle));
|
SharedArea:={%H-}PGtkGLArea(PtrUInt(SharedControl.Handle));
|
||||||
@ -866,7 +869,8 @@ end;
|
|||||||
function LOpenGLCreateContext(AWinControl: TWinControl;
|
function LOpenGLCreateContext(AWinControl: TWinControl;
|
||||||
WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
|
WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
|
||||||
DoubleBuffered, RGBA: boolean;
|
DoubleBuffered, RGBA: boolean;
|
||||||
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
|
const RedBits, GreenBits, BlueBits,
|
||||||
|
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
|
||||||
const AParams: TCreateParams): HWND;
|
const AParams: TCreateParams): HWND;
|
||||||
begin
|
begin
|
||||||
if (MultiSampling > 1) and
|
if (MultiSampling > 1) and
|
||||||
@ -879,16 +883,19 @@ begin
|
|||||||
{$ENDIF} then
|
{$ENDIF} then
|
||||||
try
|
try
|
||||||
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
|
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
|
||||||
DoubleBuffered, RGBA, MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
|
DoubleBuffered, RGBA, RedBits, GreenBits, BlueBits, MultiSampling,
|
||||||
|
AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
|
||||||
except
|
except
|
||||||
{ retry without MultiSampling }
|
{ retry without MultiSampling }
|
||||||
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
|
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
|
||||||
DoubleBuffered, RGBA, 1, AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
|
DoubleBuffered, RGBA, RedBits, GreenBits, BlueBits, 1, AlphaBits,
|
||||||
|
DepthBits, StencilBits, AUXBuffers, AParams);
|
||||||
end else
|
end else
|
||||||
{ no multi-sampling requested (or GLX_ARB_multisample not available),
|
{ no multi-sampling requested (or GLX_ARB_multisample not available),
|
||||||
just pass to LOpenGLCreateContextCore }
|
just pass to LOpenGLCreateContextCore }
|
||||||
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
|
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
|
||||||
DoubleBuffered, RGBA, MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
|
DoubleBuffered, RGBA, RedBits, GreenBits, BlueBits, MultiSampling,
|
||||||
|
AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
|
procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
|
||||||
@ -898,7 +905,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function CreateOpenGLContextAttrList(DoubleBuffered: boolean; RGBA: boolean;
|
function CreateOpenGLContextAttrList(DoubleBuffered: boolean; RGBA: boolean;
|
||||||
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal): PInteger;
|
const RedBits, GreenBits, BlueBits, MultiSampling, AlphaBits, DepthBits,
|
||||||
|
StencilBits, AUXBuffers: Cardinal): PInteger;
|
||||||
var
|
var
|
||||||
p: integer;
|
p: integer;
|
||||||
UseFBConfig: boolean;
|
UseFBConfig: boolean;
|
||||||
@ -924,9 +932,9 @@ var
|
|||||||
if not UseFBConfig then Add(GLX_RGBA);
|
if not UseFBConfig then Add(GLX_RGBA);
|
||||||
{ For UseFBConfig, glXChooseFBConfig already defaults to RGBA }
|
{ For UseFBConfig, glXChooseFBConfig already defaults to RGBA }
|
||||||
end;
|
end;
|
||||||
Add(GLX_RED_SIZE); Add(1);
|
Add(GLX_RED_SIZE); Add(RedBits);
|
||||||
Add(GLX_GREEN_SIZE); Add(1);
|
Add(GLX_GREEN_SIZE); Add(GreenBits);
|
||||||
Add(GLX_BLUE_SIZE); Add(1);
|
Add(GLX_BLUE_SIZE); Add(BlueBits);
|
||||||
if AlphaBits>0 then
|
if AlphaBits>0 then
|
||||||
begin
|
begin
|
||||||
Add(GLX_ALPHA_SIZE); Add(AlphaBits);
|
Add(GLX_ALPHA_SIZE); Add(AlphaBits);
|
||||||
|
|||||||
@ -65,9 +65,11 @@ uses
|
|||||||
Graphics, LMessages, WSLCLClasses, WSControls,
|
Graphics, LMessages, WSLCLClasses, WSControls,
|
||||||
{$IFDEF UseGtkGLX}
|
{$IFDEF UseGtkGLX}
|
||||||
GLGtkGlxContext;
|
GLGtkGlxContext;
|
||||||
|
{$DEFINE HasRGBBits}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
{$IFDEF UseGtk2GLX}
|
{$IFDEF UseGtk2GLX}
|
||||||
GLGtkGlxContext;
|
GLGtkGlxContext;
|
||||||
|
{$DEFINE HasRGBBits}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
{$IFDEF UseCarbonAGL}
|
{$IFDEF UseCarbonAGL}
|
||||||
GLCarbonAGLContext;
|
GLCarbonAGLContext;
|
||||||
@ -79,6 +81,8 @@ uses
|
|||||||
GLQTContext;
|
GLQTContext;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
const
|
||||||
|
DefaultDepthBits = 16;
|
||||||
|
|
||||||
type
|
type
|
||||||
TOpenGlCtrlMakeCurrentEvent = procedure(Sender: TObject;
|
TOpenGlCtrlMakeCurrentEvent = procedure(Sender: TObject;
|
||||||
@ -109,6 +113,9 @@ type
|
|||||||
FCurrentFrameTime: integer; // in msec
|
FCurrentFrameTime: integer; // in msec
|
||||||
FLastFrameTime: integer; // in msec
|
FLastFrameTime: integer; // in msec
|
||||||
FRGBA: boolean;
|
FRGBA: boolean;
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
FRedBits, FGreenBits, FBlueBits,
|
||||||
|
{$ENDIF}
|
||||||
FMultiSampling, FAlphaBits, FDepthBits, FStencilBits, FAUXBuffers: Cardinal;
|
FMultiSampling, FAlphaBits, FDepthBits, FStencilBits, FAUXBuffers: Cardinal;
|
||||||
FSharedOpenGLControl: TCustomOpenGLControl;
|
FSharedOpenGLControl: TCustomOpenGLControl;
|
||||||
FSharingOpenGlControls: TList;
|
FSharingOpenGlControls: TList;
|
||||||
@ -116,6 +123,11 @@ type
|
|||||||
procedure SetAutoResizeViewport(const AValue: boolean);
|
procedure SetAutoResizeViewport(const AValue: boolean);
|
||||||
procedure SetDoubleBuffered(const AValue: boolean);
|
procedure SetDoubleBuffered(const AValue: boolean);
|
||||||
procedure SetRGBA(const AValue: boolean);
|
procedure SetRGBA(const AValue: boolean);
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
procedure SetRedBits(const AValue: Cardinal);
|
||||||
|
procedure SetGreenBits(const AValue: Cardinal);
|
||||||
|
procedure SetBlueBits(const AValue: Cardinal);
|
||||||
|
{$ENDIF}
|
||||||
procedure SetMultiSampling(const AMultiSampling: Cardinal);
|
procedure SetMultiSampling(const AMultiSampling: Cardinal);
|
||||||
procedure SetAlphaBits(const AValue: Cardinal);
|
procedure SetAlphaBits(const AValue: Cardinal);
|
||||||
procedure SetDepthBits(const AValue: Cardinal);
|
procedure SetDepthBits(const AValue: Cardinal);
|
||||||
@ -151,7 +163,11 @@ type
|
|||||||
write SetAutoResizeViewport default false;
|
write SetAutoResizeViewport default false;
|
||||||
property DoubleBuffered: boolean read FDoubleBuffered write SetDoubleBuffered default true;
|
property DoubleBuffered: boolean read FDoubleBuffered write SetDoubleBuffered default true;
|
||||||
property RGBA: boolean read FRGBA write SetRGBA default true;
|
property RGBA: boolean read FRGBA write SetRGBA default true;
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
property RedBits: Cardinal read FRedBits write SetRedBits default 8;
|
||||||
|
property GreenBits: Cardinal read FGreenBits write SetGreenBits default 8;
|
||||||
|
property BlueBits: Cardinal read FBlueBits write SetBlueBits default 8;
|
||||||
|
{$ENDIF}
|
||||||
{ Number of samples per pixel, for OpenGL multi-sampling (anti-aliasing).
|
{ Number of samples per pixel, for OpenGL multi-sampling (anti-aliasing).
|
||||||
|
|
||||||
Value <= 1 means that we use 1 sample per pixel, which means no anti-aliasing.
|
Value <= 1 means that we use 1 sample per pixel, which means no anti-aliasing.
|
||||||
@ -166,7 +182,7 @@ type
|
|||||||
property MultiSampling: Cardinal read FMultiSampling write SetMultiSampling default 1;
|
property MultiSampling: Cardinal read FMultiSampling write SetMultiSampling default 1;
|
||||||
|
|
||||||
property AlphaBits: Cardinal read FAlphaBits write SetAlphaBits default 0;
|
property AlphaBits: Cardinal read FAlphaBits write SetAlphaBits default 0;
|
||||||
property DepthBits: Cardinal read FDepthBits write SetDepthBits default 16;
|
property DepthBits: Cardinal read FDepthBits write SetDepthBits default DefaultDepthBits;
|
||||||
property StencilBits: Cardinal read FStencilBits write SetStencilBits default 0;
|
property StencilBits: Cardinal read FStencilBits write SetStencilBits default 0;
|
||||||
property AUXBuffers: Cardinal read FAUXBuffers write SetAUXBuffers default 0;
|
property AUXBuffers: Cardinal read FAUXBuffers write SetAUXBuffers default 0;
|
||||||
end;
|
end;
|
||||||
@ -180,6 +196,11 @@ type
|
|||||||
property AutoResizeViewport;
|
property AutoResizeViewport;
|
||||||
property BorderSpacing;
|
property BorderSpacing;
|
||||||
property Enabled;
|
property Enabled;
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
property RedBits;
|
||||||
|
property GreenBits;
|
||||||
|
property BlueBits;
|
||||||
|
{$ENDIF}
|
||||||
property MultiSampling;
|
property MultiSampling;
|
||||||
property AlphaBits;
|
property AlphaBits;
|
||||||
property DepthBits;
|
property DepthBits;
|
||||||
@ -270,6 +291,29 @@ begin
|
|||||||
OpenGLAttributesChanged;
|
OpenGLAttributesChanged;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
procedure TCustomOpenGLControl.SetRedBits(const AValue: Cardinal);
|
||||||
|
begin
|
||||||
|
if FRedBits=AValue then exit;
|
||||||
|
FRedBits:=AValue;
|
||||||
|
OpenGLAttributesChanged;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomOpenGLControl.SetGreenBits(const AValue: Cardinal);
|
||||||
|
begin
|
||||||
|
if FGreenBits=AValue then exit;
|
||||||
|
FGreenBits:=AValue;
|
||||||
|
OpenGLAttributesChanged;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomOpenGLControl.SetBlueBits(const AValue: Cardinal);
|
||||||
|
begin
|
||||||
|
if FBlueBits=AValue then exit;
|
||||||
|
FBlueBits:=AValue;
|
||||||
|
OpenGLAttributesChanged;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
procedure TCustomOpenGLControl.SetMultiSampling(const AMultiSampling: Cardinal);
|
procedure TCustomOpenGLControl.SetMultiSampling(const AMultiSampling: Cardinal);
|
||||||
begin
|
begin
|
||||||
if FMultiSampling=AMultiSampling then exit;
|
if FMultiSampling=AMultiSampling then exit;
|
||||||
@ -297,12 +341,14 @@ begin
|
|||||||
FStencilBits:=AValue;
|
FStencilBits:=AValue;
|
||||||
OpenGLAttributesChanged;
|
OpenGLAttributesChanged;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomOpenGLControl.SetAUXBuffers(const AValue: Cardinal);
|
procedure TCustomOpenGLControl.SetAUXBuffers(const AValue: Cardinal);
|
||||||
begin
|
begin
|
||||||
if FAUXBuffers=AValue then exit;
|
if FAUXBuffers=AValue then exit;
|
||||||
FAUXBuffers:=AValue;
|
FAUXBuffers:=AValue;
|
||||||
OpenGLAttributesChanged;
|
OpenGLAttributesChanged;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomOpenGLControl.SetSharedControl(
|
procedure TCustomOpenGLControl.SetSharedControl(
|
||||||
const AValue: TCustomOpenGLControl);
|
const AValue: TCustomOpenGLControl);
|
||||||
begin
|
begin
|
||||||
@ -391,8 +437,13 @@ begin
|
|||||||
inherited Create(TheOwner);
|
inherited Create(TheOwner);
|
||||||
FDoubleBuffered:=true;
|
FDoubleBuffered:=true;
|
||||||
FRGBA:=true;
|
FRGBA:=true;
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
FRedBits:=8;
|
||||||
|
FGreenBits:=8;
|
||||||
|
FBlueBits:=8;
|
||||||
|
{$ENDIF}
|
||||||
FMultiSampling:=1;
|
FMultiSampling:=1;
|
||||||
FDepthBits:=16;
|
FDepthBits:=DefaultDepthBits;
|
||||||
ControlStyle:=ControlStyle-[csSetCaption];
|
ControlStyle:=ControlStyle-[csSetCaption];
|
||||||
if (csDesigning in ComponentState) then begin
|
if (csDesigning in ComponentState) then begin
|
||||||
FCanvas := TControlCanvas.Create;
|
FCanvas := TControlCanvas.Create;
|
||||||
@ -534,6 +585,11 @@ begin
|
|||||||
Result:=LOpenGLCreateContext(OpenGlControl,WSPrivate,
|
Result:=LOpenGLCreateContext(OpenGlControl,WSPrivate,
|
||||||
OpenGlControl.SharedControl,
|
OpenGlControl.SharedControl,
|
||||||
AttrControl.DoubleBuffered,AttrControl.RGBA,
|
AttrControl.DoubleBuffered,AttrControl.RGBA,
|
||||||
|
{$IFDEF HasRGBBits}
|
||||||
|
AttrControl.RedBits,
|
||||||
|
AttrControl.GreenBits,
|
||||||
|
AttrControl.BlueBits,
|
||||||
|
{$ENDIF}
|
||||||
AttrControl.MultiSampling,
|
AttrControl.MultiSampling,
|
||||||
AttrControl.AlphaBits,
|
AttrControl.AlphaBits,
|
||||||
AttrControl.DepthBits,
|
AttrControl.DepthBits,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user