1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
// Fonction gestion Shift, Mask et Taille des composantes dans une couleur au format 32 bits (Integer)
function CreateBitFieldMask(AShift, APrec: Byte): Cardinal; inline;
begin
Result := ($FFFFFFFF shr (32 - APrec)) shl AShift;
end;
function GetMaskShift(AMask: LongWord): ShortInt; inline;
begin
Result := 0;
while ((AMask and (1 shl Result)) = 0) and (Result < 32) do inc(Result);
if result = 32 then result:=0;
end;
function GetMaskSize(AMask: LongWord; AShift:ShortInt): Byte; inline;
begin
Result := 0;
while (AShift + Result < 32) and ((AMask and (1 shl (AShift + Result))) <> 0) do Inc(Result);
end;
function GetMaskDeltaShift(ASize:Byte): Integer; inline;
begin
result:=8-ASize;
end;
function ConvertBitFieldsToBZColor(Const aBitFields : TBZColorBitFields; SrcColor : Integer):TBZColor;
function GetBitFieldValue(Const Value : LongWord; Mask:LongWord; BitShift, BitSize : Byte):Byte; inline;
var
I,v,v2 : Integer;
begin
V:=(Value and Mask) Shr BitShift;
V2:=0;
I:=8-BitSize; //DeltaShift;
While I>0 do
begin
V2 := V2 or (V Shl I);
I:=I-BitSize;
end;
if I<0 then
V2 := V2 or (V Shr (-I))
else
V2 := V2 or (V Shl I);
V:= (V2 shl 8) + V2;
Result:= V; //(V and 255); // ClampByte(V);
end;
begin
With aBitFields do
begin
Result.Red:= GetBitFieldValue(SrcColor,RedMask, RedShift, RedSize);
Result.Green:= GetBitFieldValue(SrcColor,GreenMask, GreenShift, GreenSize);
Result.Blue:= GetBitFieldValue(SrcColor,BlueMask, BlueShift, BlueSize);
if (AlphaSize=0) then Result.Alpha:=255
else Result.Alpha:=GetBitFieldValue(SrcColor,AlphaMask, AlphaShift, AlphaSize);
end;
end;
.....
If (Compression = BMP_COMPRESSION_BITF) Then
Begin
With BitFields Do
Begin
If (FHeaderType = bmpht_WindowsV1) or (FHeaderType = bmpht_WindowsV4) or (FHeaderType = bmpht_WindowsV5) Then
Begin
If GapSize1 = 12 Then
Begin
Size := 12;
RedMask := (Memory.ReadLongWord);
GreenMask := (Memory.ReadLongWord);
BlueMask := (Memory.ReadLongWord);
AlphaSize := 0;
End
Else If GapSize1 = 16 Then
Begin
Size := 16;
RedMask := (Memory.ReadLongWord);
GreenMask := (Memory.ReadLongWord);
BlueMask := (Memory.ReadLongWord);
AlphaMask := (Memory.ReadLongWord);
End
Else If GapSize1 = 0 Then
Begin
If (FHeaderType = bmpht_WindowsV4) or (FHeaderType = bmpht_WindowsV5) Then
Begin
Size := 16;
RedMask := GetHeaderRedMask;
GreenMask := GetHeaderGreenMask;
BlueMask := GetHeaderBlueMask;
AlphaMask := GetHeaderAlphaMask;
End;
End;
End
Else // Version Windows 2 ou 3
Begin
Size := 12;
RedMask := GetHeaderRedMask;
GreenMask := GetHeaderGreenMask;
BlueMask := GetHeaderBlueMask;
AlphaSize := 0;
AlphaMask := 0;
If (FHeaderType > bmpht_WindowsV2) Then
Begin
Size := 16;
AlphaMask := GetHeaderAlphaMask;
End;
End;
RedShift := GetMaskShift(RedMask);
GreenShift := GetMaskShift(GreenMask);
BlueShift := GetMaskShift(BlueMask);
AlphaShift := GetMaskShift(AlphaMask);
RedSize := GetMaskSize(RedMask, RedShift);
GreenSize := GetMaskSize(GreenMask, GreenShift);
BlueSize := GetMaskSize(BlueMask, BlueShift);
AlphaSize := GetMaskSize(AlphaMask, AlphaShift);
If AlphaSize > 0 Then //--------------------> C'est ICI QUE TOUT SE JOUE AVEC LE FORMAT XRGB
Begin
// Le Mask Alpha cache-t-il une autre composante de la couleur
If (RedMask or GreenMask or BlueMask) and AlphaMask <> 0 Then
Begin
AlphaMask := 0;
AlphaShift := 0;
AlphaSize := 0;
End;
End;
End;
End;
End;
End; |
Partager