svgtopt/nvgdecoder/inc/NVGCSIcon.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 07 Jan 2010 16:19:02 +0200
changeset 0 d46562c3d99d
permissions -rw-r--r--
Revision: 200951 Kit: 201001

/*
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  NVG Decoder header file
 *
*/


#ifndef NVGCSICON_H_
#define NVGCSICON_H_

#include <e32base.h>
#include <openvg.h>

#include "NVGIcon.h"

class CNVGIconData;
class CNvgEngine;
class COpenVGHandleStore;

class CNVGCSIcon : public CBase, public MNVGIcon
    {
private:
    enum TNVGCSIconCommands
        {
        EPath,
        EPathData,
        EPaint,
        EColorRamp,
        ETransform,
        EStrokeWidth,
        EStrokeMiterLimit,
        EStrokeLineJoinCap,
        EStrokePaint,
        EStrokeColorRamp
        };

    CNVGCSIcon();
    void ConstructL(const TDesC8& aBuf);
    
public:
    static CNVGCSIcon * NewL(const TDesC8& aBuf);
    static CNVGCSIcon * NewLC(const TDesC8& aBuf);
    virtual ~CNVGCSIcon();
    
    virtual TInt Draw(const TSize aSize, CNvgEngine * aNVGEngine);
    
    TInt SetViewBox(TReal32 x, TReal32 y, TReal32 w, TReal32 h) __SOFTFP;

    TInt SetPreserveAspectRatio(TInt aPreserveAspectSetting, 
            TInt aSmilFitSetting);

    TInt Rotate(TReal32 aAngle, TReal32 aX, TReal32 aY) __SOFTFP;
    
    /**
     * Adds new path drawing command. 
     * @param aPath vgPath to be appended
     */
    void AddDrawPathCommandL(VGPath aPath, VGbitfield aPaintMode);
    
    /**
     * Adds path data. This is required if vgCreatePath fails. 
     */        
    void AddPathDataL(VGint numSegments, const VGubyte * pathSegments, const void * pathData);
    
    /**
     * Adds linear gradient drawing command. Stores the gradient data and matrix
     * to be used with VG_MATRIX_FILL_PAINT_TO_USER mode.
     * 
     * @param aCount            Gradient data parameter count
     * @param aGradientData     Linear gradient data to be given to vgSetParameterfv
     * @param aGradientMatrix   Linear gradient matrix used for FILL_PAINT_TO_USER matrix mode
     */
    void AddLinearGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint);

    /**
     * Adds radial gradient drawing command. Stores the gradient data and matrix
     * to be used with VG_MATRIX_FILL_PAINT_TO_USER mode.
     * 
     * @param aCount            Gradient data parameter count
     * @param aGradientData     Linear gradient data to be given to vgSetParameterfv
     * @param aGradientMatrix   Linear gradient matrix used for FILL_PAINT_TO_USER matrix mode
     */
    void AddRadialGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint);
    
    /**
     * Adds a setColor command to be used with paints.
     * 
     * @param aRgba RGBA color in hex format to be set with vgSetColor
     */
    void AddSetColorCommandL(VGuint aRgba);

    /**
     * Adds color ramp to the icon data structure.
     * 
     * @param aStopCount    Count of the color ramps, has to be multiple of 5
     * @param aColorRamps   Color ramp data
     */
    void AddColorRampCommandL(VGPaint aPaint);
    
    /**
     * Adds a transformation command which is multiplied to the current matrix
     * 
     * @param aTransformMatrix  Transformation matrix used for multiplication
     * @param aFlag 1 multiplies  aTransformMatrix with current matrix, 0 loads original matrix
     */
    void AddSetTransformCommandL(const VGfloat* aTransformMatrix, TInt aFlag);
    
    /**
     * Adds set stroke-width command
     * 
     * @param aStrokeWidth stroke width
     */
    void AddSetStrokeWidthCommandL(VGfloat aStrokeWidth);
    
    /**
     * Adds set stroke-miterlimit command
     * 
     * @param aMiterLimit miter length     
     */
    void AddSetStrokeMiterLimitCommandL(VGfloat aMiterLimit);
    
    /**
     * Adds set line join cap command
     * 
     * @param aCapStyle   end cap style
     * @param aJoinStyle  line join style
     */
    void AddStrokeLineJoinCapCommandL(VGint aCapStyle, VGint aJoinStyle);

    /**
     * Adds linear gradient drawing command. Stores the gradient data and matrix
     * 
     * @param aCount            Gradient data parameter count
     * @param aGradientData     Linear gradient data to be given to vgSetParameterfv
     * @param aGradientMatrix   Linear gradient matrix used for STROKE_PAINT_TO_USER matrix mode
     */
    void AddStrokeLinearGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint);

    /**
     * Adds radial gradient drawing command. Stores the gradient data and matrix
     * to be used with VG_MATRIX_STROKE_PAINT_TO_USER mode.
     * 
     * @param aCount            Gradient data parameter count
     * @param aGradientData     Linear gradient data to be given to vgSetParameterfv
     * @param aGradientMatrix   Linear gradient matrix used for VG_MATRIX_STROKE_PAINT_TO_USER matrix mode
     */
    void AddStrokeRadialGradientCommandL(VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix, VGPaint aPaint);
    
    /**
     * Adds a setColor command to be used with stroke.
     * 
     * @param aRgba RGBA color in hex format
     */
    void AddStrokeSetColorCommandL(VGuint aRgba);
    
    /**
     * Adds color ramp to the icon data structure.
     * 
     * @param aStopCount    Count of the color ramps, has to be multiple of 5
     * @param aColorRamps   Color ramp data
     */
    void AddStrokeColorRampCommandL(VGPaint aPaint);
    
private:

    TInt DoDrawL(const TSize aSize);

    void AddLinearGradientCommandDataL(VGPaint aPaint, VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix);
    void AddRadialGradientCommandDataL(VGPaint aPaint, VGint aCount, VGfloat* aGradientData, VGfloat* aGradientMatrix);
    void AddSetColorCommandDataL(VGuint aRgba);

    void DrawPaintL(VGPaint aPaint, VGMatrixMode aMatrixMode, TUint & aLastPaintType, TUint & aLastPaintColor, VGPaintMode aPaintMode);
    void DrawColorRampL(VGPaint aPaint);
    void SetViewBoxToViewTransformationL(const TSize aSize);
    void SetRotation();

    void UpdateClientMatrices();
    void RestoreClientMatrices();
    
private:
    TReal32             iViewBoxX;
    TReal32             iViewBoxY;
    TReal32             iViewBoxW;
    TReal32             iViewBoxH;
    
    TReal32             iRotationAngle;
    TReal32             iRotationX;
    TReal32             iRotationY;
    
    TInt                iPreserveAspectSetting;
    TInt                iSmilFitSetting;

    CNVGIconData *      iNVGIconData;

    VGPath              iPath;          // when create path fails this handle will be used
    VGPaint             iFillPaint;     // currently just one object for fill paint
    VGPaint             iStrokePaint;   // currently just one object for stroke paint

    // caller's parameters
    VGPaint             iUserStrokePaint;
    VGPaint             iUserFillPaint;

    VGint               iMatrixMode;
    TReal32             iImageMatrix[9];
    TReal32             iPathMatrix[9];
    TReal32             iFillPaintMatrix[9];
    TReal32             iStrokePaintMatrix[9];
    CNvgEngine *        iNVGEngine;
    COpenVGHandleStore* iOpenVGHandles;
    
    TUint       iLastFillPaintType;
    TUint       iLastStrokePaintType;
    TUint       iLastFillPaintColor;
    TUint       iLastStrkePaintColor;
    
    TUint       iResetFillPaint;
    VGPaint     iResetStrokePaint;
    };

#endif