svgtopt/SVG/SVGImpl/src/SVGLinearGradientElementImpl.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) 2003 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:  SVG Implementation source file
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "SVGLinearGradientElementImpl.h"
hgs
parents:
diff changeset
    20
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    21
#include "SVGSchemaData.h"
hgs
parents:
diff changeset
    22
#include "SvgStopElementImpl.h"
hgs
parents:
diff changeset
    23
#include "SVGIntCssValueImpl.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include "GfxAffineTransform.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
_LIT(X1,"x1");
hgs
parents:
diff changeset
    28
_LIT(X2,"x2");
hgs
parents:
diff changeset
    29
_LIT(Y1,"y1");
hgs
parents:
diff changeset
    30
_LIT(Y2,"y2");
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
//
hgs
parents:
diff changeset
    33
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    34
CSvgLinearGradientElementImpl* CSvgLinearGradientElementImpl::NewL(const TUint8 aElemID, CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    35
	{
hgs
parents:
diff changeset
    36
    CSvgLinearGradientElementImpl *self = new (ELeave) CSvgLinearGradientElementImpl(aDoc);
hgs
parents:
diff changeset
    37
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    38
    self->ConstructL(aElemID);
hgs
parents:
diff changeset
    39
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    40
    return self;
hgs
parents:
diff changeset
    41
	}
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    44
//
hgs
parents:
diff changeset
    45
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
void CSvgLinearGradientElementImpl::ConstructL(const TUint8 aElemID)
hgs
parents:
diff changeset
    47
	{
hgs
parents:
diff changeset
    48
    CSvgGradientElementImpl::ConstructL(aElemID);
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
	}
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    55
CSvgLinearGradientElementImpl::CSvgLinearGradientElementImpl( CSvgDocumentImpl* aDoc ):
hgs
parents:
diff changeset
    56
	CSvgGradientElementImpl(aDoc)
hgs
parents:
diff changeset
    57
	{
hgs
parents:
diff changeset
    58
	iGradientPaint = &iGfxLinearPaint;
hgs
parents:
diff changeset
    59
	}
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
//Dt:17-Feb-2009 modified the function to support  the % values for X1,Y1,X2,Y2
hgs
parents:
diff changeset
    63
//TSW ISSUE ID: ANAE-7NZ8B8
hgs
parents:
diff changeset
    64
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
TInt CSvgLinearGradientElementImpl::SetAttributeL(const TDesC &aName, const TDesC &aValue)
hgs
parents:
diff changeset
    66
	{
hgs
parents:
diff changeset
    67
	TFloatFixPt KZero( KFloatFixZero );
hgs
parents:
diff changeset
    68
	TFloatFixPt KOne( KFloatFixOne );
hgs
parents:
diff changeset
    69
	TFloatFixPt val;
hgs
parents:
diff changeset
    70
	if ( aName == X1 || aName == X2 || aName == Y1 || aName == Y2 )
hgs
parents:
diff changeset
    71
		{
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
		if ( IsValidValue(aValue) )
hgs
parents:
diff changeset
    74
			{
hgs
parents:
diff changeset
    75
			val = TFloatFixPt::ConvertString(aValue); 
hgs
parents:
diff changeset
    76
			if ( aValue.Locate('%') != KErrNotFound )
hgs
parents:
diff changeset
    77
				{
hgs
parents:
diff changeset
    78
				val = val / TFloatFixPt(100);
hgs
parents:
diff changeset
    79
				}
hgs
parents:
diff changeset
    80
			}
hgs
parents:
diff changeset
    81
		else
hgs
parents:
diff changeset
    82
			{
hgs
parents:
diff changeset
    83
			if( aName == X2 )
hgs
parents:
diff changeset
    84
				{
hgs
parents:
diff changeset
    85
				val = KOne;
hgs
parents:
diff changeset
    86
				}
hgs
parents:
diff changeset
    87
			else 
hgs
parents:
diff changeset
    88
				{
hgs
parents:
diff changeset
    89
				val = KZero;
hgs
parents:
diff changeset
    90
				}
hgs
parents:
diff changeset
    91
			}
hgs
parents:
diff changeset
    92
		if( aName==X1 )
hgs
parents:
diff changeset
    93
			{
hgs
parents:
diff changeset
    94
			iGfxLinearPaint.iX1 = val;
hgs
parents:
diff changeset
    95
			}
hgs
parents:
diff changeset
    96
		else if( aName==Y1 )   
hgs
parents:
diff changeset
    97
			{
hgs
parents:
diff changeset
    98
			iGfxLinearPaint.iY1 = val;
hgs
parents:
diff changeset
    99
			}
hgs
parents:
diff changeset
   100
		else if( aName==X2 )
hgs
parents:
diff changeset
   101
			{
hgs
parents:
diff changeset
   102
			iGfxLinearPaint.iX2 = val;
hgs
parents:
diff changeset
   103
			}
hgs
parents:
diff changeset
   104
		else
hgs
parents:
diff changeset
   105
			{
hgs
parents:
diff changeset
   106
			iGfxLinearPaint.iY2 = val;
hgs
parents:
diff changeset
   107
			}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
		}
hgs
parents:
diff changeset
   110
	else 
hgs
parents:
diff changeset
   111
		{
hgs
parents:
diff changeset
   112
		CSvgGradientElementImpl::SetAttributeL( aName, aValue );
hgs
parents:
diff changeset
   113
		}
hgs
parents:
diff changeset
   114
    return 0;
hgs
parents:
diff changeset
   115
	}
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
//
hgs
parents:
diff changeset
   119
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
MGfxPaint *CSvgLinearGradientElementImpl::PaintAttribute()
hgs
parents:
diff changeset
   121
	{
hgs
parents:
diff changeset
   122
	TInt i=0;
hgs
parents:
diff changeset
   123
	TFloatFixPt lOffset;
hgs
parents:
diff changeset
   124
	TUint32 lStopColor;
hgs
parents:
diff changeset
   125
	TFloatFixPt	lStopOpacity;
hgs
parents:
diff changeset
   126
	if( iStopElementData )
hgs
parents:
diff changeset
   127
		{
hgs
parents:
diff changeset
   128
		iStopElementData->Reset();
hgs
parents:
diff changeset
   129
		}
hgs
parents:
diff changeset
   130
	
hgs
parents:
diff changeset
   131
	TInt svgStopEleArrayCnt = iSvgStopElementArray->Count();
hgs
parents:
diff changeset
   132
    for(i=0;i<svgStopEleArrayCnt ;i++)
hgs
parents:
diff changeset
   133
		{
hgs
parents:
diff changeset
   134
		CSvgStopElementImpl* temp = (*iSvgStopElementArray)[i];
hgs
parents:
diff changeset
   135
		
hgs
parents:
diff changeset
   136
		// Check if the element has valid offset value. If the offset had invalid value
hgs
parents:
diff changeset
   137
		// it will be made zero but this function will return FALSE.
hgs
parents:
diff changeset
   138
		if( temp->IsValidElement() )
hgs
parents:
diff changeset
   139
		{
hgs
parents:
diff changeset
   140
		    temp->GetOffset(lOffset);
hgs
parents:
diff changeset
   141
            temp->GetStopColor(lStopColor);
hgs
parents:
diff changeset
   142
	    	temp->GetStopOpacity (lStopOpacity);
hgs
parents:
diff changeset
   143
	    	TSvgStopData la ;
hgs
parents:
diff changeset
   144
	    	la.iOffset = lOffset;
hgs
parents:
diff changeset
   145
	    	la.iStopColor = lStopColor;
hgs
parents:
diff changeset
   146
	    	la.iStopOpacity = lStopOpacity;
hgs
parents:
diff changeset
   147
	    	TInt error = iStopElementData->Append(la);
hgs
parents:
diff changeset
   148
	    	if(error != KErrNone)
hgs
parents:
diff changeset
   149
		 	{
hgs
parents:
diff changeset
   150
			// not enough memory
hgs
parents:
diff changeset
   151
			break;
hgs
parents:
diff changeset
   152
			}	
hgs
parents:
diff changeset
   153
		}
hgs
parents:
diff changeset
   154
        
hgs
parents:
diff changeset
   155
		}
hgs
parents:
diff changeset
   156
	iGfxLinearPaint.iStopData = iStopElementData;
hgs
parents:
diff changeset
   157
    const TGfxAffineTransform& tempTransform = GetCTM();
hgs
parents:
diff changeset
   158
	iGradientPaint->iGradientTransform.matrix[0][0] = tempTransform.iM00.iValue;
hgs
parents:
diff changeset
   159
    iGradientPaint->iGradientTransform.matrix[0][1] = tempTransform.iM01.iValue;
hgs
parents:
diff changeset
   160
    iGradientPaint->iGradientTransform.matrix[0][2] = tempTransform.iM02.iValue;
hgs
parents:
diff changeset
   161
	iGradientPaint->iGradientTransform.matrix[1][0] = tempTransform.iM10.iValue;
hgs
parents:
diff changeset
   162
	iGradientPaint->iGradientTransform.matrix[1][1] = tempTransform.iM11.iValue;
hgs
parents:
diff changeset
   163
	iGradientPaint->iGradientTransform.matrix[1][2] = tempTransform.iM12.iValue;
hgs
parents:
diff changeset
   164
    return &iGfxLinearPaint;
hgs
parents:
diff changeset
   165
	}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   168
//
hgs
parents:
diff changeset
   169
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
TInt CSvgLinearGradientElementImpl::GetAttributeFloat( const TInt aNameId, TFloatFixPt& aValue )
hgs
parents:
diff changeset
   171
	{
hgs
parents:
diff changeset
   172
	 switch ( aNameId )
hgs
parents:
diff changeset
   173
        {
hgs
parents:
diff changeset
   174
        case KAtrX1:
hgs
parents:
diff changeset
   175
			 aValue = iGfxLinearPaint.iX1 ;
hgs
parents:
diff changeset
   176
			 break;
hgs
parents:
diff changeset
   177
        case KAtrY1:
hgs
parents:
diff changeset
   178
			 aValue = iGfxLinearPaint.iY1 ;
hgs
parents:
diff changeset
   179
			break;
hgs
parents:
diff changeset
   180
        case KAtrX2 :
hgs
parents:
diff changeset
   181
			 aValue = iGfxLinearPaint.iX2 ;
hgs
parents:
diff changeset
   182
			break;
hgs
parents:
diff changeset
   183
        case KAtrY2 :
hgs
parents:
diff changeset
   184
			 aValue = iGfxLinearPaint.iY2 ;
hgs
parents:
diff changeset
   185
			break;
hgs
parents:
diff changeset
   186
        default:
hgs
parents:
diff changeset
   187
			return CSvgElementImpl::GetAttributeFloat( aNameId, aValue );
hgs
parents:
diff changeset
   188
        }
hgs
parents:
diff changeset
   189
	return 0;
hgs
parents:
diff changeset
   190
	}
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   193
//
hgs
parents:
diff changeset
   194
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
TInt CSvgLinearGradientElementImpl::SetAttributeFloatL( const TInt aNameId, const TFloatFixPt aValue )
hgs
parents:
diff changeset
   196
	{
hgs
parents:
diff changeset
   197
    switch ( aNameId )
hgs
parents:
diff changeset
   198
        {
hgs
parents:
diff changeset
   199
        case KAtrX1:
hgs
parents:
diff changeset
   200
			iGfxLinearPaint.iX1 = aValue;
hgs
parents:
diff changeset
   201
			break;
hgs
parents:
diff changeset
   202
        case KAtrY1:
hgs
parents:
diff changeset
   203
			iGfxLinearPaint.iY1 = aValue;
hgs
parents:
diff changeset
   204
			break;
hgs
parents:
diff changeset
   205
        case KAtrX2 :
hgs
parents:
diff changeset
   206
			iGfxLinearPaint.iX2 = aValue;
hgs
parents:
diff changeset
   207
			break;
hgs
parents:
diff changeset
   208
        case KAtrY2 :
hgs
parents:
diff changeset
   209
			iGfxLinearPaint.iY2 = aValue;
hgs
parents:
diff changeset
   210
			break;
hgs
parents:
diff changeset
   211
        default:
hgs
parents:
diff changeset
   212
			return CSvgElementImpl::SetAttributeFloatL( aNameId, aValue );
hgs
parents:
diff changeset
   213
        }
hgs
parents:
diff changeset
   214
	return 0;
hgs
parents:
diff changeset
   215
	}
hgs
parents:
diff changeset
   216
TInt CSvgLinearGradientElementImpl::SetAttributeIntL( const TInt aNameId,
hgs
parents:
diff changeset
   217
                                        const TInt32 aValue )
hgs
parents:
diff changeset
   218
{
hgs
parents:
diff changeset
   219
	CSvgGradientElementImpl::SetAttributeIntL(  aNameId,
hgs
parents:
diff changeset
   220
												 aValue );
hgs
parents:
diff changeset
   221
	return 0;
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
}
hgs
parents:
diff changeset
   224
TInt CSvgLinearGradientElementImpl::GetAttributeIntL( const TInt aNameId, TInt32& aValue )
hgs
parents:
diff changeset
   225
{
hgs
parents:
diff changeset
   226
	CSvgGradientElementImpl::GetAttributeIntL(aNameId,  aValue );
hgs
parents:
diff changeset
   227
	return 0;
hgs
parents:
diff changeset
   228
}
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   232
//
hgs
parents:
diff changeset
   233
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   234
CSvgLinearGradientElementImpl::~CSvgLinearGradientElementImpl()
hgs
parents:
diff changeset
   235
	{
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
	}
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
void CSvgLinearGradientElementImpl::Print( TBool aIsEncodeOn )
hgs
parents:
diff changeset
   240
{
hgs
parents:
diff changeset
   241
	if (!aIsEncodeOn)
hgs
parents:
diff changeset
   242
	{
hgs
parents:
diff changeset
   243
		#ifdef _DEBUG
hgs
parents:
diff changeset
   244
		RDebug::Printf("<linearGradient xlink:href=\"hmm\" spreadMethod=\"hmm\" gradientUnits=\"hmm\" gradientTransform=\"hmm\" x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\"/>",
hgs
parents:
diff changeset
   245
		/*Href(),*/ (int)iGfxLinearPaint.iX1, (int)iGfxLinearPaint.iY1, (int)iGfxLinearPaint.iX2, (int)iGfxLinearPaint.iY2);
hgs
parents:
diff changeset
   246
		#endif
hgs
parents:
diff changeset
   247
	}
hgs
parents:
diff changeset
   248
}
hgs
parents:
diff changeset
   249
TBool CSvgLinearGradientElementImpl::IsValidValue(const TDesC& aValue)
hgs
parents:
diff changeset
   250
{
hgs
parents:
diff changeset
   251
    TBool lValidValue = ETrue;
hgs
parents:
diff changeset
   252
    // aValue can only contain these characters "-+.%0123456789", If it contains any thing
hgs
parents:
diff changeset
   253
    // other than this it should be treated as 0.
hgs
parents:
diff changeset
   254
    
hgs
parents:
diff changeset
   255
    _LIT(KValidChars,"-+.%0123456789");
hgs
parents:
diff changeset
   256
    TBufC<14> lValidChars(KValidChars);
hgs
parents:
diff changeset
   257
        
hgs
parents:
diff changeset
   258
    TInt llength = aValue.Length();
hgs
parents:
diff changeset
   259
        
hgs
parents:
diff changeset
   260
    for( int charpos = 0 ; charpos < llength; charpos++ )
hgs
parents:
diff changeset
   261
    {
hgs
parents:
diff changeset
   262
        if( lValidChars.Locate(aValue[charpos]) == KErrNotFound )
hgs
parents:
diff changeset
   263
        {
hgs
parents:
diff changeset
   264
            
hgs
parents:
diff changeset
   265
            lValidValue = EFalse;
hgs
parents:
diff changeset
   266
            break;
hgs
parents:
diff changeset
   267
        }
hgs
parents:
diff changeset
   268
    }
hgs
parents:
diff changeset
   269
    
hgs
parents:
diff changeset
   270
    return lValidValue;
hgs
parents:
diff changeset
   271
}