mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-07 22:58:14 +02:00
gtk intf: added automatic realign for bitmap masks bug #2022
git-svn-id: trunk@9610 -
This commit is contained in:
parent
41f5aae4d5
commit
835168efa7
@ -113,9 +113,9 @@ type
|
||||
TRawImage = record
|
||||
Description: TRawImageDescription;
|
||||
Data: PByte;
|
||||
DataSize: cardinal;
|
||||
DataSize: PtrInt;
|
||||
Mask: PByte;
|
||||
MaskSize: cardinal;
|
||||
MaskSize: PtrInt;
|
||||
Palette: PByte;
|
||||
PaletteSize: cardinal;
|
||||
end;
|
||||
@ -166,7 +166,7 @@ procedure ReleaseRawImageData(RawImage: PRawImage);
|
||||
|
||||
procedure CreateRawImageData(Width, Height, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd;
|
||||
var Data: Pointer; var DataSize: cardinal);
|
||||
var Data: Pointer; var DataSize: PtrInt);
|
||||
procedure CreateRawImageLineStarts(Width, Height, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd;
|
||||
var LineStarts: PRawImagePosition);
|
||||
@ -180,17 +180,21 @@ procedure ExtractRawImageRect(SrcRawImage: PRawImage; const SrcRect: TRect;
|
||||
procedure ExtractRawImageDataRect(SrcRawImageDesc: PRawImageDescription;
|
||||
const SrcRect: TRect; SrcData: Pointer;
|
||||
DestRawImageDesc: PRawImageDescription;
|
||||
var DestData: Pointer; var DestDataSize: cardinal);
|
||||
var DestData: Pointer; var DestDataSize: PtrInt);
|
||||
function GetBytesPerLine(Width, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd): cardinal;
|
||||
LineEnd: TRawImageLineEnd): PtrInt;
|
||||
function GetBitsPerLine(Width, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd): cardinal;
|
||||
LineEnd: TRawImageLineEnd): PtrInt;
|
||||
procedure ReadRawImageBits(TheData: PByte; const Position: TRawImagePosition;
|
||||
BitsPerPixel, Prec, Shift: cardinal;
|
||||
BitOrder: TRawImageBitOrder; var Bits: word);
|
||||
procedure WriteRawImageBits(TheData: PByte; const Position: TRawImagePosition;
|
||||
BitsPerPixel, Prec, Shift: cardinal;
|
||||
BitOrder: TRawImageBitOrder; Bits: word);
|
||||
procedure ReAlignRawImageLines(var Data: Pointer; var Size: PtrInt;
|
||||
Width, Height: cardinal;
|
||||
var OldLineEnd: TRawImageLineEnd; NewLineEnd: TRawImageLineEnd);
|
||||
|
||||
var
|
||||
MissingBits: array[0..15] of array[0..7] of word;
|
||||
|
||||
@ -267,7 +271,7 @@ begin
|
||||
BitsPerLine:=GetBitsPerLine(Width,RawImage^.Description.AlphaBitsPerPixel,
|
||||
RawImage^.Description.AlphaLineEnd);
|
||||
UsedBitsPerLine:=Width*RawImage^.Description.AlphaBitsPerPixel;
|
||||
if RawImage^.MaskSize<((Height*BitsPerLine+7) shr 3) then
|
||||
if RawImage^.MaskSize<PtrInt((Height*BitsPerLine+7) shr 3) then
|
||||
raise Exception.Create('RawImageMaskIsEmpty Invalid MaskSize');
|
||||
if (BitsPerLine and 7)=0 then begin
|
||||
// byte boundary
|
||||
@ -400,10 +404,10 @@ end;
|
||||
|
||||
-------------------------------------------------------------------------------}
|
||||
procedure CreateRawImageData(Width, Height, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd; var Data: Pointer; var DataSize: cardinal);
|
||||
LineEnd: TRawImageLineEnd; var Data: Pointer; var DataSize: PtrInt);
|
||||
var
|
||||
PixelCount: cardinal;
|
||||
BitsPerLine: cardinal;
|
||||
PixelCount: PtrInt;
|
||||
BitsPerLine: PtrInt;
|
||||
DataBits: Int64;
|
||||
begin
|
||||
// get current size
|
||||
@ -493,7 +497,7 @@ end;
|
||||
procedure ExtractRawImageDataRect(SrcRawImageDesc: PRawImageDescription;
|
||||
const SrcRect: TRect; SrcData: Pointer;
|
||||
DestRawImageDesc: PRawImageDescription;
|
||||
var DestData: Pointer; var DestDataSize: cardinal);
|
||||
var DestData: Pointer; var DestDataSize: PtrInt);
|
||||
var
|
||||
SrcWidth: cardinal;
|
||||
SrcHeight: cardinal;
|
||||
@ -510,7 +514,7 @@ var
|
||||
Shift: LongWord;
|
||||
SrcPos: PByte;
|
||||
DestPos: PByte;
|
||||
ByteCount: LongWord;
|
||||
ByteCount: PtrInt;
|
||||
x: Integer;
|
||||
begin
|
||||
// init
|
||||
@ -628,15 +632,15 @@ begin
|
||||
end;
|
||||
|
||||
function GetBytesPerLine(Width, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd): cardinal;
|
||||
LineEnd: TRawImageLineEnd): PtrInt;
|
||||
begin
|
||||
Result:=(GetBitsPerLine(Width,BitsPerPixel,LineEnd)+7) shr 3;
|
||||
end;
|
||||
|
||||
function GetBitsPerLine(Width, BitsPerPixel: cardinal;
|
||||
LineEnd: TRawImageLineEnd): cardinal;
|
||||
LineEnd: TRawImageLineEnd): PtrInt;
|
||||
var
|
||||
BitsPerLine: Cardinal;
|
||||
BitsPerLine: PtrInt;
|
||||
begin
|
||||
BitsPerLine:=Width*BitsPerPixel;
|
||||
case LineEnd of
|
||||
@ -753,6 +757,48 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure ReAlignRawImageLines(var Data: Pointer; var Size: PtrInt;
|
||||
Width, Height: cardinal;
|
||||
var OldLineEnd: TRawImageLineEnd; NewLineEnd: TRawImageLineEnd);
|
||||
var
|
||||
OldBytesPerLine: PtrInt;
|
||||
OldSize: PtrInt;
|
||||
NewBytesPerLine: PtrInt;
|
||||
NewSize: PtrInt;
|
||||
y: Integer;
|
||||
OldPos: Pointer;
|
||||
NewPos: Pointer;
|
||||
begin
|
||||
if OldLineEnd=NewLineEnd then exit;
|
||||
if (Width=0) or (Height=0) then exit;
|
||||
OldBytesPerLine:=GetBytesPerLine(Width,Height,OldLineEnd);
|
||||
OldSize:=OldBytesPerLine*PtrInt(Height);
|
||||
if OldSize<>Size then
|
||||
RaiseGDBException('ReAlignRawImageLines OldSize<>Size');
|
||||
NewBytesPerLine:=GetBytesPerLine(Width,Height,OldLineEnd);
|
||||
NewSize:=NewBytesPerLine*PtrInt(Height);
|
||||
|
||||
// enlarge before
|
||||
if OldSize<NewSize then
|
||||
ReAllocMem(Data,NewSize);
|
||||
|
||||
// move data
|
||||
OldPos:=Data;
|
||||
NewPos:=Data;
|
||||
for y:=0 to Height-1 do begin
|
||||
System.Move(OldPos,NewPos,OldBytesPerLine);
|
||||
inc(OldPos,OldBytesPerLine);
|
||||
inc(NewPos,NewBytesPerLine);
|
||||
end;
|
||||
|
||||
// shrink after
|
||||
if OldSize>NewSize then
|
||||
ReAllocMem(Data,NewSize);
|
||||
|
||||
Size:=NewSize;
|
||||
OldLineEnd:=NewLineEnd;
|
||||
end;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
procedure InternalInit;
|
||||
var
|
||||
|
@ -2730,7 +2730,7 @@ begin
|
||||
DebugLn('TGtkWidgetSet.GetRawImageFromGdkWindow G Width=',dbgs(AnImage^.Width),' Height=',dbgs(AnImage^.Height),
|
||||
' BitsPerPixel=',dbgs(NewRawImage.Description.BitsPerPixel),' bpl=',dbgs(AnImage^.bpl));
|
||||
{$ENDIF}
|
||||
if NewRawImage.DataSize<>cardinal(AnImage^.bpl) * cardinal(AnImage^.Height)
|
||||
if NewRawImage.DataSize<>PtrInt(AnImage^.bpl) * PtrInt(AnImage^.Height)
|
||||
then
|
||||
RaiseGDBException('NewRawImage.DataSize<>AnImage^.bpl*AnImage^.Height');
|
||||
|
||||
@ -2784,7 +2784,7 @@ var
|
||||
BytesPerLine: Integer;
|
||||
begin
|
||||
Result:=false;
|
||||
|
||||
|
||||
Width:=SrcRect.Right-SrcRect.Left;
|
||||
Height:=SrcRect.Bottom-SrcRect.Top;
|
||||
|
||||
@ -2814,16 +2814,18 @@ begin
|
||||
|
||||
// See also GetWindowRawImageDescription
|
||||
RawImage.Description.AlphaBitsPerPixel:=GetPGdkImageBitsPerPixel(AnImage);
|
||||
RawImage.Description.AlphaLineEnd:=rileByteBoundary;// gdk_image_get uses rileByteBoundary or rileDWordBoundary
|
||||
RawImage.Description.AlphaLineEnd:=rileByteBoundary;// gdk_bitmap_create_from_data expects rileByteBoundary
|
||||
BytesPerLine:=GetBytesPerLine(RawImage.Description.Width,
|
||||
RawImage.Description.AlphaBitsPerPixel,
|
||||
RawImage.Description.AlphaLineEnd);
|
||||
if BytesPerLine<>AnImage^.bpl then begin
|
||||
RawImage.Description.AlphaLineEnd:=rileDWordBoundary;// gdk_image_get uses rileByteBoundary
|
||||
//DebugLn(['TGTKWidgetSet.GetRawImageMaskFromGdkBitmap WRONG: Width=',RawImage.Description.Width,' AlphaBitsPerPixel=',RawImage.Description.AlphaBitsPerPixel,' BytesPerLine=',BytesPerLine,' AnImage^.bpl=',AnImage^.bpl,' AlphaLineEnd=',RawImageLineEndNames[RawImage.Description.AlphaLineEnd]]);
|
||||
RawImage.Description.AlphaLineEnd:=rileDWordBoundary;
|
||||
BytesPerLine:=GetBytesPerLine(RawImage.Description.Width,
|
||||
RawImage.Description.AlphaBitsPerPixel,
|
||||
RawImage.Description.AlphaLineEnd);
|
||||
end;
|
||||
//DebugLn(['TGTKWidgetSet.GetRawImageMaskFromGdkBitmap Width=',RawImage.Description.Width,' AlphaBitsPerPixel=',RawImage.Description.AlphaBitsPerPixel,' BytesPerLine=',BytesPerLine,' AnImage^.bpl=',AnImage^.bpl,' AlphaLineEnd=',RawImageLineEndNames[RawImage.Description.AlphaLineEnd]]);
|
||||
|
||||
// consistency checks
|
||||
if RawImage.Description.AlphaBitsPerPixel<>AnImage^.Depth then
|
||||
@ -2839,7 +2841,7 @@ begin
|
||||
{$IFDEF VerboseRawImage}
|
||||
DebugLn('TGtkWidgetSet.GetRawImageFromGdkWindow G Width=',dbgs(AnImage^.Width),' Height=',dbgs(AnImage^.Height),' BitsPerPixel=',dbgs(RawImage.Description.AlphaBitsPerPixel),' bpl=',dbgs(AnImage^.bpl));
|
||||
{$ENDIF}
|
||||
if RawImage.MaskSize<>cardinal(AnImage^.bpl) * cardinal(AnImage^.Height)
|
||||
if RawImage.MaskSize<>PtrInt(AnImage^.bpl) * PtrInt(AnImage^.Height)
|
||||
then
|
||||
RaiseGDBException('RawImage.MaskSize<>AnImage^.bpl*AnImage^.Height');
|
||||
|
||||
@ -2847,6 +2849,15 @@ begin
|
||||
ReAllocMem(RawImage.Mask,RawImage.MaskSize);
|
||||
if RawImage.MaskSize>0 then
|
||||
System.Move(AnImage^.Mem^,RawImage.Mask^,RawImage.MaskSize);
|
||||
|
||||
// gdk_bitmap_create_from_data expects rileByteBoundary
|
||||
if RawImage.Description.AlphaLineEnd<>rileByteBoundary then begin
|
||||
// re align data
|
||||
ReAlignRawImageLines(RawImage.Mask,RawImage.MaskSize,
|
||||
RawImage.Description.Width,RawImage.Description.Height,
|
||||
RawImage.Description.AlphaLineEnd,rileByteBoundary);
|
||||
end;
|
||||
|
||||
//debugln(dbgMemRange(RawImage.Mask,RawImage.MaskSize,
|
||||
// GetBytesPerLine(RawImage.Description.Width,
|
||||
// RawImage.Description.AlphaBitsPerPixel,
|
||||
|
@ -117,9 +117,9 @@ type
|
||||
FAutoCreateMask: boolean;
|
||||
FDataDescription: TRawImageDescription;
|
||||
FPixelData: PByte;
|
||||
FPixelDataSize: cardinal;
|
||||
FPixelDataSize: PtrInt;
|
||||
FMaskData: PByte;
|
||||
FMaskDataSize: cardinal;
|
||||
FMaskDataSize: PtrInt;
|
||||
FLineStarts: PRawImagePosition;
|
||||
FMaskLineStarts: PRawImagePosition;
|
||||
FUpdateCount: integer;
|
||||
@ -143,7 +143,7 @@ type
|
||||
procedure FreeAllData; virtual;
|
||||
procedure FreePixelData; virtual;
|
||||
procedure FreeMaskData; virtual;
|
||||
procedure CreateDataAndLineStarts(var Data: Pointer; var DataSize: cardinal;
|
||||
procedure CreateDataAndLineStarts(var Data: Pointer; var DataSize: PtrInt;
|
||||
var TheLineStarts: PRawImagePosition;
|
||||
TheBitsPerPixel: cardinal;
|
||||
TheLineEnd: TRawImageLineEnd); virtual;
|
||||
@ -1568,7 +1568,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure TLazIntfImage.CreateDataAndLineStarts(var Data: Pointer;
|
||||
var DataSize: cardinal; var TheLineStarts: PRawImagePosition;
|
||||
var DataSize: PtrInt; var TheLineStarts: PRawImagePosition;
|
||||
TheBitsPerPixel: cardinal; TheLineEnd: TRawImageLineEnd);
|
||||
begin
|
||||
CreateRawImageLineStarts(Width,Height,TheBitsPerPixel,TheLineEnd,
|
||||
|
Loading…
Reference in New Issue
Block a user