lcl: fix loading bitmap from a windows resource (#0011520)

git-svn-id: trunk@16004 -
This commit is contained in:
paul 2008-08-08 15:23:23 +00:00
parent 0bcf56402b
commit 66a43dc768
2 changed files with 36 additions and 2 deletions

View File

@ -1179,8 +1179,8 @@ type
function PaletteAllocated: boolean; virtual; abstract;
procedure LoadFromBitmapHandles(ABitmap, AMask: HBitmap; ARect: PRect = nil);
procedure LoadFromDevice(DC: HDC); virtual;
procedure LoadFromStream(AStream: TStream); override;
procedure LoadFromStream(AStream: TStream; ASize: Cardinal); virtual;
procedure LoadFromStream(AStream: TStream); overload; override;
procedure LoadFromStream(AStream: TStream; ASize: Cardinal); overload; virtual;
procedure LoadFromMimeStream(AStream: TStream; const AMimeType: string); override;
//todo LoadFromRawImage
procedure LoadFromIntfImage(IntfImage: TLazIntfImage);
@ -1330,6 +1330,7 @@ type
class function GetSharedImageClass: TSharedRasterImageClass; override;
public
class function GetFileExtensions: string; override;
procedure LoadFromStream(AStream: TStream; ASize: Cardinal); override;
end;

View File

@ -47,6 +47,39 @@ begin
Result:='bmp';
end;
procedure TBitmap.LoadFromStream(AStream: TStream; ASize: Cardinal);
var
TempStream: TMemoryStream;
Header: TBitmapFileHeader;
begin
if AStream is TResourceStream then
begin
FillChar(Header, SizeOf(Header), 0);
Header.bfType := $4d42;
Header.bfSize := SizeOf(Header) + ASize;
Header.bfOffBits := SizeOf(Header);
{$IFDEF ENDIAN_BIG}
swap(Header.bfType);
swap(Header.bfSize);
swap(Header.bfOffBits);
{$ENDIF}
TempStream := TMemoryStream.Create;
try
TempStream.SetSize(Header.bfSize);
TempStream.Write(Header, SizeOf(Header));
TempStream.CopyFrom(AStream, ASize);
TempStream.Position := 0;
inherited LoadFromStream(TempStream, ASize);
finally
TempStream.Free;
end;
end
else
inherited LoadFromStream(AStream, ASize);
end;
class function TBitmap.GetReaderClass: TFPCustomImageReaderClass;
begin
Result := TLazReaderBMP;