Visitar URL original
ADD: Use fast ScaleBitmap function · doublecmd/doublecmd@4989d6d · GitHub
Skip to content

Commit 4989d6d

Browse files
committed
ADD: Use fast ScaleBitmap function
1 parent 319e513 commit 4989d6d

4 files changed

Lines changed: 68 additions & 20 deletions

File tree

‎src/platform/unix/ufolderthumb.pas‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ implementation
3131
uses
3232
Math, Classes, SysUtils, Graphics, IntfGraphics, GraphType, BaseUnix, Unix,
3333
Types, FPImage, DCClassesUtf8, DCOSUtils, DCStrUtils, DCConvertEncoding,
34-
LCLVersion, uThumbnails, uPixMapManager, uReSample, uGraphics;
34+
LCLVersion, uThumbnails, uPixMapManager, uScaleBitmap, uGraphics;
3535

3636
var
3737
ProviderIndex: Integer;
@@ -143,8 +143,7 @@ function GetThumbnail(const aFileName: String; aSize: Types.TSize): Graphics.TBi
143143

144144
OBitmap:= TBitmap.Create;
145145
try
146-
OBitmap.SetSize(InnerSize.cx, InnerSize.cy);
147-
Stretch(ABitmap, OBitmap, ResampleFilters[2].Filter, ResampleFilters[2].Width);
146+
ScaleBitmapAuto(ABitmap, OBitmap, InnerSize.cx, InnerSize.cy);
148147
finally
149148
ABitmap.Free;
150149
ABitmap:= OBitmap;

‎src/platform/unix/ujpegthumb.pas‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ implementation
3030

3131
uses
3232
Classes, SysUtils, Types, Graphics, FPReadJPEG, IntfGraphics, GraphType,
33-
DCClassesUtf8, uReSample, uThumbnails;
33+
DCClassesUtf8, uScaleBitmap, uThumbnails;
3434

3535
function GetThumbnail(const aFileName: String; aSize: TSize): Graphics.TBitmap;
3636
var
@@ -50,7 +50,7 @@ function GetThumbnail(const aFileName: String; aSize: TSize): Graphics.TBitmap;
5050
FPReaderJPEG.MinHeight:= aSize.cy;
5151
try
5252
FileStream:= TFileStreamEx.Create(aFileName, fmOpenRead or fmShareDenyNone);
53-
LazIntfImage:= TLazIntfImage.Create(aSize.cx, aSize.cy, [riqfRGB]);
53+
LazIntfImage:= TLazIntfImage.Create(aSize.cx, aSize.cy, [riqfRGB, riqfAlpha]);
5454
try
5555
FPReaderJPEG.ImageRead(FileStream, LazIntfImage);
5656
LazIntfImage.GetRawImage(RawImage, True);
@@ -62,8 +62,7 @@ function GetThumbnail(const aFileName: String; aSize: TSize): Graphics.TBitmap;
6262
try
6363
Bitmap.LoadFromRawImage(RawImage, True);
6464
aSize:= TThumbnailManager.GetPreviewScaleSize(aSize, Bitmap.Width, Bitmap.Height);
65-
Result.SetSize(aSize.cx, aSize.cy);
66-
Stretch(Bitmap, Result, ResampleFilters[2].Filter, ResampleFilters[2].Width);
65+
ScaleBitmapAuto(Bitmap, Result, aSize.cx, aSize.cy);
6766
finally
6867
Bitmap.Free;
6968
end;

‎src/platform/uscalebitmap.pas‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
unit uScaleBitmap;
2+
3+
{$mode ObjFPC}{$H+}
4+
5+
interface
6+
7+
uses
8+
Classes, SysUtils, Graphics;
9+
10+
function ScaleFastAvailable(Src: TRasterImage): Boolean;
11+
function ScaleBitmapFast(Src: TRasterImage; Dst: TBitmap; DstWidth, DstHeight: Cardinal): Boolean;
12+
function ScaleBitmapAuto(Src: TRasterImage; Dst: TBitmap; DstWidth, DstHeight: Cardinal): Boolean;
13+
14+
implementation
15+
16+
uses
17+
GraphType, swscale, uReSample;
18+
19+
type
20+
TRawAccess = class(TRasterImage) end;
21+
22+
function ScaleFastAvailable(Src: TRasterImage): Boolean;
23+
var
24+
Description: PRawImageDescription;
25+
begin
26+
Result:= swscale.Available;
27+
if Result then
28+
begin
29+
Description:= TRawAccess(Src).GetRawImageDescriptionPtr;
30+
Result:= (Description^.Depth in [24, 32]) and
31+
(Description^.Depth = Description^.BitsPerPixel);
32+
end;
33+
end;
34+
35+
function ScaleBitmapFast(Src: TRasterImage; Dst: TBitmap; DstWidth, DstHeight: Cardinal): Boolean;
36+
begin
37+
if swscale.Available then
38+
Result:= swscale.Scale(Src, Dst, DstWidth, DstHeight)
39+
else begin
40+
Result:= False;
41+
end;
42+
end;
43+
44+
function ScaleBitmapAuto(Src: TRasterImage; Dst: TBitmap; DstWidth, DstHeight: Cardinal): Boolean;
45+
begin
46+
if ScaleFastAvailable(Src) then
47+
begin
48+
Result:= ScaleBitmapFast(Src, Dst, DstWidth, DstHeight);
49+
end
50+
else begin
51+
Result:= True;
52+
Dst.SetSize(DstWidth, DstHeight);
53+
Stretch(Src, Dst, ResampleFilters[2].Filter, ResampleFilters[2].Width);
54+
end;
55+
end;
56+
57+
end.
58+

‎src/uthumbnails.pas‎

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ implementation
5252

5353
uses
5454
StreamEx, URIParser, MD5, FileUtil, LazFileUtils, Forms, uDCUtils, DCOSUtils, DCStrUtils,
55-
uDebug, uReSample, uGlobsPaths, uGlobs, uPixmapManager, uFileSystemFileSource,
55+
uDebug, uScaleBitmap, uGlobsPaths, uGlobs, uPixmapManager, uFileSystemFileSource,
5656
uGraphics, uFileProcs;
5757

5858
const
@@ -74,19 +74,11 @@ function TThumbnailManager.GetPreviewFileName(const sFileName: String): String;
7474
function TThumbnailManager.CreatePreviewImage(const Graphic: TGraphic): TBitmap;
7575
var
7676
aSize: TSize;
77-
bmpTemp: TBitmap = nil;
7877
begin
79-
try
80-
// Calculate aspect width and height of thumb
81-
aSize:= GetPreviewScaleSize(FThumbBitmapSize, Graphic.Width, Graphic.Height);
82-
bmpTemp:= TBitMap.Create;
83-
bmpTemp.Assign(Graphic);
84-
Result:= TBitMap.Create;
85-
Result.SetSize(aSize.cx, aSize.cy);
86-
Stretch(bmpTemp, Result, ResampleFilters[2].Filter, ResampleFilters[2].Width);
87-
finally
88-
FreeAndNil(bmpTemp);
89-
end;
78+
Result:= TBitMap.Create;
79+
// Calculate aspect width and height of thumb
80+
aSize:= GetPreviewScaleSize(FThumbBitmapSize, Graphic.Width, Graphic.Height);
81+
ScaleBitmapAuto(TRasterImage(Graphic), Result, aSize.cx, aSize.cy);
9082
end;
9183

9284
procedure TThumbnailManager.DoCreatePreviewText;

0 commit comments

Comments
 (0)