svgtopt/SVG/SVGImpl/src/SVGGElementImpl.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
#if !defined(__E32BASE_H__)
hgs
parents:
diff changeset
    20
#include <e32base.h>
hgs
parents:
diff changeset
    21
#endif
hgs
parents:
diff changeset
    22
#include "SVGGElementImpl.h"
hgs
parents:
diff changeset
    23
#include "SVGElementImpl.h"
hgs
parents:
diff changeset
    24
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    25
#include "SVGSchemaData.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include "GfxAffineTransform.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include "SVGUseElementImpl.h"
hgs
parents:
diff changeset
    30
_LIT(DISPLAY, "display");
hgs
parents:
diff changeset
    31
_LIT(NONE, "none");
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    34
//
hgs
parents:
diff changeset
    35
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    36
CSvgGElementImpl* CSvgGElementImpl::NewL(  const TUint8 aElemID,
hgs
parents:
diff changeset
    37
                                          CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    38
    {
hgs
parents:
diff changeset
    39
    CSvgGElementImpl*   self    = new ( ELeave ) CSvgGElementImpl( aDoc );
hgs
parents:
diff changeset
    40
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    41
    self->ConstructL(  aElemID );
hgs
parents:
diff changeset
    42
    CleanupStack::Pop();
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
    return self;
hgs
parents:
diff changeset
    45
    }
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
//
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
CSvgGElementImpl* CSvgGElementImpl::NewLC(  const TUint8 aElemID,
hgs
parents:
diff changeset
    51
                                           CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    CSvgGElementImpl*   self    = new ( ELeave ) CSvgGElementImpl( aDoc );
hgs
parents:
diff changeset
    54
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    55
    self->ConstructL(  aElemID );
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
    return self;
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    64
//
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
CSvgGElementImpl::~CSvgGElementImpl()
hgs
parents:
diff changeset
    67
    {
hgs
parents:
diff changeset
    68
	if ( iSvgStyleProperties )
hgs
parents:
diff changeset
    69
		{
hgs
parents:
diff changeset
    70
		iSvgStyleProperties->Close();
hgs
parents:
diff changeset
    71
		delete iSvgStyleProperties;
hgs
parents:
diff changeset
    72
		iSvgStyleProperties = NULL;
hgs
parents:
diff changeset
    73
		}
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    }
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
// Private
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    80
//
hgs
parents:
diff changeset
    81
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
void CSvgGElementImpl::ConstructL(  const TUint8 aElemID )
hgs
parents:
diff changeset
    84
    {
hgs
parents:
diff changeset
    85
    CSvgElementImpl::InitializeL( aElemID );
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
	iSvgStyleProperties = new(ELeave) RPointerArray<CCssValue>(KCSS_MAX_ATTR);
hgs
parents:
diff changeset
    88
	User::LeaveIfError( iSvgStyleProperties->Append( NULL ) );
hgs
parents:
diff changeset
    89
iSvgStyleProperties->Remove( 0 );
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
    iSvgTransformable = CSvgTransformableImpl::NewL();
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    if (this->ElemID() >= KSvgAllGElemsSubStartIndex &&
hgs
parents:
diff changeset
    94
    	this->ElemID() <= KSvgAllGElemsEndIndex )
hgs
parents:
diff changeset
    95
        {
hgs
parents:
diff changeset
    96
        // Set display to "none"
hgs
parents:
diff changeset
    97
        // Otherwise it will be rendered
hgs
parents:
diff changeset
    98
		SetAttributeL(DISPLAY, NONE);
hgs
parents:
diff changeset
    99
        }
hgs
parents:
diff changeset
   100
    }
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
hgs
parents:
diff changeset
   108
CSvgGElementImpl::CSvgGElementImpl( CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
   109
    {
hgs
parents:
diff changeset
   110
	SetOwnerDocument(aDoc);
hgs
parents:
diff changeset
   111
    }
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
// *******************************************************
hgs
parents:
diff changeset
   115
// From MXmlElement
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
TInt CSvgGElementImpl::SetAttributeL( const TDesC& aName, const TDesC& aValue )
hgs
parents:
diff changeset
   121
    {
hgs
parents:
diff changeset
   122
	CSvgElementImpl::SetAttributeL(aName,aValue);
hgs
parents:
diff changeset
   123
    return KErrNone;
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
// From MXmlElementOpt
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   130
//
hgs
parents:
diff changeset
   131
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   132
TInt CSvgGElementImpl::GetAttributeFloat( const TInt aNameId, TFloatFixPt& aValue )
hgs
parents:
diff changeset
   133
    {
hgs
parents:
diff changeset
   134
    switch ( aNameId )
hgs
parents:
diff changeset
   135
        {
hgs
parents:
diff changeset
   136
        case KAtrRefX:
hgs
parents:
diff changeset
   137
            {
hgs
parents:
diff changeset
   138
            TFloatFixPt          xmin( KMAXFLOATFIX ), x; // 0x7fff is the maximum integer in TFixPt
hgs
parents:
diff changeset
   139
            CSvgElementImpl*lNewElement = ( CSvgElementImpl* ) FirstChild();
hgs
parents:
diff changeset
   140
            while ( lNewElement != NULL )
hgs
parents:
diff changeset
   141
                {
hgs
parents:
diff changeset
   142
                lNewElement->GetAttributeFloat( KAtrRefX, x );
hgs
parents:
diff changeset
   143
                if ( x < xmin )
hgs
parents:
diff changeset
   144
                    xmin = x;
hgs
parents:
diff changeset
   145
                lNewElement = ( CSvgElementImpl * )
hgs
parents:
diff changeset
   146
                              lNewElement->NextSibling();
hgs
parents:
diff changeset
   147
                }
hgs
parents:
diff changeset
   148
            aValue = xmin;
hgs
parents:
diff changeset
   149
            }
hgs
parents:
diff changeset
   150
        break;
hgs
parents:
diff changeset
   151
        case KAtrRefY:
hgs
parents:
diff changeset
   152
            {
hgs
parents:
diff changeset
   153
            TFloatFixPt          ymin( KMAXFLOATFIX ), y; // 0x7fff is the maximum integer in TFixPt
hgs
parents:
diff changeset
   154
            CSvgElementImpl*lNewElement = ( CSvgElementImpl* ) FirstChild();
hgs
parents:
diff changeset
   155
            while ( lNewElement != NULL )
hgs
parents:
diff changeset
   156
                {
hgs
parents:
diff changeset
   157
                lNewElement->GetAttributeFloat( KAtrRefY, y );
hgs
parents:
diff changeset
   158
                if ( y < ymin )
hgs
parents:
diff changeset
   159
                    ymin = y;
hgs
parents:
diff changeset
   160
                lNewElement = ( CSvgElementImpl * )
hgs
parents:
diff changeset
   161
                              lNewElement->NextSibling();
hgs
parents:
diff changeset
   162
                }
hgs
parents:
diff changeset
   163
            aValue = ymin;
hgs
parents:
diff changeset
   164
            }
hgs
parents:
diff changeset
   165
        break;
hgs
parents:
diff changeset
   166
        default:
hgs
parents:
diff changeset
   167
        return CSvgElementImpl::GetAttributeFloat( aNameId, aValue );
hgs
parents:
diff changeset
   168
        }
hgs
parents:
diff changeset
   169
    return KErrNone;
hgs
parents:
diff changeset
   170
    }
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
// *******************************************************
hgs
parents:
diff changeset
   173
// From CSvgElementImpl
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   176
//
hgs
parents:
diff changeset
   177
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   178
TBool CSvgGElementImpl::DrawL( CGfx2dGc* /* aGc */,
hgs
parents:
diff changeset
   179
                               CSvgElementImpl* /* aElement */ )
hgs
parents:
diff changeset
   180
    {
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	if (	this->ElemID() >= KSvgAllGElemsStartIndex &&
hgs
parents:
diff changeset
   183
			this->ElemID() <= KSvgAllGElemsEndIndex
hgs
parents:
diff changeset
   184
	   )
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
        {
hgs
parents:
diff changeset
   188
        return EFalse;
hgs
parents:
diff changeset
   189
        }
hgs
parents:
diff changeset
   190
    else
hgs
parents:
diff changeset
   191
        {
hgs
parents:
diff changeset
   192
        return ETrue;
hgs
parents:
diff changeset
   193
        }
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
// *******************************************************
hgs
parents:
diff changeset
   199
// Utilities
hgs
parents:
diff changeset
   200
// Get group bounding box
hgs
parents:
diff changeset
   201
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   202
//
hgs
parents:
diff changeset
   203
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   204
void CSvgGElementImpl::GetGroupBounding( TGfxRectangle2D& aBbox,
hgs
parents:
diff changeset
   205
                                         CSvgElementImpl* aStartElement )
hgs
parents:
diff changeset
   206
    {
hgs
parents:
diff changeset
   207
    TFloatFixPt  xMin( KMAXFLOATFIX ), yMin( KMAXFLOATFIX ), xMax( KMINFLOATFIX ), yMax( KMINFLOATFIX );
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
    GetGroupBoundingInternal( xMin, yMin, xMax, yMax, aStartElement );
hgs
parents:
diff changeset
   210
    aBbox.iX = xMin;
hgs
parents:
diff changeset
   211
    aBbox.iY = yMin;
hgs
parents:
diff changeset
   212
    aBbox.iWidth = xMax - xMin;
hgs
parents:
diff changeset
   213
    aBbox.iHeight = yMax - yMin;
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   217
//
hgs
parents:
diff changeset
   218
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   219
void CSvgGElementImpl::GetGroupBoundingInternal( TFloatFixPt& aXmin,
hgs
parents:
diff changeset
   220
                                                 TFloatFixPt& aYmin,
hgs
parents:
diff changeset
   221
                                                 TFloatFixPt& aXmax,
hgs
parents:
diff changeset
   222
                                                 TFloatFixPt& aYmax,
hgs
parents:
diff changeset
   223
                                                 CSvgElementImpl* aStartElement )
hgs
parents:
diff changeset
   224
    {
hgs
parents:
diff changeset
   225
   	TInt    position= aStartElement->ElemID();
hgs
parents:
diff changeset
   226
	if(  position > KSvgNoBoundBoxElemsEndIndex )
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
        {
hgs
parents:
diff changeset
   229
        TFloatFixPt          zero    ( 0 );
hgs
parents:
diff changeset
   230
        TGfxRectangle2D bbox;
hgs
parents:
diff changeset
   231
        TInt32 displayValue;
hgs
parents:
diff changeset
   232
        aStartElement->GetBBox( bbox );
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
        TRAP_IGNORE( aStartElement->GetAttributeIntL( KCSS_ATTR_DISPLAY, displayValue ) );
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
    	// Ignore area-less elements and dispay="none" elements
hgs
parents:
diff changeset
   237
        if ( (bbox.iWidth > zero || bbox.iHeight > zero) && displayValue !=  KDisplayEnumNone)
hgs
parents:
diff changeset
   238
        {
hgs
parents:
diff changeset
   239
            if ( bbox.iX < aXmin )
hgs
parents:
diff changeset
   240
                aXmin = bbox.iX;
hgs
parents:
diff changeset
   241
            if ( bbox.iY < aYmin )
hgs
parents:
diff changeset
   242
                aYmin = bbox.iY;
hgs
parents:
diff changeset
   243
            if ( bbox.iX + bbox.iWidth > aXmax )
hgs
parents:
diff changeset
   244
                aXmax = bbox.iX + bbox.iWidth;
hgs
parents:
diff changeset
   245
            if ( bbox.iY + bbox.iHeight > aYmax )
hgs
parents:
diff changeset
   246
                aYmax = bbox.iY + bbox.iHeight;
hgs
parents:
diff changeset
   247
            }
hgs
parents:
diff changeset
   248
        }
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
    CSvgElementImpl*element = ( CSvgElementImpl* )
hgs
parents:
diff changeset
   251
                              aStartElement->FirstChild();
hgs
parents:
diff changeset
   252
    while ( element != NULL )
hgs
parents:
diff changeset
   253
        {
hgs
parents:
diff changeset
   254
        GetGroupBoundingInternal( aXmin, aYmin, aXmax, aYmax, element );
hgs
parents:
diff changeset
   255
        element = ( CSvgElementImpl * ) element->NextSibling();
hgs
parents:
diff changeset
   256
        }
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
void CSvgGElementImpl::GetGroupBoundingUnscaled( TGfxRectangle2D& aBbox,
hgs
parents:
diff changeset
   263
                                                 CSvgElementImpl* aStartElement )
hgs
parents:
diff changeset
   264
    {
hgs
parents:
diff changeset
   265
    TFloatFixPt  xMin( KMAXFLOATFIX ), yMin( KMAXFLOATFIX ), xMax( KMINFLOATFIX ), yMax( KMINFLOATFIX );
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
    GetGroupBoundingInternalUnscaled( xMin, yMin, xMax, yMax, aStartElement );
hgs
parents:
diff changeset
   268
    aBbox.iX = xMin;
hgs
parents:
diff changeset
   269
    aBbox.iY = yMin;
hgs
parents:
diff changeset
   270
    aBbox.iWidth = xMax - xMin;
hgs
parents:
diff changeset
   271
    aBbox.iHeight = yMax - yMin;
hgs
parents:
diff changeset
   272
    }
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   275
//
hgs
parents:
diff changeset
   276
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   277
void CSvgGElementImpl::GetGroupBoundingInternalUnscaled( TFloatFixPt& aXmin,
hgs
parents:
diff changeset
   278
                                                         TFloatFixPt& aYmin,
hgs
parents:
diff changeset
   279
                                                         TFloatFixPt& aXmax,
hgs
parents:
diff changeset
   280
                                                         TFloatFixPt& aYmax,
hgs
parents:
diff changeset
   281
                                                         CSvgElementImpl* aStartElement )
hgs
parents:
diff changeset
   282
{
hgs
parents:
diff changeset
   283
    TInt    position= aStartElement->ElemID();
hgs
parents:
diff changeset
   284
    if(  position > KSvgNoBoundBoxElemsEndIndex )
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
        {
hgs
parents:
diff changeset
   287
        TFloatFixPt          zero    ( 0 );
hgs
parents:
diff changeset
   288
        TGfxRectangle2D bbox;
hgs
parents:
diff changeset
   289
        TInt32 displayValue;
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
        //solving the case where a <g><rect transform="translate(10,10)"></g>
hgs
parents:
diff changeset
   292
        //the rect elements transform must be reflected on the G
hgs
parents:
diff changeset
   293
        //but we dont want the scaled bbox of the rect with the entire CTM scaling
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
        if( aStartElement->IsTransformable() )
hgs
parents:
diff changeset
   296
            {
hgs
parents:
diff changeset
   297
            MSvgTransformList*  trList;
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
        	TGfxAffineTransform lElementTransform;
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
            aStartElement->GetTransform( trList );
hgs
parents:
diff changeset
   302
            lElementTransform = trList->Consolidate( aStartElement->IsOverwriteTransforms() );
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
            TGfxAffineTransform lTempCTM = aStartElement->GetCTM();
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
            //use only the transform on the child element and not the entire CTM
hgs
parents:
diff changeset
   307
            aStartElement->SetCTM( lElementTransform );
hgs
parents:
diff changeset
   308
			if (KSvgUseElement == (( CSvgElementImpl* )aStartElement)->ElemID())
hgs
parents:
diff changeset
   309
            {
hgs
parents:
diff changeset
   310
              ((CSvgUseElementImpl*)aStartElement)->GetBoundingBox( bbox);
hgs
parents:
diff changeset
   311
            }
hgs
parents:
diff changeset
   312
            else
hgs
parents:
diff changeset
   313
            	aStartElement->GetBBox( bbox );
hgs
parents:
diff changeset
   314
hgs
parents:
diff changeset
   315
            //set the original entire CTM back on to the element
hgs
parents:
diff changeset
   316
            aStartElement->SetCTM(lTempCTM);
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
            }
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
        TRAP_IGNORE( aStartElement->GetAttributeIntL( KCSS_ATTR_DISPLAY, displayValue ) );
hgs
parents:
diff changeset
   321
		
hgs
parents:
diff changeset
   322
		//TBool iDisplayNoneFlag  = aStartElement->IsInherited(KCSS_ATTR_DISPLAY);
hgs
parents:
diff changeset
   323
		// if the display attribute is inherited, consider it for bounding box calculation
hgs
parents:
diff changeset
   324
        if ( (bbox.iWidth > zero || bbox.iHeight > zero) && ( displayValue !=  KDisplayEnumNone ) )    // Ignore area-less elements
hgs
parents:
diff changeset
   325
        {
hgs
parents:
diff changeset
   326
            if ( bbox.iX < aXmin )
hgs
parents:
diff changeset
   327
                aXmin = bbox.iX;
hgs
parents:
diff changeset
   328
            if ( bbox.iY < aYmin )
hgs
parents:
diff changeset
   329
                aYmin = bbox.iY;
hgs
parents:
diff changeset
   330
            if ( bbox.iX + bbox.iWidth > aXmax )
hgs
parents:
diff changeset
   331
                aXmax = bbox.iX + bbox.iWidth;
hgs
parents:
diff changeset
   332
            if ( bbox.iY + bbox.iHeight > aYmax )
hgs
parents:
diff changeset
   333
                aYmax = bbox.iY + bbox.iHeight;
hgs
parents:
diff changeset
   334
            }
hgs
parents:
diff changeset
   335
        }
hgs
parents:
diff changeset
   336
      if (KSvgUseElement == (( CSvgElementImpl* )aStartElement)->ElemID()) 
hgs
parents:
diff changeset
   337
      return;
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
    CSvgElementImpl*element = ( CSvgElementImpl* )
hgs
parents:
diff changeset
   340
                              aStartElement->FirstChild();
hgs
parents:
diff changeset
   341
    TFloatFixPt tempXMin ;
hgs
parents:
diff changeset
   342
    TFloatFixPt tempYMin ;
hgs
parents:
diff changeset
   343
    TFloatFixPt tempXMax ;
hgs
parents:
diff changeset
   344
    TFloatFixPt tempYMax ;
hgs
parents:
diff changeset
   345
    
hgs
parents:
diff changeset
   346
    while ( element != NULL )
hgs
parents:
diff changeset
   347
    {
hgs
parents:
diff changeset
   348
                    
hgs
parents:
diff changeset
   349
        //Apply group level transformation if the group is not the original element. 
hgs
parents:
diff changeset
   350
        if( KSvgGElement == element->ElemID() )
hgs
parents:
diff changeset
   351
        {
hgs
parents:
diff changeset
   352
 			TFloatFixPt  xMin( KMAXFLOATFIX ), yMin( KMAXFLOATFIX ), xMax( KMINFLOATFIX ), yMax( KMINFLOATFIX );
hgs
parents:
diff changeset
   353
        	
hgs
parents:
diff changeset
   354
        	tempXMin = KMAXFLOATFIX ;
hgs
parents:
diff changeset
   355
        	tempYMin = KMAXFLOATFIX ;
hgs
parents:
diff changeset
   356
        	tempXMax = KMINFLOATFIX ;
hgs
parents:
diff changeset
   357
        	tempYMax = KMINFLOATFIX ;
hgs
parents:
diff changeset
   358
        	
hgs
parents:
diff changeset
   359
        	GetGroupBoundingInternalUnscaled( tempXMin, tempYMin, tempXMax, tempYMax, element );	
hgs
parents:
diff changeset
   360
           	if((tempXMax > tempXMin)&&(tempYMax > tempYMin)) 
hgs
parents:
diff changeset
   361
           	    {
hgs
parents:
diff changeset
   362
           	    TGfxRectangle2D rect(tempXMin, tempYMin, tempXMax - tempXMin, tempYMax - tempYMin);
hgs
parents:
diff changeset
   363
        	
hgs
parents:
diff changeset
   364
        	    MSvgTransformList*  trList;
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
        	    TGfxAffineTransform lElementTransform;
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
                element->GetTransform( trList );
hgs
parents:
diff changeset
   369
                lElementTransform = trList->Consolidate( element->IsOverwriteTransforms() );
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
        	    rect.GetBounds(lElementTransform, rect);
hgs
parents:
diff changeset
   372
        	
hgs
parents:
diff changeset
   373
        	    tempXMin = rect.iX ;
hgs
parents:
diff changeset
   374
        	    tempYMin = rect.iY ;
hgs
parents:
diff changeset
   375
        	    tempXMax = rect.iX + rect.iWidth ;
hgs
parents:
diff changeset
   376
        	    tempYMax = rect.iY + rect.iHeight ; 
hgs
parents:
diff changeset
   377
        	
hgs
parents:
diff changeset
   378
        	    if( tempXMin < aXmin )
hgs
parents:
diff changeset
   379
        		    aXmin = tempXMin ;
hgs
parents:
diff changeset
   380
        	    if( tempYMin < aYmin )
hgs
parents:
diff changeset
   381
        		    aYmin = tempYMin ;
hgs
parents:
diff changeset
   382
        	    if( tempXMax > aXmax )
hgs
parents:
diff changeset
   383
        		    aXmax = tempXMax ;
hgs
parents:
diff changeset
   384
        	    if( tempYMax > aYmax )
hgs
parents:
diff changeset
   385
        		    aYmax = tempYMax ;
hgs
parents:
diff changeset
   386
           	    }
hgs
parents:
diff changeset
   387
        }
hgs
parents:
diff changeset
   388
        else
hgs
parents:
diff changeset
   389
        {
hgs
parents:
diff changeset
   390
        	GetGroupBoundingInternalUnscaled( aXmin, aYmin, aXmax, aYmax, element );	
hgs
parents:
diff changeset
   391
        }
hgs
parents:
diff changeset
   392
        
hgs
parents:
diff changeset
   393
        element = ( CSvgElementImpl * ) element->NextSibling();
hgs
parents:
diff changeset
   394
    }
hgs
parents:
diff changeset
   395
        
hgs
parents:
diff changeset
   396
}
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
// perform a deep clone of this object
hgs
parents:
diff changeset
   399
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   400
//
hgs
parents:
diff changeset
   401
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   402
MXmlElement* CSvgGElementImpl::CloneL(MXmlElement* aParentElement)
hgs
parents:
diff changeset
   403
    {
hgs
parents:
diff changeset
   404
    // create new g element
hgs
parents:
diff changeset
   405
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   406
//
hgs
parents:
diff changeset
   407
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   408
	CSvgGElementImpl* newElement = CSvgGElementImpl::NewL(  this->ElemID(), ((CSvgDocumentImpl*)iOwnerDocument) );
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
	CleanupStack::PushL(newElement);
hgs
parents:
diff changeset
   412
	newElement->iParentNode = aParentElement;
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
    // copy everything over
hgs
parents:
diff changeset
   415
    this->CopyL(newElement);
hgs
parents:
diff changeset
   416
	CleanupStack::Pop();
hgs
parents:
diff changeset
   417
    return newElement;
hgs
parents:
diff changeset
   418
    }
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
// perform a deep copy of this object
hgs
parents:
diff changeset
   421
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   422
//
hgs
parents:
diff changeset
   423
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   424
void CSvgGElementImpl::CopyL( CSvgGElementImpl* aDestElement )
hgs
parents:
diff changeset
   425
    {
hgs
parents:
diff changeset
   426
    if(aDestElement)
hgs
parents:
diff changeset
   427
	    {
hgs
parents:
diff changeset
   428
	    // copy stuff from superclass
hgs
parents:
diff changeset
   429
	    this->CSvgElementImpl::CopyL(aDestElement);
hgs
parents:
diff changeset
   430
	    // copy the reference to idoc (CSvgDocumentImpl)
hgs
parents:
diff changeset
   431
	    aDestElement->iOwnerDocument = this->iOwnerDocument;
hgs
parents:
diff changeset
   432
	    }
hgs
parents:
diff changeset
   433
    }
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   436
//
hgs
parents:
diff changeset
   437
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   438
void CSvgGElementImpl::GetBBox( TGfxRectangle2D& aBbox )
hgs
parents:
diff changeset
   439
    {
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
    // if there are not any children then the bbox should be NULL
hgs
parents:
diff changeset
   442
    if (!HasChildNodes())
hgs
parents:
diff changeset
   443
    {
hgs
parents:
diff changeset
   444
    	return;
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
    CSvgGElementImpl::GetGroupBounding( aBbox, this );
hgs
parents:
diff changeset
   448
    }
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   451
//
hgs
parents:
diff changeset
   452
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   453
void CSvgGElementImpl::GetUnscaledBBox( TGfxRectangle2D& aBbox )
hgs
parents:
diff changeset
   454
    {
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
    // if there are not any children then the bbox should be NULL
hgs
parents:
diff changeset
   457
    if (!HasChildNodes())
hgs
parents:
diff changeset
   458
    {
hgs
parents:
diff changeset
   459
    	return;
hgs
parents:
diff changeset
   460
    }
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
    CSvgGElementImpl::GetGroupBoundingUnscaled( aBbox, this );
hgs
parents:
diff changeset
   463
    }
hgs
parents:
diff changeset
   464
hgs
parents:
diff changeset
   465
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   466
//
hgs
parents:
diff changeset
   467
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   468
void CSvgGElementImpl::Print( TBool aIsEncodeOn )
hgs
parents:
diff changeset
   469
{
hgs
parents:
diff changeset
   470
	if (!aIsEncodeOn)
hgs
parents:
diff changeset
   471
	{
hgs
parents:
diff changeset
   472
		#ifdef _DEBUG
hgs
parents:
diff changeset
   473
		RDebug::Printf("<g>");
hgs
parents:
diff changeset
   474
		#endif
hgs
parents:
diff changeset
   475
	}
hgs
parents:
diff changeset
   476
}