2007-09-29 00:59:44 +00:00
|
|
|
{-----------------------------------------------------------------------------
|
|
|
|
The contents of this file are subject to the Mozilla Public License
|
|
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
|
|
|
|
The Original Code is: JvXPCoreUtils.PAS, released on 2004-01-01.
|
|
|
|
|
|
|
|
The Initial Developer of the Original Code is Marc Hoffman.
|
|
|
|
Portions created by Marc Hoffman are Copyright (C) 2002 APRIORI business solutions AG.
|
|
|
|
Portions created by APRIORI business solutions AG are Copyright (C) 2002 APRIORI business solutions AG
|
|
|
|
All Rights Reserved.
|
|
|
|
|
|
|
|
Contributor(s):
|
|
|
|
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
|
|
located at http://jvcl.sourceforge.net
|
|
|
|
|
|
|
|
Known Issues:
|
|
|
|
-----------------------------------------------------------------------------}
|
|
|
|
// $Id: JvXPCoreUtils.pas 11400 2007-06-28 21:24:06Z ahuser $
|
|
|
|
|
|
|
|
// Ported to Lazarus (no too hard after all) by Sergio Samayoa - september 2007.
|
|
|
|
// Still dont tested on linux.
|
|
|
|
|
|
|
|
unit JvXPCoreUtils;
|
|
|
|
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
|
|
|
Classes, Controls, Graphics, LCLIntf, LCLType, SysUtils,
|
|
|
|
TypInfo, JvXPCore;
|
|
|
|
|
|
|
|
function JvXPMethodsEqual(const Method1, Method2: TMethod): Boolean;
|
|
|
|
procedure JvXPDrawLine(const ACanvas: TCanvas; const X1, Y1, X2, Y2: Integer);
|
|
|
|
|
2007-10-03 14:30:38 +00:00
|
|
|
(******************** NOT CONVERTED - NOT USED
|
2007-09-29 00:59:44 +00:00
|
|
|
procedure JvXPCreateGradientRect(const AWidth, AHeight: Integer; const StartColor,
|
|
|
|
EndColor: TColor; const AColors: TJvXPGradientColors; const Style: TJvXPGradientStyle;
|
|
|
|
const Dithered: Boolean; var Bitmap: TBitmap);
|
|
|
|
procedure JvXPAdjustBoundRect(const BorderWidth: Byte;
|
|
|
|
const ShowBoundLines: Boolean; const BoundLines: TJvXPBoundLines; var Rect: TRect);
|
|
|
|
procedure JvXPDrawBoundLines(const ACanvas: TCanvas; const BoundLines: TJvXPBoundLines;
|
|
|
|
const AColor: TColor; const Rect: TRect);
|
|
|
|
|
|
|
|
//
|
|
|
|
// attic!
|
|
|
|
//
|
|
|
|
|
|
|
|
procedure JvXPConvertToGray2(Bitmap: TBitmap);
|
|
|
|
procedure JvXPRenderText(const AParent: TControl; const ACanvas: TCanvas;
|
|
|
|
ACaption: TCaption; const AFont: TFont; const AEnabled, AShowAccelChar: Boolean;
|
|
|
|
var ARect: TRect; AFlags: Integer);
|
2007-10-03 14:30:38 +00:00
|
|
|
******************** NOT CONVERTED *)
|
|
|
|
|
2007-09-29 00:59:44 +00:00
|
|
|
procedure JvXPFrame3D(const ACanvas: TCanvas; const ARect: TRect;
|
|
|
|
const TopColor, BottomColor: TColor; const Swapped: Boolean = False);
|
2007-10-03 14:30:38 +00:00
|
|
|
|
|
|
|
(******************** NOT CONVERTED - NOT USED
|
2007-09-29 00:59:44 +00:00
|
|
|
procedure JvXPColorizeBitmap(Bitmap: TBitmap; const AColor: TColor);
|
|
|
|
procedure JvXPSetDrawFlags(const AAlignment: TAlignment; const AWordWrap: Boolean;
|
|
|
|
var Flags: Integer);
|
|
|
|
procedure JvXPPlaceText(const AParent: TControl; const ACanvas: TCanvas;
|
|
|
|
const AText: TCaption; const AFont: TFont; const AEnabled, AShowAccelChar: Boolean;
|
|
|
|
const AAlignment: TAlignment; const AWordWrap: Boolean; var Rect: TRect);
|
2007-10-03 14:30:38 +00:00
|
|
|
******************** NOT CONVERTED *)
|
2007-09-29 00:59:44 +00:00
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
function JvXPMethodsEqual(const Method1, Method2: TMethod): Boolean;
|
|
|
|
begin
|
|
|
|
Result := (Method1.Code = Method2.Code) and (Method1.Data = Method2.Data);
|
|
|
|
end;
|
|
|
|
|
2007-10-03 14:30:38 +00:00
|
|
|
(******************** NOT USED
|
2007-09-29 00:59:44 +00:00
|
|
|
procedure JvXPCreateGradientRect(const AWidth, AHeight: Integer; const StartColor,
|
|
|
|
EndColor: TColor; const AColors: TJvXPGradientColors; const Style: TJvXPGradientStyle;
|
|
|
|
const Dithered: Boolean; var Bitmap: TBitmap);
|
|
|
|
{ // Short version...
|
|
|
|
var
|
|
|
|
gd: TGradientDirection;
|
|
|
|
begin
|
|
|
|
if (AHeight <= 0) or (AWidth <= 0) then
|
|
|
|
Exit;
|
|
|
|
Bitmap.Height := AHeight;
|
|
|
|
Bitmap.Width := AWidth;
|
|
|
|
Bitmap.PixelFormat := pf24bit;
|
|
|
|
if Style in [gsLeft, gsRight] then
|
|
|
|
gd := gdHorizontal
|
|
|
|
else
|
|
|
|
gd := gdVertical;
|
|
|
|
Bitmap.Canvas.GradientFill(Rect(0, 0, AWidth, AHeight), StartColor, EndColor, gd);
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
const
|
|
|
|
PixelCountMax = 32768;
|
|
|
|
DitherDepth = 16;
|
|
|
|
type
|
|
|
|
TGradientBand = array [0..255] of TColor;
|
|
|
|
TRGBMap = packed record
|
|
|
|
case Boolean of
|
|
|
|
True:
|
|
|
|
(RGBVal: DWord);
|
|
|
|
False:
|
|
|
|
(R, G, B, D: Byte);
|
|
|
|
end;
|
|
|
|
PRGBTripleArray = ^TRGBTripleArray;
|
|
|
|
TRGBTripleArray = array [0..PixelCountMax-1] of TRGBTriple;
|
|
|
|
var
|
|
|
|
iLoop, xLoop, yLoop, XX, YY: Integer;
|
|
|
|
iBndS, iBndE: Integer;
|
|
|
|
GBand: TGradientBand;
|
|
|
|
Row: PRGBTripleArray;
|
|
|
|
|
|
|
|
procedure CalculateGradientBand;
|
|
|
|
var
|
|
|
|
rR, rG, rB: Real;
|
|
|
|
lCol, hCol: TRGBMap;
|
|
|
|
iStp: Integer;
|
|
|
|
begin
|
|
|
|
if Style in [gsLeft, gsTop] then
|
|
|
|
begin
|
|
|
|
lCol.RGBVal := ColorToRGB(StartColor);
|
|
|
|
hCol.RGBVal := ColorToRGB(EndColor);
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
lCol.RGBVal := ColorToRGB(EndColor);
|
|
|
|
hCol.RGBVal := ColorToRGB(StartColor);
|
|
|
|
end;
|
|
|
|
rR := (hCol.R - lCol.R) / (AColors - 1);
|
|
|
|
rG := (hCol.G - lCol.G) / (AColors - 1);
|
|
|
|
rB := (hCol.B - lCol.B) / (AColors - 1);
|
|
|
|
for iStp := 0 to (AColors - 1) do
|
|
|
|
GBand[iStp] := RGB(
|
|
|
|
lCol.R + Round(rR * iStp),
|
|
|
|
lCol.G + Round(rG * iStp),
|
|
|
|
lCol.B + Round(rB * iStp));
|
|
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
|
|
// Exit if Height or Width are not positive. If not, the calls would lead to
|
|
|
|
// GDI errors about "Invalid parameter" and/or "Out Of Resources".
|
|
|
|
if (AHeight <= 0) or (AWidth <= 0) then
|
|
|
|
Exit;
|
|
|
|
|
|
|
|
Bitmap.Height := AHeight;
|
|
|
|
Bitmap.Width := AWidth;
|
|
|
|
Bitmap.PixelFormat := pf24bit;
|
|
|
|
|
|
|
|
CalculateGradientBand;
|
|
|
|
|
|
|
|
with Bitmap.Canvas do
|
|
|
|
begin
|
|
|
|
Brush.Color := StartColor;
|
|
|
|
FillRect(Bounds(0, 0, AWidth, AHeight));
|
|
|
|
if Style in [gsLeft, gsRight] then
|
|
|
|
begin
|
|
|
|
for iLoop := 0 to AColors - 1 do
|
|
|
|
begin
|
|
|
|
iBndS := MulDiv(iLoop, AWidth, AColors);
|
|
|
|
iBndE := MulDiv(iLoop + 1, AWidth, AColors);
|
|
|
|
Brush.Color := GBand[iLoop];
|
|
|
|
PatBlt(Handle, iBndS, 0, iBndE, AHeigth, PATCOPY);
|
|
|
|
if (iLoop > 0) and Dithered then
|
|
|
|
for yLoop := 0 to DitherDepth - 1 do
|
|
|
|
if yLoop < AHeight then
|
|
|
|
begin
|
|
|
|
Row := Bitmap.ScanLine[yLoop];
|
|
|
|
for xLoop := 0 to AWidth div (AColors - 1) do
|
|
|
|
begin
|
|
|
|
XX := iBndS + Random(xLoop);
|
|
|
|
if (XX < AWidth) and (XX > -1) then
|
|
|
|
with Row[XX] do
|
|
|
|
begin
|
|
|
|
rgbtRed := GetRValue(GBand[iLoop - 1]);
|
|
|
|
rgbtGreen := GetGValue(GBand[iLoop - 1]);
|
|
|
|
rgbtBlue := GetBValue(GBand[iLoop - 1]);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
for yLoop := 1 to AHeight div DitherDepth do
|
|
|
|
CopyRect(Bounds(0, yLoop * DitherDepth, AWidth, DitherDepth),
|
|
|
|
Bitmap.Canvas, Bounds(0, 0, AWidth, DitherDepth));
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
for iLoop := 0 to AColors - 1 do
|
|
|
|
begin
|
|
|
|
iBndS := MulDiv(iLoop, AHeight, AColors);
|
|
|
|
iBndE := MulDiv(iLoop + 1, AHeight, AColors);
|
|
|
|
Brush.Color := GBand[iLoop];
|
|
|
|
PatBlt(Handle, 0, iBndS, AWidth, iBndE, PATCOPY);
|
|
|
|
if (iLoop > 0) and Dithered then
|
|
|
|
for yLoop := 0 to AHeight div (AColors - 1) do
|
|
|
|
begin
|
|
|
|
YY := iBndS + Random(yLoop);
|
|
|
|
if (YY < AHeight) and (YY > -1) then
|
|
|
|
begin
|
|
|
|
Row := Bitmap.ScanLine[YY];
|
|
|
|
for xLoop := 0 to DitherDepth - 1 do
|
|
|
|
if xLoop < AWidth then
|
|
|
|
with Row[xLoop] do
|
|
|
|
begin
|
|
|
|
rgbtRed := GetRValue(GBand[iLoop - 1]);
|
|
|
|
rgbtGreen := GetGValue(GBand[iLoop - 1]);
|
|
|
|
rgbtBlue := GetBValue(GBand[iLoop - 1]);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
for xLoop := 0 to AWidth div DitherDepth do
|
|
|
|
CopyRect(Bounds(xLoop * DitherDepth, 0, DitherDepth, AHeight),
|
|
|
|
Bitmap.Canvas, Bounds(0, 0, DitherDepth, AHeight));
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
2007-10-03 14:30:38 +00:00
|
|
|
******************** NOT USED *)
|
2007-09-29 00:59:44 +00:00
|
|
|
|
|
|
|
procedure JvXPDrawLine(const ACanvas: TCanvas; const X1, Y1, X2, Y2: Integer);
|
|
|
|
begin
|
|
|
|
with ACanvas do
|
|
|
|
begin
|
|
|
|
MoveTo(X1, Y1);
|
|
|
|
LineTo(X2, Y2);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2007-10-03 14:30:38 +00:00
|
|
|
(******************** NOT CONVERTED - NOT USED
|
2007-09-29 00:59:44 +00:00
|
|
|
procedure JvXPAdjustBoundRect(const BorderWidth: Byte;
|
|
|
|
const ShowBoundLines: Boolean; const BoundLines: TJvXPBoundLines;
|
|
|
|
var Rect: TRect);
|
|
|
|
begin
|
|
|
|
InflateRect(Rect, -BorderWidth, -BorderWidth);
|
|
|
|
if not ShowBoundLines then
|
|
|
|
Exit;
|
|
|
|
if blLeft in BoundLines then
|
|
|
|
Inc(Rect.Left);
|
|
|
|
if blRight in BoundLines then
|
|
|
|
Dec(Rect.Right);
|
|
|
|
if blTop in BoundLines then
|
|
|
|
Inc(Rect.Top);
|
|
|
|
if blBottom in BoundLines then
|
|
|
|
Dec(Rect.Bottom);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure JvXPDrawBoundLines(const ACanvas: TCanvas; const BoundLines: TJvXPBoundLines;
|
|
|
|
const AColor: TColor; const Rect: TRect);
|
|
|
|
begin
|
|
|
|
with ACanvas do
|
|
|
|
begin
|
|
|
|
Pen.Color := AColor;
|
|
|
|
Pen.Style := psSolid;
|
|
|
|
if blLeft in BoundLines then
|
|
|
|
JvXPDrawLine(ACanvas, Rect.Left, Rect.Top, Rect.Left, Rect.Bottom - 1);
|
|
|
|
if blTop in BoundLines then
|
|
|
|
JvXPDrawLine(ACanvas, Rect.Left, Rect.Top, Rect.Right, Rect.Top);
|
|
|
|
if blRight in BoundLines then
|
|
|
|
JvXPDrawLine(ACanvas, Rect.Right - 1, Rect.Top, Rect.Right - 1, Rect.Bottom - 1);
|
|
|
|
if blBottom in BoundLines then
|
|
|
|
JvXPDrawLine(ACanvas, Rect.Top, Rect.Bottom - 1, Rect.Right, Rect.Bottom - 1);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
//
|
|
|
|
// attic
|
|
|
|
//
|
|
|
|
|
|
|
|
procedure JvXPConvertToGray2(Bitmap: TBitmap);
|
|
|
|
var
|
|
|
|
x, y, c: Integer;
|
|
|
|
PxlColor: TColor;
|
|
|
|
begin
|
|
|
|
for x := 0 to Bitmap.Width - 1 do
|
|
|
|
for y := 0 to Bitmap.Height - 1 do
|
|
|
|
begin
|
|
|
|
PxlColor := ColorToRGB(Bitmap.Canvas.Pixels[x, y]);
|
|
|
|
c := (PxlColor shr 16 + ((PxlColor shr 8) and $00FF) + PxlColor and $0000FF) div 3 + 100;
|
|
|
|
if c > 255 then
|
|
|
|
c := 255;
|
|
|
|
Bitmap.Canvas.Pixels[x, y] := RGB(c, c, c);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure JvXPRenderText(const AParent: TControl; const ACanvas: TCanvas;
|
|
|
|
ACaption: TCaption; const AFont: TFont; const AEnabled, AShowAccelChar: Boolean;
|
|
|
|
var ARect: TRect; AFlags: Integer);
|
|
|
|
|
|
|
|
procedure DoDrawText;
|
|
|
|
begin
|
|
|
|
// (rom) Kludge! This will probably not work for CLX
|
|
|
|
DrawText(ACanvas.Handle, PChar(ACaption), -1, ARect, AFlags);
|
|
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
|
|
if (AFlags and DT_CALCRECT <> 0) and ((ACaption = '') or AShowAccelChar and
|
|
|
|
(ACaption[1] = '&') and (ACaption[2] = #0)) then
|
|
|
|
ACaption := ACaption + ' ';
|
|
|
|
if not AShowAccelChar then
|
|
|
|
AFlags := AFlags or DT_NOPREFIX;
|
|
|
|
AFlags := AParent.DrawTextBiDiModeFlags(AFlags);
|
|
|
|
with ACanvas do
|
|
|
|
begin
|
|
|
|
Font.Assign(AFont);
|
|
|
|
if not AEnabled then
|
|
|
|
Font.Color := dxColor_Msc_Dis_Caption_WXP;
|
|
|
|
if not AEnabled then
|
|
|
|
begin
|
|
|
|
OffsetRect(ARect, 1, 1);
|
|
|
|
Font.Color := clBtnHighlight;
|
|
|
|
DoDrawText;
|
|
|
|
OffsetRect(ARect, -1, -1);
|
|
|
|
Font.Color := clBtnShadow;
|
|
|
|
DoDrawText;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
DoDrawText;
|
|
|
|
end;
|
|
|
|
end;
|
2007-10-03 14:30:38 +00:00
|
|
|
******************** NOT CONVERTED *)
|
2007-09-29 00:59:44 +00:00
|
|
|
|
|
|
|
procedure JvXPFrame3D(const ACanvas: TCanvas; const ARect: TRect;
|
|
|
|
const TopColor, BottomColor: TColor; const Swapped: Boolean = False);
|
|
|
|
var
|
|
|
|
ATopColor, ABottomColor: TColor;
|
|
|
|
begin
|
|
|
|
ATopColor := TopColor;
|
|
|
|
ABottomColor := BottomColor;
|
|
|
|
if Swapped then
|
|
|
|
begin
|
|
|
|
ATopColor := BottomColor;
|
|
|
|
ABottomColor := TopColor;
|
|
|
|
end;
|
|
|
|
with ACanvas do
|
|
|
|
begin
|
|
|
|
Pen.Color := ATopColor;
|
|
|
|
// 21.09.07 - SESS
|
|
|
|
Polyline([
|
|
|
|
Classes.Point(ARect.Left, ARect.Bottom - 1),
|
|
|
|
Classes.Point(ARect.Left, ARect.Top),
|
|
|
|
Classes.Point(ARect.Right - 1, ARect.Top)]);
|
|
|
|
Pen.Color := ABottomColor;
|
|
|
|
Polyline([
|
|
|
|
Classes.Point(ARect.Right - 1, ARect.Top + 1),
|
|
|
|
Classes.Point(ARect.Right - 1 , ARect.Bottom - 1),
|
|
|
|
Classes.Point(ARect.Left, ARect.Bottom - 1)]);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2007-10-03 14:30:38 +00:00
|
|
|
(******************** NOT CONVERTED
|
2007-09-29 00:59:44 +00:00
|
|
|
procedure JvXPColorizeBitmap(Bitmap: TBitmap; const AColor: TColor);
|
|
|
|
var
|
|
|
|
ColorMap: TBitmap;
|
|
|
|
Rect: TRect;
|
|
|
|
begin
|
|
|
|
Rect := Bounds(0, 0, Bitmap.Width, Bitmap.Height);
|
|
|
|
ColorMap := TBitmap.Create;
|
|
|
|
try
|
|
|
|
ColorMap.Assign(Bitmap);
|
|
|
|
Bitmap.FreeImage;
|
|
|
|
with ColorMap.Canvas do
|
|
|
|
begin
|
|
|
|
Brush.Color := AColor;
|
|
|
|
BrushCopy( Rect, Bitmap, Rect, clBlack);
|
|
|
|
end;
|
|
|
|
Bitmap.Assign(ColorMap);
|
|
|
|
finally
|
|
|
|
ColorMap.Free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure JvXPSetDrawFlags(const AAlignment: TAlignment; const AWordWrap: Boolean;
|
|
|
|
var Flags: Integer);
|
|
|
|
begin
|
|
|
|
Flags := DT_END_ELLIPSIS;
|
|
|
|
case AAlignment of
|
|
|
|
taLeftJustify:
|
|
|
|
Flags := Flags or DT_LEFT;
|
|
|
|
taCenter:
|
|
|
|
Flags := Flags or DT_CENTER;
|
|
|
|
taRightJustify:
|
|
|
|
Flags := Flags or DT_RIGHT;
|
|
|
|
end;
|
|
|
|
if not AWordWrap then
|
|
|
|
Flags := Flags or DT_SINGLELINE
|
|
|
|
else
|
|
|
|
Flags := Flags or DT_WORDBREAK;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure JvXPPlaceText(const AParent: TControl; const ACanvas: TCanvas; const AText: TCaption;
|
|
|
|
const AFont: TFont; const AEnabled, AShowAccelChar: Boolean; const AAlignment: TAlignment;
|
|
|
|
const AWordWrap: Boolean; var Rect: TRect);
|
|
|
|
var
|
|
|
|
Flags, DX, OH, OW: Integer;
|
|
|
|
begin
|
|
|
|
OH := Rect.Bottom - Rect.Top;
|
|
|
|
OW := Rect.Right - Rect.Left;
|
|
|
|
JvXPSetDrawFlags(AAlignment, AWordWrap, Flags);
|
|
|
|
JvXPRenderText(AParent, ACanvas, AText, AFont, AEnabled, AShowAccelChar, Rect,
|
|
|
|
Flags or DT_CALCRECT);
|
|
|
|
if AAlignment = taRightJustify then
|
|
|
|
DX := OW - (Rect.Right + Rect.Left)
|
|
|
|
else
|
|
|
|
if AAlignment = taCenter then
|
|
|
|
DX := (OW - Rect.Right) div 2
|
|
|
|
else
|
|
|
|
DX := 0;
|
|
|
|
OffsetRect(Rect, DX, (OH - Rect.Bottom) div 2);
|
|
|
|
JvXPRenderText(AParent, ACanvas, AText, AFont, AEnabled, AShowAccelChar, Rect, Flags);
|
|
|
|
end;
|
2007-10-03 14:30:38 +00:00
|
|
|
******************** NOT CONVERTED *)
|
2007-09-29 00:59:44 +00:00
|
|
|
|
|
|
|
end.
|
|
|
|
|