diff --git a/lcl/interfaces/gtk2/gtk2winapi.inc b/lcl/interfaces/gtk2/gtk2winapi.inc index 81a834f788..f4c84bd861 100644 --- a/lcl/interfaces/gtk2/gtk2winapi.inc +++ b/lcl/interfaces/gtk2/gtk2winapi.inc @@ -6242,199 +6242,6 @@ begin Result:=false; end; -{------------------------------------------------------------------------------ - Function: GradientFill - Params: DC - DeviceContext to perform on - Vertices - array of Points W/Color & Alpha - NumVertices - Number of Vertices - Meshes - array of Triangle or Rectangle Meshes, - each mesh representing one Gradient Fill - NumMeshes - Number of Meshes - Mode - Gradient Type, either Triangle, - Vertical Rect, Horizontal Rect - - Returns: true on success - - Performs multiple Gradient Fills, either a Three way Triangle Gradient, - or a two way Rectangle Gradient, each Vertex point also supports optional - Alpha/Transparency for more advanced Gradients. - ------------------------------------------------------------------------------} -function TGtk2WidgetSet.GradientFill(DC: HDC; Vertices: PTriVertex; - NumVertices : Longint; Meshes: Pointer; NumMeshes : Longint; Mode : Longint - ): Boolean; - - function DoFillTriangle : Boolean; - begin - Result := (Mode and GRADIENT_FILL_TRIANGLE) = GRADIENT_FILL_TRIANGLE; - end; - - function DoFillVRect : Boolean; - begin - Result := (Mode and GRADIENT_FILL_RECT_V) = GRADIENT_FILL_RECT_V; - end; - - procedure GetGradientBrush(BeginColor, EndColor : TColorRef; Position, - TotalSteps : Longint; var GradientBrush : hBrush); - var - R1, G1, B1 : Integer; - R2, G2, B2 : Integer; - NewBrush : TLogBrush; - begin - GetRGBIntValues(BeginColor,R1,G1,B1); - GetRGBIntValues(EndColor,R2,G2,B2); - - R1 := R1 + (Position*(R2 - R1) div TotalSteps); - G1 := G1 + (Position*(G2 - G1) div TotalSteps); - B1 := B1 + (Position*(B2 - B1) div TotalSteps); - - with NewBrush do - begin - lbStyle := BS_SOLID; - lbColor := RGB(R1,G1,B1); - end; - - If GradientBrush <> 0 then - LCLIntf.DeleteObject(GradientBrush); - GradientBrush := LCLIntf.CreateBrushIndirect(NewBrush); - end; - - function FillTriMesh({%H-}Mesh : tagGradientTriangle) : Boolean; - {var - V1, V2, V3 : tagTRIVERTEX; - C1, C2, C3 : TColorRef; - begin - With Mesh do begin - Result := (Vertex1 < NumVertices) and (Vertex2 >= 0) and - (Vertex2 < NumVertices) and (Vertex2 >= 0) and - (Vertex3 < NumVertices) and (Vertex3 >= 0); - - If (Vertex1 = Vertex2) or (Vertex1 = Vertex3) or - (Vertex2 = Vertex3) or not Result - then - exit; - - V1 := Vertices[Vertex1]; - V2 := Vertices[Vertex2]; - V3 := Vertices[Vertex3]; - - //Check to make sure they are in reasonable positions.. - - //then what?? - end;} - begin - Result := False; - end; - - function FillRectMesh(Mesh : tagGradientRect) : Boolean; - var - TL, BR: tagTRIVERTEX; - StartColor, EndColor: TColorRef; - I, Swap: Longint; - SwapColors: Boolean; - UseBrush: hBrush; - Steps, MaxSteps: Int64; - begin - with Mesh do - begin - Result := (UpperLeft < NumVertices) and (LowerRight < NumVertices); - if (LowerRight = UpperLeft) or not Result then - exit; - TL := Vertices[UpperLeft]; - BR := Vertices[LowerRight]; - SwapColors := (BR.Y < TL.Y) and (BR.X < TL.X); - if BR.X < TL.X then - begin - Swap := BR.X; - BR.X := TL.X; - TL.X := Swap; - end; - if BR.Y < TL.Y then - begin - Swap := BR.Y; - BR.Y := TL.Y; - TL.Y := Swap; - end; - StartColor := RGB(TL.Red shr 8, TL.Green shr 8, TL.Blue shr 8); - EndColor := RGB(BR.Red shr 8, BR.Green shr 8, BR.Blue shr 8); - if SwapColors then - begin - Swap := StartColor; - StartColor := EndColor; - EndColor := Swap; - end; - UseBrush := 0; - MaxSteps := GetDeviceCaps(DC, BITSPIXEL); - if MaxSteps >= 32 then - MaxSteps := $FFFFFFFF - else - if MaxSteps >= 4 then - MaxSteps := 1 shl MaxSteps - else - MaxSteps := 256; - if DoFillVRect then - begin - Steps := Min(BR.Y - TL.Y, MaxSteps); - for I := 0 to Steps - 1 do - begin - GetGradientBrush(StartColor, EndColor, I, Steps, UseBrush); - LCLIntf.FillRect(DC, Rect(TL.X, TL.Y + I, BR.X, TL.Y + I + 1), - UseBrush) - end - end - else begin - Steps := Min(BR.X - TL.X, MaxSteps); - for I := 0 to Steps - 1 do - begin - GetGradientBrush(StartColor, EndColor, I, Steps, UseBrush); - LCLIntf.FillRect(DC, Rect(TL.X + I, TL.Y, TL.X + I + 1, BR.Y), - UseBrush); - end; - end; - If UseBrush <> 0 then - LCLIntf.DeleteObject(UseBrush); - end; - end; - -const - MeshSize: Array[Boolean] of Integer = ( - SizeOf(tagGradientRect), SizeOf(tagGradientTriangle)); -var - I : Integer; -begin - //Currently Alpha blending is ignored... Ideas anyone? - Result := (Meshes <> nil) and (NumMeshes >= 1) and (NumVertices >= 2) - and (Vertices <> nil); - if Result and DoFillTriangle then - Result := NumVertices >= 3; - if Result then - begin - Result := False; - - //Sanity Checks For Vertices Size vs. Count - if MemSize(Vertices) < PtrInt(SizeOf(tagTRIVERTEX)*NumVertices) then - exit; - - //Sanity Checks For Meshes Size vs. Count - if MemSize(Meshes) < PtrInt(MeshSize[DoFillTriangle]*NumMeshes) then - exit; - - for I := 0 to NumMeshes - 1 do - begin - if DoFillTriangle then - begin - If not FillTriMesh(PGradientTriangle(Meshes)[I]) then - exit; - end - else - begin - if not FillRectMesh(PGradientRect(Meshes)[I]) then - exit; - end; - end; - Result := True; - end; -end; - {------------------------------------------------------------------------------ Function: HideCaret Params: none diff --git a/lcl/interfaces/gtk2/gtk2winapih.inc b/lcl/interfaces/gtk2/gtk2winapih.inc index 63b57ef239..7ff3c0c898 100644 --- a/lcl/interfaces/gtk2/gtk2winapih.inc +++ b/lcl/interfaces/gtk2/gtk2winapih.inc @@ -153,8 +153,6 @@ function GetWindowOrgEx(dc : hdc; P: PPoint): Integer; override; function GetWindowRect(Handle : hwnd; var ARect: TRect): Integer; override; function GetWindowRelativePosition(Handle : hwnd; var Left, Top: integer): boolean; override; function GetWindowSize(Handle : hwnd; var Width, Height: integer): boolean; override; -function GradientFill(DC: HDC; Vertices: PTriVertex; NumVertices : Longint; - Meshes: Pointer; NumMeshes : Longint; Mode : Longint): Boolean; override; procedure InitializeCriticalSection(var CritSection: TCriticalSection); override; function InvalidateRect(aHandle : HWND; Rect : pRect; bErase : Boolean) : Boolean; override;