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

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);

procedure BlendPixels(pdest: PBGRAPixel; psrc: PBGRAPixel;
  blendOp: TBlendOperation; Count: integer);
begin
  BlendPixelsProc[blendOp](pdest,psrc,count);
end;

