gtk intf: added automatic realign for bitmap masks bug #2022

git-svn-id: trunk@9610 -
This commit is contained in:
mattias 2006-07-14 16:45:05 +00:00
parent 41f5aae4d5
commit 835168efa7
3 changed files with 81 additions and 24 deletions

View File

@ -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

View File

@ -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,

View File

@ -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,