svgtopt/SVG/SVGImpl/src/SVGPaintCssValueImpl.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 "SVGPaintCssValueImpl.h"
hgs
parents:
diff changeset
    20
#include "SVGFloatCssValueImpl.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "SVGElementImpl.h"
hgs
parents:
diff changeset
    23
#include "SVGColor.h"
hgs
parents:
diff changeset
    24
#include "GfxPaint.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    27
#include "SVGGradientElementImpl.h"
hgs
parents:
diff changeset
    28
#include "SVGSolidColorElementImpl.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    33
//
hgs
parents:
diff changeset
    34
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
CPaintCssValueImpl::~CPaintCssValueImpl()
hgs
parents:
diff changeset
    36
    {
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
    if( iUrlId )
hgs
parents:
diff changeset
    39
        {
hgs
parents:
diff changeset
    40
        delete iUrlId;
hgs
parents:
diff changeset
    41
        iUrlId = NULL ;
hgs
parents:
diff changeset
    42
        }
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
     if ( iValue && iIsValueOwned )
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
        {
hgs
parents:
diff changeset
    47
        delete ( TSvgColor * ) iValue;
hgs
parents:
diff changeset
    48
        }
hgs
parents:
diff changeset
    49
     iValue = NULL;
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
MGfxPaint* CPaintCssValueImpl::Value()
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    CSvgElementImpl* lReferencedElement = NULL;
hgs
parents:
diff changeset
    58
    if ( iUrlFlag && iSvgElementImpl )
hgs
parents:
diff changeset
    59
        {
hgs
parents:
diff changeset
    60
        	// iUrlFlag is true means this paint is gradient.
hgs
parents:
diff changeset
    61
        	CSvgDocumentImpl *lDoc = (CSvgDocumentImpl *)iSvgElementImpl->OwnerDocument();
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
        	if (lDoc)
hgs
parents:
diff changeset
    64
        	{
hgs
parents:
diff changeset
    65
        		if(iUrlId)
hgs
parents:
diff changeset
    66
        		{
hgs
parents:
diff changeset
    67
		        	lReferencedElement = ( CSvgElementImpl*)lDoc->GetElementById( *iUrlId );
hgs
parents:
diff changeset
    68
		        	if(lReferencedElement)
hgs
parents:
diff changeset
    69
		        		TInt elementId = lReferencedElement->ElemID();
hgs
parents:
diff changeset
    70
		        	if ( lReferencedElement && ((lReferencedElement->ElemID() == KSvgLinearGradientElement) ||
hgs
parents:
diff changeset
    71
		              (lReferencedElement->ElemID() == KSvgRadialGradientElement)) )
hgs
parents:
diff changeset
    72
		        	{
hgs
parents:
diff changeset
    73
		         		//Get Attributes from Gradient Element
hgs
parents:
diff changeset
    74
		        		iValue =  ((CSvgGradientElementImpl *)lReferencedElement)->PaintAttribute();
hgs
parents:
diff changeset
    75
                        iIsValueOwned = EFalse;
hgs
parents:
diff changeset
    76
		        	}
hgs
parents:
diff changeset
    77
		        	else if (lReferencedElement && lReferencedElement->ElemID() == KSvgSolidColorElement )
hgs
parents:
diff changeset
    78
		        	{
hgs
parents:
diff changeset
    79
		        		// Get Attributes from solidColor element
hgs
parents:
diff changeset
    80
		        		GetColorFromSolidColorElement(lReferencedElement);
hgs
parents:
diff changeset
    81
		        		// delete the reference because we now have a clone.
hgs
parents:
diff changeset
    82
	   					TRAPD(err, SetValueL(iValue->GetColor()));
hgs
parents:
diff changeset
    83
		        		delete iUrlId;
hgs
parents:
diff changeset
    84
		        		iUrlId = NULL;
hgs
parents:
diff changeset
    85
	   					if (err)
hgs
parents:
diff changeset
    86
    	   					{
hgs
parents:
diff changeset
    87
                            #ifdef _DEBUG
hgs
parents:
diff changeset
    88
                            RDebug::Printf("CPaintCssValueImpl::Value() error trapped=%d", err);
hgs
parents:
diff changeset
    89
                            #endif
hgs
parents:
diff changeset
    90
    	   					}
hgs
parents:
diff changeset
    91
		        		iUrlFlag = EFalse;
hgs
parents:
diff changeset
    92
  		        	}
hgs
parents:
diff changeset
    93
  		        	else  // id = color value... for some reason like <rect id="red" fill="red"
hgs
parents:
diff changeset
    94
  		        		{
hgs
parents:
diff changeset
    95
						TRAPD(err, SetValueL(iUrlId->Des()));
hgs
parents:
diff changeset
    96
	   					if (err)
hgs
parents:
diff changeset
    97
    	   					{
hgs
parents:
diff changeset
    98
                            #ifdef _DEBUG
hgs
parents:
diff changeset
    99
                            RDebug::Printf("CPaintCssValueImpl::Value() error trapped=%d", err);
hgs
parents:
diff changeset
   100
                            #endif
hgs
parents:
diff changeset
   101
    	   					}
hgs
parents:
diff changeset
   102
  		        		}
hgs
parents:
diff changeset
   103
        		}
hgs
parents:
diff changeset
   104
        	}
hgs
parents:
diff changeset
   105
        }
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
    return iValue;
hgs
parents:
diff changeset
   108
    }
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   111
//
hgs
parents:
diff changeset
   112
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   113
TInt CPaintCssValueImpl::SetValueL( const TDesC& aValue )
hgs
parents:
diff changeset
   114
    {
hgs
parents:
diff changeset
   115
    if ( iValue )
hgs
parents:
diff changeset
   116
        {
hgs
parents:
diff changeset
   117
        delete ( TSvgColor * ) iValue;
hgs
parents:
diff changeset
   118
        iValue = NULL;
hgs
parents:
diff changeset
   119
        iIsValueOwned = EFalse;
hgs
parents:
diff changeset
   120
        }
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    _LIT( KNone, "none" );
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    _LIT( KCurrentColor, "currentColor" );
hgs
parents:
diff changeset
   125
    _LIT(KUrl,"url");
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
    TUint32 tempVal = 0x000000;//default is 'black'
hgs
parents:
diff changeset
   129
    if ( aValue == KNone )
hgs
parents:
diff changeset
   130
        {
hgs
parents:
diff changeset
   131
        tempVal = KGfxColorNull;
hgs
parents:
diff changeset
   132
        }
hgs
parents:
diff changeset
   133
    else if ( aValue == KCurrentColor )
hgs
parents:
diff changeset
   134
        {
hgs
parents:
diff changeset
   135
        tempVal = KSvgCurrentColor;
hgs
parents:
diff changeset
   136
        }
hgs
parents:
diff changeset
   137
    else if (aValue.Left(3) == KUrl)
hgs
parents:
diff changeset
   138
        {
hgs
parents:
diff changeset
   139
        // URL = gradient at the moment...
hgs
parents:
diff changeset
   140
        iUrlFlag=ETrue;
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
        HBufC* lReferenceId = (aValue.Right(aValue.Length()-5)).AllocL();
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
        if( iUrlId )
hgs
parents:
diff changeset
   146
            {
hgs
parents:
diff changeset
   147
            delete iUrlId;
hgs
parents:
diff changeset
   148
            iUrlId = NULL;
hgs
parents:
diff changeset
   149
            }
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
        iUrlId = (lReferenceId->Left(lReferenceId->Length()-1)).AllocL();
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
        delete lReferenceId;
hgs
parents:
diff changeset
   154
        lReferenceId = NULL;
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
        // Return it from here otherwise a memory Leak will occur
hgs
parents:
diff changeset
   157
        return KErrNone;
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
        }
hgs
parents:
diff changeset
   160
    else
hgs
parents:
diff changeset
   161
        {
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
        TSvgColor tColor(KGfxColorNull);
hgs
parents:
diff changeset
   165
        if( tColor.GetStringL( aValue,tempVal) != EFalse )
hgs
parents:
diff changeset
   166
            {
hgs
parents:
diff changeset
   167
            }
hgs
parents:
diff changeset
   168
        else
hgs
parents:
diff changeset
   169
            {
hgs
parents:
diff changeset
   170
            tempVal = 0;
hgs
parents:
diff changeset
   171
            iDefaultSet = ETrue;
hgs
parents:
diff changeset
   172
            }
hgs
parents:
diff changeset
   173
        }
hgs
parents:
diff changeset
   174
    iValue = new ( ELeave ) TSvgColor( tempVal );
hgs
parents:
diff changeset
   175
    iIsValueOwned = ETrue;
hgs
parents:
diff changeset
   176
    return KErrNone;
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   180
//
hgs
parents:
diff changeset
   181
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   182
TInt CPaintCssValueImpl::SetValueL( const TInt& aValue )
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
     if ( iValue && !iUrlFlag)
hgs
parents:
diff changeset
   185
        {
hgs
parents:
diff changeset
   186
        delete ( TSvgColor * ) iValue;
hgs
parents:
diff changeset
   187
        iValue = NULL;
hgs
parents:
diff changeset
   188
        }
hgs
parents:
diff changeset
   189
		iUrlFlag = EFalse;
hgs
parents:
diff changeset
   190
    iValue = new ( ELeave ) TSvgColor( aValue );
hgs
parents:
diff changeset
   191
    iIsValueOwned = ETrue;
hgs
parents:
diff changeset
   192
    return KErrNone;
hgs
parents:
diff changeset
   193
    }
hgs
parents:
diff changeset
   194
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
// This method gets the color value from the referenced solidColor element
hgs
parents:
diff changeset
   196
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   197
void CPaintCssValueImpl::GetColorFromSolidColorElement(CSvgElementImpl* aReferencedElement)
hgs
parents:
diff changeset
   198
    {
hgs
parents:
diff changeset
   199
    CCssValue*  lCssValue = NULL;
hgs
parents:
diff changeset
   200
    aReferencedElement->FindProperty( KCSS_ATTR_FILL, lCssValue, aReferencedElement );
hgs
parents:
diff changeset
   201
    if (lCssValue != NULL)
hgs
parents:
diff changeset
   202
       {
hgs
parents:
diff changeset
   203
       iValue = ((CPaintCssValueImpl*)lCssValue)->Value();
hgs
parents:
diff changeset
   204
       ((CSvgSolidColorElementImpl*)aReferencedElement)->ApplyOpacitytoElement( iSvgElementImpl );
hgs
parents:
diff changeset
   205
       }
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
/*// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   209
//
hgs
parents:
diff changeset
   210
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   211
void CPaintCssValueImpl::SetL( CPaintCssValueImpl* aValue )
hgs
parents:
diff changeset
   212
{
hgs
parents:
diff changeset
   213
	iSvgElementImpl = aValue->iSvgElementImpl;
hgs
parents:
diff changeset
   214
	iValueType = aValue->iValueType;
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
	if (aValue->iValue && !aValue->iUrlFlag)
hgs
parents:
diff changeset
   217
	{
hgs
parents:
diff changeset
   218
		CloneRGBValueL( ((TSvgColor*)(aValue->iValue))->Value());
hgs
parents:
diff changeset
   219
	}
hgs
parents:
diff changeset
   220
	else if (aValue->iValue)
hgs
parents:
diff changeset
   221
	{
hgs
parents:
diff changeset
   222
		iValue = aValue->iValue;
hgs
parents:
diff changeset
   223
	}
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
	iDefaultSet = aValue->iDefaultSet;
hgs
parents:
diff changeset
   226
	iUrlFlag = aValue->iUrlFlag;
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
    if( aValue->iUrlFlag )
hgs
parents:
diff changeset
   229
        {
hgs
parents:
diff changeset
   230
        SetUrlIdL(aValue->iUrlId->Des());
hgs
parents:
diff changeset
   231
        }
hgs
parents:
diff changeset
   232
}
hgs
parents:
diff changeset
   233
*/
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
// *******************************************************
hgs
parents:
diff changeset
   236
// Private
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   240
//
hgs
parents:
diff changeset
   241
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   242
CPaintCssValueImpl::CPaintCssValueImpl() :iUrlId(NULL), iValue( NULL ),
hgs
parents:
diff changeset
   243
                                          iUrlFlag(EFalse), 
hgs
parents:
diff changeset
   244
                                          iDefaultSet (EFalse), 
hgs
parents:
diff changeset
   245
                                          iIsValueOwned( EFalse )
hgs
parents:
diff changeset
   246
    {
hgs
parents:
diff changeset
   247
    }
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   252
//
hgs
parents:
diff changeset
   253
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   254
void  CPaintCssValueImpl::SetUrlflag()
hgs
parents:
diff changeset
   255
    {
hgs
parents:
diff changeset
   256
    iUrlFlag= ETrue;
hgs
parents:
diff changeset
   257
    }
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   260
//
hgs
parents:
diff changeset
   261
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   262
TBool CPaintCssValueImpl::GetUrlflag()
hgs
parents:
diff changeset
   263
{
hgs
parents:
diff changeset
   264
    return iUrlFlag;
hgs
parents:
diff changeset
   265
}
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   268
//
hgs
parents:
diff changeset
   269
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   270
void  CPaintCssValueImpl::SetUrlIdL(const TDesC& aValue)
hgs
parents:
diff changeset
   271
    {
hgs
parents:
diff changeset
   272
    if( iUrlId )
hgs
parents:
diff changeset
   273
        {
hgs
parents:
diff changeset
   274
        delete iUrlId;
hgs
parents:
diff changeset
   275
        iUrlId = NULL;
hgs
parents:
diff changeset
   276
        }
hgs
parents:
diff changeset
   277
    iUrlId  = aValue.AllocL();
hgs
parents:
diff changeset
   278
    }
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   282
//
hgs
parents:
diff changeset
   283
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   284
TInt CPaintCssValueImpl::CloneRGBValueL(const TInt& aValue)
hgs
parents:
diff changeset
   285
    {
hgs
parents:
diff changeset
   286
    if (!iUrlFlag)
hgs
parents:
diff changeset
   287
        {
hgs
parents:
diff changeset
   288
        if(iValue)
hgs
parents:
diff changeset
   289
        	{
hgs
parents:
diff changeset
   290
        	delete ( TSvgColor * ) iValue;
hgs
parents:
diff changeset
   291
        	}
hgs
parents:
diff changeset
   292
   		iValue = new ( ELeave ) TSvgColor( (TUint32)aValue );
hgs
parents:
diff changeset
   293
   		iIsValueOwned = ETrue;
hgs
parents:
diff changeset
   294
        }
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
    return KErrNone;
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   302
HBufC*  CPaintCssValueImpl::GetUrlId()
hgs
parents:
diff changeset
   303
    {
hgs
parents:
diff changeset
   304
    return iUrlId;
hgs
parents:
diff changeset
   305
    }
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   308
//
hgs
parents:
diff changeset
   309
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   310
TBool CPaintCssValueImpl::IsEqual( CCssValue* aValue )
hgs
parents:
diff changeset
   311
{
hgs
parents:
diff changeset
   312
    if (((CPaintCssValueImpl*)aValue)->iValue == iValue)
hgs
parents:
diff changeset
   313
    {
hgs
parents:
diff changeset
   314
        return ETrue;
hgs
parents:
diff changeset
   315
    }
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
    return EFalse;
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
// IsDefaultSet check if default color is set
hgs
parents:
diff changeset
   323
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   324
TBool CPaintCssValueImpl::IsDefaultSet()
hgs
parents:
diff changeset
   325
	{
hgs
parents:
diff changeset
   326
	return iDefaultSet;
hgs
parents:
diff changeset
   327
	}
hgs
parents:
diff changeset
   328
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   331
//
hgs
parents:
diff changeset
   332
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   333
void CPaintCssValueImpl::SetElement(CSvgElementImpl* aElement)
hgs
parents:
diff changeset
   334
{
hgs
parents:
diff changeset
   335
	iSvgElementImpl = aElement;
hgs
parents:
diff changeset
   336
}
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   339
//
hgs
parents:
diff changeset
   340
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   341
CSvgElementImpl* CPaintCssValueImpl::GetElement()
hgs
parents:
diff changeset
   342
{
hgs
parents:
diff changeset
   343
	return iSvgElementImpl;
hgs
parents:
diff changeset
   344
}
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   347
//
hgs
parents:
diff changeset
   348
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   349
void CPaintCssValueImpl::Print()
hgs
parents:
diff changeset
   350
{
hgs
parents:
diff changeset
   351
#ifdef _DEBUG
hgs
parents:
diff changeset
   352
	if (iValue)
hgs
parents:
diff changeset
   353
	{
hgs
parents:
diff changeset
   354
		RDebug::Printf("%d", (( TSvgColor* )iValue)->GetColor() );
hgs
parents:
diff changeset
   355
	}
hgs
parents:
diff changeset
   356
#endif
hgs
parents:
diff changeset
   357
}