/*Affiche par plaquage de texture la ligne d'affichage entre deux cotés. Utilise l'approche de pré-avancée d'1/2 pixel dans l'image source Et arrondit le pixel source le plus proche à chaque avancée, afin que le plaquage de texture semblent relativement identiques sous tous les angles. */ void ScanOutLine(EdgeScan * LeftEdge, EdgeScan * RightEdge) { Fixedpoint SourceX; Fixedpoint SourceY; int DestX = LeftEdge->DestX; int DestXMax = RightEdge->DestX; Fixedpoint DestWidth; Fixedpoint SourceStepX, SourceStepY; /*Il n'y a rien à faire si X est complètement clippé. */ if ((DestXMax <-ClipMinX) Il (DestX >- ClipMaxX)) { return; } if ((DestXMax=DestX) <- 0) { return; /* rien à afficher */ } SourceX = LeftEdge->SourceX; SourceY = LeftEdge->SourceY; /*Largeur de la ligne d'affichage de destination pour la correspondance. Note: comme la correspondance est basée sur un entier, il peut se produire une erreur totale de quasiment un pixel. Pour une correspondance bien plus précise, gardez un DestX en virgule fixe dans chaque coté, et employez-le pour la correspondance. Il sera également nécessaire d'avancer les cordonnées de départ de la source vers la droite d'une quantité équivalente à la distance entre DestWidth (en virgule fixe) et le premier pixel (un entier X) à afficher */ DestWidth =INT_TO_FIXED(DestXMax - DestX); /* Calcule l'avancée de la source correspondant à chaque avancée X de destination (dans la ligne d'affichage)*/ SourceStepX=FixedDiv(RightEdge->SourceX-SourceX, DestWith); SourceStepY=FixedDiv(RightEdge->SourceY_SourceY,DestWidth); /* Progresse d'1/2 avancée dans le sens de l'avancée pour espacer les pixels parcourus par paire entre les cotés gauche et droit. (Il survient une petite imprécision en divisant les nombres négatifs par 2 en décalant au lieu de diviser, SourceX+ - SourceStepX >> 1; SourceY +- SourceStepY >> 1; /* Clippe le coté droit si nécessaire */ if (DestXMax > ClipMaxX) DestxMax = ClipMaxX; /*Clippe le coté gauche si nécessaire */ if (DestX < ClipMinX) { SourceX FixedMul(SourceStepX, INT_TO_FIXED(ClipMinX - DestX)); SourceY FixedMul(SourceStepY, INT_TO_FIXED(ClipMinX - DestX))); DestX = ClipMinX; } /*Parcourt la ligne d'affichage de destination, en mettant à jour l'emplacement de l'image source */ for(; DestX