diff --git a/.gitattributes b/.gitattributes index bae0ce1233..e3cd9ed543 100644 --- a/.gitattributes +++ b/.gitattributes @@ -658,7 +658,6 @@ components/customdrawn/customdrawnextras.pas svneol=native#text/plain components/customdrawn/customdrawnimages/android.lrs svneol=native#text/plain components/customdrawn/customdrawnimages/android_checkbox.bmp -text components/customdrawn/customdrawnimages/android_checkbox_checked.bmp -text -components/customdrawn/customdrawnutils.pas svneol=native#text/pascal components/customform/custforms.pp svneol=native#text/plain components/customform/demo/appform.pas svneol=native#text/plain components/customform/demo/appforms.lpk svneol=native#text/plain diff --git a/components/customdrawn/customdrawn.lpk b/components/customdrawn/customdrawn.lpk index a9882cb4b1..d783b9605b 100644 --- a/components/customdrawn/customdrawn.lpk +++ b/components/customdrawn/customdrawn.lpk @@ -17,44 +17,40 @@ - + - - - - - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/components/customdrawn/customdrawn.pas b/components/customdrawn/customdrawn.pas index 41e253a936..457203541e 100644 --- a/components/customdrawn/customdrawn.pas +++ b/components/customdrawn/customdrawn.pas @@ -7,7 +7,7 @@ unit customdrawn; interface uses - customdrawnextras, customdrawnutils, customdrawn_wince, customdrawn_win2000, + customdrawnextras, customdrawn_wince, customdrawn_win2000, customdrawn_winxp, customdrawn_android, customdrawn_extra1, customdrawn_kde, customdrawn_gnome, LazarusPackageIntf; diff --git a/components/customdrawn/customdrawn_android.pas b/components/customdrawn/customdrawn_android.pas index 4560f17049..8e716494d0 100644 --- a/components/customdrawn/customdrawn_android.pas +++ b/components/customdrawn/customdrawn_android.pas @@ -359,12 +359,12 @@ begin DrawAndroidAlternatedHorzLine(ADest, 1, ASize.cx-1, 2, ANDROID_BUTTON_SUNKEN_THIRD_LINE_A, ANDROID_BUTTON_SUNKEN_THIRD_LINE_B); // The central gradient - lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3); + lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3+1); DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_SUNKEN_TOP_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_TOP_GRADIENT_B, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B); - lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3); + lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); DrawAndroidMixedFill(ADest, lRect, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B); - lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3); + lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_BOTTOM_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B, ANDROID_BUTTON_SUNKEN_BOTTOM_GRADIENT_B); @@ -381,12 +381,12 @@ begin DrawAndroidAlternatedHorzLine(ADest, 1, ASize.cx-1, 2, ANDROID_BUTTON_THIRD_LINE_A, ANDROID_BUTTON_THIRD_LINE_B); // The central gradient - lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3); + lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3+1); DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_TOP_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_TOP_GRADIENT_B, ANDROID_BUTTON_MIDDLE_GRADIENT_B); - lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3); + lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); DrawAndroidMixedFill(ADest, lRect, ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_B); - lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3); + lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_BOTTOM_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_B, ANDROID_BUTTON_BOTTOM_GRADIENT_B); diff --git a/components/customdrawn/customdrawn_winxp.pas b/components/customdrawn/customdrawn_winxp.pas index 82c516bf69..7595609309 100644 --- a/components/customdrawn/customdrawn_winxp.pas +++ b/components/customdrawn/customdrawn_winxp.pas @@ -10,7 +10,7 @@ uses // LCL -> Use only TForm, TWinControl, TCanvas and TLazIntfImage Graphics, Controls, LCLType, // - customdrawndrawers, customdrawn_common, customdrawnutils; + customdrawndrawers, customdrawn_common; type diff --git a/components/customdrawn/customdrawnextras.pas b/components/customdrawn/customdrawnextras.pas index 4d90575139..33045f57ce 100644 --- a/components/customdrawn/customdrawnextras.pas +++ b/components/customdrawn/customdrawnextras.pas @@ -15,7 +15,7 @@ interface uses Classes, SysUtils, Graphics, Controls, LCLType, LCLIntf, IntfGraphics, - Math, types, customdrawnutils, contnrs, componenteditors, LMessages, Messages, + Math, types, contnrs, componenteditors, LMessages, Messages, LCLProc, PropEdits, ExtCtrls, ImgList, Forms, Menus, customdrawncontrols, // fpimage diff --git a/components/customdrawn/customdrawnutils.pas b/components/customdrawn/customdrawnutils.pas deleted file mode 100644 index 7834aff068..0000000000 --- a/components/customdrawn/customdrawnutils.pas +++ /dev/null @@ -1,409 +0,0 @@ -{ - Copyright (C) 2010 Felipe Monteiro de Carvalho - - License: The same modifying LGPL with static linking exception as the LCL - - Utility functions utilized by the custom drawn controls -} -unit customdrawnutils; - -{$mode objfpc}{$H+} - -interface - -uses - Classes, SysUtils, LCLType, LCLIntf, LMessages, LCLProc, Controls, Graphics, - Forms, Types, IntfGraphics, FPImage, Math, FPImgCanv, FPCanvas; - -function GetAColor(Color: TColor; Rate: byte): TColor; -function GetUColor(Color: TColor; Rate: byte): TColor; -procedure GradientFill(Clr1, Clr2: TColor; Canvas: TCanvas); -procedure GradientFillRect(Clr1, Clr2: TColor; Canvas: TFPCustomCanvas; lRect: TRect); -procedure GradFill(Canvas: TFPCustomCanvas; aRect: TRect; Clr1, Clr2: TColor); -procedure GradCenterFill(Canvas: TFPCustomCanvas; aRect: TRect; - Clr1, Clr2: TColor; rate: float); -procedure DrawAndroidButton(Canvas: TCanvas; Color: TColor); -procedure FPImgCloneRect(IntfImg1, IntfImg2: TLazIntfImage; lRect: TRect; Fast: boolean); -procedure DrawArrow(aDest: TFPCustomCanvas; aRect: TRect; R: boolean); - -type - PRGBTripleArray = ^TRGBTripleArray; - TRGBTripleArray = array[0..32767] of TRGBTriple; - -implementation - -procedure DrawArrow(aDest: TFPCustomCanvas; aRect: TRect; R: boolean); -var - CenColor, CenColor2: TFPColor; - lWidth, lHeight, lCenter: integer; -begin - lWidth := aRect.Right - aRect.Left; - lHeight := aRect.Bottom - aRect.Top; - CenColor := aDest.Colors[aRect.Left + lWidth div 4, aRect.Top + lHeight div 2]; - CenColor2 := aDest.Colors[aRect.Left + 3 * lWidth div 4, aRect.Top + lHeight div 2]; - if R then - begin - aDest.Line(aRect.Left + lWidth div 4 - 1, aRect.Top + lHeight div 2, - aRect.Left + lWidth div 4 + 3, aRect.Top + lHeight div 2); - aDest.Line(aRect.Left + lWidth div 4 + 3, aRect.Top + lHeight div 2 - 4, - aRect.Left + lWidth div 4 + 3, aRect.Top + lHeight div 2 + 4); - aDest.Line(aRect.Left + lWidth div 4 + 2, aRect.Top + lHeight div 2 - 3, - aRect.Left + lWidth div 4 + 2, aRect.Top + lHeight div 2 + 3); - aDest.Line(aRect.Left + lWidth div 4 + 1, aRect.Top + lHeight div 2 - 2, - aRect.Left + lWidth div 4 + 1, aRect.Top + lHeight div 2 + 2); - aDest.Line(aRect.Left + lWidth div 4, aRect.Top + lHeight div 2 - 1, - aRect.Left + lWidth div 4, aRect.Top + lHeight div 2 + 1); - //aDest.Colors[aRect.Left + lWidth div 4 - 3, aRect.Top + lHeight div 2] := aDest.Brush.FPColor; - end - else - begin - aDest.Line(aRect.Left + 3 * lWidth div 4 - 1, aRect.Top + lHeight div 2, - aRect.Left + 3 * lWidth div 4 + 3, aRect.Top + lHeight div 2); - aDest.Line(aRect.Left + 3 * lWidth div 4 + 2, aRect.Top + lHeight div 2 - 1, - aRect.Left + 3 * lWidth div 4 + 2, aRect.Top + lHeight div 2 + 1); - aDest.Line(aRect.Left + 3 * lWidth div 4 + 1, aRect.Top + lHeight div 2 - 2, - aRect.Left + 3 * lWidth div 4 + 1, aRect.Top + lHeight div 2 + 2); - aDest.Line(aRect.Left + 3 * lWidth div 4 + 0, aRect.Top + lHeight div 2 - 3, - aRect.Left + 3 * lWidth div 4 + 0, aRect.Top + lHeight div 2 + 3); - aDest.Line(aRect.Left + 3 * lWidth div 4 - 1, aRect.Top + lHeight div 2 - 4, - aRect.Left + 3 * lWidth div 4 - 1, aRect.Top + lHeight div 2 + 4); - //aDest.Colors[aRect.Left + 3 * lWidth div 4, aRect.Top + lHeight div 2] := aDest.Brush.FPColor; - end; -end; - -function GetUniqueName(const Name: string; PControl: TComponent): string; -var - i: integer; - TName: string; - - function GetTheName: boolean; - var - j: integer; - begin - Result := False; - for j := 0 to PControl.ComponentCount - 1 do - begin - if PControl.Components[j].Name = TName then - begin - Result := True; - exit; - end; - //ShowMessage(TName); - end; - end; - -begin - TName := Name; - i := 0; - repeat - Inc(i); - TName := Name + IntToStr(i); - until not GetTheName; - Result := TName; -end; - -function ResetCDColor(r, g, b: byte): TColor; -begin - if r <= 0 then - r := 1; - if g <= 0 then - g := 1; - if b <= 0 then - b := 1; - Result := RGB(r, g, b); -end; - -function GetAColor(Color: TColor; Rate: byte): TColor; -var - r, g, b: byte; -begin - r := GetRValue(ColorToRGB(Color)); - g := GetGValue(ColorToRGB(Color)); - b := GetBValue(ColorToRGB(Color)); - r := r * Rate div 100; - g := g * Rate div 100; - b := b * Rate div 100; - Result := ResetCDColor(r, g, b); -end; - -function GetUColor(Color: TColor; Rate: byte): TColor; -var - r, g, b: byte; -begin - r := GetRValue(ColorToRGB(Color)); - g := GetGValue(ColorToRGB(Color)); - b := GetBValue(ColorToRGB(Color)); - r := r * 100 div Rate; - g := g * 100 div Rate; - b := b * 100 div Rate; - Result := ResetCDColor(r, g, b); -end; - -procedure GradientFill(Clr1, Clr2: TColor; Canvas: TCanvas); -var - ColorFrom: array[0..2] of byte; - ColorDiff: array[0..2] of integer; - DrawBand: TRect; - I: integer; - R, G, B: byte; -begin - ColorFrom[0] := GetRValue(ColorToRGB(Clr1)); - ColorFrom[1] := GetGValue(ColorToRGB(Clr1)); - ColorFrom[2] := GetBValue(ColorToRGB(Clr1)); - ColorDiff[0] := GetRValue(ColorToRGB(Clr2)) - ColorFrom[0]; - ColorDiff[1] := GetGValue(ColorToRGB(Clr2)) - ColorFrom[1]; - ColorDiff[2] := GetBValue(ColorToRGB(Clr2)) - ColorFrom[2]; - Canvas.Pen.Style := psSolid; - Canvas.Pen.Mode := pmCopy; - DrawBand.Left := 0; - DrawBand.Right := Canvas.Width; - for I := 0 to $ff do - begin - DrawBand.Top := MulDiv(I, Canvas.Height, $100); - DrawBand.Bottom := MulDiv(I + 1, Canvas.Height, $100); - R := ColorFrom[0] + MulDiv(I, ColorDiff[0], $ff); - G := ColorFrom[1] + MulDiv(I, ColorDiff[1], $ff); - B := ColorFrom[2] + MulDiv(I, ColorDiff[2], $ff); - Canvas.Brush.Color := RGB(R, G, B); - Canvas.FillRect(DrawBand); - end; -end; - -procedure GradientFillRect(Clr1, Clr2: TColor; Canvas: TFPCustomCanvas; lRect: TRect); -var - ColorFrom: array[0..2] of byte; - ColorDiff: array[0..2] of integer; - DrawBand: TRect; - I: integer; - R, G, B: byte; -begin - ColorFrom[0] := GetRValue(ColorToRGB(Clr1)); - ColorFrom[1] := GetGValue(ColorToRGB(Clr1)); - ColorFrom[2] := GetBValue(ColorToRGB(Clr1)); - ColorDiff[0] := GetRValue(ColorToRGB(Clr2)) - ColorFrom[0]; - ColorDiff[1] := GetGValue(ColorToRGB(Clr2)) - ColorFrom[1]; - ColorDiff[2] := GetBValue(ColorToRGB(Clr2)) - ColorFrom[2]; - Canvas.Pen.Style := psSolid; - Canvas.Brush.Style := bsSolid; - Canvas.Pen.Mode := pmCopy; - DrawBand.Left := lRect.Left; - DrawBand.Right := lRect.Right; - for I := 0 to $ff do - begin - DrawBand.Top := lRect.Top + MulDiv(I, lRect.Bottom, $100); - DrawBand.Bottom := lRect.Top + MulDiv(I + 1, lRect.Bottom, $100); - R := ColorFrom[0] + MulDiv(I, ColorDiff[0], $ff); - G := ColorFrom[1] + MulDiv(I, ColorDiff[1], $ff); - B := ColorFrom[2] + MulDiv(I, ColorDiff[2], $ff); - Canvas.Brush.FPColor := TColorToFPColor(ColorToRGB(RGB(R, G, B))); - Canvas.Pen.FPColor := TColorToFPColor(ColorToRGB(RGB(R, G, B))); - Canvas.Rectangle(DrawBand); - end; -end; - -procedure GradCenterFill(Canvas: TFPCustomCanvas; aRect: TRect; - Clr1, Clr2: TColor; rate: float); -var - lRect: TRect; -begin - lRect.Left := aRect.Left; - lRect.Top := aRect.Top; - lRect.Right := aRect.Left + Ceil(rate * (aRect.Right - aRect.Left)); - lRect.Bottom := aRect.Bottom; - GradFill(Canvas, lRect, Clr1, Clr2); - lRect.Left := aRect.Left + Ceil(rate * (aRect.Right - aRect.Left)); - lRect.Top := aRect.Top; - lRect.Right := aRect.Right; - lRect.Bottom := aRect.Bottom; - GradFill(Canvas, lRect, Clr2, Clr1); -end; - -procedure GradFill(Canvas: TFPCustomCanvas; aRect: TRect; Clr1, Clr2: TColor); -var - ColorFrom: array[0..2] of byte; - ColorDiff: array[0..2] of integer; - I: integer; - R, G, B: byte; - RBand: TRect; -begin - ColorFrom[0] := GetRValue(ColorToRGB(Clr1)); - ColorFrom[1] := GetGValue(ColorToRGB(Clr1)); - ColorFrom[2] := GetBValue(ColorToRGB(Clr1)); - ColorDiff[0] := GetRValue(ColorToRGB(Clr2)) - ColorFrom[0]; - ColorDiff[1] := GetGValue(ColorToRGB(Clr2)) - ColorFrom[1]; - ColorDiff[2] := GetBValue(ColorToRGB(Clr2)) - ColorFrom[2]; - Canvas.Pen.Style := psSolid; - Canvas.Pen.Mode := pmCopy; - RBand.Bottom := aRect.Bottom; - RBand.Top := aRect.Top; - for I := 0 to $ff do - begin - RBand.Left := aRect.Left + MulDiv(I, aRect.Right - aRect.Left, $100); - RBand.Right := aRect.Left + MulDiv(I + 1, aRect.Right - aRect.Left, $100); - R := ColorFrom[0] + MulDiv(I, ColorDiff[0], $ff); - G := ColorFrom[1] + MulDiv(I, ColorDiff[1], $ff); - B := ColorFrom[2] + MulDiv(I, ColorDiff[2], $ff); - Canvas.Brush.FPColor := TColorToFPColor(ColorToRGB(RGB(R, G, B))); - Canvas.Pen.FPColor := TColorToFPColor(ColorToRGB(RGB(R, G, B))); - Canvas.RecTangle(RBand); - end; -end; - -function GetNomalColor(a: byte): byte; -begin - Result := a; - if a < 1 then - a := 1; - if a > 255 then - a := 255; -end; - -procedure FPImgCloneRect(IntfImg1, IntfImg2: TLazIntfImage; lRect: TRect; Fast: boolean); -var - FadeStep, px, py: integer; - Row1, Row2: PRGBTripleArray; -begin - for FadeStep := 1 to 32 do - begin - for py := lRect.Top to lRect.Bottom - 1 do - begin - if fast then - begin - Row1 := IntfImg1.GetDataLineStart(py); - Row2 := IntfImg2.GetDataLineStart(py); - end; - for px := lRect.Left to lRect.Right - 1 do - begin - if fast then - begin - Row2^[px].rgbtRed := Row1^[px].rgbtRed; - Row2^[px].rgbtGreen := Row1^[px].rgbtGreen; - Row2^[px].rgbtBlue := Row1^[px].rgbtBlue; - end - else - IntfImg2.Colors[px, py] := IntfImg1.Colors[px, py]; - end; - end; - end; -end; - -procedure DrawAndroidButton(Canvas: TCanvas; Color: TColor); -const - vedge = 12; - rr = 3; -var - i, xx, yy: integer; - c2: TColor; - r, g, b, r1, g1, b1: byte; -begin - //Canvas.Brush.Color := clWhite; - //Canvas.FillRect(0, 0, Canvas.Width, Canvas.Height); - Canvas.Brush.Color := Color; - Canvas.Pen.Color := Color; - r1 := GetRValue(Color); - g1 := GetGValue(Color); - b1 := GetBValue(Color); - for yy := 0 to Canvas.Height do - begin - { if yy < vedge then - begin - r := GetNomalColor(r1 - (vedge - yy) * rr); - g := GetNomalColor(g1 - (vedge - yy) * rr); - b := GetNomalColor(b1 - (vedge - yy) * rr); - c2 := RGB(r, g, b); - Canvas.Pen.Color := c2; - end - else } - if yy > Canvas.Height - vedge then - begin - r := GetNomalColor(r1 - (yy - Canvas.Height + vedge) * rr); - g := GetNomalColor(g1 - (yy - Canvas.Height + vedge) * rr); - b := GetNomalColor(b1 - (yy - Canvas.Height + vedge) * rr); - c2 := RGB(r, g, b); - Canvas.Pen.Color := c2; - end - else - Canvas.Pen.Color := Color; - - if yy < 4 then - Canvas.Line(4 - yy, yy, Canvas.Width - 4 + yy, yy) - else - if yy > Canvas.Height - 5 then - Canvas.Line(4 - Canvas.Height + yy, yy, Canvas.Width - yy - 4 + Canvas.Height, yy) - else - Canvas.Line(0, yy, Canvas.Width, yy); - end; -end; - -procedure FastAntiAliasPicture(orig_bmp, dest_bmp: TBitmap); -var - x, y, cx, cy: integer; - totr, totg, totb: integer; - Row1, Row2, Row3, DestRow: PRGBTripleArray; - i: integer; - IntfImg1, IntfImg2: TLazIntfImage; - ImgHandle, ImgMaskHandle: HBitmap; - FadeStep: integer; - px, py: integer; - CurColor: TFPColor; - TmpBmp: TBitmap; -begin - if (orig_bmp = nil) or (dest_bmp = nil) then - Exit; - TmpBmp := TBitmap.Create; - TmpBmp.PixelFormat := pf24bit; - IntfImg1 := TLazIntfImage.Create(0, 0); - IntfImg1.LoadFromBitmap(orig_bmp.Handle, orig_bmp.MaskHandle); - IntfImg2 := TLazIntfImage.Create(0, 0); - IntfImg2.LoadFromBitmap(dest_bmp.Handle, dest_bmp.MaskHandle); - // For each row - for y := 0 to dest_bmp.Height - 1 do - begin - // We compute samples of 3 x 3 pixels - cy := y * 3; - // Get pointers to actual, previous and next rows in supersampled bitmap - Row1 := IntfImg1.GetDataLineStart(cy); - Row2 := IntfImg1.GetDataLineStart(cy + 1); - Row3 := IntfImg1.GetDataLineStart(cy + 2); - // Get a pointer to destination row in output bitmap - DestRow := IntfImg2.GetDataLineStart(y); - // For each column... - for x := 0 to dest_bmp.Width - 1 do - begin - // We compute samples of 3 x 3 pixels - cx := 3 * x; - // Initialize result color - totr := 0; - totg := 0; - totb := 0; - // For each pixel in sample - for i := 0 to 2 do - begin - // New red value - totr := totr + Row1^[cx + i].rgbtRed + Row2^[cx + i].rgbtRed + - Row3^[cx + i].rgbtRed; - // New green value - totg := totg + Row1^[cx + i].rgbtGreen + Row2^[cx + i].rgbtGreen + - Row3^[cx + i].rgbtGreen; - // New blue value - totb := totb + Row1^[cx + i].rgbtBlue + Row2^[cx + i].rgbtBlue + - Row3^[cx + i].rgbtBlue; - end; - // Set output pixel colors - DestRow^[x].rgbtRed := totr div 9; - DestRow^[x].rgbtGreen := totg div 9; - DestRow^[x].rgbtBlue := totb div 9; - end; - end; - IntfImg2.CreateBitmaps(ImgHandle, ImgMaskHandle, False); - TmpBmp.Handle := ImgHandle; - TmpBmp.MaskHandle := ImgMaskHandle; - dest_bmp.Empty; - dest_bmp.Assign(TmpBmp); - IntfImg1.Free; - IntfImg2.Free; - TmpBmp.Free; -end; - -end. -