svgtopt/SVG/SVGImpl/src/SVGStopElementImpl.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 "SvgStopElementImpl.h"
hgs
parents:
diff changeset
    20
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    21
#include "SVGGradientElementImpl.h"
hgs
parents:
diff changeset
    22
#include "SVGIntCssValueImpl.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
_LIT(OFFSET, "offset");
hgs
parents:
diff changeset
    25
_LIT(STOPOPACITY, "stop-opacity");
hgs
parents:
diff changeset
    26
_LIT(INHERIT, "inherit");
hgs
parents:
diff changeset
    27
_LIT(STOPCOLOR, "stop-color");
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
//
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
CSvgStopElementImpl* CSvgStopElementImpl::NewL(const TUint8 aElemID,
hgs
parents:
diff changeset
    33
											   CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    34
	{
hgs
parents:
diff changeset
    35
    CSvgStopElementImpl *self = new (ELeave) CSvgStopElementImpl(aDoc);
hgs
parents:
diff changeset
    36
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    37
    self->ConstructL(aElemID);
hgs
parents:
diff changeset
    38
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    39
    return self;
hgs
parents:
diff changeset
    40
	}
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
void CSvgStopElementImpl::ConstructL(const TUint8 aElemID)
hgs
parents:
diff changeset
    46
	{
hgs
parents:
diff changeset
    47
    CSvgElementImpl::InitializeL( aElemID );
hgs
parents:
diff changeset
    48
     iSvgStyleProperties = new(ELeave) RPointerArray<CCssValue>(KCSS_MAX_ATTR);
hgs
parents:
diff changeset
    49
     User::LeaveIfError( iSvgStyleProperties->Append( NULL ) );
hgs
parents:
diff changeset
    50
     iSvgStyleProperties->Remove( 0 );
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    56
//
hgs
parents:
diff changeset
    57
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
CSvgStopElementImpl::CSvgStopElementImpl( CSvgDocumentImpl* aDoc ):
hgs
parents:
diff changeset
    59
	iOffset(-1),// This implies that offset value is yet to be initialized.
hgs
parents:
diff changeset
    60
	iStopOpacity(1),
hgs
parents:
diff changeset
    61
	iStopColor(0),
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
	iValidOffsetValue(ETrue)
hgs
parents:
diff changeset
    64
	{
hgs
parents:
diff changeset
    65
	SetOwnerDocument(aDoc);
hgs
parents:
diff changeset
    66
	}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
TInt CSvgStopElementImpl::GetAttributeFloat(const TInt aNameId, TFloatFixPt& aValue)
hgs
parents:
diff changeset
    72
{
hgs
parents:
diff changeset
    73
	switch(aNameId)
hgs
parents:
diff changeset
    74
	{
hgs
parents:
diff changeset
    75
	case KAtrOffset:
hgs
parents:
diff changeset
    76
		aValue= iOffset;
hgs
parents:
diff changeset
    77
		break;
hgs
parents:
diff changeset
    78
	case KAtrStopOpacity:
hgs
parents:
diff changeset
    79
		aValue = iStopOpacity;
hgs
parents:
diff changeset
    80
		break;
hgs
parents:
diff changeset
    81
	default:
hgs
parents:
diff changeset
    82
		CSvgElementImpl::GetAttributeFloat(aNameId,aValue);
hgs
parents:
diff changeset
    83
		break;
hgs
parents:
diff changeset
    84
	}
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    return 0;
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
}
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    91
//
hgs
parents:
diff changeset
    92
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    93
TInt CSvgStopElementImpl::SetAttributeFloatL(const TInt aNameId,const TFloatFixPt aValue)
hgs
parents:
diff changeset
    94
{
hgs
parents:
diff changeset
    95
	switch(aNameId)
hgs
parents:
diff changeset
    96
	{
hgs
parents:
diff changeset
    97
	case KAtrOffset:
hgs
parents:
diff changeset
    98
		iOffset= aValue;
hgs
parents:
diff changeset
    99
		
hgs
parents:
diff changeset
   100
		// Adjust the value of offset
hgs
parents:
diff changeset
   101
		if(((((CSvgElementImpl*)ParentNode())->ElemID()) == KSvgRadialGradientElement) ||
hgs
parents:
diff changeset
   102
			((((CSvgElementImpl*)ParentNode())->ElemID()) == KSvgLinearGradientElement))
hgs
parents:
diff changeset
   103
		   {
hgs
parents:
diff changeset
   104
		   CSvgGradientElementImpl *parent = ((CSvgGradientElementImpl *)ParentNode());
hgs
parents:
diff changeset
   105
		    
hgs
parents:
diff changeset
   106
		    if(parent)
hgs
parents:
diff changeset
   107
		       {
hgs
parents:
diff changeset
   108
		       parent->UpdateOffsetValues((CSvgStopElementImpl*)this);
hgs
parents:
diff changeset
   109
		       }
hgs
parents:
diff changeset
   110
		   }
hgs
parents:
diff changeset
   111
		
hgs
parents:
diff changeset
   112
		break;
hgs
parents:
diff changeset
   113
	case KAtrStopOpacity:
hgs
parents:
diff changeset
   114
		iStopOpacity= aValue;
hgs
parents:
diff changeset
   115
		break;
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
	default:
hgs
parents:
diff changeset
   118
		CSvgElementImpl::SetAttributeFloatL(aNameId,aValue);
hgs
parents:
diff changeset
   119
		break;
hgs
parents:
diff changeset
   120
	}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    return 0;
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
//
hgs
parents:
diff changeset
   128
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   129
TInt CSvgStopElementImpl::GetAttributeIntL( const TInt aNameId, TInt32& aValue )
hgs
parents:
diff changeset
   130
{
hgs
parents:
diff changeset
   131
	switch(aNameId)
hgs
parents:
diff changeset
   132
	{
hgs
parents:
diff changeset
   133
		case KAtrStopColor:
hgs
parents:
diff changeset
   134
		aValue = iStopColor;
hgs
parents:
diff changeset
   135
		break;
hgs
parents:
diff changeset
   136
		default:
hgs
parents:
diff changeset
   137
			CSvgElementImpl::GetAttributeIntL(  aNameId, aValue );
hgs
parents:
diff changeset
   138
			break;
hgs
parents:
diff changeset
   139
	}
hgs
parents:
diff changeset
   140
	return 0;
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   144
//
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
TInt CSvgStopElementImpl::SetAttributeIntL( const TInt aNameId,
hgs
parents:
diff changeset
   147
                                        const TInt32 aValue )
hgs
parents:
diff changeset
   148
{
hgs
parents:
diff changeset
   149
	switch(aNameId)
hgs
parents:
diff changeset
   150
	{
hgs
parents:
diff changeset
   151
	case KAtrStopColor:
hgs
parents:
diff changeset
   152
		{
hgs
parents:
diff changeset
   153
		iStopColor = (TUint32)aValue;
hgs
parents:
diff changeset
   154
		}
hgs
parents:
diff changeset
   155
		break;
hgs
parents:
diff changeset
   156
	default:
hgs
parents:
diff changeset
   157
		 CSvgElementImpl::SetAttributeIntL( aNameId,
hgs
parents:
diff changeset
   158
                                         aValue );
hgs
parents:
diff changeset
   159
		 break;
hgs
parents:
diff changeset
   160
	}
hgs
parents:
diff changeset
   161
	return 0;
hgs
parents:
diff changeset
   162
}
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
TBool CSvgStopElementImpl::IsValidValue(const TDesC& aValue)
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
    TBool lValidValue = ETrue;
hgs
parents:
diff changeset
   167
	// aValue can only contain these characters "-+.%0123456789", If it contains any thing
hgs
parents:
diff changeset
   168
	// other than this it should be treated as 0.
hgs
parents:
diff changeset
   169
	
hgs
parents:
diff changeset
   170
	_LIT(KValidChars,"-+.%0123456789");
hgs
parents:
diff changeset
   171
	TBufC<14> lValidChars(KValidChars);
hgs
parents:
diff changeset
   172
		
hgs
parents:
diff changeset
   173
	TInt llength = aValue.Length();
hgs
parents:
diff changeset
   174
		
hgs
parents:
diff changeset
   175
	for( int charpos = 0 ; charpos < llength; charpos++ )
hgs
parents:
diff changeset
   176
	{
hgs
parents:
diff changeset
   177
		if( lValidChars.Locate(aValue[charpos]) == KErrNotFound )
hgs
parents:
diff changeset
   178
		{
hgs
parents:
diff changeset
   179
			
hgs
parents:
diff changeset
   180
			lValidValue = EFalse;
hgs
parents:
diff changeset
   181
			break;
hgs
parents:
diff changeset
   182
		}
hgs
parents:
diff changeset
   183
	}
hgs
parents:
diff changeset
   184
	
hgs
parents:
diff changeset
   185
	return lValidValue;
hgs
parents:
diff changeset
   186
}
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
TBool CSvgStopElementImpl::IsValidElement() const
hgs
parents:
diff changeset
   189
{
hgs
parents:
diff changeset
   190
	return iValidOffsetValue;
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   196
TInt CSvgStopElementImpl::SetAttributeL(const TDesC &aName, const TDesC &aValue)
hgs
parents:
diff changeset
   197
	{
hgs
parents:
diff changeset
   198
	CSvgElementImpl::SetAttributeL(aName,aValue);
hgs
parents:
diff changeset
   199
	TFloatFixPt KZero(KFloatFixZero);
hgs
parents:
diff changeset
   200
    TFloatFixPt KOne( KFloatFixOne );
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
    if(aName == OFFSET)
hgs
parents:
diff changeset
   203
		{
hgs
parents:
diff changeset
   204
		iValidOffsetValue = IsValidValue(aValue);
hgs
parents:
diff changeset
   205
			
hgs
parents:
diff changeset
   206
		if( iValidOffsetValue  )
hgs
parents:
diff changeset
   207
		   {
hgs
parents:
diff changeset
   208
		   iOffset=TFloatFixPt::ConvertString(aValue); 
hgs
parents:
diff changeset
   209
		        
hgs
parents:
diff changeset
   210
		   if (aValue.Locate('%') != KErrNotFound)
hgs
parents:
diff changeset
   211
		       {
hgs
parents:
diff changeset
   212
		 	   iOffset = iOffset / TFloatFixPt(100);
hgs
parents:
diff changeset
   213
		       }
hgs
parents:
diff changeset
   214
		    
hgs
parents:
diff changeset
   215
		    // Finally if the iOffset value is lesser than 0, it should be made to 0.
hgs
parents:
diff changeset
   216
		    if( iOffset < KZero )
hgs
parents:
diff changeset
   217
			   {
hgs
parents:
diff changeset
   218
			   iOffset = KZero ;
hgs
parents:
diff changeset
   219
			   }
hgs
parents:
diff changeset
   220
			else if( iOffset > KOne )
hgs
parents:
diff changeset
   221
			   {
hgs
parents:
diff changeset
   222
			   iOffset = KOne ;
hgs
parents:
diff changeset
   223
			   }
hgs
parents:
diff changeset
   224
		   }
hgs
parents:
diff changeset
   225
		 else
hgs
parents:
diff changeset
   226
		   {
hgs
parents:
diff changeset
   227
		   // aValue contains invalid characters hence "0" is assigned to it.
hgs
parents:
diff changeset
   228
		   // Any stop element with wrong offset value should not be considered while 
hgs
parents:
diff changeset
   229
		   // rendereing and the effect should be as if no stop-offset is declared.
hgs
parents:
diff changeset
   230
		   iOffset = KZero;
hgs
parents:
diff changeset
   231
		   }
hgs
parents:
diff changeset
   232
		 
hgs
parents:
diff changeset
   233
		}
hgs
parents:
diff changeset
   234
    else if(aName == STOPOPACITY)
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
        if(aValue == INHERIT)
hgs
parents:
diff changeset
   238
            {
hgs
parents:
diff changeset
   239
            // inherit does not make any sense since the stop-opacity is
hgs
parents:
diff changeset
   240
            //specific to stop element only and a stop element can not have another stop element as
hgs
parents:
diff changeset
   241
            //its child.
hgs
parents:
diff changeset
   242
            iStopOpacity = KOne;
hgs
parents:
diff changeset
   243
            }
hgs
parents:
diff changeset
   244
        else
hgs
parents:
diff changeset
   245
            {
hgs
parents:
diff changeset
   246
            if( IsValidValue(aValue) )
hgs
parents:
diff changeset
   247
            {
hgs
parents:
diff changeset
   248
    #ifdef SVG_FLOAT_BUILD
hgs
parents:
diff changeset
   249
            iStopOpacity = TFloatFixPt::ConvertString (aValue);
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
            if (!(iStopOpacity >= TFloatFixPt(0) && iStopOpacity <= TFloatFixPt(1)))
hgs
parents:
diff changeset
   252
    #else
hgs
parents:
diff changeset
   253
            if ( TFloatFixPt::ConvertString (aValue, iStopOpacity ) != KErrNone )
hgs
parents:
diff changeset
   254
    #endif
hgs
parents:
diff changeset
   255
                {
hgs
parents:
diff changeset
   256
                iStopOpacity = KOne;
hgs
parents:
diff changeset
   257
                }
hgs
parents:
diff changeset
   258
            else
hgs
parents:
diff changeset
   259
                {
hgs
parents:
diff changeset
   260
                if (aValue.Locate('%') != KErrNotFound)
hgs
parents:
diff changeset
   261
                    {
hgs
parents:
diff changeset
   262
                    //if stop opacity was listed as a percentage
hgs
parents:
diff changeset
   263
                    iStopOpacity = iStopOpacity / TFloatFixPt(100);
hgs
parents:
diff changeset
   264
                    }
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
                if ( iStopOpacity < KZero )
hgs
parents:
diff changeset
   267
                    iStopOpacity = KZero;
hgs
parents:
diff changeset
   268
                else if ( iStopOpacity > KOne )
hgs
parents:
diff changeset
   269
                    iStopOpacity = KOne;
hgs
parents:
diff changeset
   270
                }
hgs
parents:
diff changeset
   271
            }
hgs
parents:
diff changeset
   272
                else
hgs
parents:
diff changeset
   273
                {
hgs
parents:
diff changeset
   274
                	iStopOpacity = KOne;
hgs
parents:
diff changeset
   275
                }	
hgs
parents:
diff changeset
   276
			}
hgs
parents:
diff changeset
   277
		}
hgs
parents:
diff changeset
   278
    else if (aName == STOPCOLOR)
hgs
parents:
diff changeset
   279
		{
hgs
parents:
diff changeset
   280
        TUint32 tempVal;
hgs
parents:
diff changeset
   281
hgs
parents:
diff changeset
   282
        TSvgColor tColor(KGfxColorNull);
hgs
parents:
diff changeset
   283
		if( tColor.GetStringL( aValue,tempVal) )
hgs
parents:
diff changeset
   284
			{
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
            }
hgs
parents:
diff changeset
   287
        else
hgs
parents:
diff changeset
   288
        	{
hgs
parents:
diff changeset
   289
			tempVal = 0;
hgs
parents:
diff changeset
   290
			}
hgs
parents:
diff changeset
   291
        iStopColor=tempVal;
hgs
parents:
diff changeset
   292
		}
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
    return 0;
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
}
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   299
//
hgs
parents:
diff changeset
   300
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   301
CSvgStopElementImpl::~CSvgStopElementImpl()
hgs
parents:
diff changeset
   302
	{
hgs
parents:
diff changeset
   303
	if ( iSvgStyleProperties )
hgs
parents:
diff changeset
   304
		{
hgs
parents:
diff changeset
   305
		iSvgStyleProperties->Close();
hgs
parents:
diff changeset
   306
		delete iSvgStyleProperties;
hgs
parents:
diff changeset
   307
		iSvgStyleProperties = NULL;
hgs
parents:
diff changeset
   308
		}
hgs
parents:
diff changeset
   309
	}
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   312
//
hgs
parents:
diff changeset
   313
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   314
void CSvgStopElementImpl::SetStopColorL(TUint32 &aVal)
hgs
parents:
diff changeset
   315
	{
hgs
parents:
diff changeset
   316
	iStopColor= aVal;
hgs
parents:
diff changeset
   317
	}
hgs
parents:
diff changeset
   318
hgs
parents:
diff changeset
   319
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   320
//
hgs
parents:
diff changeset
   321
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   322
void CSvgStopElementImpl::Print( TBool aIsEncodeOn )
hgs
parents:
diff changeset
   323
{
hgs
parents:
diff changeset
   324
	if (!aIsEncodeOn)
hgs
parents:
diff changeset
   325
	{
hgs
parents:
diff changeset
   326
		#ifdef _DEBUG
hgs
parents:
diff changeset
   327
		RDebug::Printf("<stop stop-color=\"hmmm\" stop-opacity=\"%d\" offset=\"%d\" />",
hgs
parents:
diff changeset
   328
		/*iStopColor,*/ (int)iStopOpacity, (int)iOffset );
hgs
parents:
diff changeset
   329
		#endif
hgs
parents:
diff changeset
   330
	}
hgs
parents:
diff changeset
   331
}
hgs
parents:
diff changeset
   332