Fixes the misterious double free memory corruption in LCL-CustomDrawn =)

git-svn-id: trunk@36215 -
This commit is contained in:
sekelsenmat 2012-03-22 11:19:14 +00:00
parent a19f9693da
commit eda1bfe2a0
2 changed files with 31 additions and 23 deletions

View File

@ -459,7 +459,19 @@ end;
------------------------------------------------------------------------------}
function TCDWidgetSet.RawImage_FromBitmap(out ARawImage: TRawImage; ABitmap, AMask: HBITMAP; ARect: PRect = nil): Boolean;
var
Desc: TRawImageDescription absolute ARawImage.Description;
CDBitmap: TCDBitmap;
lBmpRawImage: TRawImage;
NewData: PByte;
(*var
Image: TQtImage absolute ABitmap;
Mask: TQtImage absolute AMask;
WorkImage, WorkMask: TQtImage;
R: TRect;
Width, Height: Integer;
InvertPixels: Boolean;
Px: QRgb;*)
begin
{$ifdef VerboseCDBitmap}
DebugLn(Format('[TCDWidgetSet.RawImage_FromBitmap] ABitmap=%x', [ABitmap]));
@ -474,28 +486,23 @@ begin
CDBitmap := TCDBitmap(ABitmap);
CDBitmap.Image.GetRawImage(ARawImage);
end;
(*var
Desc: TRawImageDescription absolute ARawImage.Description;
Image: TQtImage absolute ABitmap;
Mask: TQtImage absolute AMask;
WorkImage, WorkMask: TQtImage;
R: TRect;
Width, Height: Integer;
InvertPixels: Boolean;
Px: QRgb;
begin
Result := False;
if not CheckBitmap(ABitmap, 'RawImage_FromBitmap') then Exit;
if (AMask <> 0) and not CheckBitmap(AMask, 'RawImage_FromBitmap (mask)') then Exit;
ARawImage.Init;
RawImage_DescriptionFromBitmap(ABitmap, Desc);
if ARect = nil
// Copy the data
CDBitmap.Image.GetRawImage(lBmpRawImage);
if lBmpRawImage.DataSize > 0 then
begin
NewData := AllocMem(lBmpRawImage.DataSize);
System.Move(lBmpRawImage.Data^, NewData^, lBmpRawImage.DataSize);
end
else
NewData := nil;
ARawImage.Data := NewData;
ARawImage.DataSize := lBmpRawImage.DataSize;
(* if ARect = nil
then begin
Width := Image.Width;
Height := Image.Height;
@ -565,12 +572,12 @@ begin
if WorkImage <> Image then
WorkImage.Free;
if WorkMask <> Mask then
WorkMask.Free;
WorkMask.Free;*)
Result := True;
end;
{------------------------------------------------------------------------------
(*{------------------------------------------------------------------------------
Function: RawImage_FromDevice
Params: ADC:
ARect:

View File

@ -3142,6 +3142,7 @@ end;
procedure TLazIntfImage.FreeData;
begin
DebugLn(Format('[TLazIntfImage.FreeData] Self=%x Data=%x', [PtrUInt(Self), PtrUInt(FRawImage.Data)]));
if FDataOwner
then ReallocMem(FRawImage.Data, 0)
else FRawImage.Data := nil;
@ -3150,7 +3151,7 @@ begin
if FLineStarts <> nil then Dispose(FLineStarts);
FLineStarts := nil;
if FDataOwner
if FDataOwner and (FRawImage.Mask <> nil)
then ReallocMem(FRawImage.Mask, 0)
else FRawImage.Mask := nil;
FRawImage.MaskSize := 0;
@ -3159,7 +3160,7 @@ begin
FMaskLineStarts := nil;
FMaskSet := False;
if FDataOwner
if FDataOwner and (FRawImage.Palette <> nil)
then ReallocMem(FRawImage.Palette, 0)
else FRawImage.Palette := nil;
FRawImage.PaletteSize := 0;