fpspreadsheet: Fix writing of images from stream (issue #30633)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5204 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-09-23 15:44:08 +00:00
parent 9a553e8b08
commit 2a43d89371
2 changed files with 20 additions and 12 deletions

View File

@ -51,7 +51,8 @@ type
public public
destructor Destroy; override; destructor Destroy; override;
function LoadFromFile(const AFileName: String): Boolean; function LoadFromFile(const AFileName: String): Boolean;
function LoadFromStream(AStream: TStream; AName: String): Boolean; function LoadFromStream(AStream: TStream; AName: String;
ASize: Int64 = -1): Boolean;
property FileName: String read FFileName; property FileName: String read FFileName;
property ImageType: TsImagetype read FImageType; property ImageType: TsImagetype read FImageType;
property ImageWidth: Double read FWidth write FWidth; property ImageWidth: Double read FWidth write FWidth;
@ -888,11 +889,15 @@ begin
end; end;
end; end;
function TsEmbeddedObj.LoadFromStream(AStream: TStream; AName: String): Boolean; function TsEmbeddedObj.LoadFromStream(AStream: TStream; AName: String;
ASize: Int64 = -1): Boolean;
begin begin
FreeAndNil(FStream); FreeAndNil(FStream);
FStream := TMemoryStream.Create; FStream := TMemoryStream.Create;
FStream.CopyFrom(AStream, AStream.Size); if ASize = -1 then
FStream.LoadFromStream(AStream)
else
FStream.CopyFrom(AStream, ASize);
Result := CheckStream(itUnknown); Result := CheckStream(itUnknown);
if Result then FFileName := AName; if Result then FFileName := AName;
end; end;

View File

@ -529,11 +529,11 @@ type
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AOffsetX: Double = 0.0; AOffsetY: Double = 0.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload; AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
function WriteImage(ARow, ACol: Cardinal; AStream: TStream; function WriteImage(ARow, ACol: Cardinal; AStream: TStream;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AScaleX: Double = 1.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload; AScaleY: Double = 1.0; ASize: Int64 = -1): Integer; overload;
function WriteImage(ARow, ACol: Cardinal; AImageIndex: Integer; function WriteImage(ARow, ACol: Cardinal; AImageIndex: Integer;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AScaleX: Double = 1.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload; AScaleY: Double = 1.0): Integer; overload;
// Notification of changed cells // Notification of changed cells
procedure ChangedCell(ARow, ACol: Cardinal); procedure ChangedCell(ARow, ACol: Cardinal);
@ -800,7 +800,7 @@ type
{ Embedded objects } { Embedded objects }
function AddEmbeddedObj(const AFileName: String): Integer; overload; function AddEmbeddedObj(const AFileName: String): Integer; overload;
function AddEmbeddedObj(AStream: TStream; function AddEmbeddedObj(AStream: TStream;
const AName: String = ''): Integer; overload; const AName: String = ''; ASize: Int64 = -1): Integer; overload;
function FindEmbeddedObj(const AFileName: String): Integer; function FindEmbeddedObj(const AFileName: String): Integer;
function GetEmbeddedObj(AIndex: Integer): TsEmbeddedObj; function GetEmbeddedObj(AIndex: Integer): TsEmbeddedObj;
function GetEmbeddedObjCount: Integer; function GetEmbeddedObjCount: Integer;
@ -3569,16 +3569,19 @@ end;
Value is in workbook units. Value is in workbook units.
@param AScaleX Horizontal scaling factor of the image @param AScaleX Horizontal scaling factor of the image
@param AScaleY Vertical scaling factor of the image @param AScaleY Vertical scaling factor of the image
@param ASize Number ob bytes to be read from the input stream.
@return Index into the internal image list. @return Index into the internal image list.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsWorksheet.WriteImage(ARow, ACol: Cardinal; AStream: TStream; function TsWorksheet.WriteImage(ARow, ACol: Cardinal; AStream: TStream;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AOffsetX: Double = 0.0; AOffsetY: Double = 0.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; AScaleX: Double = 1.0; AScaleY: Double = 1.0;
ASize: Int64 = -1): Integer;
var var
idx: Integer; idx: Integer;
begin begin
// Copy the stream to a new item in embedded object list. // Copy the stream to a new item in embedded object list.
idx := Workbook.AddEmbeddedObj(AStream); idx := Workbook.AddEmbeddedObj(AStream, '', ASize);
// An error has occured? Error is already logged. Just exit. // An error has occured? Error is already logged. Just exit.
if idx = -1 then if idx = -1 then
exit; exit;
@ -8723,12 +8726,12 @@ end;
Returns the index of the embedded object. Returns the index of the embedded object.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsWorkbook.AddEmbeddedObj(AStream: TStream; function TsWorkbook.AddEmbeddedObj(AStream: TStream;
const AName: String = ''): Integer; const AName: String = ''; ASize: Int64 = -1): Integer;
var var
obj: TsEmbeddedObj = nil; obj: TsEmbeddedObj = nil;
begin begin
obj := TsEmbeddedObj.Create; obj := TsEmbeddedObj.Create;
if obj.LoadFromStream(AStream, AName) then if obj.LoadFromStream(AStream, AName, ASize) then
begin begin
obj.ImageWidth := ConvertUnits(obj.ImageWidth, suInches, FUnits); obj.ImageWidth := ConvertUnits(obj.ImageWidth, suInches, FUnits);
obj.ImageHeight := ConvertUnits(obj.ImageHeight, suInches, FUnits); obj.ImageHeight := ConvertUnits(obj.ImageHeight, suInches, FUnits);