mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-06 04:08:00 +02:00
Fixes the misterious double free memory corruption in LCL-CustomDrawn =)
git-svn-id: trunk@36215 -
This commit is contained in:
parent
a19f9693da
commit
eda1bfe2a0
@ -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:
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user