svgtopt/nvgdecoder/src/NVGCSIcon.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  NVG Decoder source file
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "NVGCSIcon.h"
hgs
parents:
diff changeset
    19
#include "NVGIconData.h"
hgs
parents:
diff changeset
    20
#include "nvgfittoviewbox.h"
hgs
parents:
diff changeset
    21
#include "nvg.h"
hgs
parents:
diff changeset
    22
#include "NVGUtil.h"
hgs
parents:
diff changeset
    23
#include "OpenVGHandleStore.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <string.h>
hgs
parents:
diff changeset
    26
#include <e32math.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
CNVGCSIcon::CNVGCSIcon()
hgs
parents:
diff changeset
    30
    :   iNVGIconData(0),
hgs
parents:
diff changeset
    31
        iPath(VG_INVALID_HANDLE),
hgs
parents:
diff changeset
    32
        iFillPaint(VG_INVALID_HANDLE),
hgs
parents:
diff changeset
    33
        iStrokePaint(VG_INVALID_HANDLE),
hgs
parents:
diff changeset
    34
        iLastFillPaintType(0),
hgs
parents:
diff changeset
    35
        iLastStrokePaintType(0),
hgs
parents:
diff changeset
    36
        iLastFillPaintColor(0),
hgs
parents:
diff changeset
    37
        iLastStrkePaintColor(0),
hgs
parents:
diff changeset
    38
        iResetFillPaint(0),
hgs
parents:
diff changeset
    39
        iResetStrokePaint(0)
hgs
parents:
diff changeset
    40
    {
hgs
parents:
diff changeset
    41
    }
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
CNVGCSIcon::~CNVGCSIcon()
hgs
parents:
diff changeset
    44
    {
hgs
parents:
diff changeset
    45
    vgSetPaint(VG_INVALID_HANDLE, VG_FILL_PATH);
hgs
parents:
diff changeset
    46
    vgSetPaint(VG_INVALID_HANDLE, VG_STROKE_PATH);
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
    delete iNVGIconData;
hgs
parents:
diff changeset
    49
    delete iOpenVGHandles;
hgs
parents:
diff changeset
    50
    }
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
CNVGCSIcon * CNVGCSIcon::NewL(const TDesC8& aBuf)
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    CNVGCSIcon* self    = CNVGCSIcon::NewLC(aBuf);
hgs
parents:
diff changeset
    55
    
hgs
parents:
diff changeset
    56
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    57
    return self;
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
CNVGCSIcon * CNVGCSIcon::NewLC(const TDesC8& aBuf)
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
    CNVGCSIcon* self    = new (ELeave) CNVGCSIcon;
hgs
parents:
diff changeset
    63
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
    self->ConstructL(aBuf);
hgs
parents:
diff changeset
    66
    
hgs
parents:
diff changeset
    67
    return self;
hgs
parents:
diff changeset
    68
    }
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
void CNVGCSIcon::ConstructL(const TDesC8& aBuf)
hgs
parents:
diff changeset
    71
    {
hgs
parents:
diff changeset
    72
    iNVGIconData = CNVGIconData::NewL(aBuf.Length());
hgs
parents:
diff changeset
    73
    iOpenVGHandles = COpenVGHandleStore::NewL();
hgs
parents:
diff changeset
    74
    
hgs
parents:
diff changeset
    75
    if (iPath == VG_INVALID_HANDLE)
hgs
parents:
diff changeset
    76
        {
hgs
parents:
diff changeset
    77
        iPath = vgCreatePath(VG_PATH_FORMAT_STANDARD,
hgs
parents:
diff changeset
    78
                        VG_PATH_DATATYPE_S_32, 1.0f/65536.0f, 0.0f, 0, 0,
hgs
parents:
diff changeset
    79
                        VG_PATH_CAPABILITY_APPEND_TO);
hgs
parents:
diff changeset
    80
        iOpenVGHandles->AddPathDHL(iPath);
hgs
parents:
diff changeset
    81
        }
hgs
parents:
diff changeset
    82
    
hgs
parents:
diff changeset
    83
    if (iFillPaint == VG_INVALID_HANDLE)
hgs
parents:
diff changeset
    84
        {
hgs
parents:
diff changeset
    85
        iFillPaint = vgCreatePaint();
hgs
parents:
diff changeset
    86
        iOpenVGHandles->AddPaintDHL(iFillPaint);
hgs
parents:
diff changeset
    87
        }
hgs
parents:
diff changeset
    88
    vgSetPaint(iFillPaint, VG_FILL_PATH);
hgs
parents:
diff changeset
    89
    
hgs
parents:
diff changeset
    90
    if (iStrokePaint == VG_INVALID_HANDLE)
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
        iStrokePaint = vgCreatePaint();
hgs
parents:
diff changeset
    93
        iOpenVGHandles->AddPaintDHL(iStrokePaint);
hgs
parents:
diff changeset
    94
        }
hgs
parents:
diff changeset
    95
    vgSetPaint(iStrokePaint, VG_STROKE_PATH);
hgs
parents:
diff changeset
    96
    }
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
TInt CNVGCSIcon::SetViewBox(TReal32 x, TReal32 y, TReal32 w, TReal32 h) __SOFTFP
hgs
parents:
diff changeset
    99
    {
hgs
parents:
diff changeset
   100
    iViewBoxX = x;
hgs
parents:
diff changeset
   101
    iViewBoxY = y;
hgs
parents:
diff changeset
   102
    iViewBoxW = w;
hgs
parents:
diff changeset
   103
    iViewBoxH = h;
hgs
parents:
diff changeset
   104
    
hgs
parents:
diff changeset
   105
    return KErrNone;
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
TInt CNVGCSIcon::SetPreserveAspectRatio(TInt aPreserveAspectSetting, 
hgs
parents:
diff changeset
   109
        TInt aSmilFitSetting)
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
    iPreserveAspectSetting = aPreserveAspectSetting;
hgs
parents:
diff changeset
   112
    iSmilFitSetting = aSmilFitSetting;
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    return KErrNone;
hgs
parents:
diff changeset
   115
    }
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
TInt CNVGCSIcon::Rotate(TReal32 aAngle, TReal32 aX, TReal32 aY) __SOFTFP
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
    iRotationAngle  = aAngle;
hgs
parents:
diff changeset
   120
    iRotationX      = aX;
hgs
parents:
diff changeset
   121
    iRotationY      = aY;
hgs
parents:
diff changeset
   122
    
hgs
parents:
diff changeset
   123
    return KErrNone;
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
    
hgs
parents:
diff changeset
   126
void CNVGCSIcon::AddPathDataL(VGint numSegments, const VGubyte * pathSegments, const void * pathData)
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    iNVGIconData->EncodeInt32L(EPathData);
hgs
parents:
diff changeset
   129
    iNVGIconData->EncodeInt32L(numSegments);
hgs
parents:
diff changeset
   130
    iNVGIconData->EncodeDataL(pathSegments, numSegments);
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    TInt coordinateCount = 0;
hgs
parents:
diff changeset
   133
    for (TInt i = 0; i < numSegments; ++i)
hgs
parents:
diff changeset
   134
        {
hgs
parents:
diff changeset
   135
        switch (pathSegments[i])
hgs
parents:
diff changeset
   136
            {
hgs
parents:
diff changeset
   137
            case VG_HLINE_TO:
hgs
parents:
diff changeset
   138
            case VG_VLINE_TO:
hgs
parents:
diff changeset
   139
                coordinateCount += 1;
hgs
parents:
diff changeset
   140
                break;
hgs
parents:
diff changeset
   141
            case VG_MOVE_TO:
hgs
parents:
diff changeset
   142
            case VG_LINE_TO:
hgs
parents:
diff changeset
   143
            case VG_SQUAD_TO:
hgs
parents:
diff changeset
   144
                coordinateCount += 2;
hgs
parents:
diff changeset
   145
                break;                
hgs
parents:
diff changeset
   146
            case VG_QUAD_TO:
hgs
parents:
diff changeset
   147
            case VG_SCUBIC_TO:
hgs
parents:
diff changeset
   148
                coordinateCount += 4;
hgs
parents:
diff changeset
   149
                break;
hgs
parents:
diff changeset
   150
            case VG_SCCWARC_TO:
hgs
parents:
diff changeset
   151
            case VG_SCWARC_TO:
hgs
parents:
diff changeset
   152
            case VG_LCCWARC_TO:
hgs
parents:
diff changeset
   153
            case VG_LCWARC_TO:
hgs
parents:
diff changeset
   154
                coordinateCount += 5;
hgs
parents:
diff changeset
   155
                break;
hgs
parents:
diff changeset
   156
            case VG_CUBIC_TO:
hgs
parents:
diff changeset
   157
                coordinateCount += 6;
hgs
parents:
diff changeset
   158
                break;
hgs
parents:
diff changeset
   159
            default:
hgs
parents:
diff changeset
   160
                break;
hgs
parents:
diff changeset
   161
            }
hgs
parents:
diff changeset
   162
        }
hgs
parents:
diff changeset
   163
    iNVGIconData->EncodeInt16L(coordinateCount);
hgs
parents:
diff changeset
   164
    iNVGIconData->EncodeDataL(pathData, coordinateCount * 4);
hgs
parents:
diff changeset
   165
    }
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
void CNVGCSIcon::AddDrawPathCommandL(VGPath aPath, VGbitfield aPaintMode)
hgs
parents:
diff changeset
   168
    {
hgs
parents:
diff changeset
   169
    iOpenVGHandles->AddPathDHL(aPath);
hgs
parents:
diff changeset
   170
    iNVGIconData->EncodeInt32L(EPath);
hgs
parents:
diff changeset
   171
    iNVGIconData->EncodeInt32L(aPath);    
hgs
parents:
diff changeset
   172
    iNVGIconData->EncodeInt32L(aPaintMode);    
hgs
parents:
diff changeset
   173
    }
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
void CNVGCSIcon::AddLinearGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint)
hgs
parents:
diff changeset
   176
    {
hgs
parents:
diff changeset
   177
    iOpenVGHandles->AddPaintDHL(aPaint);
hgs
parents:
diff changeset
   178
    iNVGIconData->EncodeInt32L(EPaint);
hgs
parents:
diff changeset
   179
    AddLinearGradientCommandDataL(aPaint, aCount, aGradientData, aGradientMatrix);
hgs
parents:
diff changeset
   180
    }
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
void CNVGCSIcon::AddRadialGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint)
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
    iOpenVGHandles->AddPaintDHL(aPaint);
hgs
parents:
diff changeset
   185
    iNVGIconData->EncodeInt32L(EPaint);
hgs
parents:
diff changeset
   186
    AddRadialGradientCommandDataL(aPaint, aCount, aGradientData, aGradientMatrix);
hgs
parents:
diff changeset
   187
    }
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
void CNVGCSIcon::AddSetColorCommandL(VGuint aRgba)
hgs
parents:
diff changeset
   190
    {
hgs
parents:
diff changeset
   191
    iNVGIconData->EncodeInt32L(EPaint);
hgs
parents:
diff changeset
   192
    iNVGIconData->EncodeInt32L(VG_PAINT_TYPE_COLOR);
hgs
parents:
diff changeset
   193
    iNVGIconData->EncodeInt32L(aRgba);
hgs
parents:
diff changeset
   194
    }
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
void CNVGCSIcon::AddColorRampCommandL(VGPaint aPaint)
hgs
parents:
diff changeset
   197
    {
hgs
parents:
diff changeset
   198
    iNVGIconData->EncodeInt32L(EColorRamp);
hgs
parents:
diff changeset
   199
    iNVGIconData->EncodeInt32L(aPaint);
hgs
parents:
diff changeset
   200
    }
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
void CNVGCSIcon::AddSetTransformCommandL(const VGfloat* aTransformMatrix, TInt aFlag)
hgs
parents:
diff changeset
   203
    {
hgs
parents:
diff changeset
   204
    iNVGIconData->EncodeInt32L(ETransform);
hgs
parents:
diff changeset
   205
    iNVGIconData->EncodeDataL(aTransformMatrix, 9 * sizeof(VGfloat));
hgs
parents:
diff changeset
   206
    iNVGIconData->EncodeInt32L(aFlag);
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
void CNVGCSIcon::AddSetStrokeWidthCommandL(VGfloat aStrokeWidth)
hgs
parents:
diff changeset
   210
    {
hgs
parents:
diff changeset
   211
    iNVGIconData->EncodeInt32L(EStrokeWidth);
hgs
parents:
diff changeset
   212
    iNVGIconData->EncodeReal32L(aStrokeWidth);
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
void CNVGCSIcon::AddSetStrokeMiterLimitCommandL(VGfloat aMiterLimit)
hgs
parents:
diff changeset
   216
    {
hgs
parents:
diff changeset
   217
    iNVGIconData->EncodeInt32L(EStrokeMiterLimit);
hgs
parents:
diff changeset
   218
    iNVGIconData->EncodeReal32L(aMiterLimit);
hgs
parents:
diff changeset
   219
    }
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
void CNVGCSIcon::AddStrokeLineJoinCapCommandL(VGint aCapStyle, VGint aJoinStyle)
hgs
parents:
diff changeset
   222
    {
hgs
parents:
diff changeset
   223
    iNVGIconData->EncodeInt32L(EStrokeLineJoinCap);
hgs
parents:
diff changeset
   224
    iNVGIconData->EncodeInt32L(aCapStyle);
hgs
parents:
diff changeset
   225
    iNVGIconData->EncodeInt32L(aJoinStyle);
hgs
parents:
diff changeset
   226
    }
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
void CNVGCSIcon::AddStrokeLinearGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint)
hgs
parents:
diff changeset
   229
    {
hgs
parents:
diff changeset
   230
    iOpenVGHandles->AddPaintDHL(aPaint);
hgs
parents:
diff changeset
   231
    iNVGIconData->EncodeInt32L(EStrokePaint);
hgs
parents:
diff changeset
   232
    AddLinearGradientCommandDataL(aPaint, aCount, aGradientData, aGradientMatrix);
hgs
parents:
diff changeset
   233
    }
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
void CNVGCSIcon::AddStrokeRadialGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint)
hgs
parents:
diff changeset
   236
    {
hgs
parents:
diff changeset
   237
    iOpenVGHandles->AddPaintDHL(aPaint);
hgs
parents:
diff changeset
   238
    iNVGIconData->EncodeInt32L(EStrokePaint);
hgs
parents:
diff changeset
   239
    AddRadialGradientCommandDataL(aPaint, aCount, aGradientData, aGradientMatrix);
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
void CNVGCSIcon::AddStrokeSetColorCommandL(VGuint aRgba)
hgs
parents:
diff changeset
   243
    {
hgs
parents:
diff changeset
   244
    iNVGIconData->EncodeInt32L(EStrokePaint);
hgs
parents:
diff changeset
   245
    AddSetColorCommandDataL(aRgba);
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
void CNVGCSIcon::AddStrokeColorRampCommandL(VGPaint aPaint)
hgs
parents:
diff changeset
   249
    {
hgs
parents:
diff changeset
   250
    iNVGIconData->EncodeInt32L(EStrokeColorRamp);
hgs
parents:
diff changeset
   251
    iNVGIconData->EncodeInt32L(aPaint);
hgs
parents:
diff changeset
   252
    }
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
void CNVGCSIcon::AddLinearGradientCommandDataL(VGPaint aPaint, VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix)
hgs
parents:
diff changeset
   255
    {
hgs
parents:
diff changeset
   256
    iNVGIconData->EncodeInt32L(VG_PAINT_TYPE_LINEAR_GRADIENT);
hgs
parents:
diff changeset
   257
    iNVGIconData->EncodeInt32L(aPaint);
hgs
parents:
diff changeset
   258
    iNVGIconData->EncodeInt32L(aCount);
hgs
parents:
diff changeset
   259
    iNVGIconData->EncodeDataL(aGradientData, aCount * sizeof(VGfloat));
hgs
parents:
diff changeset
   260
    iNVGIconData->EncodeDataL(aGradientMatrix, 9 * sizeof(VGfloat));    
hgs
parents:
diff changeset
   261
    }
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
void CNVGCSIcon::AddRadialGradientCommandDataL(VGPaint aPaint, VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix)
hgs
parents:
diff changeset
   264
    {
hgs
parents:
diff changeset
   265
    iNVGIconData->EncodeInt32L(VG_PAINT_TYPE_RADIAL_GRADIENT);
hgs
parents:
diff changeset
   266
    iNVGIconData->EncodeInt32L(aPaint);
hgs
parents:
diff changeset
   267
    iNVGIconData->EncodeInt32L(aCount);
hgs
parents:
diff changeset
   268
    iNVGIconData->EncodeDataL(aGradientData, aCount * sizeof(VGfloat));
hgs
parents:
diff changeset
   269
    iNVGIconData->EncodeDataL(aGradientMatrix, 9 * sizeof(VGfloat));
hgs
parents:
diff changeset
   270
    }
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
void CNVGCSIcon::AddSetColorCommandDataL(VGuint aRgba)
hgs
parents:
diff changeset
   273
    {
hgs
parents:
diff changeset
   274
    iNVGIconData->EncodeInt32L(VG_PAINT_TYPE_COLOR);
hgs
parents:
diff changeset
   275
    iNVGIconData->EncodeInt32L(aRgba);
hgs
parents:
diff changeset
   276
    }
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
TInt CNVGCSIcon::Draw(const TSize aSize, CNvgEngine * aNVGEngine)
hgs
parents:
diff changeset
   279
    {
hgs
parents:
diff changeset
   280
    NVG_DEBUGP2("DRAWING NVGCSIcon %s, ", __FUNCTION__);
hgs
parents:
diff changeset
   281
hgs
parents:
diff changeset
   282
    TInt error = KErrNone;
hgs
parents:
diff changeset
   283
    
hgs
parents:
diff changeset
   284
    iNVGEngine = aNVGEngine;
hgs
parents:
diff changeset
   285
    
hgs
parents:
diff changeset
   286
    // Get Matrix modes and all caller matrices (must be restored afterwards)
hgs
parents:
diff changeset
   287
    UpdateClientMatrices();
hgs
parents:
diff changeset
   288
    
hgs
parents:
diff changeset
   289
    TRAP(error, DoDrawL(aSize));
hgs
parents:
diff changeset
   290
    
hgs
parents:
diff changeset
   291
    // restore everything as we may have changed matrix mode            
hgs
parents:
diff changeset
   292
    RestoreClientMatrices();
hgs
parents:
diff changeset
   293
    
hgs
parents:
diff changeset
   294
    return error;
hgs
parents:
diff changeset
   295
    }
hgs
parents:
diff changeset
   296
hgs
parents:
diff changeset
   297
TInt CNVGCSIcon::DoDrawL(const TSize aSize)
hgs
parents:
diff changeset
   298
    {
hgs
parents:
diff changeset
   299
    TInt ret = KErrNone;
hgs
parents:
diff changeset
   300
    
hgs
parents:
diff changeset
   301
    vgSetPaint(iFillPaint,   VG_FILL_PATH);
hgs
parents:
diff changeset
   302
    vgSetPaint(iStrokePaint, VG_STROKE_PATH);
hgs
parents:
diff changeset
   303
    iLastFillPaintColor     = 0;
hgs
parents:
diff changeset
   304
    iLastStrkePaintColor    = 0;
hgs
parents:
diff changeset
   305
    iLastFillPaintType      = 0;
hgs
parents:
diff changeset
   306
    iLastStrokePaintType    = 0;
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    VGfloat lCurrentPathMatrix[9];
hgs
parents:
diff changeset
   309
    vgGetMatrix(lCurrentPathMatrix);
hgs
parents:
diff changeset
   310
    
hgs
parents:
diff changeset
   311
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);  
hgs
parents:
diff changeset
   312
    vgLoadMatrix(lCurrentPathMatrix);
hgs
parents:
diff changeset
   313
    SetRotation();
hgs
parents:
diff changeset
   314
#ifdef __MIRROR_    
hgs
parents:
diff changeset
   315
    vgScale(1.0f, -1.0f);
hgs
parents:
diff changeset
   316
    vgTranslate(0, (VGfloat)(-aSize.iHeight) );
hgs
parents:
diff changeset
   317
#endif
hgs
parents:
diff changeset
   318
    
hgs
parents:
diff changeset
   319
    SetViewBoxToViewTransformationL(aSize);
hgs
parents:
diff changeset
   320
   
hgs
parents:
diff changeset
   321
    
hgs
parents:
diff changeset
   322
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
hgs
parents:
diff changeset
   323
    
hgs
parents:
diff changeset
   324
    VGfloat currentMatrix[9];
hgs
parents:
diff changeset
   325
    
hgs
parents:
diff changeset
   326
    vgGetMatrix(currentMatrix);
hgs
parents:
diff changeset
   327
    
hgs
parents:
diff changeset
   328
    iNVGIconData->BeginRead();
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    while (!iNVGIconData->EOF())
hgs
parents:
diff changeset
   331
        {
hgs
parents:
diff changeset
   332
        switch (iNVGIconData->ReadInt32L())
hgs
parents:
diff changeset
   333
            {
hgs
parents:
diff changeset
   334
            case EPath:
hgs
parents:
diff changeset
   335
                {
hgs
parents:
diff changeset
   336
                VGPath path = (VGPath)iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   337
                VGPaintMode paintMode = (VGPaintMode)iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
                if (path == VG_INVALID_HANDLE)
hgs
parents:
diff changeset
   340
                    {
hgs
parents:
diff changeset
   341
                    vgDrawPath(iPath, paintMode);
hgs
parents:
diff changeset
   342
                    }
hgs
parents:
diff changeset
   343
                else
hgs
parents:
diff changeset
   344
                    {
hgs
parents:
diff changeset
   345
                    vgDrawPath(path, paintMode);
hgs
parents:
diff changeset
   346
                    }
hgs
parents:
diff changeset
   347
                
hgs
parents:
diff changeset
   348
                break;
hgs
parents:
diff changeset
   349
                }
hgs
parents:
diff changeset
   350
            case EPathData:
hgs
parents:
diff changeset
   351
                {                
hgs
parents:
diff changeset
   352
                if (iPath != VG_INVALID_HANDLE)
hgs
parents:
diff changeset
   353
                    {
hgs
parents:
diff changeset
   354
                    VGint numSegments;
hgs
parents:
diff changeset
   355
                    VGubyte * pathSegments = 0;
hgs
parents:
diff changeset
   356
                    VGubyte * pathData = 0;
hgs
parents:
diff changeset
   357
                    
hgs
parents:
diff changeset
   358
                    numSegments  = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   359
                    pathSegments = new (ELeave) VGubyte[numSegments];
hgs
parents:
diff changeset
   360
                    CleanupStack::PushL(TCleanupItem(CleanupArray, pathSegments));
hgs
parents:
diff changeset
   361
                    if (pathSegments)
hgs
parents:
diff changeset
   362
                        {
hgs
parents:
diff changeset
   363
                        iNVGIconData->ReadL(pathSegments, numSegments);
hgs
parents:
diff changeset
   364
                        VGint coordinateCount = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   365
                        pathData = new (ELeave) VGubyte[coordinateCount * 4];
hgs
parents:
diff changeset
   366
                        if (pathData)
hgs
parents:
diff changeset
   367
                            {
hgs
parents:
diff changeset
   368
                            CleanupStack::PushL(TCleanupItem(CleanupArray, pathData));
hgs
parents:
diff changeset
   369
                            iNVGIconData->ReadL(pathData, coordinateCount * 4);
hgs
parents:
diff changeset
   370
                            vgClearPath(iPath, VG_PATH_CAPABILITY_APPEND_TO);
hgs
parents:
diff changeset
   371
                            vgAppendPathData(iPath, numSegments, pathSegments, pathData);
hgs
parents:
diff changeset
   372
                            CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   373
                            }                        
hgs
parents:
diff changeset
   374
                        }
hgs
parents:
diff changeset
   375
                    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   376
                    }
hgs
parents:
diff changeset
   377
                break;
hgs
parents:
diff changeset
   378
                }
hgs
parents:
diff changeset
   379
            case EPaint:
hgs
parents:
diff changeset
   380
                {
hgs
parents:
diff changeset
   381
                DrawPaintL(iFillPaint, VG_MATRIX_FILL_PAINT_TO_USER, iLastFillPaintType, iLastFillPaintColor, VG_FILL_PATH);
hgs
parents:
diff changeset
   382
                break;
hgs
parents:
diff changeset
   383
                }
hgs
parents:
diff changeset
   384
            case EColorRamp:
hgs
parents:
diff changeset
   385
                {
hgs
parents:
diff changeset
   386
                iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   387
                break;
hgs
parents:
diff changeset
   388
                }
hgs
parents:
diff changeset
   389
            case ETransform:
hgs
parents:
diff changeset
   390
                {
hgs
parents:
diff changeset
   391
                TInt flag;
hgs
parents:
diff changeset
   392
                VGfloat transformMatrix[9];
hgs
parents:
diff changeset
   393
                
hgs
parents:
diff changeset
   394
                TPtr8 tmPtr((TUint8 *)transformMatrix, 9 * sizeof(VGfloat));
hgs
parents:
diff changeset
   395
                
hgs
parents:
diff changeset
   396
                iNVGIconData->ReadL(tmPtr, 9 * sizeof(VGfloat));
hgs
parents:
diff changeset
   397
                flag = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   398
                
hgs
parents:
diff changeset
   399
                vgLoadMatrix(currentMatrix);
hgs
parents:
diff changeset
   400
                if (flag)
hgs
parents:
diff changeset
   401
                    {
hgs
parents:
diff changeset
   402
                    vgMultMatrix(transformMatrix);
hgs
parents:
diff changeset
   403
                    }
hgs
parents:
diff changeset
   404
                }
hgs
parents:
diff changeset
   405
                break;
hgs
parents:
diff changeset
   406
            case EStrokeWidth:
hgs
parents:
diff changeset
   407
                {
hgs
parents:
diff changeset
   408
                VGfloat strokeWidth = iNVGIconData->ReadReal32L();
hgs
parents:
diff changeset
   409
                vgSetf(VG_STROKE_LINE_WIDTH, strokeWidth);
hgs
parents:
diff changeset
   410
                break;
hgs
parents:
diff changeset
   411
                }
hgs
parents:
diff changeset
   412
            case EStrokeMiterLimit:
hgs
parents:
diff changeset
   413
                {
hgs
parents:
diff changeset
   414
                VGfloat miterLimit = iNVGIconData->ReadReal32L();
hgs
parents:
diff changeset
   415
                vgSetf(VG_STROKE_MITER_LIMIT, miterLimit);
hgs
parents:
diff changeset
   416
                break;
hgs
parents:
diff changeset
   417
                }
hgs
parents:
diff changeset
   418
            case EStrokeLineJoinCap:
hgs
parents:
diff changeset
   419
                {
hgs
parents:
diff changeset
   420
                VGint lineJoin = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   421
                VGint cap = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   422
                
hgs
parents:
diff changeset
   423
                vgSeti(VG_STROKE_JOIN_STYLE, (VGJoinStyle)lineJoin);
hgs
parents:
diff changeset
   424
                vgSeti(VG_STROKE_CAP_STYLE, (VGCapStyle)cap);
hgs
parents:
diff changeset
   425
                break;
hgs
parents:
diff changeset
   426
                }
hgs
parents:
diff changeset
   427
            case EStrokePaint:
hgs
parents:
diff changeset
   428
                {
hgs
parents:
diff changeset
   429
                DrawPaintL(iStrokePaint, VG_MATRIX_STROKE_PAINT_TO_USER, iLastStrokePaintType, iLastStrkePaintColor, VG_STROKE_PATH);
hgs
parents:
diff changeset
   430
                break;
hgs
parents:
diff changeset
   431
                }
hgs
parents:
diff changeset
   432
            case EStrokeColorRamp:
hgs
parents:
diff changeset
   433
                {
hgs
parents:
diff changeset
   434
                iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   435
                break;
hgs
parents:
diff changeset
   436
                }
hgs
parents:
diff changeset
   437
            default:
hgs
parents:
diff changeset
   438
                {
hgs
parents:
diff changeset
   439
                User::Leave(KErrCorrupt);
hgs
parents:
diff changeset
   440
                break;
hgs
parents:
diff changeset
   441
                }
hgs
parents:
diff changeset
   442
            }
hgs
parents:
diff changeset
   443
        }
hgs
parents:
diff changeset
   444
    
hgs
parents:
diff changeset
   445
    iNVGIconData->EndRead();
hgs
parents:
diff changeset
   446
    
hgs
parents:
diff changeset
   447
    return ret;
hgs
parents:
diff changeset
   448
    }
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
void CNVGCSIcon::DrawColorRampL(VGPaint aPaint)
hgs
parents:
diff changeset
   451
    {
hgs
parents:
diff changeset
   452
    TInt stopCount = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   453
    VGfloat * colorRamps = new (ELeave) VGfloat[stopCount];
hgs
parents:
diff changeset
   454
    CleanupStack::PushL(TCleanupItem(CleanupArray, colorRamps));
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
    iNVGIconData->ReadL((TUint8 *)colorRamps, stopCount * sizeof(VGfloat));
hgs
parents:
diff changeset
   457
    vgSetParameteri(aPaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_PAD);
hgs
parents:
diff changeset
   458
    vgSetParameterfv(aPaint, VG_PAINT_COLOR_RAMP_STOPS, stopCount, colorRamps);                    
hgs
parents:
diff changeset
   459
    
hgs
parents:
diff changeset
   460
    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   461
    }
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
void CNVGCSIcon::DrawPaintL(VGPaint aPaint, VGMatrixMode aMatrixMode, TUint & aLastPaintType, TUint & aLastPaintColor, VGPaintMode aPaintMode)
hgs
parents:
diff changeset
   464
    {
hgs
parents:
diff changeset
   465
    VGPaintType paintType = (VGPaintType)iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   466
    
hgs
parents:
diff changeset
   467
    if (paintType == VG_PAINT_TYPE_LINEAR_GRADIENT ||
hgs
parents:
diff changeset
   468
        paintType == VG_PAINT_TYPE_RADIAL_GRADIENT)
hgs
parents:
diff changeset
   469
        {
hgs
parents:
diff changeset
   470
        VGPaintParamType paintPType = VG_PAINT_LINEAR_GRADIENT;
hgs
parents:
diff changeset
   471
        if (paintType == VG_PAINT_TYPE_RADIAL_GRADIENT)
hgs
parents:
diff changeset
   472
            {
hgs
parents:
diff changeset
   473
            paintPType = VG_PAINT_RADIAL_GRADIENT;
hgs
parents:
diff changeset
   474
            }
hgs
parents:
diff changeset
   475
        
hgs
parents:
diff changeset
   476
        VGPaint paintHandle = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   477
        TInt count = iNVGIconData->ReadInt32L();
hgs
parents:
diff changeset
   478
        VGfloat gradientData[5];
hgs
parents:
diff changeset
   479
        VGfloat gradientMatrix[9];
hgs
parents:
diff changeset
   480
        
hgs
parents:
diff changeset
   481
        iNVGIconData->ReadL((TUint8 *)gradientData, count * sizeof(VGfloat));
hgs
parents:
diff changeset
   482
        iNVGIconData->ReadL((TUint8 *)gradientMatrix, 9 * sizeof(VGfloat));
hgs
parents:
diff changeset
   483
        
hgs
parents:
diff changeset
   484
        if (paintHandle)
hgs
parents:
diff changeset
   485
            {
hgs
parents:
diff changeset
   486
            vgSetPaint(paintHandle,   aPaintMode);
hgs
parents:
diff changeset
   487
            vgSeti(VG_MATRIX_MODE, aMatrixMode);
hgs
parents:
diff changeset
   488
            vgLoadMatrix(gradientMatrix);
hgs
parents:
diff changeset
   489
            if (aPaintMode == VG_FILL_PATH)
hgs
parents:
diff changeset
   490
                {
hgs
parents:
diff changeset
   491
                iResetFillPaint = 1;
hgs
parents:
diff changeset
   492
                }
hgs
parents:
diff changeset
   493
            else
hgs
parents:
diff changeset
   494
                {
hgs
parents:
diff changeset
   495
                iResetStrokePaint = 1;
hgs
parents:
diff changeset
   496
                }
hgs
parents:
diff changeset
   497
            }
hgs
parents:
diff changeset
   498
        else
hgs
parents:
diff changeset
   499
            {
hgs
parents:
diff changeset
   500
        if (aLastPaintType != paintType)
hgs
parents:
diff changeset
   501
            {
hgs
parents:
diff changeset
   502
            vgSetParameteri(aPaint, VG_PAINT_TYPE, paintType);
hgs
parents:
diff changeset
   503
            }
hgs
parents:
diff changeset
   504
        vgSetParameterfv(aPaint, paintPType, count, gradientData);
hgs
parents:
diff changeset
   505
        
hgs
parents:
diff changeset
   506
        vgSeti(VG_MATRIX_MODE, aMatrixMode);
hgs
parents:
diff changeset
   507
        vgLoadMatrix(gradientMatrix);
hgs
parents:
diff changeset
   508
            }
hgs
parents:
diff changeset
   509
        vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
hgs
parents:
diff changeset
   510
        }
hgs
parents:
diff changeset
   511
    else if (paintType == VG_PAINT_TYPE_COLOR)
hgs
parents:
diff changeset
   512
        {
hgs
parents:
diff changeset
   513
        if (aPaintMode == VG_FILL_PATH && iResetFillPaint)
hgs
parents:
diff changeset
   514
            {
hgs
parents:
diff changeset
   515
            iResetFillPaint = 0;
hgs
parents:
diff changeset
   516
            vgSetPaint(aPaint, aPaintMode);
hgs
parents:
diff changeset
   517
            }
hgs
parents:
diff changeset
   518
        else if (aPaintMode == VG_STROKE_PATH && iResetStrokePaint)
hgs
parents:
diff changeset
   519
            {
hgs
parents:
diff changeset
   520
            iResetStrokePaint = 0;
hgs
parents:
diff changeset
   521
            vgSetPaint(aPaint, aPaintMode);
hgs
parents:
diff changeset
   522
            }
hgs
parents:
diff changeset
   523
        TUint color = static_cast<TUint>(iNVGIconData->ReadInt32L());
hgs
parents:
diff changeset
   524
        if (aLastPaintType != paintType)
hgs
parents:
diff changeset
   525
            {
hgs
parents:
diff changeset
   526
            vgSetParameteri(aPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
hgs
parents:
diff changeset
   527
            vgSetColor(aPaint, color);
hgs
parents:
diff changeset
   528
            }
hgs
parents:
diff changeset
   529
        else
hgs
parents:
diff changeset
   530
            {
hgs
parents:
diff changeset
   531
            if (aLastPaintColor != color)
hgs
parents:
diff changeset
   532
                {
hgs
parents:
diff changeset
   533
                vgSetColor(aPaint, color);
hgs
parents:
diff changeset
   534
                }
hgs
parents:
diff changeset
   535
            }
hgs
parents:
diff changeset
   536
        aLastPaintColor = color;
hgs
parents:
diff changeset
   537
        }
hgs
parents:
diff changeset
   538
    else
hgs
parents:
diff changeset
   539
        {
hgs
parents:
diff changeset
   540
        User::Leave(KErrCorrupt);
hgs
parents:
diff changeset
   541
        }
hgs
parents:
diff changeset
   542
    aLastPaintType = paintType;
hgs
parents:
diff changeset
   543
    }
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
void CNVGCSIcon::SetViewBoxToViewTransformationL(const TSize aSize)
hgs
parents:
diff changeset
   546
    {
hgs
parents:
diff changeset
   547
    CNvgFitToViewBoxImpl * fitToViewBoxImpl = CNvgFitToViewBoxImpl::NewLC();
hgs
parents:
diff changeset
   548
hgs
parents:
diff changeset
   549
    fitToViewBoxImpl->SetAlign((TNvgAlignStatusType)iPreserveAspectSetting);
hgs
parents:
diff changeset
   550
    fitToViewBoxImpl->SetScaling((TNvgMeetOrSliceType)iSmilFitSetting);
hgs
parents:
diff changeset
   551
    
hgs
parents:
diff changeset
   552
    fitToViewBoxImpl->SetViewBox(iViewBoxX, iViewBoxY, iViewBoxW, iViewBoxH);
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
    fitToViewBoxImpl->SetWindowViewportTrans(TRect(0, 0, aSize.iWidth, aSize.iHeight), TSize(0, 0));
hgs
parents:
diff changeset
   555
    
hgs
parents:
diff changeset
   556
    CleanupStack::PopAndDestroy(fitToViewBoxImpl);
hgs
parents:
diff changeset
   557
    }
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
void CNVGCSIcon::SetRotation()
hgs
parents:
diff changeset
   560
    {
hgs
parents:
diff changeset
   561
    if (iRotationAngle)
hgs
parents:
diff changeset
   562
        {
hgs
parents:
diff changeset
   563
       	vgTranslate(iRotationX, iRotationY);  
hgs
parents:
diff changeset
   564
           
hgs
parents:
diff changeset
   565
        vgRotate(iRotationAngle);
hgs
parents:
diff changeset
   566
           
hgs
parents:
diff changeset
   567
        vgTranslate(-iRotationX, -iRotationY);
hgs
parents:
diff changeset
   568
        }
hgs
parents:
diff changeset
   569
    }
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
void CNVGCSIcon::UpdateClientMatrices()
hgs
parents:
diff changeset
   572
    {
hgs
parents:
diff changeset
   573
    iMatrixMode = vgGeti(VG_MATRIX_MODE);
hgs
parents:
diff changeset
   574
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
hgs
parents:
diff changeset
   575
    vgGetMatrix(iPathMatrix);
hgs
parents:
diff changeset
   576
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
hgs
parents:
diff changeset
   577
    vgGetMatrix(iImageMatrix);
hgs
parents:
diff changeset
   578
    vgSeti(VG_MATRIX_MODE, iMatrixMode);
hgs
parents:
diff changeset
   579
    }
hgs
parents:
diff changeset
   580
hgs
parents:
diff changeset
   581
void CNVGCSIcon::RestoreClientMatrices()
hgs
parents:
diff changeset
   582
    {
hgs
parents:
diff changeset
   583
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
hgs
parents:
diff changeset
   584
    vgLoadMatrix(iPathMatrix);
hgs
parents:
diff changeset
   585
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
hgs
parents:
diff changeset
   586
    vgLoadMatrix(iImageMatrix);
hgs
parents:
diff changeset
   587
    vgSeti(VG_MATRIX_MODE, iMatrixMode);
hgs
parents:
diff changeset
   588
    }