| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- unit BGRADrawerFlashProgressBar;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, {$IFDEF BGRABITMAP_USE_MSEGUI} mclasses, {$ENDIF} SysUtils, Types, BGRABitmap, BGRABitmapTypes, BGRAGraphics, BGRAGradients,
- Math;
- type
- TBGRAProgressBarRedrawEvent = procedure(Sender: TObject; Bitmap: TBGRABitmap; xpos: integer) of object;
- { TBGRADrawerFlashProgressBar }
- TBGRADrawerFlashProgressBar = class(TPersistent)
- private
- FBackgroundColor: TColor;
- FBackgroundRandomize: boolean;
- FBackgroundRandomizeMaxIntensity: word;
- FBackgroundRandomizeMinIntensity: word;
- FBarColor: TColor;
- FMaxValue: integer;
- FMinValue: integer;
- FOnChange: TNotifyEvent;
- FRandSeed: integer;
- FValue: integer;
- xpos: integer;
- procedure SetBackgroundRandomize(AValue: boolean);
- procedure SetBackgroundRandomizeMaxIntensity(AValue: word);
- procedure SetBackgroundRandomizeMinIntensity(AValue: word);
- procedure SetBarColor(AValue: TColor);
- procedure SetBackgroundColor(AValue: TColor);
- procedure SetMaxValue(AValue: integer);
- procedure SetMinValue(AValue: integer);
- procedure SetRandSeed(AValue: integer);
- procedure SetValue(AValue: integer);
- public
- procedure Draw(ABitmap: TBGRABitmap);
- public
- property OnChange: TNotifyEvent read FOnChange write FOnChange;
- property RandSeed: integer read FRandSeed write SetRandSeed;
- property BarColor: TColor read FBarColor write SetBarColor;
- property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor;
- property BackgroundRandomizeMinIntensity: word
- read FBackgroundRandomizeMinIntensity write SetBackgroundRandomizeMinIntensity;
- property BackgroundRandomizeMaxIntensity: word
- read FBackgroundRandomizeMaxIntensity write SetBackgroundRandomizeMaxIntensity;
- property BackgroundRandomize: boolean read FBackgroundRandomize
- write SetBackgroundRandomize;
- property XPosition: integer read xpos;
- public
- property MinValue: integer read FMinValue write SetMinValue;
- property MaxValue: integer read FMaxValue write SetMaxValue;
- property Value: integer read FValue write SetValue;
- end;
- implementation
- { TBGRADrawerFlashProgressBar }
- procedure TBGRADrawerFlashProgressBar.SetBarColor(AValue: TColor);
- begin
- if FBarColor = AValue then
- Exit;
- FBarColor := AValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetBackgroundRandomize(AValue: boolean);
- begin
- if FBackgroundRandomize = AValue then
- Exit;
- FBackgroundRandomize := AValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetBackgroundRandomizeMaxIntensity(AValue: word);
- begin
- if FBackgroundRandomizeMaxIntensity = AValue then
- Exit;
- FBackgroundRandomizeMaxIntensity := AValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetBackgroundRandomizeMinIntensity(AValue: word);
- begin
- if FBackgroundRandomizeMinIntensity = AValue then
- Exit;
- FBackgroundRandomizeMinIntensity := AValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetBackgroundColor(AValue: TColor);
- begin
- if FBackgroundColor = AValue then
- Exit;
- FBackgroundColor := AValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetMaxValue(AValue: integer);
- begin
- if FMaxValue = AValue then
- exit;
- FMaxValue := AValue;
- if FValue > FMaxValue then
- FValue := FMaxValue;
- if FMinValue > FMaxValue then
- FMinValue := FMaxValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetMinValue(AValue: integer);
- begin
- if FMinValue = AValue then
- exit;
- FMinValue := AValue;
- if FValue < FMinValue then
- FValue := FMinValue;
- if FMaxValue < FMinValue then
- FMaxValue := FMinValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.SetRandSeed(AValue: integer);
- begin
- if FRandSeed = AValue then
- Exit;
- FRandSeed := AValue;
- end;
- procedure TBGRADrawerFlashProgressBar.SetValue(AValue: integer);
- begin
- if FValue = AValue then
- exit;
- FValue := AValue;
- if FValue < FMinValue then
- FValue := FMinValue;
- if FValue > FMaxValue then
- FValue := FMaxValue;
- if Assigned(FOnChange) then
- FOnChange(Self);
- end;
- procedure TBGRADrawerFlashProgressBar.Draw(ABitmap: TBGRABitmap);
- var
- content: TRect;
- y, tx, ty: integer;
- bgColor: TBGRAPixel;
- function ApplyLightness(c: TBGRAPixel; lightness: word): TBGRAPixel;
- begin
- Result := GammaCompression(SetLightness(GammaExpansion(c), lightness));
- end;
- procedure DrawBar(bounds: TRect);
- var
- lCol: TBGRAPixel;
- begin
- lCol := BarColor;
- DoubleGradientAlphaFill(ABitmap, bounds,
- ApplyLightness(lCol, 37000), ApplyLightness(lCol, 29000),
- ApplyLightness(lCol, 26000), ApplyLightness(lCol, 18000),
- gdVertical, gdVertical, gdVertical, 0.53);
- InflateRect(bounds, -1, -1);
- DoubleGradientAlphaFill(ABitmap, bounds,
- ApplyLightness(lCol, 28000), ApplyLightness(lCol, 22000),
- ApplyLightness(lCol, 19000), ApplyLightness(lCol, 11000),
- gdVertical, gdVertical, gdVertical, 0.53);
- end;
- begin
- ABitmap.FillTransparent;
- tx := ABitmap.Width;
- ty := ABitmap.Height;
- ABitmap.Rectangle(0, 0, tx, ty, BGRA(255, 255, 255, 6), BackgroundColor, dmSet);
- if (tx > 2) and (ty > 2) then
- ABitmap.Rectangle(1, 1, tx - 1, ty - 1, BGRA(29, 29, 29), dmSet);
- if (tx > 4) and (ty > 4) then
- begin
- content := Rect(2, 2, tx - 2, ty - 2);
- randseed := FRandSeed;
- if BackgroundRandomize then
- for y := content.Top to content.Bottom - 1 do
- begin
- bgColor := BackgroundColor;
- bgColor.Intensity := RandomRange(BackgroundRandomizeMinIntensity, BackgroundRandomizeMaxIntensity);
- ABitmap.HorizLine(content.Left, y, content.Right - 1, bgColor, dmSet);
- end;
- if tx >= 6 then
- ABitmap.DrawVertLine(content.Right - 1, content.Top, content.Bottom - 1,
- BGRA(0, 0, 0, 32));
- if FMaxValue > FMinValue then
- begin
- xpos := round((FValue - FMinValue) / (FMaxValue - FMinValue) *
- (content.right - content.left)) + content.left;
- if xpos > content.left then
- begin
- DrawBar(rect(content.left, content.top, xpos, content.bottom));
- if xpos < content.right then
- begin
- ABitmap.SetPixel(xpos, content.top, BGRA(62, 62, 62));
- ABitmap.SetVertLine(xpos, content.top + 1, content.bottom - 1, BGRA(40, 40, 40));
- end;
- end;
- end;
- end;
- end;
- end.
|