NO HAY CÓDIGO FUENTE git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TRichView@1 b34d35ef-135b-4489-b9d1-9916e9c25524
202 lines
7.6 KiB
ObjectPascal
202 lines
7.6 KiB
ObjectPascal
unit RVBlendBitmap;
|
|
|
|
interface
|
|
{$I RV_Defs.inc}
|
|
|
|
uses
|
|
{$IFDEF RICHVIEWDEF2009}AnsiStrings,{$ENDIF}
|
|
SysUtils, Classes, Windows, Graphics,
|
|
RVStyle, RVItem, RVFMisc, DLines, CRVFData, RVTypes;
|
|
|
|
const
|
|
rvsBlendBitmap = -50;
|
|
rvsHotBlendBitmap = -51;
|
|
|
|
type
|
|
TRVBlendBitmapItemInfo = class(TRVGraphicItemInfo)
|
|
protected
|
|
Back: TBitmap;
|
|
function SaveRVFHeaderTail(RVData: TPersistent): TRVRawByteString; override;
|
|
function GetTransparency(State: TRVItemDrawStates): Byte; virtual;
|
|
public
|
|
Transparency: Byte;
|
|
constructor CreateEx(RVData: TPersistent; AImage: TGraphic; AVAlign: TRVVAlign); override;
|
|
destructor Destroy; override;
|
|
procedure Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
|
|
Style: TRVStyle; dli: TRVDrawLineInfo); override;
|
|
procedure AfterLoading(FileFormat: TRVLoadFormat); override;
|
|
function ReadRVFHeaderTail(var P: PRVAnsiChar; RVData: TPersistent;
|
|
UTF8Strings: Boolean; var AssStyleNameUsed: Boolean): Boolean; override;
|
|
procedure Assign(Source: TCustomRVItemInfo); override;
|
|
end;
|
|
|
|
TRVHotBlendBitmapItemInfo = class(TRVBlendBitmapItemInfo)
|
|
protected
|
|
function GetTransparency(State: TRVItemDrawStates): Byte; override;
|
|
public
|
|
HotTransparency: Byte;
|
|
function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean; override;
|
|
constructor CreateEx(RVData: TPersistent; AImage: TGraphic; AVAlign: TRVVAlign); override;
|
|
procedure Execute(RVData:TPersistent); override;
|
|
procedure Assign(Source: TCustomRVItemInfo); override;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
{$R-}
|
|
procedure DrawTransparent(Canvas: TCanvas;
|
|
x,y: Integer;
|
|
Transparency: Byte;
|
|
Back: TBitmap;
|
|
Bitmap: TBitmap);
|
|
type
|
|
RGBARR = array [0..0] of TRGBQUAD;
|
|
PRGBARR = ^RGBARR;
|
|
var rgb1,rgb2: PRGBARR;
|
|
i,j: Integer;
|
|
op, tr: Integer;
|
|
begin
|
|
tr := Transparency;
|
|
op := 255-Transparency;
|
|
Back.Canvas.CopyRect(Rect(0,0,Back.Width,Back.Height), Canvas,
|
|
Bounds(x,y,Back.Width,Back.Height));
|
|
for i:=0 to Back.Height-1 do begin
|
|
rgb1 := PRGBARR(Back.ScanLine[i]);
|
|
rgb2 := PRGBARR(Bitmap.ScanLine[i]);
|
|
for j:=0 to Back.Width-1 do
|
|
if not CompareMem(@rgb1[j], @rgb2[j],3) then
|
|
with rgb1[j] do begin
|
|
rgbBlue := (rgbBlue*tr + rgb2[j].rgbBlue*op) div 255;
|
|
rgbGreen := (rgbGreen*tr + rgb2[j].rgbGreen*op)div 255;
|
|
rgbRed := (rgbRed*tr + rgb2[j].rgbRed*op) div 255;
|
|
end;
|
|
end;
|
|
Canvas.Draw(x,y, Back);
|
|
end;
|
|
|
|
{======================= TRVBlendBitmapItemInfo ===============================}
|
|
constructor TRVBlendBitmapItemInfo.CreateEx(RVData: TPersistent; AImage: TGraphic; AVAlign: TRVVAlign);
|
|
begin
|
|
inherited CreateEx(RVData, AImage as TBitmap, AValign);
|
|
Transparency := 0;
|
|
StyleNo := rvsBlendBitmap;
|
|
AfterLoading(rvlfRVF);
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
procedure TRVBlendBitmapItemInfo.AfterLoading(FileFormat: TRVLoadFormat);
|
|
begin
|
|
inherited AfterLoading(FileFormat);
|
|
TBitmap(Image).PixelFormat := pf32bit;
|
|
Back := TBitmap.Create;
|
|
Back.PixelFormat := pf32bit;
|
|
Back.Width := TBitmap(Image).Width;
|
|
Back.Height := TBitmap(Image).Height;
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
destructor TRVBlendBitmapItemInfo.Destroy;
|
|
begin
|
|
Back.Free;
|
|
inherited Destroy;
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
function TRVBlendBitmapItemInfo.GetTransparency(State: TRVItemDrawStates): Byte;
|
|
begin
|
|
Result := Transparency;
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
procedure TRVBlendBitmapItemInfo.Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
|
|
Style: TRVStyle; dli: TRVDrawLineInfo);
|
|
begin
|
|
if ImageCopy<>nil then
|
|
inherited Paint(x, y, Canvas, State, Style, dli)
|
|
else begin
|
|
inc(x); inc(y);
|
|
DrawTransparent(Canvas, x, y, GetTransparency(State), Back, TBitmap(Image));
|
|
if (rvidsCurrent in State) and (Style.HoverColor<>clNone) then begin
|
|
Canvas.Pen.Color := Style.HoverColor;
|
|
Canvas.Pen.Style := psSolid;
|
|
Canvas.Rectangle(x-2,y-2, x+Image.Width+2, y+Image.Height+2);
|
|
end;
|
|
if (rvidsSelected in State) then begin
|
|
Canvas.Pen.Color := Style.SelColor;
|
|
Canvas.Pen.Style := psSolid;
|
|
Canvas.Rectangle(x-1,y-1, x+Image.Width+1, y+Image.Height+1);
|
|
end
|
|
end;
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
function TRVBlendBitmapItemInfo.SaveRVFHeaderTail(RVData: TPersistent): TRVRawByteString;
|
|
begin
|
|
Result := {$IFDEF RVUNICODESTR}AnsiStrings.{$ENDIF}Format('%s %d', [inherited SaveRVFHeaderTail(RVData), Integer(Transparency)]);
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
function TRVBlendBitmapItemInfo.ReadRVFHeaderTail(var P: PRVAnsiChar;
|
|
RVData: TPersistent; UTF8Strings: Boolean;
|
|
var AssStyleNameUsed: Boolean): Boolean;
|
|
var tr: Integer;
|
|
begin
|
|
Result := inherited ReadRVFHeaderTail(P, RVData, UTF8Strings, AssStyleNameUsed);
|
|
if not Result then exit;
|
|
if not (P^ in [#0, #10, #13]) then
|
|
Result := RVFReadInteger(P,tr)
|
|
else
|
|
Result := False;
|
|
if Result then
|
|
Transparency := Byte(tr);
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
procedure TRVBlendBitmapItemInfo.Assign(Source: TCustomRVItemInfo);
|
|
begin
|
|
if (Source is TRVBlendBitmapItemInfo) then
|
|
Transparency := TRVBlendBitmapItemInfo(Source).Transparency;
|
|
inherited Assign(Source);
|
|
end;
|
|
{======================= TRVHotBlendBitmapItemInfo ============================}
|
|
constructor TRVHotBlendBitmapItemInfo.CreateEx(RVData: TPersistent;
|
|
AImage: TGraphic; AVAlign: TRVVAlign);
|
|
begin
|
|
inherited CreateEx(RVData, AImage, AVAlign);
|
|
StyleNo := rvsHotBlendBitmap;
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
function TRVHotBlendBitmapItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
|
|
RVStyle: TRVStyle): Boolean;
|
|
begin
|
|
case Prop of
|
|
rvbpJump, rvbpAllowsFocus, rvbpXORFocus, rvbpHotColdJump:
|
|
Result := True;
|
|
else
|
|
Result := inherited GetBoolValueEx(Prop, RVStyle);
|
|
end;
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
procedure TRVHotBlendBitmapItemInfo.Execute(RVData:TPersistent);
|
|
begin
|
|
if RVData is TCustomRVFormattedData then
|
|
TCustomRVFormattedData(RVData).DoJump(JumpID+
|
|
TCustomRVFormattedData(RVData).FirstJumpNo)
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
procedure TRVHotBlendBitmapItemInfo.Assign(Source: TCustomRVItemInfo);
|
|
begin
|
|
if (Source is TRVHotBlendBitmapItemInfo) then
|
|
HotTransparency := TRVHotBlendBitmapItemInfo(Source).HotTransparency;
|
|
inherited Assign(Source);
|
|
end;
|
|
{------------------------------------------------------------------------------}
|
|
function TRVHotBlendBitmapItemInfo.GetTransparency(State: TRVItemDrawStates): Byte;
|
|
begin
|
|
if rvidsHover in State then
|
|
Result := HotTransparency
|
|
else
|
|
Result := Transparency;
|
|
end;
|
|
{==============================================================================}
|
|
initialization
|
|
|
|
RegisterRichViewItemClass(rvsBlendBitmap, TRVBlendBitmapItemInfo);
|
|
RegisterRichViewItemClass(rvsHotBlendBitmap, TRVHotBlendBitmapItemInfo);
|
|
|
|
end.
|