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; function TCDWidgetSet.RawImage_FromBitmap(out ARawImage: TRawImage; ABitmap, AMask: HBITMAP; ARect: PRect = nil): Boolean;
var var
Desc: TRawImageDescription absolute ARawImage.Description;
CDBitmap: TCDBitmap; 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 begin
{$ifdef VerboseCDBitmap} {$ifdef VerboseCDBitmap}
DebugLn(Format('[TCDWidgetSet.RawImage_FromBitmap] ABitmap=%x', [ABitmap])); DebugLn(Format('[TCDWidgetSet.RawImage_FromBitmap] ABitmap=%x', [ABitmap]));
@ -474,28 +486,23 @@ begin
CDBitmap := TCDBitmap(ABitmap); 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; ARawImage.Init;
RawImage_DescriptionFromBitmap(ABitmap, Desc); 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 then begin
Width := Image.Width; Width := Image.Width;
Height := Image.Height; Height := Image.Height;
@ -565,12 +572,12 @@ begin
if WorkImage <> Image then if WorkImage <> Image then
WorkImage.Free; WorkImage.Free;
if WorkMask <> Mask then if WorkMask <> Mask then
WorkMask.Free; WorkMask.Free;*)
Result := True; Result := True;
end; end;
{------------------------------------------------------------------------------ (*{------------------------------------------------------------------------------
Function: RawImage_FromDevice Function: RawImage_FromDevice
Params: ADC: Params: ADC:
ARect: ARect:

View File

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