// SPDX-License-Identifier: LGPL-3.0-linking-exception
{$i bgrasse.inc}

  var
    xLen: single;       //horizontal length in pixels
    t: single;          //initial horizontal position in [0..1]
    texVect: TPointF;   //texture vector between start and end of line
    texPos: TPointF;    //texture start position
    texStep: TPointF;   //texture step
    intTexPos: packed record
          x,y: integer;
        end;

    //loop variables
    pdest: PBGRAPixel;
    i: LongInt;

  {$IFDEF PARAM_USELIGHTING}
    light,lightStep,lightDiff,lightAcc,lightMod: word;
    lightLen: integer;

    procedure NextLight; inline;
    begin
      light := (light+lightStep) and 65535;
      inc(lightAcc,lightDiff);
      if lightAcc >= lightMod then
      begin
        dec(lightAcc,lightMod);
        light := (light + 1) and 65535;
      end;
    end;
  {$ENDIF}

  begin
    xLen := info2.interX - info1.interX;
    t := ((ix1+0.5)-info1.interX)/xLen;

    texVect := info2.texCoord-info1.texCoord;
    texPos := info1.texCoord + texVect*t;
    texStep := texVect*(1/xLen);

    pdest := bmp.ScanLine[yb]+ix1;

  {$IFDEF PARAM_USELIGHTING}
    if ix2 = ix1 then
    begin
      light := (info1.lightness+info2.lightness) div 2;
      lightStep := 0;
      lightDiff := 0;
      lightMod := 1;
    end
    else
    begin
      light := info1.lightness;
      lightLen := info2.lightness-info1.lightness;
      if lightLen >= 0 then
      begin
        lightStep := lightLen div (ix2-ix1);
        lightMod := ix2-ix1;
        lightDiff := lightLen - lightStep*(ix2-ix1);
      end else
      begin
        lightStep := (-lightLen+(ix2-ix1-1)) div (ix2-ix1);
        lightMod := ix2-ix1;
        lightDiff := lightLen + lightStep*(ix2-ix1);
        lightStep := 65536 - lightStep;
      end;
    end;
    lightAcc := lightDiff div 2;
  {$ENDIF}

    {$IFDEF BGRASSE_AVAILABLE}
    if UseSSE then
    begin
      {$DEFINE PARAM_USESSE}
      if UseSSE2 then
      begin
        {$DEFINE PARAM_USESSE2}
        if WithInterpolation then
        begin
          {$DEFINE PARAM_USEINTERPOLATION}
          {$i lineartexscan2.inc}
          {$UNDEF PARAM_USEINTERPOLATION}
        end else
        begin
          {$i lineartexscan2.inc}
        end;
        {$UNDEF PARAM_USESSE2}
      end else
      begin
        if WithInterpolation then
        begin
          {$DEFINE PARAM_USEINTERPOLATION}
          {$i lineartexscan2.inc}
          {$UNDEF PARAM_USEINTERPOLATION}
        end else
        begin
          {$i lineartexscan2.inc}
        end;
      end;
      {$UNDEF PARAM_USESSE}
    end else
    {$ENDIF}
    if WithInterpolation then
    begin
      {$DEFINE PARAM_USEINTERPOLATION}
      {$i lineartexscan2.inc}
      {$UNDEF PARAM_USEINTERPOLATION}
    end else
    begin
      {$i lineartexscan2.inc}
    end;
  end;
{$undef PARAM_USELIGHTING}
