* Start of new Icon - bitmap cleanup

git-svn-id: trunk@13624 -
This commit is contained in:
marc 2008-01-05 00:30:10 +00:00
parent 3e34d8a699
commit 39aa9c05e7
5 changed files with 130 additions and 93 deletions

View File

@ -695,19 +695,23 @@ type
procedure WriteData(Stream: TStream); virtual; procedure WriteData(Stream: TStream); virtual;
public public
constructor Create; virtual; constructor Create; virtual;
function LazarusResourceTypeValid(const AResourceType: string): boolean; virtual;
procedure LoadFromFile(const Filename: string); virtual; procedure LoadFromFile(const Filename: string); virtual;
procedure SaveToFile(const Filename: string); virtual;
procedure LoadFromStream(Stream: TStream); virtual; abstract; procedure LoadFromStream(Stream: TStream); virtual; abstract;
procedure SaveToStream(Stream: TStream); virtual; abstract;
procedure LoadFromMimeStream(Stream: TStream; const MimeType: string); virtual; procedure LoadFromMimeStream(Stream: TStream; const MimeType: string); virtual;
procedure LoadFromLazarusResource(const ResName: String); virtual; abstract; procedure LoadFromLazarusResource(const ResName: String); virtual;
procedure LoadFromResourceName(Instance: THandle; const ResName: String);
procedure LoadFromResourceID(Instance: THandle; ResID: Integer);
procedure LoadFromClipboardFormat(FormatID: TClipboardFormat); virtual; procedure LoadFromClipboardFormat(FormatID: TClipboardFormat); virtual;
procedure LoadFromClipboardFormatID(ClipboardType: TClipboardType; procedure LoadFromClipboardFormatID(ClipboardType: TClipboardType;
FormatID: TClipboardFormat); virtual; FormatID: TClipboardFormat); virtual;
procedure SaveToFile(const Filename: string); virtual;
procedure SaveToStream(Stream: TStream); virtual; abstract;
procedure SaveToClipboardFormat(FormatID: TClipboardFormat); virtual; procedure SaveToClipboardFormat(FormatID: TClipboardFormat); virtual;
procedure SaveToClipboardFormatID(ClipboardType: TClipboardType; procedure SaveToClipboardFormatID(ClipboardType: TClipboardType;
FormatID: TClipboardFormat); virtual; FormatID: TClipboardFormat); virtual;
procedure GetSupportedSourceMimeTypes(List: TStrings); virtual; procedure GetSupportedSourceMimeTypes(List: TStrings); virtual;
function GetResourceType: TResourceType; virtual;
function GetDefaultMimeType: string; virtual; function GetDefaultMimeType: string; virtual;
class function GetFileExtensions: string; virtual; class function GetFileExtensions: string; virtual;
class function GetFPReaderForFileExt( class function GetFPReaderForFileExt(
@ -1152,6 +1156,7 @@ type
function GetHandle: HBITMAP; virtual; function GetHandle: HBITMAP; virtual;
function GetMaskHandle: HBITMAP; virtual; function GetMaskHandle: HBITMAP; virtual;
function GetTransparent: Boolean; override; function GetTransparent: Boolean; override;
function GetBitmapNativeType: TBitmapNativeType; virtual;
procedure HandleNeeded; procedure HandleNeeded;
procedure MaskHandleNeeded; procedure MaskHandleNeeded;
procedure PaletteNeeded; procedure PaletteNeeded;
@ -1180,22 +1185,19 @@ type
function MaskHandleAllocated: boolean; function MaskHandleAllocated: boolean;
function PaletteAllocated: boolean; function PaletteAllocated: boolean;
procedure CreateFromBitmapHandles(ABitmap, AMask: HBitmap; const ARect: TRect); procedure CreateFromBitmapHandles(ABitmap, AMask: HBitmap; const ARect: TRect);
function LazarusResourceTypeValid(const ResourceType: string): boolean; virtual; function LazarusResourceTypeValid(const ResourceType: string): boolean; override;
procedure LoadFromDevice(DC: HDC); virtual; procedure LoadFromDevice(DC: HDC); virtual;
procedure LoadFromStream(Stream: TStream); override; procedure LoadFromStream(Stream: TStream); override;
procedure LoadFromLazarusResource(const ResName: String); override;
procedure LoadFromResourceName(Instance: THandle; const ResName: String); virtual;
procedure LoadFromResourceID(Instance: THandle; ResID: Integer); virtual;
procedure LoadFromMimeStream(Stream: TStream; const MimeType: string); override; procedure LoadFromMimeStream(Stream: TStream; const MimeType: string); override;
procedure SaveToFile(const Filename: string); override; procedure LoadFromIntfImage(IntfImage: TLazIntfImage);
procedure LoadFromXPMFile(const Filename: String); deprecated;
procedure SaveToStream(Stream: TStream); override;
procedure GetSupportedSourceMimeTypes(List: TStrings); override; procedure GetSupportedSourceMimeTypes(List: TStrings); override;
function GetDefaultMimeType: string; override; function GetDefaultMimeType: string; override;
function GetResourceType: TResourceType; override;
class function GetFileExtensions: string; override; class function GetFileExtensions: string; override;
procedure LoadFromXPMFile(const Filename: String);
procedure LoadFromIntfImage(IntfImage: TLazIntfImage);
procedure Mask(ATransparentColor: TColor); procedure Mask(ATransparentColor: TColor);
procedure SetHandles(ABitmap, AMask: HBITMAP); procedure SetHandles(ABitmap, AMask: HBITMAP);
procedure SaveToStream(Stream: TStream); override;
procedure ReadStream(Stream: TStream; UseSize: boolean; Size: Longint); virtual; procedure ReadStream(Stream: TStream; UseSize: boolean; Size: Longint); virtual;
procedure WriteStream(Stream: TStream; WriteSize: Boolean); virtual; procedure WriteStream(Stream: TStream; WriteSize: Boolean); virtual;
function ReleaseHandle: HBITMAP; function ReleaseHandle: HBITMAP;
@ -1236,8 +1238,9 @@ type
{ TPixmap } { TPixmap }
TPixmap = class(TBitmap) TPixmap = class(TBitmap)
protected
function GetBitmapNativeType: TBitmapNativeType; override;
public public
procedure SaveToFile(const Filename: string); override;
function LazarusResourceTypeValid(const ResourceType: string): boolean; override; function LazarusResourceTypeValid(const ResourceType: string): boolean; override;
procedure WriteStream(Stream: TStream; WriteSize: Boolean); override; procedure WriteStream(Stream: TStream; WriteSize: Boolean); override;
class function GetDefaultFPReader: TFPCustomImageReaderClass; override; class function GetDefaultFPReader: TFPCustomImageReaderClass; override;
@ -1250,6 +1253,8 @@ type
reader and writer } reader and writer }
TFPImageBitmap = class(TBitmap) TFPImageBitmap = class(TBitmap)
protected
function GetBitmapNativeType: TBitmapNativeType; override;
public public
class function GetFileExtensions: string; override; class function GetFileExtensions: string; override;
class function IsFileExtensionSupported(const FileExtension: string): boolean; class function IsFileExtensionSupported(const FileExtension: string): boolean;
@ -1297,10 +1302,14 @@ type
Bitmaps property Bitmaps property
Writing is not (yet) implemented. Writing is not (yet) implemented.
} }
{.$define ICON_OLDSTYLE} // Set to keep original functionality
TIcon = class(TBitmap) TIcon = class(TBitmap)
private private
FBitmaps: TObjectList; FBitmaps: TObjectList;
protected protected
function GetBitmapNativeType: TBitmapNativeType; override;
procedure ReadData(Stream: TStream); override; procedure ReadData(Stream: TStream); override;
procedure InitFPImageReader(IntfImg: TLazIntfImage; ImgReader: TFPCustomImageReader); override; procedure InitFPImageReader(IntfImg: TLazIntfImage; ImgReader: TFPCustomImageReader); override;
public public
@ -1310,6 +1319,7 @@ type
procedure AddBitmap(Bitmap: TBitmap); { Note that Ownership passes to TIcon } procedure AddBitmap(Bitmap: TBitmap); { Note that Ownership passes to TIcon }
end; end;
{ TCursorImage } { TCursorImage }
TCursorImage = class(TIcon) TCursorImage = class(TIcon)
private private
@ -1317,6 +1327,7 @@ type
FCursorHandle: HCURSOR; FCursorHandle: HCURSOR;
FOwnHandle: Boolean; FOwnHandle: Boolean;
protected protected
function GetBitmapNativeType: TBitmapNativeType; override;
function GetCursorHandle: HCURSOR; function GetCursorHandle: HCURSOR;
procedure CursorHandleNeeded; procedure CursorHandleNeeded;
public public
@ -1938,6 +1949,11 @@ begin
Result:=nil; Result:=nil;
end; end;
function TFPImageBitmap.GetBitmapNativeType: TBitmapNativeType;
begin
Result := bnNone;
end;
class function TFPImageBitmap.GetDefaultFPReader: TFPCustomImageReaderClass; class function TFPImageBitmap.GetDefaultFPReader: TFPCustomImageReaderClass;
begin begin
Result:=nil; Result:=nil;
@ -2044,6 +2060,11 @@ begin
FreeAndNil(FBitmaps); FreeAndNil(FBitmaps);
end; end;
function TIcon.GetBitmapNativeType: TBitmapNativeType;
begin
Result := bnIcon;
end;
procedure TIcon.AddBitmap(Bitmap: TBitmap); procedure TIcon.AddBitmap(Bitmap: TBitmap);
begin begin
if not Assigned(FBitmaps) then if not Assigned(FBitmaps) then
@ -2051,6 +2072,8 @@ begin
FBitmaps.Add(Bitmap); FBitmaps.Add(Bitmap);
end; end;
{ TCursorImage } { TCursorImage }
class function TCursorImage.GetFileExtensions: string; class function TCursorImage.GetFileExtensions: string;
@ -2106,6 +2129,11 @@ begin
inherited Destroy; inherited Destroy;
end; end;
function TCursorImage.GetBitmapNativeType: TBitmapNativeType;
begin
Result := bnCursor;
end;
// ------------------------------------------------------------------ // ------------------------------------------------------------------
// Decrease the component RGBs of a color of the quantity' passed // Decrease the component RGBs of a color of the quantity' passed
// //

View File

@ -270,9 +270,8 @@ end;
function TBitmap.LazarusResourceTypeValid(const ResourceType: string): boolean; function TBitmap.LazarusResourceTypeValid(const ResourceType: string): boolean;
begin begin
Result:=((ClassType=TBitmap) or (ClassType=TPixmap) or (ClassType=TIcon)) Result := AnsiSameText(ResourceType,'XPM')
and ((AnsiCompareText(ResourceType,'XPM')=0) or AnsiSameText(ResourceType,'BMP');
or (AnsiCompareText(ResourceType,'BMP')=0));
end; end;
procedure TBitMap.Mask(ATransparentColor: TColor); procedure TBitMap.Mask(ATransparentColor: TColor);
@ -442,51 +441,11 @@ begin
// CreateMask; // CreateMask;
end; end;
procedure TBitmap.LoadFromLazarusResource(const ResName: String);
var
Stream: TLazarusResourceStream;
begin
Stream := nil;
try
Stream := TLazarusResourceStream.Create(ResName, nil);
if LazarusResourceTypeValid(Stream.Res.ValueType) then
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TBitMap.LoadFromStream(Stream: TStream); procedure TBitMap.LoadFromStream(Stream: TStream);
begin begin
ReadStream(Stream, true, Stream.Size - Stream.Position); ReadStream(Stream, true, Stream.Size - Stream.Position);
end; end;
procedure TBitMap.LoadFromResourceName(Instance: THandle; const ResName: String);
var
Stream: TResourceStream;
begin
Stream := nil;
try
Stream := TResourceStream.Create(Instance, ResName, RT_BITMAP);
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TBitMap.LoadFromResourceID(Instance: THandle; ResID: Integer);
var
Stream: TResourceStream;
begin
Stream := nil;
try
Stream := TResourceStream.CreateFromID(Instance, ResID, RT_BITMAP);
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TBitmap.GetSupportedSourceMimeTypes(List: TStrings); procedure TBitmap.GetSupportedSourceMimeTypes(List: TStrings);
begin begin
if (ClassType=TBitmap) or (ClassType=TPixmap) or (ClassType=TIcon) then if (ClassType=TBitmap) or (ClassType=TPixmap) or (ClassType=TIcon) then
@ -609,6 +568,11 @@ begin
FImage.SaveStreamClass:=nil; FImage.SaveStreamClass:=nil;
end; end;
function TBitmap.GetBitmapNativeType: TBitmapNativeType;
begin
Result := bnWinBitmap;
end;
procedure TBitmap.ReadStream(Stream: TStream; UseSize: boolean; Size: Longint); procedure TBitmap.ReadStream(Stream: TStream; UseSize: boolean; Size: Longint);
procedure RaiseInvalidBitmapHeader; procedure RaiseInvalidBitmapHeader;
@ -703,18 +667,6 @@ begin
inherited LoadFromMimeStream(Stream, MimeType); inherited LoadFromMimeStream(Stream, MimeType);
end; end;
procedure TBitmap.SaveToFile(const Filename: string);
begin
if (ClassType=TBitmap) and (FImage.SaveStreamType<>bnWinBitmap) then begin
// TBitmap should always save in .bmp format
// but the current SaveStream is not in .bmp format.
// -> Clear the SaveStream.
UnshareImage(true);
FreeSaveStream;
end;
inherited SaveToFile(Filename);
end;
procedure TBitmap.SetWidthHeight(NewWidth, NewHeight: integer); procedure TBitmap.SetWidthHeight(NewWidth, NewHeight: integer);
begin begin
if (FImage.FDIB.dsbm.bmHeight <> NewHeight) if (FImage.FDIB.dsbm.bmHeight <> NewHeight)
@ -937,9 +889,10 @@ var
RawImage: TRawImage; RawImage: TRawImage;
begin begin
//DebugLn(['WriteStreamWithFPImage Self=',DbgS(Self),' ',Width,',',Height,' Using SaveStream=',(FImage.SaveStream<>nil) and (FImage.SaveStream.Size>0)]); //DebugLn(['WriteStreamWithFPImage Self=',DbgS(Self),' ',Width,',',Height,' Using SaveStream=',(FImage.SaveStream<>nil) and (FImage.SaveStream.Size>0)]);
if (FImage.SaveStream<>nil) and (FImage.SaveStream.Size>0) if (FImage.SaveStream<>nil)
and ((FImage.SaveStreamType<>bnNone) and (FImage.SaveStream.Size>0)
or CanReadGraphicStreams(FImage.SaveStreamClass)) and (FImage.SaveStreamType = GetBitmapNativeType)
and ((FImage.SaveStreamType<>bnNone) or CanReadGraphicStreams(FImage.SaveStreamClass))
then begin then begin
// it's a stream format, that this graphic class can read // it's a stream format, that this graphic class can read
// (important for restore) // (important for restore)
@ -1266,6 +1219,11 @@ begin
Result := FImage.FPalette; Result := FImage.FPalette;
end; end;
function TBitmap.GetResourceType: TResourceType;
begin
Result := RT_BITMAP;
end;
function TBitmap.GetWidth: Integer; function TBitmap.GetWidth: Integer;
begin begin
Result := FImage.FDIB.dsbm.bmWidth; Result := FImage.FDIB.dsbm.bmWidth;

View File

@ -45,6 +45,11 @@ begin
Result:=0; Result:=0;
end; end;
function TGraphic.GetResourceType: TResourceType;
begin
Result := nil;
end;
procedure TGraphic.Changed(Sender: TObject); procedure TGraphic.Changed(Sender: TObject);
begin begin
FModified := True; FModified := True;
@ -126,7 +131,39 @@ begin
if (DefMimeType<>'') and (MimeType=GetDefaultMimeType) then if (DefMimeType<>'') and (MimeType=GetDefaultMimeType) then
LoadFromStream(Stream) LoadFromStream(Stream)
else else
raise Exception.Create(ClassName+': Unsupported MimeType: '+MimeType); raise EInvalidGraphic.Create(ClassName+': Unsupported MimeType: '+MimeType);
end;
procedure TGraphic.LoadFromResourceID(Instance: THandle; ResID: Integer);
var
Stream: TResourceStream;
ResType: TResourceType;
begin
ResType := GetResourceType;
if ResType = nil then Exit;
Stream := TResourceStream.CreateFromID(Instance, ResID, ResType);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TGraphic.LoadFromResourceName(Instance: THandle; const ResName: String);
var
Stream: TResourceStream;
ResType: TResourceType;
begin
ResType := GetResourceType;
if ResType = nil then Exit;
Stream := TResourceStream.Create(Instance, ResName, ResType);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end; end;
procedure TGraphic.LoadFromClipboardFormat(FormatID: TClipboardFormat); procedure TGraphic.LoadFromClipboardFormat(FormatID: TClipboardFormat);
@ -193,6 +230,21 @@ begin
end; end;
end; end;
procedure TGraphic.LoadFromLazarusResource(const ResName: String);
var
Stream: TLazarusResourceStream;
begin
Stream := nil;
try
Stream := TLazarusResourceStream.Create(ResName, nil);
if LazarusResourceTypeValid(Stream.Res.ValueType)
then LoadFromStream(Stream)
else raise EInvalidGraphic.Create(ClassName+': Unsupported Resourcetype: '+Stream.Res.ValueType);
finally
Stream.Free;
end;
end;
procedure TGraphic.WriteData(Stream: TStream); procedure TGraphic.WriteData(Stream: TStream);
begin begin
SaveToStream(Stream); SaveToStream(Stream);
@ -203,6 +255,11 @@ begin
Result := FTransparent; Result := FTransparent;
end; end;
function TGraphic.LazarusResourceTypeValid(const AResourceType: string): boolean;
begin
Result := False;
end;
procedure TGraphic.SetModified(Value: Boolean); procedure TGraphic.SetModified(Value: Boolean);
begin begin
if Value then if Value then

View File

@ -277,18 +277,6 @@ end;
{ TPixmap } { TPixmap }
procedure TPixmap.SaveToFile(const Filename: string);
begin
if (ClassType=TPixmap) and (FImage.SaveStreamType<>bnXPixmap) then begin
// TPixmap should always save in .xpm format
// but the current SaveStream is not in .xpm format.
// -> Clear the SaveStream.
UnshareImage(true);
FreeSaveStream;
end;
inherited SaveToFile(Filename);
end;
function TPixmap.LazarusResourceTypeValid(const ResourceType: string): boolean; function TPixmap.LazarusResourceTypeValid(const ResourceType: string): boolean;
begin begin
Result:=(ResourceType='XPM'); Result:=(ResourceType='XPM');
@ -299,6 +287,11 @@ begin
WriteStreamWithFPImage(Stream,WriteSize,TLazWriterXPM); WriteStreamWithFPImage(Stream,WriteSize,TLazWriterXPM);
end; end;
function TPixmap.GetBitmapNativeType: TBitmapNativeType;
begin
Result := bnXPixmap;
end;
class function TPixmap.GetDefaultFPReader: TFPCustomImageReaderClass; class function TPixmap.GetDefaultFPReader: TFPCustomImageReaderClass;
begin begin
Result:=TLazReaderXPM; Result:=TLazReaderXPM;

View File

@ -1868,20 +1868,21 @@ const
CBM_INIT = 4; { initialize bitmap } CBM_INIT = 4; { initialize bitmap }
{ Predefined Resource Types } { Predefined Resource Types }
type
{$ifdef UNICODE}
TResourceType = PWideChar;
{$else}
TResourceType = PChar;
{$endif}
const
{$ifdef windows} {$ifdef windows}
RT_CURSOR = Windows.RT_CURSOR; RT_CURSOR = Windows.RT_CURSOR;
RT_BITMAP = Windows.RT_BITMAP; RT_BITMAP = Windows.RT_BITMAP;
RT_ICON = Windows.RT_ICON; RT_ICON = Windows.RT_ICON;
{$else} {$else}
{$ifdef UNICODE} // PI: taked this define from classesh.inc TResourceStream RT_CURSOR = TResourceType(1);
RT_CURSOR = PWideChar(1); RT_BITMAP = TResourceType(2);
RT_BITMAP = PWideChar(2); RT_ICON = TResourceType(3);
RT_ICON = PWideChar(3);
{$else}
RT_CURSOR = PChar(1);
RT_BITMAP = PChar(2);
RT_ICON = PChar(3);
{$endif}
{$endif} {$endif}