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
destructor Destroy; override;
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 ImageType: TsImagetype read FImageType;
property ImageWidth: Double read FWidth write FWidth;
@ -888,11 +889,15 @@ begin
end;
end;
function TsEmbeddedObj.LoadFromStream(AStream: TStream; AName: String): Boolean;
function TsEmbeddedObj.LoadFromStream(AStream: TStream; AName: String;
ASize: Int64 = -1): Boolean;
begin
FreeAndNil(FStream);
FStream := TMemoryStream.Create;
FStream.CopyFrom(AStream, AStream.Size);
if ASize = -1 then
FStream.LoadFromStream(AStream)
else
FStream.CopyFrom(AStream, ASize);
Result := CheckStream(itUnknown);
if Result then FFileName := AName;
end;

View File

@ -529,11 +529,11 @@ type
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
function WriteImage(ARow, ACol: Cardinal; AStream: TStream;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AScaleX: Double = 1.0;
AScaleY: Double = 1.0; ASize: Int64 = -1): Integer; overload;
function WriteImage(ARow, ACol: Cardinal; AImageIndex: Integer;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0;
AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload;
AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AScaleX: Double = 1.0;
AScaleY: Double = 1.0): Integer; overload;
// Notification of changed cells
procedure ChangedCell(ARow, ACol: Cardinal);
@ -800,7 +800,7 @@ type
{ Embedded objects }
function AddEmbeddedObj(const AFileName: String): Integer; overload;
function AddEmbeddedObj(AStream: TStream;
const AName: String = ''): Integer; overload;
const AName: String = ''; ASize: Int64 = -1): Integer; overload;
function FindEmbeddedObj(const AFileName: String): Integer;
function GetEmbeddedObj(AIndex: Integer): TsEmbeddedObj;
function GetEmbeddedObjCount: Integer;
@ -3569,16 +3569,19 @@ end;
Value is in workbook units.
@param AScaleX Horizontal 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.
-------------------------------------------------------------------------------}
function TsWorksheet.WriteImage(ARow, ACol: Cardinal; AStream: TStream;
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
idx: Integer;
begin
// 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.
if idx = -1 then
exit;
@ -8723,12 +8726,12 @@ end;
Returns the index of the embedded object.
-------------------------------------------------------------------------------}
function TsWorkbook.AddEmbeddedObj(AStream: TStream;
const AName: String = ''): Integer;
const AName: String = ''; ASize: Int64 = -1): Integer;
var
obj: TsEmbeddedObj = nil;
begin
obj := TsEmbeddedObj.Create;
if obj.LoadFromStream(AStream, AName) then
if obj.LoadFromStream(AStream, AName, ASize) then
begin
obj.ImageWidth := ConvertUnits(obj.ImageWidth, suInches, FUnits);
obj.ImageHeight := ConvertUnits(obj.ImageHeight, suInches, FUnits);