svgtopt/gfx2d/src/GfxRenderer/GfxPolygonRendererP.cpp
changeset 0 d46562c3d99d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/gfx2d/src/GfxRenderer/GfxPolygonRendererP.cpp	Thu Jan 07 16:19:02 2010 +0200
@@ -0,0 +1,130 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Graphics Extension Library source file
+*
+*/
+
+
+#include "GfxPolygonRendererP.h"
+#include "GfxPaint.h"
+#include "GfxColor.h"
+#include "GfxRendererInfoP.h"
+#include "GfxEdgeListP.h"
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+// --------------------------------------------------------------------------
+// TGfxPolygonRendererP::TGfxPolygonRendererP()
+// ---------------------------------------------------------------------------
+TGfxPolygonRendererP::TGfxPolygonRendererP()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// void TGfxPolygonRendererP::InitializeP( CGfxEdgeListP* aEdgeList,
+// ---------------------------------------------------------------------------
+void TGfxPolygonRendererP::InitializeP( CGfxEdgeListP* aEdgeList,
+                                        TGfxRendererInfoP* aRenderInfo,
+                                        MGfxPaint* aPaint,
+                                        TBool aWindingNoneZero )
+    {
+    iEdgeList = aEdgeList;
+    iRenderInfo = aRenderInfo;
+    iPaint = aPaint;
+    iWindingNoneZero = aWindingNoneZero;
+    }
+
+// --------------------------------------------------------------------------
+// void TGfxPolygonRendererP::RenderScanlineL( TInt aY, TUint32 /* aAlpha */ )
+// ---------------------------------------------------------------------------
+void TGfxPolygonRendererP::RenderScanlineL( TInt aY, TUint32 /* aAlpha */ )
+    {
+    if ( iRenderInfo->iClipMinY >= aY || aY > iRenderInfo->iClipMaxY )
+        return;
+
+    TInt edgeCount = iEdgeList->iEdgesCount;
+    TGfxSegEdge dummyEdge;
+    dummyEdge.iEnd = -1;    // less than 0
+    dummyEdge.iSign = 100;  // neither -1, 0, or 1
+
+    TUint16 flatColor;
+    flatColor = TGfxColor( iPaint->FlatColor() ).ColorRgb();
+
+    // ************ Buffer is 2 bytes per pixel **********
+    TUint16* fb;
+
+    fb = ( ( TUint16 * ) iRenderInfo->iDstBuf ) +
+           aY * iRenderInfo->iWidth;
+
+
+    TInt i, j;
+
+    TInt edgeSignSum = 0;
+    TBool fill = EFalse;
+    TGfxSegEdge* lastEdge =& dummyEdge; // iEdgeList->EdgeList();
+    TGfxSegEdge* currentEdge = iEdgeList->EdgeList();
+    for ( i = 0; i < edgeCount; i++ )
+        {
+        // Fill between edges
+        TInt32 fbXmin, fbXmax;
+        if ( fill )
+            {
+            fbXmin = lastEdge->iStart + iEdgeList->iMinX;
+            fbXmax = currentEdge->iEnd + iEdgeList->iMinX;
+            if ( fbXmax >= iRenderInfo->iClipMinX &&
+                           fbXmin < iRenderInfo->iClipMaxX )  // inside clipping
+            {
+                if ( fbXmin < iRenderInfo->iClipMinX )
+                    {
+                    fbXmin = iRenderInfo->iClipMinX;
+                    }
+                if ( iRenderInfo->iClipMaxX <= fbXmax )
+                    {
+                    fbXmax = iRenderInfo->iClipMaxX - 1;
+                    }
+                TUint16* fbb =& fb[fbXmin];
+
+                TInt fbw = fbXmax - fbXmin;
+                if ( fbw > 10 )
+                    {
+                    DrawHLine( fbb, flatColor, fbXmin, fbw );
+                    }
+                else
+                    {
+                    for ( j = fbXmin; j <= fbXmax ; j++ )
+                        *fbb++ = flatColor;
+                    }
+                }
+            }   // end if (fill)
+
+        // update sum of sign and determine fill/non-fill
+
+        if ( iWindingNoneZero )
+            {
+            fill = ( edgeSignSum += currentEdge->iSign );  // Non-zero rule.
+            }
+        else
+            {
+            fill = ( ++edgeSignSum & 1 );       // Even/odd rule.
+            }
+
+        lastEdge = currentEdge;
+        currentEdge = currentEdge->iNext;
+        } // end for i (each edges)
+    }
+
+
+