📄 gr32_blend.pas
字号:
if a1 > $FF then a1 := $FF;
if r1 > $FF then r1 := $FF;
if g1 > $FF then g1 := $FF;
if b1 > $FF then b1 := $FF;
Result := a1 shl 24 + r1 shl 16 + g1 shl 8 + b1;
end;
function _ColorModulate(C1, C2: TColor32): TColor32;
var
r1, g1, b1, a1: Integer;
r2, g2, b2, a2: Integer;
begin
a1 := C1 shr 24;
r1 := C1 and $00FF0000;
g1 := C1 and $0000FF00;
b1 := C1 and $000000FF;
r1 := r1 shr 16;
g1 := g1 shr 8;
a2 := C2 shr 24;
r2 := C2 and $00FF0000;
g2 := C2 and $0000FF00;
b2 := C2 and $000000FF;
r2 := r2 shr 16;
g2 := g2 shr 8;
a1 := a1 * a2 shr 8;
r1 := r1 * r2 shr 8;
g1 := g1 * g2 shr 8;
b1 := b1 * b2 shr 8;
if a1 > 255 then a1 := 255;
if r1 > 255 then r1 := 255;
if g1 > 255 then g1 := 255;
if b1 > 255 then b1 := 255;
Result := a1 shl 24 + r1 shl 16 + g1 shl 8 + b1;
end;
function _ColorMax(C1, C2: TColor32): TColor32;
var
r1, g1, b1, a1: TColor32;
r2, g2, b2, a2: TColor32;
begin
a1 := C1 shr 24;
r1 := C1 and $00FF0000;
g1 := C1 and $0000FF00;
b1 := C1 and $000000FF;
a2 := C2 shr 24;
r2 := C2 and $00FF0000;
g2 := C2 and $0000FF00;
b2 := C2 and $000000FF;
if a2 > a1 then a1 := a2;
if r2 > r1 then r1 := r2;
if g2 > g1 then g1 := g2;
if b2 > b1 then b1 := b2;
Result := a1 shl 24 + r1 + g1 + b1;
end;
function _ColorMin(C1, C2: TColor32): TColor32;
var
r1, g1, b1, a1: TColor32;
r2, g2, b2, a2: TColor32;
begin
a1 := C1 shr 24;
r1 := C1 and $00FF0000;
g1 := C1 and $0000FF00;
b1 := C1 and $000000FF;
a2 := C2 shr 24;
r2 := C2 and $00FF0000;
g2 := C2 and $0000FF00;
b2 := C2 and $000000FF;
if a2 < a1 then a1 := a2;
if r2 < r1 then r1 := r2;
if g2 < g1 then g1 := g2;
if b2 < b1 then b1 := b2;
Result := a1 shl 24 + r1 + g1 + b1;
end;
function _ColorDifference(C1, C2: TColor32): TColor32;
var
r1, g1, b1, a1: TColor32;
r2, g2, b2, a2: TColor32;
begin
a1 := C1 shr 24;
r1 := C1 and $00FF0000;
g1 := C1 and $0000FF00;
b1 := C1 and $000000FF;
r1 := r1 shr 16;
g1 := g1 shr 8;
a2 := C2 shr 24;
r2 := C2 and $00FF0000;
g2 := C2 and $0000FF00;
b2 := C2 and $000000FF;
r2 := r2 shr 16;
g2 := g2 shr 8;
a1 := abs(a2 - a1);
r1 := abs(r2 - r1);
g1 := abs(g2 - g1);
b1 := abs(b2 - b1);
Result := a1 shl 24 + r1 shl 16 + g1 shl 8 + b1;
end;
function _ColorExclusion(C1, C2: TColor32): TColor32;
var
r1, g1, b1, a1: TColor32;
r2, g2, b2, a2: TColor32;
begin
a1 := C1 shr 24;
r1 := C1 and $00FF0000;
g1 := C1 and $0000FF00;
b1 := C1 and $000000FF;
r1 := r1 shr 16;
g1 := g1 shr 8;
a2 := C2 shr 24;
r2 := C2 and $00FF0000;
g2 := C2 and $0000FF00;
b2 := C2 and $000000FF;
r2 := r2 shr 16;
g2 := g2 shr 8;
a1 := a1 + a2 - (a1 * a2 shr 7);
r1 := r1 + r2 - (r1 * r2 shr 7);
g1 := g1 + g2 - (g1 * g2 shr 7);
b1 := b1 + b2 - (b1 * b2 shr 7);
Result := a1 shl 24 + r1 shl 16 + g1 shl 8 + b1;
end;
function _ColorAverage(C1, C2: TColor32): TColor32;
var
r1, g1, b1, a1: TColor32;
r2, g2, b2, a2: TColor32;
begin
a1 := C1 shr 24;
r1 := C1 and $00FF0000;
g1 := C1 and $0000FF00;
b1 := C1 and $000000FF;
a2 := C2 shr 24;
r2 := C2 and $00FF0000;
g2 := C2 and $0000FF00;
b2 := C2 and $000000FF;
a1 := (a1 + a2) div 2;
r1 := (r1 + r2) div 2;
g1 := (g1 + g2) div 2;
b1 := (b1 + b2) div 2;
Result := a1 shl 24 + r1 + g1 + b1;
end;
function _ColorScale(C, W: TColor32): TColor32;
var
r1, g1, b1, a1: Cardinal;
begin
a1 := C shr 24;
r1 := C and $00FF0000;
g1 := C and $0000FF00;
b1 := C and $000000FF;
r1 := r1 shr 16;
g1 := g1 shr 8;
a1 := a1 * W shr 8;
r1 := r1 * W shr 8;
g1 := g1 * W shr 8;
b1 := b1 * W shr 8;
if a1 > 255 then a1 := 255;
if r1 > 255 then r1 := 255;
if g1 > 255 then g1 := 255;
if b1 > 255 then b1 := 255;
Result := a1 shl 24 + r1 shl 16 + g1 shl 8 + b1;
end;
{ MMX Color algebra versions }
function M_ColorAdd(C1, C2: TColor32): TColor32;
asm
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$DC,$C1 /// PADDUSB MM0,MM1
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorSub(C1, C2: TColor32): TColor32;
asm
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$D8,$C1 /// PSUBUSB MM0,MM1
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorModulate(C1, C2: TColor32): TColor32;
asm
db $0F,$EF,$D2 /// PXOR MM2,MM2
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$60,$C2 /// PUNPCKLBW MM0,MM2
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$60,$CA /// PUNPCKLBW MM1,MM2
db $0F,$D5,$C1 /// PMULLW MM0,MM1
db $0F,$71,$D0,$08 /// PSRLW MM0,8
db $0F,$67,$C2 /// PACKUSWB MM0,MM2
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorMax(C1, C2: TColor32): TColor32;
asm
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$DE,$C1 /// PMAXUB MM0,MM1
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorMin(C1, C2: TColor32): TColor32;
asm
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$DA,$C1 /// PMINUB MM0,MM1
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorDifference(C1, C2: TColor32): TColor32;
asm
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$6F,$D0 /// MOVQ MM2,MM0
db $0F,$D8,$C1 /// PSUBUSB MM0,MM1
db $0F,$D8,$CA /// PSUBUSB MM1,MM2
db $0F,$EB,$C1 /// POR MM0,MM1
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorExclusion(C1, C2: TColor32): TColor32;
asm
db $0F,$EF,$D2 /// PXOR MM2,MM2
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$60,$C2 /// PUNPCKLBW MM0,MM2
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$60,$CA /// PUNPCKLBW MM1,MM2
db $0F,$6F,$D8 /// MOVQ MM3,MM0
db $0F,$FD,$C1 /// PADDW MM0,MM1
db $0F,$D5,$CB /// PMULLW MM1,MM3
db $0F,$71,$D1,$07 /// PSRLW MM1,7
db $0F,$D9,$C1 /// PSUBUSW MM0,MM1
db $0F,$67,$C2 /// PACKUSWB MM0,MM2
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorAverage(C1, C2: TColor32): TColor32;
asm
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$6E,$CA /// MOVD MM1,EDX
db $0F,$E0,$C1 /// PAVGB MM0,MM1
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
function M_ColorScale(C, W: TColor32): TColor32;
asm
db $0F,$EF,$D2 /// PXOR MM2,MM2
SHL EDX,3
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$60,$C2 /// PUNPCKLBW MM0,MM2
ADD EDX,alpha_ptr
db $0F,$D5,$02 /// PMULLW MM0,[EDX]
db $0F,$71,$D0,$08 /// PSRLW MM0,8
db $0F,$67,$C2 /// PACKUSWB MM0,MM2
db $0F,$7E,$C0 /// MOVD EAX,MM0
end;
{ Misc stuff }
function Lighten(C: TColor32; Amount: Integer): TColor32;
var
r, g, b, a: Integer;
begin
a := C shr 24;
r := C and $00FF0000;
g := C and $0000FF00;
b := C and $000000FF;
r := r shr 16;
g := g shr 8;
Inc(r, Amount);
Inc(g, Amount);
Inc(b, Amount);
if r > 255 then r := 255 else if r < 0 then r := 0;
if g > 255 then g := 255 else if g < 0 then g := 0;
if b > 255 then b := 255 else if b < 0 then b := 0;
Result := a shl 24 + r shl 16 + g shl 8 + b;
end;
procedure MakeMergeTables;
var
I, J: Integer;
begin
for J := 0 to 255 do
for I := 0 to 255 do
begin
DivTable[I, J] := Round(I * J / 255);
if I > 0 then
RcTable[I, J] := Round(J * 255 / I)
else
RcTable[I, J] := 0;
end;
end;
{ MMX Detection and linking }
procedure SetupFunctions;
begin
MMX_ACTIVE := HasMMX;
MergeReg := _MergeReg;
MergeMem := _MergeMem;
MergeRegEx := _MergeRegEx;
MergeMemEx := _MergeMemEx;
MergeLine := _MergeLine;
MergeLineEx := _MergeLineEx;
BLEND_MEM[cmMerge] := _MergeMem;
BLEND_REG[cmMerge] := _MergeReg;
BLEND_MEM_EX[cmMerge] := _MergeMemEx;
BLEND_REG_EX[cmMerge] := _MergeRegEx;
BLEND_LINE[cmMerge] := _MergeLine;
BLEND_LINE_EX[cmMerge] := _MergeLineEx;
{$IFNDEF DISABLE_MMX}
if MMX_ACTIVE then
begin
// link MMX functions
CombineReg := M_CombineReg;
CombineMem := M_CombineMem;
BlendReg := M_BlendReg;
BlendMem := M_BlendMem;
BlendRegEx := M_BlendRegEx;
BlendMemEx := M_BlendMemEx;
BlendLine := M_BlendLine;
BlendLineEx := M_BlendLineEx;
CombineLine := M_CombineLine;
BLEND_MEM[cmBlend] := M_BlendMem;
BLEND_REG[cmBlend] := M_BlendReg;
BLEND_MEM_EX[cmBlend] := M_BlendMemEx;
BLEND_REG_EX[cmBlend] := M_BlendRegEx;
BLEND_LINE[cmBlend] := M_BlendLine;
BLEND_LINE_EX[cmBlend] := M_BlendLineEx;
ColorAdd := M_ColorAdd;
ColorSub := M_ColorSub;
ColorDiv := _ColorDiv;
ColorModulate := M_ColorModulate;
ColorMax := M_ColorMax;
ColorMin := M_ColorMin;
ColorDifference := M_ColorDifference;
ColorExclusion := M_ColorExclusion;
ColorAverage := M_ColorAverage;
ColorScale := M_ColorScale;
end
else
begin
{$ENDIF}
// link non-MMX functions
CombineReg := _CombineReg;
CombineMem := _CombineMem;
BlendReg := _BlendReg;
BlendMem := _BlendMem;
BlendRegEx := _BlendRegEx;
BlendMemEx := _BlendMemEx;
BlendLine := _BlendLine;
BlendLineEx := _BlendLineEx;
CombineLine := _CombineLine;
BLEND_MEM[cmBlend] := _BlendMem;
BLEND_REG[cmBlend] := _BlendReg;
BLEND_MEM_EX[cmBlend] := _BlendMemEx;
BLEND_REG_EX[cmBlend] := _BlendRegEx;
BLEND_LINE[cmBlend] := _BlendLine;
BLEND_LINE_EX[cmBlend] := _BlendLineEx;
ColorAdd := _ColorAdd;
ColorSub := _ColorSub;
ColorDiv := _ColorDiv;
ColorModulate := _ColorModulate;
ColorMax := _ColorMax;
ColorMin := _ColorMin;
ColorDifference := _ColorDifference;
ColorExclusion := _ColorExclusion;
ColorAverage := _ColorAverage;
ColorScale := _ColorScale;
{$IFNDEF DISABLE_MMX}
end;
{$ENDIF}
end;
initialization
MakeMergeTables;
SetupFunctions;
if MMX_ACTIVE then GenAlphaTable;
finalization
if MMX_ACTIVE then FreeAlphaTable;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -