TDLBitmap gets faster.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1608 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
yangjixian
2011-05-04 01:55:49 +00:00
parent 328c133706
commit 9b0d833ee6
4 changed files with 132 additions and 120 deletions

View File

@ -41,9 +41,13 @@ type
function GetScanLinePixel(X, Y: Integer): TColor; function GetScanLinePixel(X, Y: Integer): TColor;
procedure SetScanLinePixel(X, Y: Integer; Value: TColor); procedure SetScanLinePixel(X, Y: Integer; Value: TColor);
protected protected
ImgHandle, ImgMaskHandle: HBitmap;
procedure SetWidth(Value: integer); override; procedure SetWidth(Value: integer); override;
procedure SetHeight(Value: integer); override; procedure SetHeight(Value: integer); override;
procedure Changed(Sender: TObject); override; procedure Changed(Sender: TObject); override;
procedure InitializeReader(AImage: TLazIntfImage; AReader: TFPCustomImageReader); override;
procedure InitializeWriter(AImage: TLazIntfImage; AWriter: TFPCustomImageWriter); override;
procedure FinalizeWriter(AWriter: TFPCustomImageWriter); override;
public public
constructor Create; override; constructor Create; override;
destructor Destroy; override; destructor Destroy; override;
@ -140,6 +144,7 @@ operator div (const A, B: TRGBATriple): TRGBATriple;
function DWordTrans(SrcRow: TRGBATriple): DWORD; function DWordTrans(SrcRow: TRGBATriple): DWORD;
function DWordToTriple(SrcRow: DWORD): TRGBATriple; function DWordToTriple(SrcRow: DWORD): TRGBATriple;
procedure StretchLinear(Dest, Src: TDLBitmap); procedure StretchLinear(Dest, Src: TDLBitmap);
procedure StretchDLBMP(Src: TDLBitmap; MultiX, MultiY: integer);
implementation implementation
@ -214,25 +219,15 @@ begin
end; end;
procedure TDLBitmap.InvalidateScanLine; procedure TDLBitmap.InvalidateScanLine;
var
TmpBmp: TDLBitmap;
ImgHandle, ImgMaskHandle: HBitmap;
begin begin
TmpBmp := TDLBitmap.Create;
FIntfImgA.CreateBitmaps(ImgHandle, ImgMaskHandle, True); FIntfImgA.CreateBitmaps(ImgHandle, ImgMaskHandle, True);
TmpBmp.Handle := ImgHandle; Handle := ImgHandle;
TmpBmp.MaskHandle := ImgMaskHandle; MaskHandle := ImgMaskHandle;
Empty;
Width := TmpBmp.Width;
Height := TmpBmp.Height;
Canvas.Draw(0, 0, TmpBmp);
TmpBmp.Free;
end; end;
procedure TDLBitmap.InvalidateScanLineRect(aRect: TRect); procedure TDLBitmap.InvalidateScanLineRect(aRect: TRect);
var var
TmpBmp: TDLBitmap; TmpBmp: TDLBitmap;
ImgHandle, ImgMaskHandle: HBitmap;
begin begin
TmpBmp := TDLBitmap.Create; TmpBmp := TDLBitmap.Create;
FIntfImgA.CreateBitmaps(ImgHandle, ImgMaskHandle, True); FIntfImgA.CreateBitmaps(ImgHandle, ImgMaskHandle, True);
@ -517,6 +512,22 @@ begin
SprayPoints(Self, x, y, radian, PColor); SprayPoints(Self, x, y, radian, PColor);
end; end;
procedure TDLBitmap.InitializeReader(AImage: TLazIntfImage; AReader: TFPCustomImageReader);
begin
inherited;
FIntfImgA := AImage;
end;
procedure TDLBitmap.InitializeWriter(AImage: TLazIntfImage; AWriter: TFPCustomImageWriter);
begin
inherited;
end;
procedure TDLBitmap.FinalizeWriter(AWriter: TFPCustomImageWriter);
begin
inherited;
end;
procedure TDLBitmap.FillEllipse(X1, Y1, X2, Y2: integer); procedure TDLBitmap.FillEllipse(X1, Y1, X2, Y2: integer);
begin begin
@ -659,11 +670,8 @@ begin
TextLeft := TextX + IMGCanvas.TextWidth(LeftText); TextLeft := TextX + IMGCanvas.TextWidth(LeftText);
if IMGCanvas = nil then if IMGCanvas = nil then
Exit; Exit;
//IMGCanvas.TextOut(22, 22, FEdit.Text);
IMGCanvas.Brush.Style := bsClear; IMGCanvas.Brush.Style := bsClear;
IMGCanvas.TextOut(TextLeft, TextY, RightText); IMGCanvas.TextOut(TextLeft, TextY, RightText);
//if PositionIndex <> FEdit.SelStart then
// PositionIndex := FEdit.SelStart;
PositionIndex := Length(FEdit.Text); PositionIndex := Length(FEdit.Text);
end; end;

View File

@ -535,7 +535,7 @@ begin
if (a * a + b * b < Sqr(Round(Radian3 * 0.65))) then if (a * a + b * b < Sqr(Round(Radian3 * 0.65))) then
DLBmp.Pixels[X + a, Y + b] := PColor; DLBmp.Pixels[X + a, Y + b] := PColor;
end; end;
DLBmp.InvalidateScanLineRect(Rect(X - Radians, Y - Radians, X + Radians, Y + Radians)); DLBmp.InvalidateScanLine;//Rect(Rect(X - Radians, Y - Radians, X + Radians, Y + Radians));
end; end;
function GetRColor(const Color: TColor): Byte; function GetRColor(const Color: TColor): Byte;
@ -677,24 +677,26 @@ end;
procedure StretchDLBMP(Src: TDLBitmap; MultiX, MultiY: integer); procedure StretchDLBMP(Src: TDLBitmap; MultiX, MultiY: integer);
var var
sw, sh, dw, dh, B, N, x, y, i, j, k, nPixelSize: DWord; sw, sh, dw, dh, i, j, k, l, nPixelSize: DWord;
Dest: TDLBitmap; Dest: TDLBitmap;
begin begin
sw := Src.Width - 1; Dest := TDLBitmap.Create;
sh := Src.Height - 1; sw := Src.Width;
dw := (Src.Width - 1) * MultiX; sh := Src.Height;
dh := (Src.Height - 1) * MultiY; dw := Src.Width * MultiX;
nPixelSize := 3; dh := Src.Height * MultiY;
for i := 0 to sh do Dest.Width := dw;
begin Dest.Height := dh;
for j := 0 to sw do for i := 0 to sh - 1 do
begin for j := 0 to sw - 1 do
for k := 0 to nPixelSize - 1 do for k := 0 to MultiY - 1 do
begin for l := 0 to MultiX - 1 do
Dest.Pixels[j * MultiX + k, i * MultiY + l] := Src.Pixels[j, i];
end;
end;
end;
Dest.InvalidateScanLine; Dest.InvalidateScanLine;
//Src.Assign(Dest);
Src.Width := dw;
Src.Height := dh;
Src.Canvas.Draw(0, 0, Dest);
Dest.Free;
end; end;

View File

@ -600,8 +600,10 @@ procedure TRGBBitmapCore.StretchDrawTo(ACanvas: TCanvas;
begin begin
if ACanvas <> nil then if ACanvas <> nil then
// ACanvas.StretchDraw(Rect(DstX, DstY, DstWidth, DstHeight), Self); // ACanvas.StretchDraw(Rect(DstX, DstY, DstWidth, DstHeight), Self);
// StretchDLBMP(Self, 3, 3);
begin begin
ACanvas.AntialiasingMode:=amOff; ACanvas.AntialiasingMode:=amOff;
ACanvas.CopyMode:=cmSrcPaint;
ACanvas.CopyRect(Rect(DstX, DstY, DstWidth, DstHeight), Self.Canvas, Rect(0,0,Width,Height)); ACanvas.CopyRect(Rect(DstX, DstY, DstWidth, DstHeight), Self.Canvas, Rect(0,0,Width,Height));
end; end;
end; end;

View File

@ -72,7 +72,7 @@
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="430"/> <TopLine Value="430"/>
<CursorPos X="22" Y="443"/> <CursorPos X="23" Y="443"/>
<UsageCount Value="32"/> <UsageCount Value="32"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit2> </Unit2>
@ -170,8 +170,8 @@
<UnitName Value="Graphics"/> <UnitName Value="Graphics"/>
<EditorIndex Value="3"/> <EditorIndex Value="3"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="1083"/> <TopLine Value="386"/>
<CursorPos X="15" Y="1094"/> <CursorPos X="13" Y="411"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit12> </Unit12>
@ -242,10 +242,11 @@
<Unit21> <Unit21>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="bmprgbtypes.pas"/>
<UnitName Value="BmpRGBTypes"/> <UnitName Value="BmpRGBTypes"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="2"/> <EditorIndex Value="2"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="589"/> <TopLine Value="593"/>
<CursorPos X="36" Y="604"/> <CursorPos X="29" Y="608"/>
<UsageCount Value="28"/> <UsageCount Value="28"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit21> </Unit21>
@ -359,8 +360,8 @@
<UnitName Value="DLBitmap"/> <UnitName Value="DLBitmap"/>
<EditorIndex Value="4"/> <EditorIndex Value="4"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="170"/> <TopLine Value="124"/>
<CursorPos X="15" Y="180"/> <CursorPos X="66" Y="143"/>
<UsageCount Value="16"/> <UsageCount Value="16"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit35> </Unit35>
@ -390,11 +391,10 @@
</Unit38> </Unit38>
<Unit39> <Unit39>
<Filename Value="DLBmpUtils.inc"/> <Filename Value="DLBmpUtils.inc"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="5"/> <EditorIndex Value="5"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="616"/> <TopLine Value="671"/>
<CursorPos X="32" Y="661"/> <CursorPos X="28" Y="701"/>
<UsageCount Value="14"/> <UsageCount Value="14"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit39> </Unit39>
@ -431,124 +431,124 @@
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="298" Column="27" TopLine="288"/> <Caret Line="626" Column="33" TopLine="616"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="443" Column="26" TopLine="430"/> <Caret Line="620" Column="59" TopLine="606"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="131" Column="28" TopLine="120"/> <Caret Line="536" Column="13" TopLine="516"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="603" Column="33" TopLine="591"/> <Caret Line="147" Column="47" TopLine="137"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="602" Column="22" TopLine="591"/> <Caret Line="662" Column="20" TopLine="655"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="602" Column="20" TopLine="591"/> <Caret Line="661" Column="34" TopLine="651"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="430" Column="17" TopLine="419"/> <Caret Line="662" Column="30" TopLine="651"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="DLBmpUtils.inc"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="573" Column="18" TopLine="557"/> <Caret Line="664" Column="35" TopLine="652"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="DLBmpUtils.inc"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="573" Column="17" TopLine="557"/> <Caret Line="665" Column="26" TopLine="653"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="439" Column="56" TopLine="435"/> <Caret Line="666" Column="40" TopLine="655"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="449" Column="52" TopLine="438"/> <Caret Line="662" Column="18" TopLine="654"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="41" Column="68" TopLine="34"/> <Caret Line="184" Column="23" TopLine="167"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="41" Column="44" TopLine="31"/> <Caret Line="176" Column="5" TopLine="165"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="626" Column="33" TopLine="616"/>
</Position14>
<Position15>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="620" Column="59" TopLine="606"/>
</Position15>
<Position16>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="536" Column="13" TopLine="516"/>
</Position16>
<Position17>
<Filename Value="DLBitmap.pas"/>
<Caret Line="147" Column="47" TopLine="137"/>
</Position17>
<Position18>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="662" Column="20" TopLine="655"/>
</Position18>
<Position19>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="661" Column="34" TopLine="651"/>
</Position19>
<Position20>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="662" Column="30" TopLine="651"/>
</Position20>
<Position21>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="664" Column="35" TopLine="652"/>
</Position21>
<Position22>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="665" Column="26" TopLine="653"/>
</Position22>
<Position23>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="666" Column="40" TopLine="655"/>
</Position23>
<Position24>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="662" Column="18" TopLine="654"/>
</Position24>
<Position25>
<Filename Value="DLBitmap.pas"/>
<Caret Line="184" Column="23" TopLine="167"/>
</Position25>
<Position26>
<Filename Value="DLBitmap.pas"/>
<Caret Line="176" Column="5" TopLine="165"/>
</Position26>
<Position27>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="180" Column="16" TopLine="167"/> <Caret Line="180" Column="16" TopLine="167"/>
</Position27> </Position14>
<Position28> <Position15>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="443" Column="22" TopLine="430"/> <Caret Line="443" Column="22" TopLine="430"/>
</Position15>
<Position16>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="131" Column="28" TopLine="120"/>
</Position16>
<Position17>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="603" Column="18" TopLine="589"/>
</Position17>
<Position18>
<Filename Value="picturectrls.pas"/>
<Caret Line="443" Column="23" TopLine="430"/>
</Position18>
<Position19>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="131" Column="28" TopLine="116"/>
</Position19>
<Position20>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="603" Column="27" TopLine="585"/>
</Position20>
<Position21>
<Filename Value="DLBitmap.pas"/>
<Caret Line="232" Column="14" TopLine="218"/>
</Position21>
<Position22>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="603" Column="17" TopLine="588"/>
</Position22>
<Position23>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="606" Column="16" TopLine="588"/>
</Position23>
<Position24>
<Filename Value="T:\fpclaz\laz\lcl\graphics.pp"/>
<Caret Line="1158" Column="28" TopLine="1143"/>
</Position24>
<Position25>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="606" Column="16" TopLine="588"/>
</Position25>
<Position26>
<Filename Value="T:\fpclaz\laz\lcl\graphics.pp"/>
<Caret Line="1158" Column="27" TopLine="1143"/>
</Position26>
<Position27>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="606" Column="17" TopLine="588"/>
</Position27>
<Position28>
<Filename Value="T:\fpclaz\laz\lcl\graphics.pp"/>
<Caret Line="1158" Column="75" TopLine="1143"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="bmprgbtypes.pas"/>
<Caret Line="131" Column="28" TopLine="120"/> <Caret Line="606" Column="28" TopLine="591"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="bmprgbtypes.pas"/>
<Caret Line="603" Column="18" TopLine="589"/> <Caret Line="608" Column="63" TopLine="593"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>