498 lines
12 KiB
PHP
498 lines
12 KiB
PHP
// SPDX-License-Identifier: LGPL-3.0-linking-exception
|
|
procedure FastBlendPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
FastBlendPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure DrawTransparentPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
DrawPixelInlineWithAlphaCheck(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearMultiplyPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearMultiplyPixelInline(pdest, psrc^); //same look with non linear
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure AddPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
AddPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearAddPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearAddPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure ColorBurnPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
ColorBurnPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure ColorDodgePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
ColorDodgePixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure DividePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
DividePixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure ReflectPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
ReflectPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure GlowPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
GlowPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure NiceGlowPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
NiceGlowPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure OverlayPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
OverlayPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearOverlayPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearOverlayPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure DifferencePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
DifferencePixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearDifferencePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearDifferencePixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure ExclusionPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
ExclusionPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearExclusionPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearExclusionPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearSubtractPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearSubtractPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearSubtractInversePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearSubtractInversePixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure SubtractPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
SubtractPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure SubtractInversePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
SubtractInversePixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure NegationPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
NegationPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearNegationPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearNegationPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LightenPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LightenPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure DarkenPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
DarkenPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure ScreenPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
ScreenPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure SoftLightPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
SoftLightPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure SvgSoftLightPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
SvgSoftLightPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure HardLightPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
HardLightPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure BlendXorPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
BlendXorPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure BlendMaskPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
BlendMaskPixelInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearMultiplySaturationPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearMultiplySaturationInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearHuePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearHueInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearColorPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearColorInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearLightnessPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearLightnessInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure LinearSaturationPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
LinearSaturationInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure CorrectedHuePixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
CorrectedHueInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure CorrectedColorPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
CorrectedColorInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure CorrectedLightnessPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
CorrectedLightnessInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure CorrectedSaturationPixels(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
CorrectedSaturationInline(pdest, psrc^);
|
|
Inc(pdest);
|
|
Inc(psrc);
|
|
Dec(Count);
|
|
end;
|
|
end;
|
|
|
|
type
|
|
TBlendPixelsProc = procedure(pdest: PBGRAPixel; psrc: PBGRAPixel; Count: integer);
|
|
|
|
const
|
|
BlendPixelsProc: array[TBlendOperation] of TBlendPixelsProc =
|
|
( @FastBlendPixels, @DrawTransparentPixels,
|
|
@LightenPixels, @ScreenPixels, @AddPixels, @LinearAddPixels, @ColorDodgePixels, @DividePixels, @NiceGlowPixels, @SoftLightPixels, @HardLightPixels,
|
|
@GlowPixels, @ReflectPixels, @LinearOverlayPixels, @OverlayPixels, @DarkenPixels, @LinearMultiplyPixels, @ColorBurnPixels,
|
|
@DifferencePixels, @LinearDifferencePixels, @ExclusionPixels, @LinearExclusionPixels, @SubtractPixels, @LinearSubtractPixels,
|
|
@SubtractInversePixels, @LinearSubtractInversePixels, @NegationPixels, @LinearNegationPixels, @BlendXorPixels, @SvgSoftLightPixels,
|
|
@BlendMaskPixels, @LinearMultiplySaturationPixels, @LinearHuePixels, @LinearColorPixels, @LinearLightnessPixels, @LinearSaturationPixels,
|
|
@CorrectedHuePixels, @CorrectedColorPixels, @CorrectedLightnessPixels, @CorrectedSaturationPixels);
|
|
|
|
procedure BlendPixels(pdest: PBGRAPixel; psrc: PBGRAPixel;
|
|
blendOp: TBlendOperation; Count: integer; excludeChannels: TChannels = []);
|
|
const BufSize = 8;
|
|
var
|
|
destBuf: array[0..BufSize-1] of TBGRAPixel;
|
|
i: PtrInt;
|
|
begin
|
|
if (excludeChannels = [cRed,cGreen,cBlue,cAlpha]) or
|
|
((blendOp = boMask) and (cAlpha in excludeChannels)) then exit;
|
|
|
|
if excludeChannels = [] then
|
|
BlendPixelsProc[blendOp](pdest, psrc, count) else
|
|
begin
|
|
while Count >= BufSize do
|
|
begin
|
|
move(pdest^, {%H-}destBuf, sizeof(destBuf));
|
|
BlendPixelsProc[blendOp](@destBuf, psrc, BufSize);
|
|
for i := 0 to BufSize-1 do
|
|
begin
|
|
if not (cRed in excludeChannels) then pdest^.red := destBuf[i].red;
|
|
if not (cGreen in excludeChannels) then pdest^.green := destBuf[i].green;
|
|
if not (cBlue in excludeChannels) then pdest^.blue := destBuf[i].blue;
|
|
if not (cAlpha in excludeChannels) then pdest^.alpha := destBuf[i].alpha;
|
|
inc(pdest);
|
|
end;
|
|
dec(count, BufSize);
|
|
end;
|
|
if count > 0 then
|
|
begin
|
|
move(pdest^, {%H-}destBuf, count*sizeof(TBGRAPixel));
|
|
BlendPixelsProc[blendOp](@destBuf, psrc, count);
|
|
for i := 0 to count-1 do
|
|
begin
|
|
if not (cRed in excludeChannels) then pdest^.red := destBuf[i].red;
|
|
if not (cGreen in excludeChannels) then pdest^.green := destBuf[i].green;
|
|
if not (cBlue in excludeChannels) then pdest^.blue := destBuf[i].blue;
|
|
if not (cAlpha in excludeChannels) then pdest^.alpha := destBuf[i].alpha;
|
|
inc(pdest);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|