svgtopt/nvgdecoder/src/TLVIconCreator.cpp
changeset 0 d46562c3d99d
child 17 443d52b01c62
equal deleted inserted replaced
-1:000000000000 0:d46562c3d99d
       
     1 /*
       
     2 * Copyright (c) 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:  NVG Decoder source file
       
    15 *
       
    16 */
       
    17 
       
    18 #include "TLVIconCreator.h"
       
    19 #include "MVGImageBinder.h"
       
    20 #include "NVGUtil.h"
       
    21 #include "NVGIconData.h"
       
    22 #include "NVGTLVIcon.h"
       
    23 #include "nvg.h"
       
    24 
       
    25 /*
       
    26  * Length of each encoded OpenVG API in bytes. -1 if not pre known.
       
    27  * The order here and in the enum TOpenVGAPI should be same.
       
    28  */ 
       
    29 const TInt APICommandLength[] = 
       
    30     {
       
    31     16, //EvgClear
       
    32      4, //EvgSeti
       
    33      6, //EvgSetf
       
    34     -1, //EvgSetfv
       
    35      8, //EvgSetParameteri
       
    36      10, //EvgSetParameterf
       
    37     -1, //EvgSetParameterfv
       
    38      8, //EvgSetColor
       
    39      5, //EvgSetPaint
       
    40     36, //EvgLoadMatrix
       
    41     36, //EvgMultMatrix
       
    42      0, //EvgLoadIdentity
       
    43      8, //EvgScale
       
    44      4, //EvgRotate
       
    45      8, //EvgTranslate
       
    46     -1, //EvgAppendPathData
       
    47      6, //EvgDrawPath
       
    48      6, //EvgClearPath
       
    49     20, //EvguRect
       
    50     20, //EvguEllipse
       
    51     28, //EvguRoundRect
       
    52     20, //EvguLine
       
    53      4, //EvgCreatePaint
       
    54     29, //EvgCreatePath
       
    55      0, //EvgGetPixels
       
    56      4, //EvgDestroyImage
       
    57      0, //EvgDestroyPaint
       
    58      0, //EvgDestroyPath
       
    59     -1, //EvgSetiv
       
    60     17, //EvgCreateImage
       
    61      4, //EvgDrawImage
       
    62     20, //EvgClearImage
       
    63     -1, //EvgImageSubData
       
    64      0, //EvgPrepareToBindImage
       
    65      4, //EvgBindImage
       
    66      0, //EvgUnBindImage
       
    67      0  //EvgFlush
       
    68     };
       
    69 
       
    70 CTLVIconCreator::CTLVIconCreator(TInt aWidth, TInt aHeight, CNVGTLVIcon * aNVGTLVIcon)
       
    71         : 
       
    72         iNVGDataPtr((TUint8 *)&aWidth, 1)
       
    73     {
       
    74     vgapi[EvgSeti]              = &DvgAddCommandL;        
       
    75     vgapi[EvgSetf]              = &DvgAddCommandL;
       
    76     vgapi[EvgSetParameteri]     = &DvgAddCommandL;
       
    77     vgapi[EvgSetParameterf]     = &DvgAddCommandL;
       
    78     vgapi[EvgSetParameterfv]    = &DvgSetParameterfvL;
       
    79     vgapi[EvgSetColor]          = &DvgAddCommandL;
       
    80     vgapi[EvgSetPaint]          = &DvgAddCommandL;
       
    81     vgapi[EvgLoadMatrix]        = &DvgAddCommandL;
       
    82     vgapi[EvgMultMatrix]        = &DvgAddCommandL;
       
    83     vgapi[EvgLoadIdentity]      = &DvgAddCommandL;
       
    84     vgapi[EvgScale]             = &DvgAddCommandL;
       
    85     vgapi[EvgTranslate]         = &DvgAddCommandL;
       
    86     vgapi[EvgAppendPathData]    = &DvgAppendPathDataL;
       
    87     vgapi[EvgDrawPath]          = &DvgDrawPathL;
       
    88     vgapi[EvgClearPath]         = &DvgAddCommandL;
       
    89     vgapi[EvguRect]             = &DvguRectL;
       
    90     vgapi[EvguEllipse]          = &DvguEllipseL;
       
    91     vgapi[EvguRoundRect]        = &DvguRoundRectL;
       
    92     vgapi[EvguLine]             = &DvguLineL;
       
    93     vgapi[EvgCreatePaint]       = &DvgAddCommandL;
       
    94     vgapi[EvgSetiv]             = &DvgSetivL;                      
       
    95     vgapi[EvgClear]             = &DvgAddCommandL;
       
    96     vgapi[EvgSetfv]             = &DvgSetfvL;
       
    97     vgapi[EvgRotate]            = &DvgAddCommandL;
       
    98     vgapi[EvgCreatePath]        = &DvgCreatePathL;
       
    99     vgapi[EvgCreateImage]       = &DvgAddCommandL;
       
   100     vgapi[EvgGetPixels]         = &DvgGetPixelsL;
       
   101     vgapi[EvgDrawImage]         = &DvgAddCommandL;
       
   102     vgapi[EvgClearImage]        = &DvgAddCommandL;
       
   103     vgapi[EvgImageSubData]      = &DvgImageSubDataL;
       
   104     vgapi[EvgDestroyImage]      = &DvgAddCommandL;
       
   105     vgapi[EvgDestroyPaint]      = &DvgDestroyPaintL;
       
   106     vgapi[EvgDestroyPath]       = &DvgDestroyPathL;
       
   107     
       
   108     vgapi[EvgPrepareToBindImage]= &DvgAddCommandL;
       
   109     vgapi[EvgBindImage]         = &DvgAddCommandL;
       
   110     vgapi[EvgUnBindImage]       = &DvgAddCommandL;
       
   111         
       
   112     vgapi[EvgFlush]             = &DvgAddCommandL;
       
   113     
       
   114     iTargetWidth        = aWidth;
       
   115     iTargetHeight       = aHeight;
       
   116     iPrepareToBindImage = 0;
       
   117     iNVGTLVIcon         = aNVGTLVIcon;
       
   118     iLastVGPath         = 0;
       
   119     }
       
   120 
       
   121 CTLVIconCreator * CTLVIconCreator::NewL(const TDesC8& aBuf, TInt aWidth, TInt aHeight, CNVGTLVIcon * aNVGTLVIcon)
       
   122     {
       
   123     CTLVIconCreator* self    = CTLVIconCreator::NewLC(aBuf,aWidth, aHeight, aNVGTLVIcon);
       
   124     CleanupStack::Pop(self);
       
   125     return self;
       
   126     }
       
   127     
       
   128 CTLVIconCreator * CTLVIconCreator::NewLC(const TDesC8& aBuf, TInt aWidth, TInt aHeight, CNVGTLVIcon * aNVGTLVIcon)
       
   129     {
       
   130     CTLVIconCreator* self    = new (ELeave) CTLVIconCreator(aWidth, aHeight, aNVGTLVIcon);
       
   131     CleanupStack::PushL(self);
       
   132     self->ConstructL(aBuf);
       
   133     return self;
       
   134     }
       
   135 
       
   136 void CTLVIconCreator::ConstructL(const TDesC8& aBuf)
       
   137     {
       
   138     vgGetMatrix(iUserMatrix);
       
   139 
       
   140     iNVGIconData = CNVGIconData::NewL(aBuf);
       
   141     iDataLength  = aBuf.Length();
       
   142 
       
   143     iCommandBuffer = (TUint8 *)aBuf.Ptr();
       
   144     iNVGIconData->BeginRead();
       
   145     iNVGIconData->ReadL(iNvgHeader, sizeof(iNvgHeader));
       
   146     iNVGTLVIcon->AddCommandL(iNvgHeader, sizeof(iNvgHeader));
       
   147     }
       
   148 
       
   149 CTLVIconCreator::~CTLVIconCreator()
       
   150     {    
       
   151     delete iNVGIconData;    
       
   152     }
       
   153 
       
   154 void CTLVIconCreator::DvgAddCommandL(TInt aLength, TInt aPos)
       
   155     {
       
   156     iNVGTLVIcon->AddCommandL(iCurrentCommand, iCommandBuffer + aPos, aLength);
       
   157     }
       
   158 
       
   159 void CTLVIconCreator::DvgAddCommandL()
       
   160     {
       
   161     iNVGTLVIcon->AddCommandL(iCurrentCommand, iCommandBuffer + iNVGIconData->ReadPos(),
       
   162                             APICommandLength[iCurrentCommand]);
       
   163     iNVGIconData->SkipL(APICommandLength[iCurrentCommand]);
       
   164     }
       
   165 
       
   166 void CTLVIconCreator::DvgSetParameterfvL()    
       
   167     {
       
   168     TInt length = 0;
       
   169     TInt cpos = iNVGIconData->ReadPos();
       
   170 
       
   171     TUint32 pvalue = iNVGIconData->ReadInt32L();
       
   172     iNVGIconData->ReadInt16L();
       
   173     TUint32 countt = iNVGIconData->ReadInt32L();
       
   174     length = length + sizeof(TUint32) + sizeof(TUint16) + sizeof(TUint32) + countt * sizeof(float);
       
   175 
       
   176     iNVGIconData->SkipL(countt * sizeof(TReal32));
       
   177 
       
   178     DvgAddCommandL(length, cpos);
       
   179     }
       
   180 
       
   181 void CTLVIconCreator::DvgSetivL()    
       
   182     {
       
   183     TInt length   = 0;
       
   184     TInt cpos     = iNVGIconData->ReadPos();
       
   185     TUint16 type  = iNVGIconData->ReadInt16L();
       
   186     TUint16 count = iNVGIconData->ReadInt16L();
       
   187 
       
   188     length = sizeof(TInt16) + sizeof(TInt16);
       
   189     length += count * sizeof(TInt32);
       
   190 
       
   191     iNVGIconData->SkipL(count * sizeof(TInt32));
       
   192 
       
   193     DvgAddCommandL(length, cpos);
       
   194     }             
       
   195 
       
   196 
       
   197 VGPath  CTLVIconCreator::CreatePathL()
       
   198     {
       
   199     const float KScale = 1.0f / 65536.0f;
       
   200 
       
   201     VGPath pathH = vgCreatePath( VG_PATH_FORMAT_STANDARD,
       
   202                                   VG_PATH_DATATYPE_S_32, KScale, 0.0f, 0, 0,
       
   203                                   VG_PATH_CAPABILITY_APPEND_TO );
       
   204     if (pathH == VG_INVALID_HANDLE)
       
   205         {
       
   206         User::LeaveIfError(CNvgEngine::OpenVGErrorToSymbianError(vgGetError()));
       
   207         }
       
   208     
       
   209     return pathH;
       
   210     }
       
   211 
       
   212 void CTLVIconCreator::DvgAppendPathDataL()    
       
   213     {
       
   214     TUint16         numSegments;
       
   215     TUint16         coordinatecount;
       
   216     VGubyte *       pathSegments;
       
   217     TFloatFixPt *   pathData;
       
   218     TFloatFixPt *   coordhandle;    
       
   219 
       
   220     iNVGIconData->ReadInt32L();
       
   221     numSegments = iNVGIconData->ReadInt16L();
       
   222     
       
   223     pathSegments = new (ELeave) VGubyte[numSegments];
       
   224     CleanupStack::PushL(TCleanupItem(CleanupArray, pathSegments));
       
   225     
       
   226     for(int j=0; j < numSegments; j++)
       
   227         {	
       
   228         pathSegments[j] = iNVGIconData->ReadInt8L();
       
   229         }
       
   230     
       
   231     coordinatecount = iNVGIconData->ReadInt16L();
       
   232     pathData = new (ELeave) TFloatFixPt[coordinatecount];
       
   233     CleanupStack::PushL(TCleanupItem(CleanupArray, pathData));
       
   234     
       
   235     TInt lFloatFixVal = 0;
       
   236     
       
   237     coordhandle = pathData;
       
   238     for(int i = 0; i < coordinatecount; i++, coordhandle++)					
       
   239         {
       
   240         lFloatFixVal = iNVGIconData->ReadInt32L();
       
   241         coordhandle->copyfloatfix(lFloatFixVal);
       
   242         }
       
   243     
       
   244     iLastVGPath = CreatePathL();
       
   245     vgAppendPathData(iLastVGPath, numSegments, pathSegments, pathData);  
       
   246 
       
   247     CleanupStack::PopAndDestroy(2);
       
   248     }
       
   249 
       
   250 void CTLVIconCreator::DvgDrawPathL()    
       
   251     {
       
   252     iNVGIconData->ReadInt32L();
       
   253     TUint16 value = iNVGIconData->ReadInt16L();
       
   254     
       
   255     iNVGTLVIcon->AddDrawPathCommandL(iLastVGPath, (VGPaintMode)value);    
       
   256     }
       
   257 
       
   258 void CTLVIconCreator::DvguRectL()
       
   259     {
       
   260     iNVGIconData->ReadInt32L();
       
   261     
       
   262     TReal32 x   = iNVGIconData->ReadReal32L();
       
   263     TReal32 y   = iNVGIconData->ReadReal32L();
       
   264     
       
   265     TReal32 width   = iNVGIconData->ReadReal32L();
       
   266     TReal32 height  = iNVGIconData->ReadReal32L();
       
   267     
       
   268     iLastVGPath = CreatePathL();    
       
   269     vguRect(iLastVGPath, x, y, width, height);
       
   270     }
       
   271 
       
   272 void CTLVIconCreator::DvguEllipseL()
       
   273     {
       
   274     TReal32 cx;
       
   275     TReal32 cy;
       
   276     TReal32 width;
       
   277     TReal32 height;
       
   278 
       
   279     iNVGIconData->ReadInt32L();
       
   280     
       
   281     cx = iNVGIconData->ReadReal32L();
       
   282     cy = iNVGIconData->ReadReal32L();
       
   283     
       
   284     width  = iNVGIconData->ReadReal32L();
       
   285     height = iNVGIconData->ReadReal32L();
       
   286     
       
   287     iLastVGPath = CreatePathL();    
       
   288     vguEllipse(iLastVGPath, cx, cy, width, height);
       
   289     }
       
   290 
       
   291 void CTLVIconCreator::DvguRoundRectL()
       
   292     {
       
   293     TReal32 x;
       
   294     TReal32 y;
       
   295     TReal32 width;
       
   296     TReal32 height;
       
   297     TReal32 arcWidth;
       
   298     TReal32 arcHeight;      
       
   299 
       
   300     iNVGIconData->ReadInt32L();
       
   301     
       
   302     x = iNVGIconData->ReadReal32L();
       
   303     y = iNVGIconData->ReadReal32L();
       
   304     
       
   305     width = iNVGIconData->ReadReal32L();
       
   306     height= iNVGIconData->ReadReal32L();
       
   307     
       
   308     arcWidth = iNVGIconData->ReadReal32L();
       
   309     arcHeight= iNVGIconData->ReadReal32L();
       
   310 
       
   311     iLastVGPath = CreatePathL();    
       
   312     vguRoundRect(iLastVGPath, x, y, width, height, arcWidth, arcHeight);
       
   313     }
       
   314 
       
   315 void CTLVIconCreator::DvguLineL()
       
   316     {
       
   317     TReal32 x0;
       
   318     TReal32 y0;
       
   319     TReal32 x1;
       
   320     TReal32 y1;
       
   321     
       
   322     iNVGIconData->ReadInt32L();
       
   323     
       
   324     x0 = iNVGIconData->ReadReal32L();
       
   325     y0 = iNVGIconData->ReadReal32L();
       
   326     
       
   327     x1 = iNVGIconData->ReadReal32L();
       
   328     y1 = iNVGIconData->ReadReal32L();
       
   329     
       
   330     iLastVGPath = CreatePathL();
       
   331     vguLine(iLastVGPath, x0, y0, x1, y1);
       
   332     }
       
   333     
       
   334 void CTLVIconCreator::DvgSetfvL()
       
   335     {
       
   336     TUint16 count;
       
   337     TInt length = 0;
       
   338     TInt cpos   = iNVGIconData->ReadPos();
       
   339     
       
   340     iNVGIconData->ReadInt16L();
       
   341     count = iNVGIconData->ReadInt16L();
       
   342     
       
   343     iNVGIconData->SkipL(sizeof(TReal32) * count);
       
   344     
       
   345     length = length + 2 * sizeof(TUint16) + count * sizeof(VGfloat);
       
   346     
       
   347     DvgAddCommandL(length, cpos);
       
   348     }
       
   349 
       
   350 void CTLVIconCreator::DvgCreatePathL()
       
   351     {
       
   352     iNVGIconData->SkipL(APICommandLength[EvgCreatePath]);
       
   353     }
       
   354 
       
   355 void CTLVIconCreator::DvgImageSubDataL()
       
   356     {
       
   357     TInt cpos   = iNVGIconData->ReadPos();
       
   358     
       
   359     TInt encodedImageHandle = iNVGIconData->ReadInt32L();
       
   360     TInt dataLength         = 0;
       
   361     
       
   362     iNVGIconData->ReadInt32L();
       
   363     iNVGIconData->ReadInt32L();
       
   364     iNVGIconData->ReadInt32L();
       
   365     iNVGIconData->ReadInt32L();
       
   366     iNVGIconData->ReadInt32L();
       
   367     iNVGIconData->ReadInt32L();        
       
   368     dataLength      = iNVGIconData->ReadInt32L();
       
   369     iNVGIconData->SkipL(dataLength);
       
   370     
       
   371     DvgAddCommandL(iNVGIconData->ReadPos() - cpos, cpos);
       
   372     }
       
   373     
       
   374 void CTLVIconCreator::DvgGetPixelsL()
       
   375     {
       
   376     }
       
   377 
       
   378 void CTLVIconCreator::DvgDestroyPaintL()
       
   379     {
       
   380     }
       
   381 
       
   382 void CTLVIconCreator::DvgDestroyPathL()
       
   383     {
       
   384     }
       
   385 
       
   386 void CTLVIconCreator::DvgFlushL()
       
   387     {
       
   388     }
       
   389 
       
   390 TInt CTLVIconCreator::ExecuteL(TInt aIndex)
       
   391     {
       
   392     iCurrentCommand = aIndex;
       
   393     if (0 <= aIndex && aIndex < EvgFlush + 1)
       
   394         {
       
   395         (this->*(vgapi[aIndex]))();
       
   396         }
       
   397     else
       
   398         {
       
   399         return KErrCorrupt;
       
   400         }
       
   401 
       
   402     return KErrNone;
       
   403     }
       
   404 
       
   405 TInt CTLVIconCreator::ExecuteL()
       
   406     {
       
   407     TInt error = KErrNone;
       
   408         
       
   409     while (!iNVGIconData->EOF())
       
   410         {
       
   411         error = ExecuteL(iNVGIconData->ReadInt8L());
       
   412         if (error != KErrNone)
       
   413             {
       
   414             break;
       
   415             }
       
   416         }
       
   417     
       
   418     return error;
       
   419     }