* Use the font orientation feature to draw rotate text instead of using an intermediary rotated bitmap

* Add urotatebitmap to the package file so the ide can track changes in it
(Changes acknowledged by eugen)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1173 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
blikblum
2010-03-01 18:16:55 +00:00
parent c11c5f7592
commit 0c024f25e6
4 changed files with 65 additions and 139 deletions

View File

@ -15,7 +15,7 @@
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Files Count="2">
<Files Count="3">
<Item1>
<Filename Value="src\ugradtabcontrol.pas"/>
<HasRegisterProc Value="True"/>
@ -26,6 +26,10 @@
<HasRegisterProc Value="True"/>
<UnitName Value="ugradbtn"/>
</Item2>
<Item3>
<Filename Value="src\urotatebitmap.pas"/>
<UnitName Value="uRotateBitmap"/>
</Item3>
</Files>
<Type Value="RunAndDesignTime"/>
<RequiredPkgs Count="3">

View File

@ -1,16 +1,13 @@
{ Diese Datei wurde automatisch von Lazarus erzeugt. Sie darf nicht bearbeitet
werden!
Dieser Quelltext dient nur dem Übersetzen und Installieren des Packages.
{ This file was automatically created by Lazarus. do not edit !
This source is only used to compile and install the package.
}
unit gradcontrols;
interface
uses
ugradtabcontrol, ugradbtn, LazarusPackageIntf;
ugradtabcontrol, ugradbtn, uRotateBitmap, LazarusPackageIntf;
implementation

View File

@ -46,7 +46,6 @@ type
FNormalBackgroundCache, FHotBackgroundCache,
FDownBackgroundCache, FDisabledBackgroundCache : TBitmap;
FRotatedGlyph : TRotatedGlyph;
FRotatedText : TRotatedText;
FTextGlyphSpacing: Integer;
FGradientType : TGradientType;
FShowFocusBorder, FOnlyBackground,
@ -216,7 +215,6 @@ end;
procedure TGradButton.TextChanged;
begin
inherited TextChanged;
FRotatedText.Text := Caption;
if FAutoWidth then
UpdateButton
@ -287,9 +285,15 @@ begin
tempGS.cy:=FRotatedGlyph.Height;
end;
//tempTS := Canvas.TextExtent(Caption);
tempTS.cx:= FRotatedText.Width;
tempTS.cy:= FRotatedText.Height;
tempTS := bm.Canvas.TextExtent(Caption);
if FRotateDirection <> rdNormal then
begin
FTextSize.cx := tempTS.cy;
FTextSize.cy := tempTS.cx;
tempTS := FTextSize;
end
else
FTextSize := tempTS;
tempBL := FButtonLayout;
@ -356,9 +360,6 @@ begin
WritePoint(FGlyphPoint);
{$ENDIF}
//tempTS := Canvas.TextExtent(Caption);
FTextSize:=tempTS;
FGlyphSize:=tempGS;
end;
@ -366,11 +367,11 @@ function TGradButton.GetAutoWidth: Integer;
begin
if FShowGlyph then begin
if FButtonLayout in [blGlyphLeft,blGlyphRight] then
Result := FRotatedText.Width+ FRotatedGlyph.Width+FTextGlyphSpacing+FAutoWidthBorderSpacing
Result := FTextSize.cx+ FRotatedGlyph.Width+FTextGlyphSpacing+FAutoWidthBorderSpacing
else
Result := Max(FRotatedText.Width,FRotatedGlyph.Width)+FAutoWidthBorderSpacing;
Result := Max(FTextSize.cx,FRotatedGlyph.Width)+FAutoWidthBorderSpacing;
end else begin
Result := FRotatedText.Width+FAutoWidthBorderSpacing;
Result := FTextSize.cx+FAutoWidthBorderSpacing;
end;
end;
@ -378,11 +379,11 @@ function TGradButton.GetAutoHeight: Integer;
begin
if FShowGlyph then begin
if FButtonLayout in [blGlyphTop,blGlyphBottom] then
Result := FRotatedText.Height+ FRotatedGlyph.Height+FTextGlyphSpacing+FAutoHeightBorderSpacing
Result := FTextSize.cy+ FRotatedGlyph.Height+FTextGlyphSpacing+FAutoHeightBorderSpacing
else
Result := Max(FRotatedText.Height,FRotatedGlyph.Height)+FAutoHeightBorderSpacing;
Result := Max(FTextSize.cy,FRotatedGlyph.Height)+FAutoHeightBorderSpacing;
end else begin
Result := FRotatedText.Height+FAutoHeightBorderSpacing;
Result := FTextSize.cy+FAutoHeightBorderSpacing;
end;
end;
@ -676,7 +677,6 @@ begin
FRotateDirection:=Value;
//Rotate and Cache
FRotatedText.Direction:=FRotateDirection;
FRotatedGlyph.Direction:=FRotateDirection;
UpdatePositions;
@ -861,7 +861,6 @@ begin
FRotatedGlyph := TRotatedGlyph.Create;
FRotatedGlyph.OnChange := @GlyphChanged;
FRotatedText := TRotatedText.Create;
FButtonLayout:=blGlyphLeft;
FGlyphBackgroundColor:=clWhite;
@ -873,6 +872,7 @@ begin
FBorderSides:=[bsTopLine,bsBottomLine,bsLeftLine,bsRightLine];
bm := TBitmap.Create;
bm.Canvas.Brush.Style := bsClear;
UpdateBackground;
@ -885,8 +885,6 @@ begin
bm.Free;
//DebugLn('FRotatedGlyph.Free');
FRotatedGlyph.Free;
//DebugLn('FRotatedText.Free');
FRotatedText.Free;
//DebugLn('FBackground.Free');
FBackground.Free;
//DebugLn('FNormalBackgroundCache.Free');
@ -992,7 +990,7 @@ procedure TGradButton.FontChanged(Sender: TObject);
begin
inherited FontChanged(Sender);
FRotatedText.Font := Font;
bm.Canvas.Font := Font;
UpdatePositions;
end;
@ -1031,19 +1029,12 @@ end;
procedure TGradButton.Paint;
var
radius, r,t,p,x,y : Integer;
rt,pr : TRect;
t1,t2,t3 : TColor;
s : String;
r1,r2 : Extended;
tempState : TButtonState;
temp : TBitmap;
TextOffset : Integer;
tempState: TButtonState;
begin
if not HasParent then
Exit;
tempState:=FState;
with bm do
begin
Width := Self.Width;
@ -1055,13 +1046,10 @@ begin
Canvas.Brush.Color:=clBlack;
Canvas.FillRect(0,0,Width, Height);
p := 0;
if tempState = bsDown then
p := 1;
if not FEnabled then tempState := bsDisabled;
if not FEnabled then
tempState := bsDisabled
else
tempState := FState;
case tempState of
bsUp : Canvas.Draw(0,0,FNormalBackgroundCache);
bsDown: Canvas.Draw(0,0,FDownBackgroundCache);
@ -1069,28 +1057,25 @@ begin
else Canvas.Draw(0,0,FDisabledBackgroundCache);
end;
if Caption <> '' then
FRotatedText.Draw(bm.Canvas, FTextPoint.x+p, FTextPoint.y+p);
TextOffset := IfThen(tempState = bsDown, 1);
if FShowGlyph AND FRotatedGlyph.IsBitmapStored then
DrawRotatedText(Canvas, FTextPoint.x + TextOffset, FTextPoint.y + TextOffset,
FTextSize.cx, FTextSize.cy, Caption, FRotateDirection);
if FShowGlyph and FRotatedGlyph.IsBitmapStored then
begin
if not FEnabled then
tempState := bsDisabled
else
tempState := FState;
FRotatedGlyph.State:=tempState;
FRotatedGlyph.Draw(bm.Canvas, FGlyphPoint.x+p, FGlyphPoint.y+p);
FRotatedGlyph.State := FState;
FRotatedGlyph.Draw(bm.Canvas, FGlyphPoint.x+TextOffset, FGlyphPoint.y+TextOffset);
end;
if not (csDesigning in ComponentState) then
if FFocused AND FShowFocusBorder then
if FFocused and FShowFocusBorder then
Canvas.DrawFocusRect(RECT(FBackgroundRect.Left+2, FBackgroundRect.Top+2,
FBackgroundRect.Right-2, FBackgroundRect.Bottom-2));
end;
Canvas.Draw(0,0,bm);
inherited Paint;
end;

View File

@ -74,25 +74,11 @@ type
property Transparent;
end;
{ TRotatedText }
TRotatedText = class (TCustomRotatedBitmap)
private
FText : String;
procedure SetFont(const AValue: TFont);
procedure SetText(const Value: String);
procedure UpdateText;
protected
function GetWidth: Integer; override;
function GetHeight: Integer; override;
public
constructor Create; override;
property Font: TFont write SetFont;
property Text: String read FText write SetText;
end;
function CreateRotatedBitmap(SrcImage: TRasterImage; Direction: TRotateDirection): TBitmap;
procedure DrawRotatedText(Canvas: TCanvas; X, Y, TextWidth, TextHeight: Integer;
const Text: String; Direction: TRotateDirection);
implementation
uses
@ -140,6 +126,28 @@ begin
NormalImg.Free;
end;
procedure DrawRotatedText(Canvas: TCanvas; X, Y, TextWidth, TextHeight: Integer;
const Text: String; Direction: TRotateDirection);
begin
case Direction of
rdNormal:
begin
Canvas.Font.Orientation := 0;
Canvas.TextOut(X, Y, Text);
end;
rdLeft:
begin
Canvas.Font.Orientation := 900;
Canvas.TextOut(X, Y + TextHeight, Text);
end;
rdRight:
begin
Canvas.Font.Orientation := -900;
Canvas.TextOut(X + TextWidth, Y, Text);
end;
end;
end;
{ TCustomRotatedBitmap }
function TCustomRotatedBitmap.GetBitmap: TBitmap;
@ -284,73 +292,5 @@ begin
FGlyph.Draw(Canvas, R, P, FButtonState, Transparent, 0);
end;
{ TRotatedText }
procedure TRotatedText.SetText(const Value: String);
begin
if Value = FText then
Exit;
FText := Value;
UpdateText;
end;
procedure TRotatedText.SetFont(const AValue: TFont);
begin
FNormalBitmap.Canvas.Font := AValue;
FNormalBitmap.Canvas.Font.Quality := fqNonAntialiased;
UpdateText;
end;
procedure TRotatedText.UpdateText;
var
TextSize : TSize;
TransColor: TColor;
begin
FNormalBitmap.Canvas.Font.Quality := fqNonAntialiased;
with FNormalBitmap, Canvas do
begin
TextSize := TextExtent(FText);
{$if defined(LCLWin32) or defined (LCLQt)}
//win32 and Qt does not comput correct text extent when Italic style is set.
//gtk1/2 does not support Italic at all
if fsItalic in Font.Style then
Inc(TextSize.cx, 4);
{$endif}
SetSize(TextSize.cx, TextSize.cy);
if Font.Color <> clFuchsia then
TransColor := clFuchsia
else
TransColor := clWhite;
Brush.Color := TransColor;
FillRect(0, 0, FNormalBitmap.Width, FNormalBitmap.Height);
TextOut(0, 0, FText);
Mask(TransColor);
end;
end;
function TRotatedText.GetWidth: Integer;
begin
if FText <> '' then
Result := inherited GetWidth
else
Result := 0;
end;
function TRotatedText.GetHeight: Integer;
begin
if FText <> '' then
Result := inherited GetHeight
else
Result := 0;
end;
constructor TRotatedText.Create;
begin
inherited Create;
Transparent := True;
end;
end.