uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp
changeset 0 15bf7259bb7c
child 3 d8a3531bc6b8
child 13 8f67d927ea57
equal deleted inserted replaced
-1:000000000000 0:15bf7259bb7c
       
     1 /*
       
     2 * Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:   base class for cnaves graphics context
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include "huicanvasgc.h"
       
    21 #include "uiacceltk/HuiGc.h"
       
    22 #include "uiacceltk/HuiEnv.h"
       
    23 #include "uiacceltk/HuiImage.h"
       
    24 #include "uiacceltk/HuiCanvasVisual.h"
       
    25 #include "uiacceltk/HuiCurvePath.h"
       
    26 #include "uiacceltk/HuiMappingFunctions.h"
       
    27 #include "HuiRenderSurface.h"
       
    28 #include "uiacceltk/HuiStatic.h"
       
    29 #include "huicanvasrenderbuffer.h"
       
    30 
       
    31 #ifndef __SERIES60_30__     
       
    32 #include "HuiTargetBitmap.h"
       
    33 #endif
       
    34 
       
    35 #include <e32math.h>
       
    36 
       
    37 
       
    38 EXPORT_C CHuiCanvasGc::CHuiCanvasGc():
       
    39     iPenColor(KRgbBlack),
       
    40     iPenWidth(1.f),
       
    41     iOpacity(1.f),
       
    42     iPolygonDrawMode(EHuiNoFill),
       
    43     iVerticalTextAlign(EHuiAlignVTop),
       
    44     iHorizontalTextAlign(EHuiAlignHLeft),
       
    45     iTextStyleId(EHuiTextStyleNormal),
       
    46     iEffectiveOpacityEnabled(ETrue)
       
    47     {	    
       
    48     }
       
    49 
       
    50 EXPORT_C CHuiCanvasGc::~CHuiCanvasGc()
       
    51     {
       
    52     iClippingRegion.Close();
       
    53     iDelayedClipRegion.Close();	
       
    54 
       
    55     iTempRegion.Close();
       
    56     iTempRegion2.Close();
       
    57     }
       
    58 
       
    59 EXPORT_C void CHuiCanvasGc::SetGc(CHuiGc& aGc)
       
    60     {
       
    61     iGc = &aGc;        
       
    62     }
       
    63     
       
    64 EXPORT_C void CHuiCanvasGc::SetVisual(const CHuiCanvasVisual& aVisual)
       
    65     {
       
    66     iVisual = (CHuiCanvasVisual*)&aVisual;    
       
    67     }
       
    68 
       
    69 EXPORT_C void CHuiCanvasGc::Clip(const TRect& aClipRect)
       
    70     {
       
    71     if (!iGc)
       
    72        {
       
    73        return;    
       
    74        }
       
    75     
       
    76     switch (iClipMode)
       
    77         {
       
    78         case EHuiCanvasClipModeNormal:
       
    79         case EHuiCanvasClipModeDelayed:
       
    80             {
       
    81             if (iClippingRegion.Count())
       
    82                 {
       
    83                 CancelClipping();    
       
    84                 }
       
    85 
       
    86             if (!aClipRect.IsEmpty())
       
    87                 {
       
    88                 iTempRegion.Clear();
       
    89                 iTempRegion.AddRect(aClipRect);
       
    90                 ClipRegion(iTempRegion);
       
    91                 }
       
    92             break;    
       
    93             }
       
    94         case EHuiCanvasClipModeNone:
       
    95         default:
       
    96             {
       
    97             // Do nothing            
       
    98             break;    
       
    99             }
       
   100         }    
       
   101     }
       
   102 
       
   103 EXPORT_C void CHuiCanvasGc::ClipRegion(const TRegion& aClipRegion)
       
   104     {
       
   105     if (!iGc)
       
   106        {
       
   107        return;    
       
   108        }
       
   109 
       
   110     switch (iClipMode)
       
   111         {
       
   112         case EHuiCanvasClipModeNormal:
       
   113             {
       
   114             // If previous clipping region set, cancel it first.
       
   115             if (iClippingRegion.Count())
       
   116                 {
       
   117                 CancelClipping();    
       
   118                 }
       
   119                 
       
   120             // Set new region, ignore empty rects if any
       
   121             for (TInt i=0; i < aClipRegion.Count(); i++)
       
   122                 {
       
   123                 if (!aClipRegion[i].IsEmpty())
       
   124                     {
       
   125                     iClippingRegion.AddRect(aClipRegion[i]);    
       
   126                     }                                        
       
   127                 }
       
   128             
       
   129             iClippingRegion.Tidy();
       
   130             
       
   131             if (iClippingRegion.Count() == 1)
       
   132                 {
       
   133                 // If only one rect, then do simple clipping...                    
       
   134                 iGc->Enable(CHuiGc::EFeatureClipping);
       
   135                 iGc->PushClip();
       
   136                 iGc->Clip(iClippingRegion[0]);                
       
   137                 }
       
   138             else if (iClippingRegion.Count() > 1)
       
   139                 {
       
   140                 // ...otherewise must do region clipping.
       
   141                 iGc->Enable(CHuiGc::EFeatureClipping);
       
   142                 iGc->PushClip();
       
   143                 if (MaxNumberOfClipRects() > 1)
       
   144                     {
       
   145                     iGc->Clip(iClippingRegion);                    
       
   146                     }
       
   147                 else
       
   148                     {
       
   149                     // region clipping is not available, try boundingrect
       
   150                     iGc->Clip(iClippingRegion.BoundingRect());                                        
       
   151                     }
       
   152                 }
       
   153             else
       
   154                 {
       
   155                 // No clip rects set, do nothing here.    
       
   156                 }                                
       
   157             break;
       
   158             }
       
   159         case EHuiCanvasClipModeDelayed:
       
   160             {
       
   161             // If previous clipping region set, cancel it first.
       
   162             if (iClippingRegion.Count())
       
   163                 {
       
   164                 CancelClipping();    
       
   165                 }
       
   166                 
       
   167             // Set new region, ignore empty rects if any
       
   168             for (TInt i=0; i < aClipRegion.Count(); i++)
       
   169                 {
       
   170                 if (!aClipRegion[i].IsEmpty())
       
   171                     {
       
   172                     iClippingRegion.AddRect(aClipRegion[i]);    
       
   173                     }                    
       
   174                 }
       
   175 
       
   176             iClippingRegion.Tidy();
       
   177             break;    
       
   178             }
       
   179         case EHuiCanvasClipModeNone:
       
   180         default:
       
   181             {
       
   182             // Do nothing            
       
   183             break;    
       
   184             }
       
   185         }    
       
   186     }  
       
   187 
       
   188 EXPORT_C void CHuiCanvasGc::CancelClipping()
       
   189     {
       
   190     if (!iGc)
       
   191        {
       
   192        return;    
       
   193        }
       
   194 
       
   195 
       
   196     switch (iClipMode)
       
   197         {
       
   198         case EHuiCanvasClipModeNormal:
       
   199             {
       
   200             if (iClippingRegion.Count())
       
   201                 {
       
   202                 iClippingRegion.Clear();
       
   203                 iGc->Enable(CHuiGc::EFeatureClipping);
       
   204                 iGc->PopClip();                            
       
   205                 }
       
   206             break;
       
   207             }
       
   208         case EHuiCanvasClipModeDelayed:
       
   209             {
       
   210             iDelayedClipRegion.Clear();
       
   211             iClippingRegion.Clear();
       
   212             break;    
       
   213             }
       
   214         case EHuiCanvasClipModeNone:
       
   215         default:
       
   216             {
       
   217             // Do nothing            
       
   218             break;    
       
   219             }
       
   220         }    
       
   221     }
       
   222 
       
   223 EXPORT_C void CHuiCanvasGc::DrawImage(const CHuiTexture& aImage, const THuiRealRect& aDestinationRect)
       
   224     {
       
   225     if (!iGc)
       
   226         {
       
   227         return;    
       
   228         }
       
   229 
       
   230     THuiRealRect srcRect = THuiRealRect(TPoint(0,0), aImage.Size() );
       
   231     DrawImage(aImage, aDestinationRect, srcRect);
       
   232     }
       
   233         
       
   234 EXPORT_C void CHuiCanvasGc::DrawText(const CHuiTextMesh& aTextMesh, const THuiRealRect& aDestinationRect)
       
   235     {
       
   236     if (!iGc)
       
   237         {
       
   238         return;    
       
   239         }
       
   240 
       
   241     Setup();
       
   242     
       
   243     EnableBlendingIfNeeded();
       
   244     
       
   245     THuiTextStyle* textStyle = CHuiStatic::Env().TextStyleManager().TextStyle(iTextStyleId);
       
   246     if (textStyle)
       
   247         {
       
   248         iGc->SetFont(textStyle->Font());        
       
   249         }    
       
   250     iGc->SetAlign(iHorizontalTextAlign, iVerticalTextAlign);
       
   251 
       
   252     EnableDelayedClippingIfNeeded(aDestinationRect);	
       
   253     
       
   254     while (ClipNext())
       
   255         {
       
   256         iGc->DrawText(aTextMesh, aDestinationRect, 0.f);                              
       
   257         }
       
   258     
       
   259     DisableDelayedClippingIfNeeded();       
       
   260     
       
   261     Cleanup();
       
   262     }
       
   263     
       
   264     
       
   265 EXPORT_C void CHuiCanvasGc::DrawLines(RArray<THuiRealLine>& aLines)
       
   266 	{
       
   267 	if (!iGc)
       
   268         {
       
   269         return;    
       
   270         }
       
   271 
       
   272     Setup();
       
   273 
       
   274     EnableBlendingIfNeeded();
       
   275 
       
   276     EnableDelayedClippingIfNeeded(aLines);
       
   277 	
       
   278     while (ClipNext())
       
   279         {
       
   280         DoDrawLines(aLines);
       
   281         }
       
   282 
       
   283     DisableDelayedClippingIfNeeded();    
       
   284 
       
   285     Cleanup();
       
   286 	}
       
   287 
       
   288 EXPORT_C void CHuiCanvasGc::DoDrawLines(RArray<THuiRealLine>& aLines)
       
   289 	{
       
   290     for(TInt i=0; i<aLines.Count(); i++)
       
   291  	   	{
       
   292  	   	TPoint start = aLines[i].iStart; 
       
   293  	   	TPoint end = aLines[i].iEnd;
       
   294     	iGc->DrawLine(start, end, iPenWidth);
       
   295     	}        
       
   296 	}
       
   297 	
       
   298 
       
   299 EXPORT_C void CHuiCanvasGc::DrawEllipse(const THuiRealRect& aDestinationRect)
       
   300 	{
       
   301 	if (!iGc)
       
   302 	    {
       
   303 	    return;    
       
   304 	    }
       
   305 	double startx = aDestinationRect.iTl.iX + aDestinationRect.Width();
       
   306     double starty = aDestinationRect.iTl.iY + aDestinationRect.Height()/2;   
       
   307   
       
   308     DrawArc(aDestinationRect, THuiRealPoint(startx,starty), THuiRealPoint(startx,starty));	
       
   309 	}
       
   310 
       
   311 EXPORT_C void CHuiCanvasGc::DrawRoundRect(const THuiRealRect& aDestinationRect, 
       
   312         const THuiRealSize& aSize)
       
   313     {   
       
   314     if (!iGc)
       
   315         {
       
   316         return;    
       
   317         }
       
   318 
       
   319     Setup();
       
   320 
       
   321     EnableDelayedClippingIfNeeded(aDestinationRect);    
       
   322 
       
   323     while (ClipNext())
       
   324         {
       
   325         DoDrawRoundRect(aDestinationRect, aSize);
       
   326         }
       
   327         
       
   328     DisableDelayedClippingIfNeeded();    
       
   329 
       
   330     Cleanup();
       
   331     }
       
   332 
       
   333 EXPORT_C void CHuiCanvasGc::DoDrawRoundRect(const THuiRealRect& aDestinationRect, 
       
   334         const THuiRealSize& aSize)
       
   335     {   
       
   336     THuiRealSize cornerRectSize = THuiRealSize( 2*aSize.iWidth, 2*aSize.iHeight);
       
   337     
       
   338     THuiRealPoint topLeftCornerRectTL=aDestinationRect.iTl;
       
   339     THuiRealRect topLeftCornerRect = THuiRealRect(topLeftCornerRectTL,cornerRectSize);
       
   340     
       
   341     THuiRealPoint topRightCornerRectTL=THuiRealPoint
       
   342     (aDestinationRect.iTl.iX + aDestinationRect.Width()-2*(aSize.iWidth), aDestinationRect.iTl.iY);
       
   343     THuiRealRect topRightCornerRect = THuiRealRect(topRightCornerRectTL, cornerRectSize);
       
   344     
       
   345     THuiRealPoint bottomRightCornerRectTL = THuiRealPoint
       
   346     (aDestinationRect.iBr.iX-(2*aSize.iWidth),aDestinationRect.iBr.iY-(2*aSize.iHeight));
       
   347     THuiRealRect bottomRightCornerRect = THuiRealRect(bottomRightCornerRectTL, cornerRectSize);
       
   348     
       
   349     THuiRealPoint bottomLeftCornerRectTL = THuiRealPoint(aDestinationRect.iTl.iX, 
       
   350             aDestinationRect.iTl.iY + aDestinationRect.Height() -2*(aSize.iHeight));   
       
   351     THuiRealRect bottomLeftCornerRect = THuiRealRect(bottomLeftCornerRectTL,cornerRectSize);
       
   352  
       
   353     THuiRealPoint topLeftArcStart = THuiRealPoint(topLeftCornerRectTL.iX + aSize.iWidth, topLeftCornerRectTL.iY);
       
   354     THuiRealPoint topLeftArcEnd = THuiRealPoint(topLeftCornerRectTL.iX, topLeftCornerRectTL.iY + aSize.iHeight);
       
   355     DoDrawArc(topLeftCornerRect, topLeftArcStart,topLeftArcEnd);
       
   356     
       
   357     THuiRealPoint topRightArcStart = THuiRealPoint(topRightCornerRectTL.iX + 2*aSize.iWidth, 
       
   358             topRightCornerRectTL.iY + aSize.iHeight);
       
   359     THuiRealPoint topRightArcEnd = THuiRealPoint(topRightCornerRectTL.iX + aSize.iWidth, topRightCornerRectTL.iY);
       
   360     DoDrawArc(topRightCornerRect, topRightArcStart, topRightArcEnd);
       
   361     
       
   362     THuiRealPoint bottomRightArcStart = THuiRealPoint(bottomRightCornerRectTL.iX + aSize.iWidth, 
       
   363             bottomRightCornerRectTL.iY + 2*aSize.iHeight);
       
   364     THuiRealPoint bottomRightArcEnd = THuiRealPoint(bottomRightCornerRectTL.iX + 2*aSize.iWidth, 
       
   365             bottomRightCornerRectTL.iY + aSize.iHeight);
       
   366     DoDrawArc(bottomRightCornerRect,bottomRightArcStart ,bottomRightArcEnd);
       
   367     
       
   368     THuiRealPoint bottomLeftArcStart = THuiRealPoint(bottomLeftCornerRectTL.iX, bottomLeftCornerRectTL.iY +
       
   369             aSize.iHeight);
       
   370     THuiRealPoint bottomLeftArcEnd = THuiRealPoint(bottomLeftCornerRectTL.iX + 
       
   371             aSize.iWidth, bottomLeftCornerRectTL.iY + 2*aSize.iHeight);
       
   372     DoDrawArc(bottomLeftCornerRect, bottomLeftArcStart, bottomLeftArcEnd);
       
   373     if(iPolygonDrawMode)
       
   374         {
       
   375         RArray<THuiRealRect> rects;
       
   376         rects.Append(THuiRealRect(topLeftArcStart,bottomRightArcStart));        
       
   377         rects.Append(THuiRealRect(topLeftArcEnd, THuiRealSize(aSize.iWidth,aDestinationRect.Height()-(2*aSize.iHeight))));
       
   378         rects.Append(THuiRealRect(THuiRealPoint(topRightArcStart.iX - aSize.iWidth,topRightArcStart.iY),
       
   379                  THuiRealSize(aSize.iWidth,aDestinationRect.Height()-(2*aSize.iHeight))));
       
   380         
       
   381         DoDrawRects(rects);
       
   382         rects.Close();
       
   383         }
       
   384     else
       
   385         {
       
   386         RArray<THuiRealLine> lines;
       
   387         lines.Append(THuiRealLine(topLeftArcStart,topRightArcEnd));        
       
   388         lines.Append(THuiRealLine(topLeftArcEnd, bottomLeftArcStart));
       
   389         lines.Append(THuiRealLine(bottomLeftArcEnd, bottomRightArcStart));
       
   390         lines.Append(THuiRealLine(bottomRightArcEnd, topRightArcStart));
       
   391         DoDrawLines(lines);
       
   392         lines.Close();
       
   393         }
       
   394     }
       
   395 
       
   396 
       
   397 EXPORT_C void CHuiCanvasGc::DrawPie(const THuiRealRect& aDestinationRect, 
       
   398         const THuiRealPoint& aStart, const THuiRealPoint& aEnd)
       
   399     {   
       
   400     if (!iGc)
       
   401        {
       
   402        return;    
       
   403        }
       
   404 
       
   405     Setup();
       
   406 
       
   407     EnableDelayedClippingIfNeeded(aDestinationRect);    
       
   408 
       
   409     while (ClipNext())
       
   410         {
       
   411         DoDrawPie( aDestinationRect, aStart, aEnd);
       
   412         }
       
   413 
       
   414     DisableDelayedClippingIfNeeded();    
       
   415 
       
   416     Cleanup();
       
   417     }
       
   418 
       
   419 EXPORT_C void CHuiCanvasGc::DoDrawPie(const THuiRealRect& aDestinationRect, 
       
   420         const THuiRealPoint& aStart, const THuiRealPoint& aEnd)
       
   421     {
       
   422     double startx = aDestinationRect.iTl.iX + aDestinationRect.Width()/2;
       
   423     double starty = aDestinationRect.iTl.iY + aDestinationRect.Height()/2;      
       
   424     DoDrawPie( aDestinationRect, aStart, aEnd);
       
   425     }
       
   426 
       
   427 EXPORT_C void CHuiCanvasGc::DrawArc(const THuiRealRect& aDestinationRect, 
       
   428         const THuiRealPoint& aStart, const THuiRealPoint& aEnd)
       
   429     {    
       
   430 	if (!iGc)
       
   431         {
       
   432         return;    
       
   433         }
       
   434     
       
   435     Setup();
       
   436 
       
   437     EnableBlendingIfNeeded();
       
   438     
       
   439     EnableDelayedClippingIfNeeded(aDestinationRect);    
       
   440 
       
   441     while (ClipNext())
       
   442         {
       
   443         DoDrawArc(aDestinationRect, aStart, aEnd);
       
   444         }
       
   445     
       
   446     DisableDelayedClippingIfNeeded();    
       
   447     
       
   448     Cleanup();
       
   449 	}
       
   450 
       
   451 EXPORT_C void CHuiCanvasGc::DoDrawArc(const THuiRealRect& aDestinationRect, 
       
   452         const THuiRealPoint& aStart, const THuiRealPoint& aEnd)
       
   453     {    
       
   454     TPoint start = aStart;
       
   455     TPoint end = aEnd;
       
   456     TReal startx = aDestinationRect.iTl.iX;
       
   457     TReal starty = aDestinationRect.iTl.iY;
       
   458     TReal rx = aDestinationRect.Width()/2;
       
   459     TReal ry = aDestinationRect.Height()/2; 
       
   460     startx += rx;
       
   461     starty += ry;
       
   462     //Check if given start and end point lie on ellipse, if not, 
       
   463     //Find the point of intersection of ellipse with line joing to ellipse origin and start point
       
   464     //and ellipse origin and end point
       
   465     if ( ((aStart.iX-startx)*(aStart.iX-startx)/(rx*rx) + (aStart.iY-starty)*(aStart.iY-starty)/(ry*ry))!=1 )
       
   466        {
       
   467        TReal m = (aStart.iY-starty)/(aStart.iX - startx);
       
   468        TReal intersectionPointX;
       
   469        TReal src = (rx*rx*ry*ry)/((ry*ry)+(rx*rx*m*m));
       
   470        Math::Sqrt(intersectionPointX,src);
       
   471        TReal intersectionPointY = starty + (m*intersectionPointX);
       
   472        intersectionPointX = intersectionPointX + startx;       
       
   473        start.iX = intersectionPointX;
       
   474        start.iY = intersectionPointY;
       
   475        }
       
   476     if ( ((aEnd.iX-startx)*(aEnd.iX-startx)/(rx*rx) + (aEnd.iY-starty)*(aEnd.iY-starty)/(ry*ry))!=1 )
       
   477        {
       
   478        TReal m = (aEnd.iY-starty)/(aEnd.iX - startx);
       
   479        TReal intersectionPointX;
       
   480        TReal src = (rx*rx*ry*ry)/((ry*ry)+(rx*rx*m*m));
       
   481        Math::Sqrt(intersectionPointX,src);
       
   482        TReal intersectionPointY = (m*intersectionPointX) + starty;
       
   483        intersectionPointX = intersectionPointX + startx;       
       
   484        end.iX = intersectionPointX;
       
   485        end.iY = intersectionPointY;
       
   486        }  
       
   487     TReal startAngle = 0;
       
   488     Math::ATan(startAngle,(starty-start.iY),(start.iX-startx));
       
   489     startAngle = (startAngle*180)/KPi;
       
   490    
       
   491     TReal endAngle = 0;
       
   492     Math::ATan(endAngle,(starty-end.iY),(end.iX-startx));
       
   493     endAngle = (endAngle*180)/KPi;
       
   494    
       
   495     if ( endAngle <= startAngle )
       
   496         endAngle = 360 + endAngle;
       
   497    
       
   498     // this is very slow, needs to be re-implemented    
       
   499     if(iPolygonDrawMode)
       
   500        {     
       
   501        TReal x,y,newx,newy;
       
   502        x = startx;
       
   503        y = starty;
       
   504        newx = x;
       
   505        newy = y;
       
   506        RArray<THuiRealPoint> points;
       
   507        for(TInt i = -endAngle; i <-startAngle ; i++)
       
   508 	        {
       
   509 	        double a = double(i) * KPi / 180.0;        
       
   510 	        double sin, cos;
       
   511 	        
       
   512 	        Math::Sin( sin, a );
       
   513 	        Math::Cos( cos, a );
       
   514 
       
   515 	        newx = startx + cos * rx;
       
   516 	        newy = starty + sin * ry;        
       
   517 	        
       
   518 	        points.Append(THuiRealPoint(x,y));
       
   519 	        points.Append(THuiRealPoint(newx, newy));
       
   520 				        
       
   521 	        x = newx;
       
   522 	        y = newy;
       
   523 	        }
       
   524 	    DoDrawPolygon(points);
       
   525 	    points.Close();
       
   526 	    }
       
   527     else
       
   528 	    {
       
   529 	    CHuiCurvePath* path = NULL;
       
   530 	    TRAPD(error, path = CHuiCurvePath::NewL());
       
   531 	    if(error ==KErrNone)
       
   532 	    	{
       
   533 	    	TRAP(error,path->AppendArcL(THuiRealPoint(startx, starty), THuiRealSize(rx, ry), -startAngle, -endAngle, 1));
       
   534 	    	if(error ==KErrNone)
       
   535 	    		{
       
   536 				THuiLinearMappingFunction alphaFunc;
       
   537 				alphaFunc.iOffset = iOpacity;
       
   538 				THuiLinearMappingFunction widthFunc;
       
   539 				widthFunc.iOffset = iPenWidth;
       
   540 				
       
   541 				const TPoint pt(0,0);
       
   542 				RHuiOwnedPointer<CHuiCurvePath> iPath;
       
   543 				iPath.Set(path, EHuiHasOwnership);
       
   544             
       
   545   				iGc->DrawPath(iPath.Ref(), pt, 0.0, 1.0, &alphaFunc, &widthFunc);
       
   546 	    		}
       
   547 	    	}
       
   548 		}    
       
   549 	}
       
   550 
       
   551 		
       
   552 EXPORT_C void CHuiCanvasGc::DrawPoints(RArray<THuiRealPoint>& aPoints)
       
   553 	{
       
   554 	if (!iGc)
       
   555         {
       
   556         return;    
       
   557         }
       
   558 
       
   559     Setup();
       
   560       
       
   561     EnableBlendingIfNeeded();
       
   562 
       
   563     EnableDelayedClippingIfNeeded(aPoints);    
       
   564 
       
   565     while (ClipNext())
       
   566         {            
       
   567         DoDrawPoints(aPoints);
       
   568         }
       
   569 
       
   570     DisableDelayedClippingIfNeeded(); 
       
   571 
       
   572     Cleanup(); 
       
   573     }
       
   574 
       
   575 EXPORT_C void CHuiCanvasGc::DoDrawPoints(RArray<THuiRealPoint>& aPoints)
       
   576 	{
       
   577     for(TInt i=0; i< aPoints.Count(); i++)
       
   578  	   	{
       
   579  	   	TInt TlOffset = TInt(iPenWidth/2);
       
   580 		TInt BrOffset = TInt(TReal(iPenWidth)/2.f + 0.5f); 	   	
       
   581  	   	TPoint Tl = TPoint(aPoints[i].iX - TlOffset, aPoints[i].iY - TlOffset);
       
   582 		TPoint Br = TPoint(aPoints[i].iX + BrOffset, aPoints[i].iY + BrOffset);
       
   583 		iGc->DrawRect(TRect(Tl, Br));
       
   584     	}        
       
   585     }
       
   586 
       
   587 	
       
   588 EXPORT_C void CHuiCanvasGc::DrawPolygon(RArray<THuiRealPoint>& aPoints)
       
   589 	{
       
   590 	if (!iGc)
       
   591         {
       
   592         return;    
       
   593         }
       
   594         
       
   595     Setup();
       
   596   
       
   597     EnableBlendingIfNeeded();
       
   598 
       
   599     EnableDelayedClippingIfNeeded(aPoints);    
       
   600 
       
   601     while (ClipNext())
       
   602         {                    
       
   603         DoDrawPolygon(aPoints);
       
   604         }
       
   605 
       
   606     DisableDelayedClippingIfNeeded(); 
       
   607 
       
   608     Cleanup();       
       
   609 	}
       
   610 
       
   611 EXPORT_C void CHuiCanvasGc::DoDrawPolygon(RArray<THuiRealPoint>& aPoints)
       
   612 	{
       
   613     TInt i=0;
       
   614     for(; i<(aPoints.Count()-1); i++)
       
   615  	   	{
       
   616  	   	iGc->DrawLine(aPoints[i], aPoints[i+1], iPenWidth);
       
   617     	}
       
   618     iGc->DrawLine(aPoints[i], aPoints[0], iPenWidth);        
       
   619 	}
       
   620 
       
   621 	
       
   622 EXPORT_C void CHuiCanvasGc::DrawRects(RArray<THuiRealRect>& aRects)
       
   623 	{
       
   624 	if (!iGc)
       
   625         {
       
   626         return;    
       
   627         }
       
   628 
       
   629     Setup();
       
   630   
       
   631     EnableBlendingIfNeeded();
       
   632         
       
   633     EnableDelayedClippingIfNeeded(aRects);
       
   634 
       
   635     while (ClipNext())
       
   636         {
       
   637         DoDrawRects(aRects);
       
   638         }
       
   639 
       
   640     DisableDelayedClippingIfNeeded();                
       
   641 
       
   642     Cleanup();
       
   643 	}
       
   644 
       
   645 EXPORT_C void CHuiCanvasGc::DoDrawRects(RArray<THuiRealRect>& aRects)
       
   646 	{
       
   647 	for(TInt i=0; i<aRects.Count(); i++)
       
   648 		{
       
   649 		TRect rect = aRects[i].Round();
       
   650 		if (rect.Height() > 0 && rect.Width() > 0)
       
   651 		    {		        	
       
   652         	if(iPolygonDrawMode == 0)
       
   653         	    {
       
   654         	    // By definition, symbian TRect Br coordinates are outside of the rect so subract those here first
       
   655         	    rect.iBr.iX--;
       
   656         	    rect.iBr.iY--;
       
   657         	    
       
   658         	    // TODO: following does overlapping drawing at the corners, it could be fixed but might not be 
       
   659         	    // trivial if pensize is bigger than 1
       
   660                 if (rect.Width())
       
   661                     iGc->DrawLine(TPoint(rect.iTl.iX, rect.iTl.iY), TPoint(rect.iBr.iX, rect.iTl.iY), iPenWidth); // Top
       
   662                 
       
   663                 if (rect.Height() > 2 && rect.Width() > 1)
       
   664                     iGc->DrawLine(TPoint(rect.iBr.iX, rect.iTl.iY), TPoint(rect.iBr.iX, rect.iBr.iY), iPenWidth); // Right
       
   665                 
       
   666                 if (rect.Width() && rect.Height() > 1)
       
   667                     iGc->DrawLine(TPoint(rect.iTl.iX, rect.iBr.iY), TPoint(rect.iBr.iX, rect.iBr.iY), iPenWidth); // Bottom
       
   668                 
       
   669                 if (rect.Height() > 2)
       
   670                     iGc->DrawLine(TPoint(rect.iTl.iX, rect.iTl.iY), TPoint(rect.iTl.iX,rect.iBr.iY), iPenWidth); // Left        	    
       
   671         	    }
       
   672         	else
       
   673         	    {
       
   674       		  	iGc->DrawRect(rect);
       
   675         	    }
       
   676 		    }    	    
       
   677 		}            
       
   678 	}
       
   679 
       
   680 EXPORT_C void CHuiCanvasGc::SetTextStyle(TInt aStyleId)
       
   681     {
       
   682     iTextStyleId = aStyleId;    
       
   683     }
       
   684 
       
   685 EXPORT_C TInt CHuiCanvasGc::TextStyle() const
       
   686     {
       
   687     return iTextStyleId;    
       
   688     }
       
   689     
       
   690 EXPORT_C void CHuiCanvasGc::SetPenColor(const TRgb& aColor)
       
   691 	{
       
   692 	iPenColor = aColor;
       
   693 	}
       
   694 	
       
   695 EXPORT_C void CHuiCanvasGc::SetPenWidth(const TReal32& aWidth)
       
   696 	{
       
   697 	iPenWidth = aWidth;
       
   698 	}
       
   699 	
       
   700 EXPORT_C void CHuiCanvasGc::SetOpacity(const TReal32& aOpacity)
       
   701 	{
       
   702 	iOpacity = aOpacity;
       
   703 	}
       
   704 
       
   705 EXPORT_C void CHuiCanvasGc::SetPolygonDrawMode(THuiFillMode aPolygonDrawMode)
       
   706 	{
       
   707 	iPolygonDrawMode = aPolygonDrawMode;
       
   708 	}
       
   709 	
       
   710 EXPORT_C void CHuiCanvasGc::SetTextAlign(THuiAlignHorizontal aAlignHorizontal, THuiAlignVertical aAlignVertical)
       
   711 	{
       
   712 	iVerticalTextAlign = aAlignVertical;
       
   713     iHorizontalTextAlign = aAlignHorizontal;
       
   714     }
       
   715     
       
   716 EXPORT_C void CHuiCanvasGc::SetDefaults()
       
   717 	{
       
   718 	SetTextStyle(0);
       
   719     SetPenColor(TRgb(255,255,255));
       
   720 	SetPenWidth(1.0);
       
   721 	SetOpacity(1.0);
       
   722 	SetPolygonDrawMode(EHuiNoFill);
       
   723 	SetTextAlign(EHuiAlignHLeft, EHuiAlignVTop);
       
   724     SetDrawMode(EHuiCanvasDrawModeBlend);
       
   725     EnableEffectiveOpacity(ETrue);    
       
   726     SetPolygonFillTexture(NULL);
       
   727     SetPolygonFillTextureOrigin(TPoint(0,0));
       
   728 	CancelClipping();
       
   729 	}
       
   730     
       
   731     // Transformations
       
   732 EXPORT_C void CHuiCanvasGc::LoadIdentity()
       
   733 	{
       
   734     iGc->Pop(EHuiGcMatrixModel);
       
   735     iGc->Push(EHuiGcMatrixModel);	
       
   736 	}
       
   737 	
       
   738 EXPORT_C void CHuiCanvasGc::Translate(const TReal32& aX, const TReal32& aY, const TReal32& aZ)
       
   739 	{
       
   740 	if (!iGc)
       
   741         {
       
   742         return;    
       
   743         }
       
   744         
       
   745     iGc->SetAlign(EHuiAlignHLeft, EHuiAlignVTop);        
       
   746     iGc->Translate(EHuiGcMatrixModel, aX, aY, aZ);    
       
   747     }
       
   748 
       
   749 EXPORT_C void CHuiCanvasGc::Scale(const TReal32& aX, const TReal32& aY, const TReal32& aZ)
       
   750 	{
       
   751 	if (!iGc)
       
   752         {
       
   753         return;    
       
   754         }
       
   755         
       
   756     iGc->SetAlign(EHuiAlignHLeft, EHuiAlignVTop);        
       
   757     iGc->Scale(EHuiGcMatrixModel, aX, aY, aZ);
       
   758 	}
       
   759 
       
   760 EXPORT_C void CHuiCanvasGc::Rotate(const TReal32& aAngle, const TReal32& aX, const TReal32& aY, const TReal32& aZ)    
       
   761 	{
       
   762 	if (!iGc)
       
   763         {
       
   764         return;    
       
   765         }
       
   766         
       
   767     iGc->SetAlign(EHuiAlignHLeft, EHuiAlignVTop);        
       
   768     iGc->Rotate(EHuiGcMatrixModel, aAngle, aX, aY, aZ);
       
   769 	}
       
   770 
       
   771 EXPORT_C TInt CHuiCanvasGc::TextVerticalAlign() const
       
   772     {
       
   773     return iVerticalTextAlign;    
       
   774     }
       
   775 
       
   776 EXPORT_C TInt CHuiCanvasGc::TextHorizontalAlign() const
       
   777     {
       
   778     return iHorizontalTextAlign;    
       
   779     }
       
   780     
       
   781 EXPORT_C TReal32 CHuiCanvasGc::PenWidth() const
       
   782     {
       
   783     return iPenWidth;    
       
   784     }
       
   785 
       
   786 EXPORT_C THuiFillMode CHuiCanvasGc::PolygonDrawMode() const
       
   787     {
       
   788     return iPolygonDrawMode;    
       
   789     }
       
   790     
       
   791 EXPORT_C void CHuiCanvasGc::DrawImage(const CHuiTexture& aImage, const THuiRealRect& aDestinationRect, const THuiRealRect& aSourceRect)
       
   792     {
       
   793     DrawImage(aImage, aDestinationRect, aSourceRect, CHuiGc::EStretchFull);        
       
   794     }
       
   795 
       
   796 EXPORT_C void CHuiCanvasGc::DrawImage(const CHuiTexture& aImage, 
       
   797     const THuiRealRect& aDestinationRect, 
       
   798     const THuiRealRect& aSourceRect,
       
   799     CHuiGc::TStretchMode aStretchMode)
       
   800     {
       
   801     if (!iGc)
       
   802         {
       
   803         return;    
       
   804         }
       
   805 
       
   806     Setup();
       
   807 
       
   808     THuiImage image = THuiImage(aImage);           
       
   809 
       
   810     // If renderer supports texture coordinates, we can use those to specify subset of image
       
   811     EnableBlendingIfNeeded(&aImage);
       
   812 
       
   813     TSize textureSize = aImage.Size();        
       
   814 
       
   815     if  (textureSize.iWidth > 0 && textureSize.iHeight > 0)
       
   816         {
       
   817         THuiRealRect fullTextureRect = THuiRealRect(TPoint(0,0), aImage.Size());
       
   818         THuiRealRect partialTextureRect = fullTextureRect;
       
   819         
       
   820         // Calculate intersection
       
   821        	if (partialTextureRect.iTl.iX<aSourceRect.iTl.iX)
       
   822     		partialTextureRect.iTl.iX=aSourceRect.iTl.iX;
       
   823 	    if (partialTextureRect.iTl.iY<aSourceRect.iTl.iY)
       
   824 		    partialTextureRect.iTl.iY=aSourceRect.iTl.iY;
       
   825 	    if (partialTextureRect.iBr.iX>aSourceRect.iBr.iX)
       
   826 		    partialTextureRect.iBr.iX=aSourceRect.iBr.iX;
       
   827     	if (partialTextureRect.iBr.iY>aSourceRect.iBr.iY)
       
   828 	        partialTextureRect.iBr.iY=aSourceRect.iBr.iY;
       
   829     	
       
   830         TReal32 tlX = TReal32(partialTextureRect.iTl.iX)/TReal32(textureSize.iWidth);
       
   831         TReal32 tlY = TReal32(partialTextureRect.iTl.iY)/TReal32(textureSize.iHeight);
       
   832         TReal32 brX = TReal32(partialTextureRect.iBr.iX)/TReal32(textureSize.iWidth);
       
   833         TReal32 brY = TReal32(partialTextureRect.iBr.iY)/TReal32(textureSize.iHeight);        
       
   834         
       
   835         image.SetTexCoords(tlX,tlY,brX, brY);          
       
   836 
       
   837         TSize usedSize = aDestinationRect.Size().Round();
       
   838                 
       
   839         if(aStretchMode != CHuiGc::EStretchFull && 
       
   840            aStretchMode != CHuiGc::EStretchHorizontal && 
       
   841            partialTextureRect.Height() < usedSize.iHeight)
       
   842             {
       
   843             usedSize.iHeight = partialTextureRect.Height();  
       
   844             }
       
   845         
       
   846         if(aStretchMode != CHuiGc::EStretchFull &&
       
   847            aStretchMode != CHuiGc::EStretchVertical && 
       
   848            partialTextureRect.Width() < usedSize.iWidth)
       
   849             {
       
   850             usedSize.iWidth = partialTextureRect.Width();  
       
   851             }
       
   852         
       
   853         TRect updatedArea = TRect(aDestinationRect.iTl.Round(), usedSize);
       
   854 
       
   855         if (usedSize.iHeight > 0 && usedSize.iWidth > 0)
       
   856             {                
       
   857             EnableDelayedClippingIfNeeded(updatedArea);
       
   858 			
       
   859             while (ClipNext())
       
   860                 {
       
   861                 iGc->DrawImage(image, aDestinationRect.iTl, usedSize);                                
       
   862                 } 
       
   863             DisableDelayedClippingIfNeeded();    
       
   864             }
       
   865         }    
       
   866 
       
   867     Cleanup();        
       
   868     }
       
   869     
       
   870 EXPORT_C void CHuiCanvasGc::Clear(const THuiRealRect& aRect)
       
   871     {
       
   872     if (!iGc)
       
   873         {
       
   874         return;    
       
   875         }
       
   876 
       
   877     TReal32 effectiveOpacity = 1.f;
       
   878     if (iVisual && iEffectiveOpacityEnabled)
       
   879         {
       
   880         effectiveOpacity = iVisual->EffectiveOpacity();    
       
   881         }
       
   882     iGc->SetPenAlpha(TInt(iOpacity * effectiveOpacity * 255));
       
   883     iGc->SetPenColor(iPenColor);
       
   884     iGc->SetAlign(EHuiAlignHLeft, EHuiAlignVTop);            
       
   885     iGc->Disable(CHuiGc::EFeatureBlending);
       
   886     iGc->Enable(CHuiGc::EFeatureClipping);            
       
   887     iGc->PushClip();
       
   888     iGc->Clip(aRect.Round()); // takes transformations into account
       
   889     iGc->Clear(); 
       
   890     iGc->PopClip();
       
   891     iGc->Enable(CHuiGc::EFeatureBlending);
       
   892     }
       
   893 
       
   894 EXPORT_C void CHuiCanvasGc::ClearWithSkinBackground(const THuiRealRect& /*aRect*/)
       
   895     {
       
   896     // Implementation is renderspecific        
       
   897     }
       
   898 
       
   899     
       
   900 EXPORT_C void CHuiCanvasGc::ClearWithBackgroundItems(const THuiRealRect& /*aRect*/,
       
   901         const RArray<THuiDisplayBackgroundItem>& /*aItems*/)
       
   902     {        
       
   903     // Implementation is renderspecific   
       
   904     }
       
   905     
       
   906 EXPORT_C void CHuiCanvasGc::EnableBlendingIfNeeded(const CHuiTexture* aTexture)
       
   907     {
       
   908     if (iDrawMode == EHuiCanvasDrawModeBlend)
       
   909         {
       
   910         iGc->Enable(CHuiGc::EFeatureBlending);    
       
   911 
       
   912         // Optimization, enable blending only if really needed, on some HW blending slows performance.
       
   913         /*
       
   914         if ((iGc->PenColor().Alpha() == 255) && (iGc->PenAlpha() == 255) && (!aTexture || !aTexture->HasAlpha()))
       
   915             {
       
   916             iGc->Disable(CHuiGc::EFeatureBlending);   
       
   917             }
       
   918         else
       
   919             {
       
   920             iGc->Enable(CHuiGc::EFeatureBlending);    
       
   921             }
       
   922         */                
       
   923         }
       
   924     else if (iDrawMode == EHuiCanvasDrawModeNormal)
       
   925         {
       
   926         iGc->Disable(CHuiGc::EFeatureBlending);        
       
   927         }
       
   928     else
       
   929         {
       
   930         // Unknown mode !
       
   931         }
       
   932     }
       
   933 
       
   934 THuiCanvasDrawMode CHuiCanvasGc::DrawMode() const
       
   935     {
       
   936     return iDrawMode;
       
   937     }
       
   938 
       
   939 
       
   940     
       
   941 CHuiCanvasVisual* CHuiCanvasGc::Visual() const
       
   942     {
       
   943     return iVisual;    
       
   944     }
       
   945 
       
   946 TRgb CHuiCanvasGc::PenColor() const
       
   947     {
       
   948     return iPenColor;    
       
   949     }
       
   950     
       
   951 TReal32 CHuiCanvasGc::Opacity() const
       
   952     {
       
   953     return iOpacity;
       
   954     
       
   955     }
       
   956     
       
   957 EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TRect& aRect) const
       
   958     {
       
   959     TClipRectVisibility isClipped = EFullyOutside;
       
   960     if (!iGc)
       
   961         {
       
   962         return isClipped;
       
   963         }
       
   964 
       
   965     // First check the active clipping region from GC...
       
   966     
       
   967     // aRect is untransformed, activeClippingRegion is transformed
       
   968     // so we must transform aRect first when we comapre it to activeClippingRegion...
       
   969     THuiRealRect transformed = aRect;
       
   970     iGc->TransformDirtyRect(transformed );
       
   971     const TRegion& activeClippingRegion = iGc->ClipRegion();
       
   972 
       
   973     isClipped = IsClipped(transformed.Round(), activeClippingRegion);
       
   974     //...fully outside of GC so it would not be drawn regardless of
       
   975     // the iClipRegion (if it is trying to do clipping), we can return immediately.
       
   976     if (isClipped == EFullyOutside && activeClippingRegion.Count())
       
   977         {        
       
   978         return isClipped;
       
   979         }            
       
   980     //...not clipped by active clip region, check our own iClipRegion
       
   981     if (iClippingRegion.Count())
       
   982         {
       
   983         isClipped = IsClipped(aRect, iClippingRegion);
       
   984         }
       
   985     
       
   986     return isClipped;
       
   987     }
       
   988 
       
   989 CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TRect& aRect, const TRegion& aClippingRegion) const
       
   990     {
       
   991     TClipRectVisibility isClipped = EFullyOutside;
       
   992     if (!aClippingRegion.Count())
       
   993         {
       
   994         return EFullyInside;
       
   995         }
       
   996     
       
   997     if (!aRect.IsEmpty() && aClippingRegion.Count())
       
   998         {    
       
   999 #if 0            
       
  1000         TBool test = EFalse;        
       
  1001         if (test)
       
  1002             {
       
  1003             for (TInt i=0; i<aClippingRegion.Count(); i++)
       
  1004                 {
       
  1005 #ifdef _DEBUG
       
  1006                 RDebug::Print(_L("aClippingRegion Rect: %d %d %d %d"), 
       
  1007                         aClippingRegion[i].iTl.iX, 
       
  1008                         aClippingRegion[i].iTl.iY,
       
  1009                         aClippingRegion[i].iBr.iX,
       
  1010                         aClippingRegion[i].iBr.iY);
       
  1011 #endif
       
  1012                 }                            
       
  1013             }
       
  1014 #endif        
       
  1015         
       
  1016         if (aClippingRegion.Intersects(aRect))
       
  1017             {            
       
  1018             iTempRegion.Clear();
       
  1019             iTempRegion2.Clear();
       
  1020 
       
  1021             iTempRegion.AddRect(aRect);
       
  1022             
       
  1023             iTempRegion2.Intersection(aClippingRegion, iTempRegion);
       
  1024             iTempRegion2.Tidy();
       
  1025             
       
  1026             // Assume it is only partially inside region -> Clipped
       
  1027             isClipped = EPartialOverlap;
       
  1028             
       
  1029             if (iTempRegion2.Count() == 1)
       
  1030                 {
       
  1031                 if (iTempRegion2[0] == aRect)
       
  1032                     {
       
  1033                     // Fully inside region -> Not clipped
       
  1034                     isClipped = EFullyInside;    
       
  1035                     }                
       
  1036                 }
       
  1037             
       
  1038             }
       
  1039         else
       
  1040             {
       
  1041             // No overlap -> aRect is completely outside region -> Clipped
       
  1042             isClipped = EFullyOutside;    
       
  1043             }                    
       
  1044         }
       
  1045     return isClipped;
       
  1046     }
       
  1047 
       
  1048 
       
  1049 EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TPoint& aPoint) const
       
  1050     {
       
  1051     return IsClipped(aPoint, iClippingRegion);
       
  1052     }
       
  1053 
       
  1054 CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TPoint& aPoint, const TRegion& aClippingRegion) const
       
  1055     {
       
  1056     if (iClippingRegion.Count() && !aClippingRegion.Contains(aPoint))
       
  1057         {
       
  1058         return EFullyOutside;
       
  1059         }
       
  1060     else 
       
  1061         {
       
  1062         return EFullyInside;
       
  1063         }
       
  1064     }
       
  1065 
       
  1066 CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TRegion& aTestedRegion, const TRegion& aClippingRegion) const
       
  1067     {
       
  1068     TClipRectVisibility isWholeRegionClipped = EUnknown;
       
  1069     TInt count = aTestedRegion.Count(); 
       
  1070     
       
  1071     if (count == 0)
       
  1072         {
       
  1073         isWholeRegionClipped = EFullyOutside;
       
  1074         }
       
  1075     
       
  1076     for (TInt i=0; i<count; i++)
       
  1077         {
       
  1078         TClipRectVisibility isRectClipped = IsClipped(aTestedRegion[i], aClippingRegion);
       
  1079         if (isWholeRegionClipped == EFullyInside)
       
  1080             {
       
  1081             if (isRectClipped == EFullyOutside ||
       
  1082                 isRectClipped == EPartialOverlap )
       
  1083                 {
       
  1084                 isWholeRegionClipped = EPartialOverlap;
       
  1085                 }            
       
  1086             }
       
  1087         else if (isWholeRegionClipped == EFullyOutside)
       
  1088             {
       
  1089             if (isRectClipped == EFullyInside ||
       
  1090                 isRectClipped == EPartialOverlap )
       
  1091                 {
       
  1092                 isWholeRegionClipped = EPartialOverlap;
       
  1093                 }                        
       
  1094             }
       
  1095         else if (isWholeRegionClipped == EPartialOverlap)
       
  1096             {
       
  1097             // No changes to isWholeRegionClipped in this case and no need to look further
       
  1098             break;
       
  1099             }
       
  1100         else
       
  1101             {
       
  1102             isWholeRegionClipped = isRectClipped;
       
  1103             }                   
       
  1104         }
       
  1105     return isWholeRegionClipped;
       
  1106     }
       
  1107 
       
  1108 
       
  1109 EXPORT_C void CHuiCanvasGc::SetClippingMode(THuiCanvasClipMode aClipMode)
       
  1110     {
       
  1111     iClipMode = aClipMode;    
       
  1112     }
       
  1113 
       
  1114 EXPORT_C void CHuiCanvasGc::SetDrawMode(THuiCanvasDrawMode aDrawMode)
       
  1115     {
       
  1116     iDrawMode = aDrawMode;
       
  1117     }
       
  1118 
       
  1119 EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const THuiRealRect& aUpdatedRect)
       
  1120     {
       
  1121     iDelayedClipCount = 0;
       
  1122     iDelayedClipVisibility = EPartialOverlap;
       
  1123     if (iClipMode == EHuiCanvasClipModeDelayed)
       
  1124         {            
       
  1125         iDelayedClipVisibility = IsClipped(aUpdatedRect.Round());
       
  1126         if ( iDelayedClipVisibility ==  EPartialOverlap )
       
  1127             {
       
  1128             // Could copy only needed rects to avoid excessive clipping
       
  1129             iDelayedClipRegion.Copy(iClippingRegion);
       
  1130             }
       
  1131         }                        
       
  1132     return iDelayedClipVisibility;
       
  1133     }
       
  1134 
       
  1135 EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const RArray<THuiRealRect>& aUpdatedRects)
       
  1136     {
       
  1137     iDelayedClipCount = 0;
       
  1138     iDelayedClipVisibility = EPartialOverlap;
       
  1139     if (iClipMode == EHuiCanvasClipModeDelayed)
       
  1140         {            
       
  1141         for (TInt i=0; i<aUpdatedRects.Count(); i++)
       
  1142             {
       
  1143             iDelayedClipVisibility = IsClipped(aUpdatedRects[i].Round());            
       
  1144             if (iDelayedClipVisibility ==  EPartialOverlap)
       
  1145                 {
       
  1146                 // Could copy only needed rects to avoid excessive clipping
       
  1147                 iDelayedClipRegion.Copy(iClippingRegion);
       
  1148                 break;
       
  1149                 }                                                
       
  1150             }        
       
  1151         }
       
  1152     return iDelayedClipVisibility;
       
  1153     }
       
  1154     
       
  1155     
       
  1156 EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const RArray<THuiRealPoint>& aUpdatedPoints)
       
  1157     {
       
  1158     iDelayedClipCount = 0;
       
  1159     iDelayedClipVisibility = EPartialOverlap;
       
  1160 
       
  1161     if (iClipMode == EHuiCanvasClipModeDelayed)
       
  1162         {
       
  1163         for (TInt i=0; i<aUpdatedPoints.Count();i++)
       
  1164             {
       
  1165             iDelayedClipVisibility = IsClipped(aUpdatedPoints[i].Round());
       
  1166             if (iDelayedClipVisibility != EFullyOutside)
       
  1167                 {
       
  1168                 // Could copy only needed rects to avoid excessive clipping
       
  1169                 iDelayedClipRegion.Copy(iClippingRegion);
       
  1170                 break;
       
  1171                 }                                
       
  1172             }                    
       
  1173         }
       
  1174     return iDelayedClipVisibility;
       
  1175     }
       
  1176 
       
  1177 EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const RArray<THuiRealLine>& aUpdatedLines)
       
  1178     {
       
  1179     iDelayedClipCount = 0;
       
  1180     TClipRectVisibility vis1 = EPartialOverlap;
       
  1181     TClipRectVisibility vis2 = EPartialOverlap;
       
  1182 
       
  1183     if (iClipMode == EHuiCanvasClipModeDelayed)
       
  1184         {
       
  1185         for (TInt i=0; i<aUpdatedLines.Count();i++)
       
  1186             {
       
  1187             TPoint start = aUpdatedLines[i].iStart.Round();
       
  1188             TPoint end = aUpdatedLines[i].iEnd.Round();            
       
  1189             vis1 = IsClipped(start);
       
  1190             vis2 = IsClipped(end);
       
  1191             if ((vis1 != EFullyOutside) || (vis2 != EFullyOutside))
       
  1192                 {
       
  1193                 // Could copy only needed rects to avoid excessive clipping
       
  1194                 iDelayedClipRegion.Copy(iClippingRegion);
       
  1195                 break;
       
  1196                 }                                
       
  1197             }                    
       
  1198         }        
       
  1199     if (vis1 == EFullyOutside && vis2 == EFullyOutside)
       
  1200         {
       
  1201         iDelayedClipVisibility = EFullyOutside;
       
  1202         }
       
  1203     else
       
  1204         {
       
  1205         iDelayedClipVisibility = EPartialOverlap;
       
  1206         }
       
  1207     return iDelayedClipVisibility;
       
  1208     }
       
  1209 
       
  1210     
       
  1211     
       
  1212 EXPORT_C TBool CHuiCanvasGc::ClipNext()
       
  1213     {
       
  1214     if (iDelayedClipVisibility != EFullyOutside && 
       
  1215         iDelayedClipRegion.Count() && 
       
  1216         iDelayedClipCount < iDelayedClipRegion.Count())        
       
  1217         {
       
  1218         if (iDelayedClipRectPushed)
       
  1219             {
       
  1220             iGc->PopClip();    
       
  1221             }                
       
  1222       	
       
  1223       	iGc->Enable(CHuiGc::EFeatureClipping);
       
  1224       	iGc->PushClip();
       
  1225         iDelayedClipRectPushed = ETrue;
       
  1226         
       
  1227         if (MaxNumberOfClipRects() == 1)
       
  1228             {
       
  1229             iGc->Clip(iDelayedClipRegion[iDelayedClipCount]);                            
       
  1230             }
       
  1231         else
       
  1232             {
       
  1233             iGc->Clip(iDelayedClipRegion);                                
       
  1234             }                            
       
  1235         }    
       
  1236 
       
  1237     iDelayedClipCount += MaxNumberOfClipRects();
       
  1238     
       
  1239     if (iDelayedClipVisibility == EFullyOutside)
       
  1240         {
       
  1241         // If drawing would fall completely outside the clipping region, we are done. 
       
  1242         return EFalse;
       
  1243         }
       
  1244     else
       
  1245         {
       
  1246         // Check how many times we must do the operation in case rederer does not support many clip rects at once 
       
  1247         return (iDelayedClipCount <= iDelayedClipRegion.Count() || iDelayedClipCount == MaxNumberOfClipRects());
       
  1248         }
       
  1249     }
       
  1250 
       
  1251 EXPORT_C void CHuiCanvasGc::DisableDelayedClippingIfNeeded()
       
  1252     {
       
  1253     iDelayedClipVisibility = EPartialOverlap;
       
  1254     iDelayedClipCount = 0;
       
  1255     if (iDelayedClipRegion.Count())
       
  1256         {
       
  1257         if (iDelayedClipRectPushed)
       
  1258             {
       
  1259             iGc->PopClip();
       
  1260             iDelayedClipRectPushed = EFalse;    
       
  1261             }                
       
  1262 
       
  1263         iDelayedClipRegion.Clear();
       
  1264         }
       
  1265     }
       
  1266 
       
  1267 EXPORT_C void CHuiCanvasGc::Setup()
       
  1268     {
       
  1269     iOldPencolor = iGc->PenColor();
       
  1270     iOldPenAlpha = iGc->PenAlpha();
       
  1271     iGc->SetAlign(EHuiAlignHLeft, EHuiAlignVTop);    
       
  1272     TReal32 effectiveOpacity = 1.f;
       
  1273     if (iVisual && iEffectiveOpacityEnabled)
       
  1274         {
       
  1275         effectiveOpacity = iVisual->EffectiveOpacity();    
       
  1276         }
       
  1277     iGc->SetPenAlpha(TInt(iOpacity * effectiveOpacity * 255));
       
  1278     iGc->SetPenColor(iPenColor);        
       
  1279     }
       
  1280 
       
  1281 EXPORT_C void CHuiCanvasGc::Cleanup()
       
  1282     {
       
  1283 	iGc->SetPenAlpha(iOldPenAlpha);  
       
  1284 	iGc->SetPenColor(iOldPencolor);	
       
  1285     }
       
  1286 
       
  1287 EXPORT_C TInt CHuiCanvasGc::MaxNumberOfClipRects() const
       
  1288     {
       
  1289     // By default only one at the time, but most renders override this
       
  1290     return 1;    
       
  1291     }
       
  1292 
       
  1293 CHuiGc* CHuiCanvasGc::Gc() const
       
  1294     {
       
  1295     return iGc;
       
  1296     }
       
  1297 
       
  1298 EXPORT_C CHuiCanvasRenderBuffer* CHuiCanvasGc::CreateRenderBufferL(const TSize& /*aSize*/)
       
  1299     {
       
  1300     // Only deriving classes really create render targets
       
  1301     return NULL;
       
  1302     }
       
  1303 
       
  1304 EXPORT_C void CHuiCanvasGc::DrawImage(const CHuiCanvasRenderBuffer& aImage, const THuiRealPoint& aDestinationPoint)
       
  1305     {
       
  1306     if (!iGc)
       
  1307         {
       
  1308         return;    
       
  1309         }
       
  1310         
       
  1311     THuiRealSize destinationSize = aImage.Size();
       
  1312     THuiRealRect destinationRect(aDestinationPoint, destinationSize);
       
  1313     
       
  1314     Setup();
       
  1315   
       
  1316     EnableBlendingIfNeeded();
       
  1317 
       
  1318     EnableDelayedClippingIfNeeded(destinationRect.Round());    
       
  1319 
       
  1320     while (ClipNext())
       
  1321         {                    
       
  1322         DoDrawRenderBuffer(aImage, aDestinationPoint);
       
  1323         }
       
  1324 
       
  1325     DisableDelayedClippingIfNeeded(); 
       
  1326 
       
  1327     Cleanup();       
       
  1328     }
       
  1329 
       
  1330 EXPORT_C void CHuiCanvasGc::ClearRenderBuffer( CHuiCanvasRenderBuffer& aImage, const TRect & aRect )
       
  1331     {
       
  1332     DoClearRenderBuffer(aImage, aRect);
       
  1333     }
       
  1334 EXPORT_C void CHuiCanvasGc::DoClearRenderBuffer( CHuiCanvasRenderBuffer& /*aImage*/, const TRect & /*aRect*/ )
       
  1335     {
       
  1336     // only deriving classes implement this
       
  1337     }
       
  1338 
       
  1339 
       
  1340 EXPORT_C void CHuiCanvasGc::DoDrawRenderBuffer(const CHuiCanvasRenderBuffer& /*aImage*/, const THuiRealPoint& /*aDestinationPoint*/)
       
  1341     {
       
  1342     // Only deriving classes really draw render targets
       
  1343     }
       
  1344 
       
  1345 EXPORT_C void CHuiCanvasGc::PushTransformationMatrix()
       
  1346     {
       
  1347     if (!iGc)
       
  1348         {
       
  1349         return;    
       
  1350         }
       
  1351     
       
  1352     iGc->Push(EHuiGcMatrixModel);
       
  1353     }
       
  1354 
       
  1355 EXPORT_C void CHuiCanvasGc::PopTransformationMatrix()
       
  1356     {
       
  1357     if (!iGc)
       
  1358         {
       
  1359         return;    
       
  1360         }
       
  1361     
       
  1362     iGc->Pop(EHuiGcMatrixModel);    
       
  1363     }
       
  1364 
       
  1365 void CHuiCanvasGc::RestoreState() const
       
  1366     {
       
  1367     if (!iGc)
       
  1368         {
       
  1369         return;    
       
  1370         }
       
  1371 
       
  1372     iGc->RestoreState();    
       
  1373     }
       
  1374 
       
  1375 EXPORT_C void CHuiCanvasGc::RestoreFlaggedState() const
       
  1376     {
       
  1377     // Default implementation does not support flagged states in gc
       
  1378     RestoreState();
       
  1379     }
       
  1380 
       
  1381 void CHuiCanvasGc::EnableEffectiveOpacity(TBool aEnable)
       
  1382     {
       
  1383     iEffectiveOpacityEnabled = aEnable;
       
  1384     }
       
  1385 
       
  1386 EXPORT_C void CHuiCanvasGc::SetPolygonFillTexture(CHuiTexture* aTexture)
       
  1387     {
       
  1388     iPolygonFillTexture = aTexture;
       
  1389     }
       
  1390 
       
  1391 EXPORT_C CHuiTexture* CHuiCanvasGc::PolygonFillTexture() const 
       
  1392     {
       
  1393     return iPolygonFillTexture;
       
  1394     }
       
  1395 
       
  1396 EXPORT_C void CHuiCanvasGc::SetPolygonFillTextureOrigin(const TPoint& aOrigin)
       
  1397     {
       
  1398     iPolygonFillTextureOrigin = aOrigin;
       
  1399     }
       
  1400 
       
  1401 EXPORT_C TPoint CHuiCanvasGc::PolygonFillTextureOrigin() const
       
  1402     {
       
  1403     return iPolygonFillTextureOrigin;
       
  1404     }
       
  1405