mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 11:19:24 +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;
|
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:
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user