svgtopt/gfx2d/src/GfxRenderer/GfxStrokeRendererP.cpp
changeset 46 88edb906c587
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/gfx2d/src/GfxRenderer/GfxStrokeRendererP.cpp	Wed Nov 03 18:56:10 2010 +0200
@@ -0,0 +1,116 @@
+/*
+* 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 "GfxStrokeRendererP.h"
+#include "GfxPolygonRendererP.h"
+#include "GfxPaint.h"
+#include "GfxColor.h"
+#include "GfxRendererInfoP.h"
+#include "GfxEdgeListP.h"
+
+#include <fbs.h>
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+// --------------------------------------------------------------------------
+// TGfxStrokeRendererP::TGfxStrokeRendererP() : iStrokeColor( 0 )
+// ---------------------------------------------------------------------------
+TGfxStrokeRendererP::TGfxStrokeRendererP() : iStrokeColor( 0 )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// void TGfxStrokeRendererP::InitializeP( CGfxEdgeListP* aEdgeList,
+// ---------------------------------------------------------------------------
+void TGfxStrokeRendererP::InitializeP( CGfxEdgeListP* aEdgeList,
+                                       TGfxRendererInfoP* aRenderInfo,
+                                       TGfxColor aColor )
+    {
+    iEdgeList = aEdgeList;
+    iRenderInfo = aRenderInfo;
+    iStrokeColor = aColor;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Draw one pixel width stroke
+// ---------------------------------------------------------------------------
+// --------------------------------------------------------------------------
+// void TGfxStrokeRendererP::RenderScanlineL( TInt aY, TUint32 /* aAlpha */ )
+// ---------------------------------------------------------------------------
+void TGfxStrokeRendererP::RenderScanlineL( TInt aY, TUint32 /* aAlpha */ )
+    {
+    if ( iRenderInfo->iClipMinY > aY || aY > iRenderInfo->iClipMaxY )
+        return;
+
+    if ( iStrokeColor.Value() == KGfxColorNull )
+        return;
+
+    TGfxSegEdge* edges = iEdgeList->iEdges;
+    TInt edgeCount = iEdgeList->iEdgesCount;
+
+    // ************ Buffer is 2 bytes per pixel **********
+    TUint16* fb;
+    fb = ( ( TUint16 * ) iRenderInfo->iDstBuf ) +
+           aY * iRenderInfo->iWidth;
+
+    TUint16 strokeCol = iStrokeColor.ColorRgb();
+
+    for ( TInt i = 0; i < edgeCount; i++ )
+        {
+        if ( !edges[i].iOnlyForFill )
+            {
+            TInt32 pbufXmin, pbufXmax;
+            TInt32 fbXmin, fbXmax;
+            pbufXmin = edges[i].iStart;
+            pbufXmax = edges[i].iEnd;
+            fbXmin = pbufXmin + iEdgeList->iMinX;
+            fbXmax = pbufXmax + iEdgeList->iMinX;
+            if ( fbXmax >= iRenderInfo->iClipMinX &&
+                           fbXmin < iRenderInfo->iClipMaxX )  // inside clipping
+            {
+                if ( fbXmin < iRenderInfo->iClipMinX )
+                    {
+                    pbufXmin += iRenderInfo->iClipMinX - fbXmin; // equivalent to 'pbufXmin += -fbXmin;'
+                    fbXmin = iRenderInfo->iClipMinX;
+                    }
+                if ( iRenderInfo->iClipMaxX <= fbXmax )
+                    {
+                    pbufXmax -= fbXmax - iRenderInfo->iClipMaxX;
+                    fbXmax = iRenderInfo->iClipMaxX - 1;
+                    }
+                TUint16* fbb =& fb[fbXmin];
+                TInt fbw = fbXmax - fbXmin;
+                if ( fbw > 10 )
+                    {
+                    TGfxPolygonRendererP::DrawHLine( fbb,
+                                                     strokeCol,
+                                                     fbXmin,
+                                                     fbw );
+                    }
+                else
+                    {
+                    for ( TInt j = fbXmin; j <= fbXmax ; j++ )
+                        *fbb++ = strokeCol;
+                    }
+                }
+            }
+        }
+    }