svgtopt/SVG/SVGEngine/src/SVGEngineInterfaceImpl.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
child 19 df65ec4f2d28
child 38 db5c883ad1c5
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 Engine 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 "SVGEngineImpl.h"
hgs
parents:
diff changeset
    20
#include "SVGEngineInterfaceImpl.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "GfxAffineTransform.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "SVGTimer.h"
hgs
parents:
diff changeset
    25
#include "SVGSvgElementImpl.h"
hgs
parents:
diff changeset
    26
//#include "SVGTransformableImpl.h"
hgs
parents:
diff changeset
    27
//#include "SVGSchemaData.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
//#include "GfxPoint2D.h"
hgs
parents:
diff changeset
    30
//#include "GfxRectangle2D.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#include "SVGErrorImpl.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// added for JSR support
hgs
parents:
diff changeset
    35
#include  "SVGRectElementImpl.h"
hgs
parents:
diff changeset
    36
#include "SVGAnimationBase.h"
hgs
parents:
diff changeset
    37
#include "e32math.h"
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
//#include "SVGFourPointRect.h"
hgs
parents:
diff changeset
    40
#include "SVGTextElementImpl.h"
hgs
parents:
diff changeset
    41
#include "SVGTextAreaElementImpl.h"
hgs
parents:
diff changeset
    42
#include "SVGListener.h"
hgs
parents:
diff changeset
    43
#include "SVGUseElementImpl.h"
hgs
parents:
diff changeset
    44
//#include "SvgEventHandler.h"
hgs
parents:
diff changeset
    45
#include "SVGMediaAnimationElementImpl.h"
hgs
parents:
diff changeset
    46
#include <AknUtils.h>
hgs
parents:
diff changeset
    47
#include <avkon.hrh>
hgs
parents:
diff changeset
    48
#include "SvgBitmapFontProvider.h"
hgs
parents:
diff changeset
    49
#include "SvgStopElementImpl.h"
hgs
parents:
diff changeset
    50
#include "SVGGradientElementImpl.h"
hgs
parents:
diff changeset
    51
#include <utf.h>
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
#define  SvgUnitPixels  1
hgs
parents:
diff changeset
    54
#define  SvgUnitPercent 2
hgs
parents:
diff changeset
    55
#define  KBackgroundColor 0xffffffff
hgs
parents:
diff changeset
    56
_LIT(OFFSET, "offset");
hgs
parents:
diff changeset
    57
_LIT(ZEROVALUE, "0");
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
// EXPORT_C CSvgEngineInterfaceImpl* CSvgEngineInterfaceImpl::NewL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
    61
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
EXPORT_C CSvgEngineInterfaceImpl* CSvgEngineInterfaceImpl::NewL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
    63
                                                       MSvgRequestObserver* aReqObserver, TFontSpec& aFontSpec )
hgs
parents:
diff changeset
    64
    {
hgs
parents:
diff changeset
    65
    CSvgEngineInterfaceImpl* self    = new ( ELeave ) CSvgEngineInterfaceImpl;
hgs
parents:
diff changeset
    66
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    67
    self->ConstructL( aFrameBuffer, aReqObserver,aFontSpec );
hgs
parents:
diff changeset
    68
    CleanupStack::Pop();
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
    return self;
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
EXPORT_C CSvgEngineInterfaceImpl* CSvgEngineInterfaceImpl::NewL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
                                                       MSvgRequestObserver* aReqObserver, TFontSpec& aFontSpec ,SVGRendererId aRendererType)
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
    {
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    CSvgEngineInterfaceImpl* self    = new ( ELeave ) CSvgEngineInterfaceImpl;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    self->ConstructL( aFrameBuffer, aReqObserver,aFontSpec,aRendererType );
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    CleanupStack::Pop();
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
    return self;
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
// EXPORT_C CSvgEngineInterfaceImpl* CSvgEngineInterfaceImpl::NewLC( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
EXPORT_C CSvgEngineInterfaceImpl* CSvgEngineInterfaceImpl::NewLC( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
    96
                                                        MSvgRequestObserver* aReqObserver,TFontSpec& aFontSpec )
hgs
parents:
diff changeset
    97
    {
hgs
parents:
diff changeset
    98
    CSvgEngineInterfaceImpl* self    = new ( ELeave ) CSvgEngineInterfaceImpl;
hgs
parents:
diff changeset
    99
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   100
    self->ConstructL( aFrameBuffer, aReqObserver,aFontSpec );
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
    return self;
hgs
parents:
diff changeset
   103
    }
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
EXPORT_C CSvgEngineInterfaceImpl* CSvgEngineInterfaceImpl::NewLC( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
                                                        MSvgRequestObserver* aReqObserver,TFontSpec& aFontSpec ,SVGRendererId aRendererType)
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    CSvgEngineInterfaceImpl* self    = new ( ELeave ) CSvgEngineInterfaceImpl;
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    self->ConstructL( aFrameBuffer, aReqObserver,aFontSpec,aRendererType );
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
    return self;
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    }
hgs
parents:
diff changeset
   123
// EXPORT_C CSvgEngineInterfaceImpl::CSvgEngineInterfaceImpl()
hgs
parents:
diff changeset
   124
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   125
EXPORT_C CSvgEngineInterfaceImpl::CSvgEngineInterfaceImpl()
hgs
parents:
diff changeset
   126
    {
hgs
parents:
diff changeset
   127
    iIsLoadingRequest = EFalse;
hgs
parents:
diff changeset
   128
    iMouseDownFlag = EFalse;
hgs
parents:
diff changeset
   129
    iDrmRightsConsumptionEnabled = ETrue;
hgs
parents:
diff changeset
   130
    }
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   133
// EXPORT_C void CSvgEngineInterfaceImpl::ConstructL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   134
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
EXPORT_C void CSvgEngineInterfaceImpl::ConstructL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   136
                                     MSvgRequestObserver* aReqObserver,TFontSpec& aFontSpec )
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
    iSvgBitmapFontProvider = CSvgBitmapFontProvider::NewL( aFontSpec );
hgs
parents:
diff changeset
   139
    iSvgEngine = CSvgEngineImpl::NewL( aFrameBuffer, aReqObserver,aFontSpec, iSvgBitmapFontProvider );
hgs
parents:
diff changeset
   140
    iSvgEnginePointers.Append(iSvgEngine);
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
    SetDRMMode( ETrue );
hgs
parents:
diff changeset
   143
    SetThumbNailMode( EFalse );
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
    iFileIsLoaded = EFalse;
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
    iTotalRotation= 0;
hgs
parents:
diff changeset
   148
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   149
    
hgs
parents:
diff changeset
   150
//	Not needed since no more VGR. Causes issues when multiple 
hgs
parents:
diff changeset
   151
//  contexts are created by multiple engines...	
hgs
parents:
diff changeset
   152
//  CustomOption(ETrue);	
hgs
parents:
diff changeset
   153
    }
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
//NGA :: Renderer selector included
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
// EXPORT_C void CSvgEngineInterfaceImpl::ConstructL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
EXPORT_C void CSvgEngineInterfaceImpl::ConstructL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
                                     MSvgRequestObserver* aReqObserver,TFontSpec& aFontSpec,SVGRendererId aRendererType )
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    {
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
    iSvgBitmapFontProvider = CSvgBitmapFontProvider::NewL( aFontSpec );
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    iSvgEngine = CSvgEngineImpl::NewL( aFrameBuffer, aReqObserver,aFontSpec, iSvgBitmapFontProvider ,aRendererType);
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
    iSvgEnginePointers.Append(iSvgEngine);
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    SetDRMMode( ETrue );
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
    SetThumbNailMode( EFalse );
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
    iFileIsLoaded = EFalse;
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
    iTotalRotation= 0;
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
//	Not needed since no more VGR. Causes issues when multiple 
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
//  contexts are created by multiple engines...	
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
//  CustomOption(ETrue);	
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
// EXPORT_C void CSvgEngineInterfaceImpl::ConstructL()
hgs
parents:
diff changeset
   201
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   202
EXPORT_C void CSvgEngineInterfaceImpl::ConstructL()
hgs
parents:
diff changeset
   203
    {
hgs
parents:
diff changeset
   204
    iSvgEngine = NULL;
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    iFileIsLoaded = EFalse;
hgs
parents:
diff changeset
   207
    iTotalRotation= 0;
hgs
parents:
diff changeset
   208
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
    //Added to populated the font spec with variant default font
hgs
parents:
diff changeset
   211
    const TInt KApacFontId = EApacPlain16;
hgs
parents:
diff changeset
   212
    const TInt KLatintFontId = ELatinBold12;
hgs
parents:
diff changeset
   213
    TInt fontId = KLatintFontId;
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    switch ( AknLayoutUtils::Variant() )
hgs
parents:
diff changeset
   216
        {
hgs
parents:
diff changeset
   217
        case EApacVariant:
hgs
parents:
diff changeset
   218
            {
hgs
parents:
diff changeset
   219
            fontId = KApacFontId;
hgs
parents:
diff changeset
   220
            }
hgs
parents:
diff changeset
   221
            break;
hgs
parents:
diff changeset
   222
        case EEuropeanVariant:
hgs
parents:
diff changeset
   223
        default:
hgs
parents:
diff changeset
   224
            break;
hgs
parents:
diff changeset
   225
        }
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
    const CFont* font = AknLayoutUtils::FontFromId( fontId );
hgs
parents:
diff changeset
   228
    TFontSpec spec = font->FontSpecInTwips();
hgs
parents:
diff changeset
   229
	iSvgBitmapFontProvider = CSvgBitmapFontProvider::NewL( spec );
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
//	Not needed since no more VGR. Causes issues when multiple 
hgs
parents:
diff changeset
   232
//  contexts are created by multiple engines...		
hgs
parents:
diff changeset
   233
//  CustomOption(ETrue);
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
    }
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
EXPORT_C void CSvgEngineInterfaceImpl::ConstructL(TFontSpec& aFontSpec)
hgs
parents:
diff changeset
   238
    {
hgs
parents:
diff changeset
   239
    iSvgEngine = NULL;
hgs
parents:
diff changeset
   240
    iFileIsLoaded = EFalse;
hgs
parents:
diff changeset
   241
    iTotalRotation= 0;
hgs
parents:
diff changeset
   242
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   243
	iSvgBitmapFontProvider = CSvgBitmapFontProvider::NewL( aFontSpec );
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   246
// EXPORT_C CSvgEngineInterfaceImpl::~CSvgEngineInterfaceImpl()
hgs
parents:
diff changeset
   247
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   248
EXPORT_C CSvgEngineInterfaceImpl::~CSvgEngineInterfaceImpl()
hgs
parents:
diff changeset
   249
    {
hgs
parents:
diff changeset
   250
    iSvgDocumentPointers.ResetAndDestroy();
hgs
parents:
diff changeset
   251
    iSvgDocumentPointers.Close();
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
	iSvgEnginePointers.ResetAndDestroy();
hgs
parents:
diff changeset
   254
	iSvgEnginePointers.Close();
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
    delete iSvgBitmapFontProvider ;
hgs
parents:
diff changeset
   257
    //delete iTimer;
hgs
parents:
diff changeset
   258
    if(iSvgError)
hgs
parents:
diff changeset
   259
        {
hgs
parents:
diff changeset
   260
    delete iSvgError;
hgs
parents:
diff changeset
   261
        iSvgError = NULL;
hgs
parents:
diff changeset
   262
        }
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
    iSvgLoadingListeners.Close();
hgs
parents:
diff changeset
   265
    iSvgMouseEnteredElements.Close();
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
//DEPRECATED API
hgs
parents:
diff changeset
   270
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   271
// EXPORT_C void CSvgEngineInterfaceImpl::Destroy()
hgs
parents:
diff changeset
   272
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   273
EXPORT_C void CSvgEngineInterfaceImpl::Destroy()
hgs
parents:
diff changeset
   274
    {
hgs
parents:
diff changeset
   275
    	DestroyDocument(iSvgLoadedDocument);
hgs
parents:
diff changeset
   276
    	iSvgLoadedDocument = NULL;
hgs
parents:
diff changeset
   277
    }
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   280
// void CSvgEngineInterfaceImpl::PostLoadProcessing( TInt aDocumentHandle )
hgs
parents:
diff changeset
   281
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   282
void CSvgEngineInterfaceImpl::PostLoadProcessing( TInt /* aDocumentHandle */ )
hgs
parents:
diff changeset
   283
    {
hgs
parents:
diff changeset
   284
    }
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   287
//Deprecated for platform security
hgs
parents:
diff changeset
   288
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   289
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::Load( const TDesC& aFileName )
hgs
parents:
diff changeset
   290
    {
hgs
parents:
diff changeset
   291
    TInt documentHandle = 0;
hgs
parents:
diff changeset
   292
    iTotalRotation = 0;
hgs
parents:
diff changeset
   293
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
    // Destroy current loaded document.
hgs
parents:
diff changeset
   296
    DestroyDocument(iSvgLoadedDocument);
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
    iIsLoadingRequest = ETrue;
hgs
parents:
diff changeset
   299
    TRAPD( error, iSvgEngine->iSvgNames->AppendL(aFileName));
hgs
parents:
diff changeset
   300
        
hgs
parents:
diff changeset
   301
    if( error != KErrNone )
hgs
parents:
diff changeset
   302
        {
hgs
parents:
diff changeset
   303
        _LIT( KErrorMsg, "Failed to Append filename" );
hgs
parents:
diff changeset
   304
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, error,KErrorMsg, aFileName );
hgs
parents:
diff changeset
   305
         return iSvgError;
hgs
parents:
diff changeset
   306
        }
hgs
parents:
diff changeset
   307
    
hgs
parents:
diff changeset
   308
    PrepareDom( aFileName, documentHandle );
hgs
parents:
diff changeset
   309
    iIsLoadingRequest = EFalse;
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
    if ( iSvgError->HasError() && !iSvgError->IsWarning() )
hgs
parents:
diff changeset
   312
    {
hgs
parents:
diff changeset
   313
        return iSvgError;
hgs
parents:
diff changeset
   314
    }
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
    PostLoadProcessing( documentHandle );
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
    iSvgLoadedDocument = (CSvgDocumentImpl*)documentHandle;
hgs
parents:
diff changeset
   319
    return iSvgError;
hgs
parents:
diff changeset
   320
}
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   323
// Modified Load function to take RFile aHandle.
hgs
parents:
diff changeset
   324
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   325
EXPORT_C MSvgError*  CSvgEngineInterfaceImpl::Load( RFile& aFileHandle)
hgs
parents:
diff changeset
   326
    {
hgs
parents:
diff changeset
   327
    TInt documentHandle = 0;
hgs
parents:
diff changeset
   328
    iTotalRotation = 0;
hgs
parents:
diff changeset
   329
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
    // Destroy current loaded document.
hgs
parents:
diff changeset
   332
    DestroyDocument(iSvgLoadedDocument);
hgs
parents:
diff changeset
   333
    
hgs
parents:
diff changeset
   334
    TFileName fileName;
hgs
parents:
diff changeset
   335
    aFileHandle.Name(fileName);
hgs
parents:
diff changeset
   336
    iSvgEngine->iSvgNames->AppendL(fileName);
hgs
parents:
diff changeset
   337
    iIsLoadingRequest = ETrue;
hgs
parents:
diff changeset
   338
    PrepareDom( aFileHandle, documentHandle );
hgs
parents:
diff changeset
   339
    iIsLoadingRequest = EFalse;
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
    if ( iSvgError->HasError() && !iSvgError->IsWarning() )
hgs
parents:
diff changeset
   342
    {
hgs
parents:
diff changeset
   343
        return iSvgError;
hgs
parents:
diff changeset
   344
    }
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
    PostLoadProcessing( documentHandle );
hgs
parents:
diff changeset
   347
	iSvgLoadedDocument = (CSvgDocumentImpl*)documentHandle;
hgs
parents:
diff changeset
   348
    return iSvgError;
hgs
parents:
diff changeset
   349
    }
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   352
// Modified Load function which in turn calls the generic LoadL function
hgs
parents:
diff changeset
   353
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   354
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::Load( const TDesC8& aByteData )
hgs
parents:
diff changeset
   355
    {
hgs
parents:
diff changeset
   356
    TInt documentHandle = 0;
hgs
parents:
diff changeset
   357
    iTotalRotation = 0;
hgs
parents:
diff changeset
   358
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
    // Destroy current loaded document.
hgs
parents:
diff changeset
   361
    DestroyDocument(iSvgLoadedDocument);
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
    iIsLoadingRequest = ETrue;
hgs
parents:
diff changeset
   364
    PrepareDom( aByteData, documentHandle );
hgs
parents:
diff changeset
   365
    iIsLoadingRequest = EFalse;
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
    if ( iSvgError->HasError() && !iSvgError->IsWarning() )
hgs
parents:
diff changeset
   368
    {
hgs
parents:
diff changeset
   369
        return iSvgError;
hgs
parents:
diff changeset
   370
    }
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
    PostLoadProcessing( documentHandle );
hgs
parents:
diff changeset
   373
	iSvgLoadedDocument = (CSvgDocumentImpl*)documentHandle;
hgs
parents:
diff changeset
   374
    return iSvgError;
hgs
parents:
diff changeset
   375
    }
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   378
// EXPORT_C void CSvgEngineInterfaceImpl::Start( CSvgEngineImpl* aEngine
hgs
parents:
diff changeset
   379
//                                                  , TBool /*aIsMainThread*/ )
hgs
parents:
diff changeset
   380
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   381
EXPORT_C void CSvgEngineInterfaceImpl::Start( CSvgEngineImpl* aEngine,
hgs
parents:
diff changeset
   382
                                              TBool /*aIsMainThread*/ )
hgs
parents:
diff changeset
   383
    {
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
    if ( ChooseEngine((TInt)aEngine) )
hgs
parents:
diff changeset
   386
        {
hgs
parents:
diff changeset
   387
        iSvgEngine->SetMediaTime(0);
hgs
parents:
diff changeset
   388
        iSvgEngine->ResetTimer();
hgs
parents:
diff changeset
   389
        iSvgEngine->StartEngine();
hgs
parents:
diff changeset
   390
        }
hgs
parents:
diff changeset
   391
    }
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
// -----------------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   395
// EXPORT_C void CSvgEngineInterfaceImpl::Start( CSvgEngineImpl* aEngine,TBool /*aIsMainThread*/ )
hgs
parents:
diff changeset
   396
// -----------------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
EXPORT_C void CSvgEngineInterfaceImpl::Start( MSvgError*& aError,
hgs
parents:
diff changeset
   399
                                              CSvgEngineImpl* aEngine
hgs
parents:
diff changeset
   400
                                            )
hgs
parents:
diff changeset
   401
    {
hgs
parents:
diff changeset
   402
    
hgs
parents:
diff changeset
   403
    if ( ChooseEngine((TInt)aEngine) )
hgs
parents:
diff changeset
   404
        {
hgs
parents:
diff changeset
   405
            iSvgEngine->SetMediaTime(0);
hgs
parents:
diff changeset
   406
            iSvgEngine->ResetTimer();
hgs
parents:
diff changeset
   407
            iSvgEngine->StartEngine(iSvgError); 
hgs
parents:
diff changeset
   408
        }
hgs
parents:
diff changeset
   409
        
hgs
parents:
diff changeset
   410
        aError = iSvgError;
hgs
parents:
diff changeset
   411
    }
hgs
parents:
diff changeset
   412
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   413
// EXPORT_C void CSvgEngineInterfaceImpl::Pause( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   414
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   415
EXPORT_C void CSvgEngineInterfaceImpl::Pause( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   416
    {
hgs
parents:
diff changeset
   417
    	if ( ChooseEngine((TInt)aEngine) )
hgs
parents:
diff changeset
   418
    	{
hgs
parents:
diff changeset
   419
    	    iSvgEngine->SetSVGEngineState(ESVGEnginePaused);
hgs
parents:
diff changeset
   420
    	}
hgs
parents:
diff changeset
   421
    }
hgs
parents:
diff changeset
   422
hgs
parents:
diff changeset
   423
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   424
// EXPORT_C void CSvgEngineInterfaceImpl::Stop( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   425
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   426
EXPORT_C void CSvgEngineInterfaceImpl::Stop( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   427
    {
hgs
parents:
diff changeset
   428
    	if ( ChooseEngine((TInt)aEngine) )
hgs
parents:
diff changeset
   429
        {
hgs
parents:
diff changeset
   430
            iSvgEngine->SetSVGEngineState(ESVGEngineStopped);
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
            if (iSvgEngine->Document() && iSvgEngine->Document()->IsAnimationFile())
hgs
parents:
diff changeset
   433
            {
hgs
parents:
diff changeset
   434
            // restore some properties that changed during animation
hgs
parents:
diff changeset
   435
 //           RestoreAnimStyleProperties();
hgs
parents:
diff changeset
   436
            }
hgs
parents:
diff changeset
   437
        }
hgs
parents:
diff changeset
   438
    }
hgs
parents:
diff changeset
   439
hgs
parents:
diff changeset
   440
// Store properties that were changed during animation
hgs
parents:
diff changeset
   441
//
hgs
parents:
diff changeset
   442
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   443
// void CSvgEngineInterfaceImpl::RestoreAnimStyleProperties()
hgs
parents:
diff changeset
   444
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   445
void CSvgEngineInterfaceImpl::RestoreAnimStyleProperties( TInt aEngine )
hgs
parents:
diff changeset
   446
    {
hgs
parents:
diff changeset
   447
    if ( ChooseEngine(aEngine) && iSvgEngine->Document())
hgs
parents:
diff changeset
   448
        {
hgs
parents:
diff changeset
   449
        RPointerArray<CSvgElementImpl> all_elements;
hgs
parents:
diff changeset
   450
        iSvgEngine->Document()->FindAllElements(
hgs
parents:
diff changeset
   451
            (CSvgElementImpl* )iSvgEngine->Document()->RootElement(), -1, all_elements );
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
		TInt allEleCnt = all_elements.Count();
hgs
parents:
diff changeset
   454
        for (TInt i=0; i < allEleCnt; i++ )
hgs
parents:
diff changeset
   455
            {
hgs
parents:
diff changeset
   456
            // make sure that this is an animation element.
hgs
parents:
diff changeset
   457
            if( all_elements[i]->IsAnimatedElement() )
hgs
parents:
diff changeset
   458
                {
hgs
parents:
diff changeset
   459
                CSvgAnimationBase*
hgs
parents:
diff changeset
   460
                    lAnimationBasePtr = (CSvgAnimationBase*)all_elements[i];
hgs
parents:
diff changeset
   461
                if ( !lAnimationBasePtr->IsFillFreeze() )
hgs
parents:
diff changeset
   462
                    {
hgs
parents:
diff changeset
   463
                    TRAPD(err, lAnimationBasePtr->ResetAttrValueL());    
hgs
parents:
diff changeset
   464
                        if ( err != KErrNone )
hgs
parents:
diff changeset
   465
                        {
hgs
parents:
diff changeset
   466
                         #ifdef _DEBUG
hgs
parents:
diff changeset
   467
                         RDebug::Printf("CSvgEngineInterfaceImpl::RestoreAnimStylePropertiesL() failed");
hgs
parents:
diff changeset
   468
                         #endif
hgs
parents:
diff changeset
   469
                        }
hgs
parents:
diff changeset
   470
                    }
hgs
parents:
diff changeset
   471
                
hgs
parents:
diff changeset
   472
                
hgs
parents:
diff changeset
   473
                }
hgs
parents:
diff changeset
   474
            }
hgs
parents:
diff changeset
   475
        all_elements.Close();
hgs
parents:
diff changeset
   476
        }
hgs
parents:
diff changeset
   477
    }
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   482
// EXPORT_C void CSvgEngineInterfaceImpl::Resume( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   483
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   484
EXPORT_C void CSvgEngineInterfaceImpl::Resume( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
   485
    {
hgs
parents:
diff changeset
   486
    	if ( ChooseEngine((TInt)aEngine) )
hgs
parents:
diff changeset
   487
    	{
hgs
parents:
diff changeset
   488
            iSvgEngine->SetSVGEngineState(ESVGEngineRunning);
hgs
parents:
diff changeset
   489
        }
hgs
parents:
diff changeset
   490
    }
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   493
// EXPORT_C TUint32 CSvgEngineInterfaceImpl::Duration()
hgs
parents:
diff changeset
   494
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   495
EXPORT_C TUint32 CSvgEngineInterfaceImpl::Duration( TInt aEngine )
hgs
parents:
diff changeset
   496
    {
hgs
parents:
diff changeset
   497
hgs
parents:
diff changeset
   498
    	if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
   499
    	{
hgs
parents:
diff changeset
   500
    		return ( iSvgEngine->Duration() );
hgs
parents:
diff changeset
   501
    	}
hgs
parents:
diff changeset
   502
    	else
hgs
parents:
diff changeset
   503
    	{
hgs
parents:
diff changeset
   504
    		return 0;
hgs
parents:
diff changeset
   505
   		}
hgs
parents:
diff changeset
   506
    }
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   509
// EXPORT_C void CSvgEngineInterfaceImpl::OriginalView()
hgs
parents:
diff changeset
   510
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   511
EXPORT_C void CSvgEngineInterfaceImpl::OriginalView( TInt aEngine )
hgs
parents:
diff changeset
   512
    {
hgs
parents:
diff changeset
   513
    MSvgTransformList*  trList;
hgs
parents:
diff changeset
   514
    iTotalRotation= 0;
hgs
parents:
diff changeset
   515
    if ( ChooseEngine(aEngine) && iSvgEngine->Document() )
hgs
parents:
diff changeset
   516
        {
hgs
parents:
diff changeset
   517
        CSvgSvgElementImpl* lRoot   = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
   518
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
   519
        if ( lRoot && lRoot->GetZoomAndPan() == ESvgZoomAndPanMagnify )
hgs
parents:
diff changeset
   520
            {
hgs
parents:
diff changeset
   521
            lRoot->GetTransform( trList );
hgs
parents:
diff changeset
   522
            trList->ReplaceItem( TGfxAffineTransform(), 0 );
hgs
parents:
diff changeset
   523
            }
hgs
parents:
diff changeset
   524
        }
hgs
parents:
diff changeset
   525
    }
hgs
parents:
diff changeset
   526
hgs
parents:
diff changeset
   527
//
hgs
parents:
diff changeset
   528
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   529
// EXPORT_C void CSvgEngineInterfaceImpl::SetRenderQuality( TRenderingQuality aQualityLevel )
hgs
parents:
diff changeset
   530
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   531
EXPORT_C void CSvgEngineInterfaceImpl::SetRenderQuality( TRenderingQuality aQualityLevel, TInt aEngine )
hgs
parents:
diff changeset
   532
    {
hgs
parents:
diff changeset
   533
    
hgs
parents:
diff changeset
   534
    if( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
   535
    {
hgs
parents:
diff changeset
   536
    	iSvgEngine->SetRenderingQuality(aQualityLevel);
hgs
parents:
diff changeset
   537
    }
hgs
parents:
diff changeset
   538
hgs
parents:
diff changeset
   539
    }
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   543
// EXPORT_C TRenderingQuality CSvgEngineInterfaceImpl::GetRenderQuality()
hgs
parents:
diff changeset
   544
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   545
EXPORT_C TRenderingQuality CSvgEngineInterfaceImpl::GetRenderQuality()
hgs
parents:
diff changeset
   546
    {
hgs
parents:
diff changeset
   547
    return ( KLowAA );
hgs
parents:
diff changeset
   548
    }
hgs
parents:
diff changeset
   549
hgs
parents:
diff changeset
   550
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   551
// EXPORT_C void CSvgEngineInterfaceImpl::SetAnimFrameDuration( TUint aAFDur )
hgs
parents:
diff changeset
   552
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   553
EXPORT_C void CSvgEngineInterfaceImpl::SetAnimFrameDuration( TUint aAFDur, TInt aEngine )
hgs
parents:
diff changeset
   554
    {
hgs
parents:
diff changeset
   555
    	if (ChooseEngine(aEngine))
hgs
parents:
diff changeset
   556
    	{
hgs
parents:
diff changeset
   557
    		iSvgEngine->ChangeDuration( aAFDur );
hgs
parents:
diff changeset
   558
    	}
hgs
parents:
diff changeset
   559
    }
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   562
// EXPORT_C void CSvgEngineInterfaceImpl::Redraw( TBool aIsMainThread )
hgs
parents:
diff changeset
   563
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   564
EXPORT_C void CSvgEngineInterfaceImpl::Redraw( TBool /*aIsMainThread*/, TInt aEngine )
hgs
parents:
diff changeset
   565
    {
hgs
parents:
diff changeset
   566
    if ( !ChooseEngine(aEngine) )
hgs
parents:
diff changeset
   567
        {
hgs
parents:
diff changeset
   568
        return;
hgs
parents:
diff changeset
   569
        }
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
    CSvgDocumentImpl* document = iSvgEngine->Document();
hgs
parents:
diff changeset
   572
    if ( !document )
hgs
parents:
diff changeset
   573
        {
hgs
parents:
diff changeset
   574
        return;
hgs
parents:
diff changeset
   575
        }
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
    // This situation occurs when parsing is done in a separate thread then the draw thread
hgs
parents:
diff changeset
   578
    // Wait for pruning to complete or invalid element pointer may occur during drawing
hgs
parents:
diff changeset
   579
    if ( document->iIsPruningTree )
hgs
parents:
diff changeset
   580
        {
hgs
parents:
diff changeset
   581
        TInt waitCount = 0;
hgs
parents:
diff changeset
   582
        while ( waitCount++ < 100 && document->iIsPruningTree )
hgs
parents:
diff changeset
   583
            {
hgs
parents:
diff changeset
   584
            User::After( 10000 ); // 10 millseconds
hgs
parents:
diff changeset
   585
            }
hgs
parents:
diff changeset
   586
hgs
parents:
diff changeset
   587
        // Cannot wait any longer, prevent being stuck here
hgs
parents:
diff changeset
   588
        if ( document->iIsPruningTree )
hgs
parents:
diff changeset
   589
            {
hgs
parents:
diff changeset
   590
            return;
hgs
parents:
diff changeset
   591
            }
hgs
parents:
diff changeset
   592
        }
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
    TRAPD(redrawError, iSvgEngine->RedrawL() );
hgs
parents:
diff changeset
   595
    if( redrawError != KErrNone )
hgs
parents:
diff changeset
   596
        {
hgs
parents:
diff changeset
   597
        document->iIsRendering = EFalse;
hgs
parents:
diff changeset
   598
        }
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
    }
hgs
parents:
diff changeset
   601
hgs
parents:
diff changeset
   602
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   603
// EXPORT_C void CSvgEngineInterfaceImpl::SwitchDebugInfo( TInt aEngine )
hgs
parents:
diff changeset
   604
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
   605
EXPORT_C void CSvgEngineInterfaceImpl::SwitchDebugInfo( TInt aEngine )
hgs
parents:
diff changeset
   606
    {
hgs
parents:
diff changeset
   607
    	if (ChooseEngine( aEngine ))
hgs
parents:
diff changeset
   608
    	{
hgs
parents:
diff changeset
   609
hgs
parents:
diff changeset
   610
    	}
hgs
parents:
diff changeset
   611
    }
hgs
parents:
diff changeset
   612
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
//*****************************
hgs
parents:
diff changeset
   615
// UI event
hgs
parents:
diff changeset
   616
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   617
// EXPORT_C void CSvgEngineInterfaceImpl::MouseDown( TInt aX, TInt aY )
hgs
parents:
diff changeset
   618
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   619
EXPORT_C TInt CSvgEngineInterfaceImpl::MouseDown( TInt aX, TInt aY, TInt aEngine )
hgs
parents:
diff changeset
   620
    {
hgs
parents:
diff changeset
   621
hgs
parents:
diff changeset
   622
    if ( iMouseDownFlag || !ChooseEngine(aEngine) )
hgs
parents:
diff changeset
   623
    {
hgs
parents:
diff changeset
   624
    	return NULL;
hgs
parents:
diff changeset
   625
    }
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
    iMouseDownFlag = ETrue;
hgs
parents:
diff changeset
   628
hgs
parents:
diff changeset
   629
hgs
parents:
diff changeset
   630
    TSvgUiMouseEvent    uiev    ( ESvgEngineEventMouseDown, aX, aY );
hgs
parents:
diff changeset
   631
    TRAPD( error, iSvgEngine->ProcessEventL( iSvgEngine->Document(), &uiev ) );
hgs
parents:
diff changeset
   632
    if (error != KErrNone)
hgs
parents:
diff changeset
   633
        {
hgs
parents:
diff changeset
   634
        #ifdef _DEBUG
hgs
parents:
diff changeset
   635
        _LIT(KProcessEventFailed, "CSvgEngineInterfaceImpl::MouseDown: ProcessEventL error.");
hgs
parents:
diff changeset
   636
        RDebug::Print(KProcessEventFailed);
hgs
parents:
diff changeset
   637
        #endif //_DEBUG
hgs
parents:
diff changeset
   638
        }
hgs
parents:
diff changeset
   639
    // Process for MousePress
hgs
parents:
diff changeset
   640
    TInt listenerCount = iSvgEngine->MouseListenerCount();
hgs
parents:
diff changeset
   641
hgs
parents:
diff changeset
   642
    if (iSvgEngine->Document())
hgs
parents:
diff changeset
   643
    {
hgs
parents:
diff changeset
   644
        listenerCount += iSvgEngine->Document()->MouseInternalListenerCount();
hgs
parents:
diff changeset
   645
    }
hgs
parents:
diff changeset
   646
    if ( listenerCount == 0 )
hgs
parents:
diff changeset
   647
        {
hgs
parents:
diff changeset
   648
        return 0;
hgs
parents:
diff changeset
   649
        }
hgs
parents:
diff changeset
   650
    RPointerArray<CSvgElementImpl> viewableElements;
hgs
parents:
diff changeset
   651
    TInt topClickedElement = 0;
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
    iSvgEngine->GetViewableElementsAtPoint(iSvgEngine->Document(),viewableElements, aX, aY );
hgs
parents:
diff changeset
   654
    if ( viewableElements.Count() > 0 )
hgs
parents:
diff changeset
   655
        {
hgs
parents:
diff changeset
   656
        iSvgEngine->NotifyMousePressed( viewableElements, aX, aY );
hgs
parents:
diff changeset
   657
        if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
   658
            {
hgs
parents:
diff changeset
   659
            iSvgEngine->Document()->NotifyInternalMousePressed( viewableElements, aX, aY );
hgs
parents:
diff changeset
   660
            }
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
        topClickedElement = (TInt)viewableElements[viewableElements.Count()-1];
hgs
parents:
diff changeset
   663
        }
hgs
parents:
diff changeset
   664
    viewableElements.Close();
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
    return topClickedElement;
hgs
parents:
diff changeset
   667
    }
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   670
// EXPORT_C void CSvgEngineInterfaceImpl::MouseUp( TInt aX, TInt aY )
hgs
parents:
diff changeset
   671
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   672
EXPORT_C void CSvgEngineInterfaceImpl::MouseUp( TInt aX, TInt aY, TInt aEngine )
hgs
parents:
diff changeset
   673
    {
hgs
parents:
diff changeset
   674
    iMouseDownFlag = EFalse;
hgs
parents:
diff changeset
   675
hgs
parents:
diff changeset
   676
    if (!ChooseEngine( aEngine ))
hgs
parents:
diff changeset
   677
    {
hgs
parents:
diff changeset
   678
    	return;
hgs
parents:
diff changeset
   679
    }
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
    TSvgUiMouseEvent    uiev    ( ESvgEngineEventMouseUp, aX, aY );
hgs
parents:
diff changeset
   682
    TRAPD( error, iSvgEngine->ProcessEventL( iSvgEngine->Document(), &uiev ) );
hgs
parents:
diff changeset
   683
    if (error != KErrNone)
hgs
parents:
diff changeset
   684
        {
hgs
parents:
diff changeset
   685
        #ifdef _DEBUG
hgs
parents:
diff changeset
   686
        _LIT(KProcessEventFailed, "CSvgEngineInterfaceImpl::MouseUp: ProcessEventL error.");
hgs
parents:
diff changeset
   687
        RDebug::Print(KProcessEventFailed);
hgs
parents:
diff changeset
   688
        #endif //_DEBUG
hgs
parents:
diff changeset
   689
        }
hgs
parents:
diff changeset
   690
hgs
parents:
diff changeset
   691
    // Process for MouseRelease
hgs
parents:
diff changeset
   692
    TInt listenerCount = iSvgEngine->MouseListenerCount();
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
    if (iSvgEngine->Document())
hgs
parents:
diff changeset
   695
    {
hgs
parents:
diff changeset
   696
        listenerCount += iSvgEngine->Document()->MouseInternalListenerCount();
hgs
parents:
diff changeset
   697
    }
hgs
parents:
diff changeset
   698
    if ( listenerCount == 0 )
hgs
parents:
diff changeset
   699
        {
hgs
parents:
diff changeset
   700
        return;
hgs
parents:
diff changeset
   701
        }
hgs
parents:
diff changeset
   702
    RPointerArray<CSvgElementImpl> viewableElements;
hgs
parents:
diff changeset
   703
    iSvgEngine->GetViewableElementsAtPoint(iSvgEngine->Document(), viewableElements, aX, aY );
hgs
parents:
diff changeset
   704
    if ( viewableElements.Count() > 0 )
hgs
parents:
diff changeset
   705
        {
hgs
parents:
diff changeset
   706
        iSvgEngine->NotifyMouseReleased( viewableElements, aX, aY );
hgs
parents:
diff changeset
   707
        if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
   708
            {
hgs
parents:
diff changeset
   709
            iSvgEngine->Document()->NotifyInternalMouseReleased( viewableElements, aX, aY );
hgs
parents:
diff changeset
   710
            }
hgs
parents:
diff changeset
   711
        }
hgs
parents:
diff changeset
   712
    viewableElements.Close();
hgs
parents:
diff changeset
   713
    }
hgs
parents:
diff changeset
   714
hgs
parents:
diff changeset
   715
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   716
// EXPORT_C void CSvgEngineInterfaceImpl::MouseMove( TInt aX, TInt aY )
hgs
parents:
diff changeset
   717
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   718
EXPORT_C void CSvgEngineInterfaceImpl::MouseMove( TInt aX, TInt aY, TInt aEngine )
hgs
parents:
diff changeset
   719
    {
hgs
parents:
diff changeset
   720
hgs
parents:
diff changeset
   721
    if (!ChooseEngine( aEngine ))
hgs
parents:
diff changeset
   722
    {
hgs
parents:
diff changeset
   723
    	return;
hgs
parents:
diff changeset
   724
    }
hgs
parents:
diff changeset
   725
    RPointerArray<CSvgElementImpl> viewableElements;
hgs
parents:
diff changeset
   726
    iSvgEngine->GetViewableElementsAtPoint(iSvgEngine->Document(), viewableElements, aX, aY );
hgs
parents:
diff changeset
   727
    if( iSvgEngine->Document() && viewableElements.Count() )
hgs
parents:
diff changeset
   728
		{
hgs
parents:
diff changeset
   729
		iSvgEngine->Document()->SetCurFocusObject(viewableElements[viewableElements.Count()-1]);	
hgs
parents:
diff changeset
   730
		}
hgs
parents:
diff changeset
   731
hgs
parents:
diff changeset
   732
    TSvgUiMouseEvent    uiev    ( ESvgEngineEventMouseMove, aX, aY );
hgs
parents:
diff changeset
   733
    TRAPD( error, iSvgEngine->ProcessEventL( iSvgEngine->Document(), &uiev ) );
hgs
parents:
diff changeset
   734
    if (error != KErrNone)
hgs
parents:
diff changeset
   735
        {
hgs
parents:
diff changeset
   736
        #ifdef _DEBUG
hgs
parents:
diff changeset
   737
        _LIT(KProcessEventFailed, "CSvgEngineInterfaceImpl::MouseMove: ProcessEventL error.");
hgs
parents:
diff changeset
   738
        RDebug::Print(KProcessEventFailed);
hgs
parents:
diff changeset
   739
        #endif //_DEBUG
hgs
parents:
diff changeset
   740
        }
hgs
parents:
diff changeset
   741
hgs
parents:
diff changeset
   742
    // Process for Mouse enter/exit
hgs
parents:
diff changeset
   743
    TInt listenerCount = iSvgEngine->MouseListenerCount();
hgs
parents:
diff changeset
   744
hgs
parents:
diff changeset
   745
    if (iSvgEngine->Document())
hgs
parents:
diff changeset
   746
    {
hgs
parents:
diff changeset
   747
        listenerCount += iSvgEngine->Document()->MouseInternalListenerCount();
hgs
parents:
diff changeset
   748
    }
hgs
parents:
diff changeset
   749
    if ( listenerCount == 0 )
hgs
parents:
diff changeset
   750
        {
hgs
parents:
diff changeset
   751
        viewableElements.Close();
hgs
parents:
diff changeset
   752
        return;
hgs
parents:
diff changeset
   753
        }
hgs
parents:
diff changeset
   754
    // Get list of elements containing pointer (bounding-box)
hgs
parents:
diff changeset
   755
    RPointerArray<CSvgElementImpl> enteringElements;
hgs
parents:
diff changeset
   756
    RPointerArray<CSvgElementImpl> stillInsideElements;
hgs
parents:
diff changeset
   757
    iSvgEngine->GetViewableElementsAtPoint(iSvgEngine->Document(), viewableElements, aX, aY );
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
    // check for mouse entering of elements
hgs
parents:
diff changeset
   760
    TInt viewableEleCnt = viewableElements.Count();
hgs
parents:
diff changeset
   761
    for ( TInt i = 0; i < viewableEleCnt; i++ )
hgs
parents:
diff changeset
   762
        {
hgs
parents:
diff changeset
   763
        // If an element is in the view-list but NOT in the entered-list
hgs
parents:
diff changeset
   764
        // then, it's copied to the entered-list
hgs
parents:
diff changeset
   765
        // otherwise, ignore (still inside)
hgs
parents:
diff changeset
   766
        if ( iSvgMouseEnteredElements.Find( viewableElements[i] ) == KErrNotFound )
hgs
parents:
diff changeset
   767
            {
hgs
parents:
diff changeset
   768
            enteringElements.Append( viewableElements[i] );
hgs
parents:
diff changeset
   769
            }
hgs
parents:
diff changeset
   770
        else
hgs
parents:
diff changeset
   771
            {
hgs
parents:
diff changeset
   772
            stillInsideElements.Append( viewableElements[i] );
hgs
parents:
diff changeset
   773
            }
hgs
parents:
diff changeset
   774
        }
hgs
parents:
diff changeset
   775
hgs
parents:
diff changeset
   776
    // check for mouse exiting of elements
hgs
parents:
diff changeset
   777
    RPointerArray<CSvgElementImpl> exitingElements;
hgs
parents:
diff changeset
   778
    TInt svgMouseEnteredEleCnt = iSvgMouseEnteredElements.Count();
hgs
parents:
diff changeset
   779
    for ( TInt i = 0; i < svgMouseEnteredEleCnt; i++ )
hgs
parents:
diff changeset
   780
        {
hgs
parents:
diff changeset
   781
        // If an element is in the entered-list but not the view-list
hgs
parents:
diff changeset
   782
        // then, it's copied to the exiting list
hgs
parents:
diff changeset
   783
        // otherwise, ignore (
hgs
parents:
diff changeset
   784
        if ( viewableElements.Find( iSvgMouseEnteredElements[i] ) == KErrNotFound )
hgs
parents:
diff changeset
   785
            {
hgs
parents:
diff changeset
   786
            exitingElements.Append( iSvgMouseEnteredElements[i] );
hgs
parents:
diff changeset
   787
            }
hgs
parents:
diff changeset
   788
        }
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
    // Remove exiting elements from entered list
hgs
parents:
diff changeset
   791
    TInt exitingEleCnt = exitingElements.Count();
hgs
parents:
diff changeset
   792
    for ( TInt i = 0; i < exitingEleCnt; i++ )
hgs
parents:
diff changeset
   793
        {
hgs
parents:
diff changeset
   794
        TInt index = iSvgMouseEnteredElements.Find( exitingElements[i] );
hgs
parents:
diff changeset
   795
        if ( index != KErrNotFound )
hgs
parents:
diff changeset
   796
            {
hgs
parents:
diff changeset
   797
            iSvgMouseEnteredElements.Remove( index );
hgs
parents:
diff changeset
   798
            }
hgs
parents:
diff changeset
   799
        }
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
    // Add entering elements to entered-list
hgs
parents:
diff changeset
   802
    TInt enteringEleCnt = enteringElements.Count();
hgs
parents:
diff changeset
   803
    for ( TInt i = 0; i < enteringEleCnt; i++ )
hgs
parents:
diff changeset
   804
        {
hgs
parents:
diff changeset
   805
        iSvgMouseEnteredElements.Append( enteringElements[i] );
hgs
parents:
diff changeset
   806
        }
hgs
parents:
diff changeset
   807
hgs
parents:
diff changeset
   808
    // Notify exiting
hgs
parents:
diff changeset
   809
    if ( exitingElements.Count() > 0 )
hgs
parents:
diff changeset
   810
        {
hgs
parents:
diff changeset
   811
        iSvgEngine->NotifyMouseExited( exitingElements, aX, aY );
hgs
parents:
diff changeset
   812
        if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
   813
            {
hgs
parents:
diff changeset
   814
            iSvgEngine->Document()->NotifyInternalMouseExited( exitingElements, aX, aY );
hgs
parents:
diff changeset
   815
            }
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
hgs
parents:
diff changeset
   818
    // Notify entering
hgs
parents:
diff changeset
   819
    if ( enteringElements.Count() > 0 )
hgs
parents:
diff changeset
   820
        {
hgs
parents:
diff changeset
   821
        iSvgEngine->NotifyMouseEntered( enteringElements, aX, aY );
hgs
parents:
diff changeset
   822
        if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
   823
            {
hgs
parents:
diff changeset
   824
            iSvgEngine->Document()->NotifyInternalMouseEntered( enteringElements, aX, aY );
hgs
parents:
diff changeset
   825
            }
hgs
parents:
diff changeset
   826
        }
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
    // Notify moved
hgs
parents:
diff changeset
   829
    if ( stillInsideElements.Count() > 0 )
hgs
parents:
diff changeset
   830
        {
hgs
parents:
diff changeset
   831
        iSvgEngine->NotifyMouseMoved( stillInsideElements, aX, aY );
hgs
parents:
diff changeset
   832
        if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
   833
            {
hgs
parents:
diff changeset
   834
            iSvgEngine->Document()->NotifyInternalMouseMoved( stillInsideElements, aX, aY );
hgs
parents:
diff changeset
   835
            }
hgs
parents:
diff changeset
   836
        }
hgs
parents:
diff changeset
   837
hgs
parents:
diff changeset
   838
    exitingElements.Close();
hgs
parents:
diff changeset
   839
    enteringElements.Close();
hgs
parents:
diff changeset
   840
    stillInsideElements.Close();
hgs
parents:
diff changeset
   841
    viewableElements.Close();
hgs
parents:
diff changeset
   842
    }
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   845
// EXPORT_C void CSvgEngineInterfaceImpl::KeyPress( const TKeyEvent &aKeyEvent )
hgs
parents:
diff changeset
   846
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   847
EXPORT_C void CSvgEngineInterfaceImpl::KeyPress( const TKeyEvent &aKeyEvent, TInt aEngine )
hgs
parents:
diff changeset
   848
    {
hgs
parents:
diff changeset
   849
hgs
parents:
diff changeset
   850
    if (!ChooseEngine( aEngine ))
hgs
parents:
diff changeset
   851
    {
hgs
parents:
diff changeset
   852
    	return;
hgs
parents:
diff changeset
   853
    }
hgs
parents:
diff changeset
   854
hgs
parents:
diff changeset
   855
    TSvgUiKeyEvent  uiev    ( aKeyEvent.iCode );
hgs
parents:
diff changeset
   856
    TRAPD( error, iSvgEngine->ProcessEventL( iSvgEngine->Document(), &uiev ) );
hgs
parents:
diff changeset
   857
    if (error != KErrNone)
hgs
parents:
diff changeset
   858
        {
hgs
parents:
diff changeset
   859
        #ifdef _DEBUG
hgs
parents:
diff changeset
   860
        _LIT(KProcessEventFailed, "CSvgEngineInterfaceImpl::KeyPress: ProcessEventL error.");
hgs
parents:
diff changeset
   861
        RDebug::Print(KProcessEventFailed);
hgs
parents:
diff changeset
   862
        #endif //_DEBUG
hgs
parents:
diff changeset
   863
        }
hgs
parents:
diff changeset
   864
    }
hgs
parents:
diff changeset
   865
hgs
parents:
diff changeset
   866
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   867
// EXPORT_C CSvgDocumentImpl* CSvgEngineInterfaceImpl::SvgDocument()
hgs
parents:
diff changeset
   868
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   869
EXPORT_C CSvgDocumentImpl* CSvgEngineInterfaceImpl::SvgDocument()
hgs
parents:
diff changeset
   870
    {
hgs
parents:
diff changeset
   871
    //this method is a bad idea and should be removed
hgs
parents:
diff changeset
   872
    return iSvgLoadedDocument;
hgs
parents:
diff changeset
   873
    }
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
hgs
parents:
diff changeset
   876
//*****************************
hgs
parents:
diff changeset
   877
//
hgs
parents:
diff changeset
   878
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   879
// EXPORT_C void CSvgEngineInterfaceImpl::Zoom( TReal32 aScaleFactor )
hgs
parents:
diff changeset
   880
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   881
EXPORT_C void CSvgEngineInterfaceImpl::Zoom( TReal32 aScaleFactor, TInt aEngine ) __SOFTFP
hgs
parents:
diff changeset
   882
    {
hgs
parents:
diff changeset
   883
    TGfxAffineTransform zT;
hgs
parents:
diff changeset
   884
    MSvgTransformList*  trList = NULL;
hgs
parents:
diff changeset
   885
    TFloatFixPt cx,cy;
hgs
parents:
diff changeset
   886
    if( ChooseEngine( aEngine ) && iSvgEngine->Document() && iSvgEngine->GraphicsContext())
hgs
parents:
diff changeset
   887
        {
hgs
parents:
diff changeset
   888
        CSvgSvgElementImpl* lRoot   = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
   889
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
   890
        if ( lRoot )
hgs
parents:
diff changeset
   891
            {
hgs
parents:
diff changeset
   892
            if ( lRoot->GetZoomAndPan() == ESvgZoomAndPanMagnify )
hgs
parents:
diff changeset
   893
                {
hgs
parents:
diff changeset
   894
                // Calculate screen center in svg element's coordinate system
hgs
parents:
diff changeset
   895
                TSize               devSize = iSvgEngine->GraphicsContext()->DeviceBounds();
hgs
parents:
diff changeset
   896
hgs
parents:
diff changeset
   897
				TGfxRectangle2D devbound;
hgs
parents:
diff changeset
   898
                lRoot->GetBBox( devbound );
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
				    cx = TFloatFixPt(devSize.iWidth/2);
hgs
parents:
diff changeset
   901
				    cy = TFloatFixPt(devSize.iHeight/2);
hgs
parents:
diff changeset
   902
hgs
parents:
diff changeset
   903
                lRoot->GetTransform( trList );
hgs
parents:
diff changeset
   904
                if( trList )
hgs
parents:
diff changeset
   905
                    {
hgs
parents:
diff changeset
   906
                    zT = trList->GetItem( 0 );
hgs
parents:
diff changeset
   907
                    zT.UserZoom(aScaleFactor,cx,cy);
hgs
parents:
diff changeset
   908
                    trList->ReplaceItem( zT, 0 );
hgs
parents:
diff changeset
   909
hgs
parents:
diff changeset
   910
                    lRoot->SetTransform(trList);
hgs
parents:
diff changeset
   911
                    }
hgs
parents:
diff changeset
   912
hgs
parents:
diff changeset
   913
hgs
parents:
diff changeset
   914
                }
hgs
parents:
diff changeset
   915
            }
hgs
parents:
diff changeset
   916
        }
hgs
parents:
diff changeset
   917
    }
hgs
parents:
diff changeset
   918
hgs
parents:
diff changeset
   919
hgs
parents:
diff changeset
   920
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   921
// EXPORT_C void CSvgEngineInterfaceImpl::Pan( TInt aX, TInt aY )
hgs
parents:
diff changeset
   922
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   923
EXPORT_C void CSvgEngineInterfaceImpl::Pan( TInt aX, TInt aY, TInt aEngine )
hgs
parents:
diff changeset
   924
hgs
parents:
diff changeset
   925
    {
hgs
parents:
diff changeset
   926
    TInt32 PanX = aX;
hgs
parents:
diff changeset
   927
    TInt32 PanY = aY;
hgs
parents:
diff changeset
   928
    TGfxAffineTransform pT;
hgs
parents:
diff changeset
   929
    MSvgTransformList*  trList = NULL;
hgs
parents:
diff changeset
   930
hgs
parents:
diff changeset
   931
    if( ChooseEngine( aEngine ) && iSvgEngine->Document() )
hgs
parents:
diff changeset
   932
        {
hgs
parents:
diff changeset
   933
hgs
parents:
diff changeset
   934
        CSvgSvgElementImpl* lRoot   = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
   935
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
   936
        if ( lRoot )
hgs
parents:
diff changeset
   937
            {
hgs
parents:
diff changeset
   938
            if ( lRoot->GetZoomAndPan() == ESvgZoomAndPanMagnify )
hgs
parents:
diff changeset
   939
                {
hgs
parents:
diff changeset
   940
hgs
parents:
diff changeset
   941
                // Do panning
hgs
parents:
diff changeset
   942
                lRoot->GetTransform( trList );
hgs
parents:
diff changeset
   943
                if( trList )
hgs
parents:
diff changeset
   944
                    {
hgs
parents:
diff changeset
   945
                    pT = trList->GetItem( 0 );
hgs
parents:
diff changeset
   946
hgs
parents:
diff changeset
   947
hgs
parents:
diff changeset
   948
                    pT.UserPan( PanX , PanY  );
hgs
parents:
diff changeset
   949
hgs
parents:
diff changeset
   950
                    trList->ReplaceItem( pT, 0 );
hgs
parents:
diff changeset
   951
hgs
parents:
diff changeset
   952
                    lRoot->SetTransform(trList);
hgs
parents:
diff changeset
   953
                    }
hgs
parents:
diff changeset
   954
                }
hgs
parents:
diff changeset
   955
            }
hgs
parents:
diff changeset
   956
        }
hgs
parents:
diff changeset
   957
    }
hgs
parents:
diff changeset
   958
hgs
parents:
diff changeset
   959
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   960
// Panning indicator
hgs
parents:
diff changeset
   961
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   962
hgs
parents:
diff changeset
   963
EXPORT_C TBool CSvgEngineInterfaceImpl::IsPanPossible( TInt aX, TInt aY, TInt aEngine )
hgs
parents:
diff changeset
   964
hgs
parents:
diff changeset
   965
    {
hgs
parents:
diff changeset
   966
    if( !ChooseEngine( aEngine ) || (iSvgEngine->Document() == NULL) )
hgs
parents:
diff changeset
   967
    {
hgs
parents:
diff changeset
   968
        return EFalse;
hgs
parents:
diff changeset
   969
    }
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
    CSvgSvgElementImpl* lRoot   = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
   972
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
   973
    if ( lRoot == NULL)
hgs
parents:
diff changeset
   974
        return EFalse;
hgs
parents:
diff changeset
   975
    if ( lRoot->GetZoomAndPan() != ESvgZoomAndPanMagnify )
hgs
parents:
diff changeset
   976
        return EFalse;
hgs
parents:
diff changeset
   977
hgs
parents:
diff changeset
   978
    // Get the clipping size
hgs
parents:
diff changeset
   979
    TFloatFixPt  clipWidthFP, clipHeightFP;
hgs
parents:
diff changeset
   980
    TInt    clipWidth, clipHeight;
hgs
parents:
diff changeset
   981
    lRoot->GetAttributeFloat( KAtrWidth, clipWidthFP );
hgs
parents:
diff changeset
   982
    lRoot->GetAttributeFloat( KAtrHeight, clipHeightFP );
hgs
parents:
diff changeset
   983
    clipWidth = ( TInt ) clipWidthFP;
hgs
parents:
diff changeset
   984
    clipHeight = ( TInt ) clipHeightFP;
hgs
parents:
diff changeset
   985
    // Get bounding box of svg element
hgs
parents:
diff changeset
   986
    TFloatFixPt          zero    ( 0 );
hgs
parents:
diff changeset
   987
    TGfxRectangle2D bound;
hgs
parents:
diff changeset
   988
    lRoot->GetBBox( bound );
hgs
parents:
diff changeset
   989
    TInt32  xmax    = ( bound.iX + bound.iWidth );
hgs
parents:
diff changeset
   990
    TInt32  ymax    = ( bound.iY + bound.iHeight );
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
    // check  them
hgs
parents:
diff changeset
   993
    if ( xmax <= clipWidth && aX < 0 )
hgs
parents:
diff changeset
   994
        aX = 0;
hgs
parents:
diff changeset
   995
    if ( bound.iX >= zero && aX > 0 )
hgs
parents:
diff changeset
   996
        aX = 0;
hgs
parents:
diff changeset
   997
    if ( ymax <= clipHeight && aY < 0 )
hgs
parents:
diff changeset
   998
        aY = 0;
hgs
parents:
diff changeset
   999
    if ( bound.iY >= zero && aY > 0 )
hgs
parents:
diff changeset
  1000
        aY = 0;
hgs
parents:
diff changeset
  1001
    // Do panning
hgs
parents:
diff changeset
  1002
    if ( ( aY == 0 ) && ( aX == 0 ) )
hgs
parents:
diff changeset
  1003
        return EFalse;
hgs
parents:
diff changeset
  1004
    else
hgs
parents:
diff changeset
  1005
       return ETrue;
hgs
parents:
diff changeset
  1006
hgs
parents:
diff changeset
  1007
    }
hgs
parents:
diff changeset
  1008
hgs
parents:
diff changeset
  1009
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1010
// Panning indicator
hgs
parents:
diff changeset
  1011
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1012
hgs
parents:
diff changeset
  1013
EXPORT_C void CSvgEngineInterfaceImpl::IsPanPossibleFourWay
hgs
parents:
diff changeset
  1014
    ( TBool& left, TBool& right, TBool& up, TBool& down, TInt aEngine )
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
    {
hgs
parents:
diff changeset
  1017
hgs
parents:
diff changeset
  1018
    left = right = up = down = EFalse;
hgs
parents:
diff changeset
  1019
hgs
parents:
diff changeset
  1020
    if( !ChooseEngine( aEngine ) || (iSvgEngine->Document() == NULL) )
hgs
parents:
diff changeset
  1021
    {
hgs
parents:
diff changeset
  1022
        return ;
hgs
parents:
diff changeset
  1023
    }
hgs
parents:
diff changeset
  1024
hgs
parents:
diff changeset
  1025
    CSvgSvgElementImpl* lRoot   = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
  1026
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1027
    if ( lRoot == NULL)
hgs
parents:
diff changeset
  1028
        return ;
hgs
parents:
diff changeset
  1029
    if ( lRoot->GetZoomAndPan() != ESvgZoomAndPanMagnify )
hgs
parents:
diff changeset
  1030
        return ;
hgs
parents:
diff changeset
  1031
hgs
parents:
diff changeset
  1032
    // Get the clipping size
hgs
parents:
diff changeset
  1033
    TFloatFixPt  clipWidthFP, clipHeightFP;
hgs
parents:
diff changeset
  1034
    TInt    clipWidth, clipHeight;
hgs
parents:
diff changeset
  1035
    lRoot->GetAttributeFloat( KAtrWidth, clipWidthFP );
hgs
parents:
diff changeset
  1036
    lRoot->GetAttributeFloat( KAtrHeight, clipHeightFP );
hgs
parents:
diff changeset
  1037
    clipWidth = ( TInt ) clipWidthFP;
hgs
parents:
diff changeset
  1038
    clipHeight = ( TInt ) clipHeightFP;
hgs
parents:
diff changeset
  1039
    //the svg element has no width or height no reason to pan.
hgs
parents:
diff changeset
  1040
    if (clipWidth <= 0 || clipHeight <= 0)
hgs
parents:
diff changeset
  1041
    {
hgs
parents:
diff changeset
  1042
    	return;
hgs
parents:
diff changeset
  1043
    }
hgs
parents:
diff changeset
  1044
    // Get bounding box of svg element
hgs
parents:
diff changeset
  1045
    TFloatFixPt          zero    ( 0 );
hgs
parents:
diff changeset
  1046
    TGfxRectangle2D bound;
hgs
parents:
diff changeset
  1047
    lRoot->GetBBox( bound );
hgs
parents:
diff changeset
  1048
    //fix if no width or heigth is there.
hgs
parents:
diff changeset
  1049
    if((TInt32)bound.iWidth <=0 ||(TInt32) bound.iHeight <=0 )
hgs
parents:
diff changeset
  1050
        return;
hgs
parents:
diff changeset
  1051
    TInt32  xmax    = ( bound.iX + bound.iWidth );
hgs
parents:
diff changeset
  1052
    TInt32  ymax    = ( bound.iY + bound.iHeight );
hgs
parents:
diff changeset
  1053
hgs
parents:
diff changeset
  1054
    // check the panning in four directions now.
hgs
parents:
diff changeset
  1055
    TInt aX,aY;
hgs
parents:
diff changeset
  1056
    // Check in Left direction
hgs
parents:
diff changeset
  1057
    aX = 1; aY = 0;
hgs
parents:
diff changeset
  1058
    if ( xmax <= clipWidth && aX < 0 )
hgs
parents:
diff changeset
  1059
        aX = 0;
hgs
parents:
diff changeset
  1060
    if ( bound.iX >= zero && aX > 0 )
hgs
parents:
diff changeset
  1061
        aX = 0;
hgs
parents:
diff changeset
  1062
    if ( ymax <= clipHeight && aY < 0 )
hgs
parents:
diff changeset
  1063
        aY = 0;
hgs
parents:
diff changeset
  1064
    if ( bound.iY >= zero && aY > 0 )
hgs
parents:
diff changeset
  1065
        aY = 0;
hgs
parents:
diff changeset
  1066
    // Do panning
hgs
parents:
diff changeset
  1067
    if ( ( aY == 0 ) && ( aX == 0 ) )
hgs
parents:
diff changeset
  1068
	    left = EFalse;
hgs
parents:
diff changeset
  1069
    else
hgs
parents:
diff changeset
  1070
	    left = ETrue;
hgs
parents:
diff changeset
  1071
hgs
parents:
diff changeset
  1072
    // Check in Right direction
hgs
parents:
diff changeset
  1073
    aX = -1; aY = 0;
hgs
parents:
diff changeset
  1074
    if ( xmax <= clipWidth && aX < 0 )
hgs
parents:
diff changeset
  1075
        aX = 0;
hgs
parents:
diff changeset
  1076
    if ( bound.iX >= zero && aX > 0 )
hgs
parents:
diff changeset
  1077
        aX = 0;
hgs
parents:
diff changeset
  1078
    if ( ymax <= clipHeight && aY < 0 )
hgs
parents:
diff changeset
  1079
        aY = 0;
hgs
parents:
diff changeset
  1080
    if ( bound.iY >= zero && aY > 0 )
hgs
parents:
diff changeset
  1081
        aY = 0;
hgs
parents:
diff changeset
  1082
    // Do panning
hgs
parents:
diff changeset
  1083
    if ( ( aY == 0 ) && ( aX == 0 ) )
hgs
parents:
diff changeset
  1084
	    right = EFalse;
hgs
parents:
diff changeset
  1085
    else
hgs
parents:
diff changeset
  1086
	    right = ETrue;
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
    // Check in Up direction
hgs
parents:
diff changeset
  1089
    aX = 0; aY = 1;
hgs
parents:
diff changeset
  1090
    if ( xmax <= clipWidth && aX < 0 )
hgs
parents:
diff changeset
  1091
        aX = 0;
hgs
parents:
diff changeset
  1092
    if ( bound.iX >= zero && aX > 0 )
hgs
parents:
diff changeset
  1093
        aX = 0;
hgs
parents:
diff changeset
  1094
    if ( ymax <= clipHeight && aY < 0 )
hgs
parents:
diff changeset
  1095
        aY = 0;
hgs
parents:
diff changeset
  1096
    if ( bound.iY >= zero && aY > 0 )
hgs
parents:
diff changeset
  1097
        aY = 0;
hgs
parents:
diff changeset
  1098
    // Do panning
hgs
parents:
diff changeset
  1099
    if ( ( aY == 0 ) && ( aX == 0 ) )
hgs
parents:
diff changeset
  1100
	    up = EFalse;
hgs
parents:
diff changeset
  1101
    else
hgs
parents:
diff changeset
  1102
	    up = ETrue;
hgs
parents:
diff changeset
  1103
hgs
parents:
diff changeset
  1104
    // Check in down direction
hgs
parents:
diff changeset
  1105
    aX = 0; aY = -1;
hgs
parents:
diff changeset
  1106
    if ( xmax <= clipWidth && aX < 0 )
hgs
parents:
diff changeset
  1107
        aX = 0;
hgs
parents:
diff changeset
  1108
    if ( bound.iX >= zero && aX > 0 )
hgs
parents:
diff changeset
  1109
        aX = 0;
hgs
parents:
diff changeset
  1110
    if ( ymax <= clipHeight && aY < 0 )
hgs
parents:
diff changeset
  1111
        aY = 0;
hgs
parents:
diff changeset
  1112
    if ( bound.iY >= zero && aY > 0 )
hgs
parents:
diff changeset
  1113
        aY = 0;
hgs
parents:
diff changeset
  1114
    // Do panning
hgs
parents:
diff changeset
  1115
    if ( ( aY == 0 ) && ( aX == 0 ) )
hgs
parents:
diff changeset
  1116
	    down = EFalse;
hgs
parents:
diff changeset
  1117
    else
hgs
parents:
diff changeset
  1118
	    down = ETrue;
hgs
parents:
diff changeset
  1119
hgs
parents:
diff changeset
  1120
    }
hgs
parents:
diff changeset
  1121
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1122
// EXPORT_C void CSvgEngineInterfaceImpl::Rotate( TReal32 aAngle,
hgs
parents:
diff changeset
  1123
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1124
EXPORT_C void CSvgEngineInterfaceImpl::Rotate( TReal32 aAngle,
hgs
parents:
diff changeset
  1125
                                               TInt aX,
hgs
parents:
diff changeset
  1126
                                               TInt aY,
hgs
parents:
diff changeset
  1127
                                               TInt aEngine ) __SOFTFP
hgs
parents:
diff changeset
  1128
hgs
parents:
diff changeset
  1129
    {
hgs
parents:
diff changeset
  1130
    TGfxAffineTransform rT;
hgs
parents:
diff changeset
  1131
    MSvgTransformList*  trList = NULL;
hgs
parents:
diff changeset
  1132
hgs
parents:
diff changeset
  1133
    if( ChooseEngine( aEngine ) && iSvgEngine->Document() )
hgs
parents:
diff changeset
  1134
        {
hgs
parents:
diff changeset
  1135
        CSvgSvgElementImpl* lRoot   = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
  1136
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1137
hgs
parents:
diff changeset
  1138
        if ( lRoot )
hgs
parents:
diff changeset
  1139
            {
hgs
parents:
diff changeset
  1140
            if ( lRoot->GetZoomAndPan() == ESvgZoomAndPanMagnify )
hgs
parents:
diff changeset
  1141
                {
hgs
parents:
diff changeset
  1142
                lRoot->GetTransform( trList );
hgs
parents:
diff changeset
  1143
                if( trList )
hgs
parents:
diff changeset
  1144
                    {
hgs
parents:
diff changeset
  1145
                    rT = trList->GetItem( 0 );
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
                    rT.UserRotate( aAngle, aX, aY );
hgs
parents:
diff changeset
  1148
                    trList->ReplaceItem( rT, 0 );
hgs
parents:
diff changeset
  1149
                    iTotalRotation +=  aAngle;
hgs
parents:
diff changeset
  1150
                    }
hgs
parents:
diff changeset
  1151
                lRoot->SetTransform(trList); //added
hgs
parents:
diff changeset
  1152
                }
hgs
parents:
diff changeset
  1153
            }
hgs
parents:
diff changeset
  1154
        }
hgs
parents:
diff changeset
  1155
    }
hgs
parents:
diff changeset
  1156
hgs
parents:
diff changeset
  1157
// ==========================================================================
hgs
parents:
diff changeset
  1158
// ContentDimensions integer value version
hgs
parents:
diff changeset
  1159
//1)  Return the size of the <svg> width/height if given in non-percentage.
hgs
parents:
diff changeset
  1160
//
hgs
parents:
diff changeset
  1161
//2)  If <svg> width/height are given as percentages:
hgs
parents:
diff changeset
  1162
//    A) If viewbox attribute is specified, return the viewbox width/height times the <svg> width/height percentages.
hgs
parents:
diff changeset
  1163
//    B) Return the content bounding-box size times times the <svg> width/height percentages.
hgs
parents:
diff changeset
  1164
// ==========================================================================
hgs
parents:
diff changeset
  1165
EXPORT_C TSize CSvgEngineInterfaceImpl::ContentDimensions( TInt aEngine )
hgs
parents:
diff changeset
  1166
    {
hgs
parents:
diff changeset
  1167
    if ( !ChooseEngine( aEngine ) || !iSvgEngine->Document() )
hgs
parents:
diff changeset
  1168
        {
hgs
parents:
diff changeset
  1169
        return TSize( 0, 0 );
hgs
parents:
diff changeset
  1170
        }
hgs
parents:
diff changeset
  1171
hgs
parents:
diff changeset
  1172
    CSvgSvgElementImpl* svgElement = (CSvgSvgElementImpl* )iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1173
hgs
parents:
diff changeset
  1174
    if ( !svgElement )
hgs
parents:
diff changeset
  1175
        {
hgs
parents:
diff changeset
  1176
        return TSize( 0, 0 );
hgs
parents:
diff changeset
  1177
        }
hgs
parents:
diff changeset
  1178
hgs
parents:
diff changeset
  1179
    // width/height are given as user-units
hgs
parents:
diff changeset
  1180
        if ( !( svgElement->iWidthInPercentage ) && !(svgElement->iHeightInPercentage))
hgs
parents:
diff changeset
  1181
        {
hgs
parents:
diff changeset
  1182
        return TSize( (TInt)svgElement->iWidthInUserCoordinate,
hgs
parents:
diff changeset
  1183
                      (TInt)svgElement->iHeightInUserCoordinate );
hgs
parents:
diff changeset
  1184
        }
hgs
parents:
diff changeset
  1185
hgs
parents:
diff changeset
  1186
    // width/height are given as percentages
hgs
parents:
diff changeset
  1187
    TInt percentWidth = (TInt)svgElement->iWidthInUserCoordinate;
hgs
parents:
diff changeset
  1188
    TInt percentHeight = (TInt)svgElement->iHeightInUserCoordinate;
hgs
parents:
diff changeset
  1189
    // Multiply percentages with viewbox if available
hgs
parents:
diff changeset
  1190
    TGfxRectangle2D viewBox;
hgs
parents:
diff changeset
  1191
    if ( svgElement->GetViewBox( viewBox ) )
hgs
parents:
diff changeset
  1192
        {
hgs
parents:
diff changeset
  1193
            TInt tempWidth = 0, tempHeight = 0;
hgs
parents:
diff changeset
  1194
            
hgs
parents:
diff changeset
  1195
            if( svgElement->iWidthInPercentage )
hgs
parents:
diff changeset
  1196
            {
hgs
parents:
diff changeset
  1197
                tempWidth  = ((TReal32)viewBox.iWidth)  * percentWidth / 100.0;    
hgs
parents:
diff changeset
  1198
            }
hgs
parents:
diff changeset
  1199
            else
hgs
parents:
diff changeset
  1200
            {
hgs
parents:
diff changeset
  1201
                tempWidth = viewBox.iWidth;
hgs
parents:
diff changeset
  1202
            }
hgs
parents:
diff changeset
  1203
        
hgs
parents:
diff changeset
  1204
            if( svgElement->iHeightInPercentage )
hgs
parents:
diff changeset
  1205
            {
hgs
parents:
diff changeset
  1206
                tempHeight = ((TReal32)viewBox.iHeight) * percentHeight / 100.0;    
hgs
parents:
diff changeset
  1207
            }
hgs
parents:
diff changeset
  1208
            else
hgs
parents:
diff changeset
  1209
            {
hgs
parents:
diff changeset
  1210
                tempHeight = viewBox.iHeight;
hgs
parents:
diff changeset
  1211
            }
hgs
parents:
diff changeset
  1212
            return TSize(tempWidth, tempHeight);
hgs
parents:
diff changeset
  1213
        }
hgs
parents:
diff changeset
  1214
    // return the <svg> bounding box
hgs
parents:
diff changeset
  1215
    else
hgs
parents:
diff changeset
  1216
        {
hgs
parents:
diff changeset
  1217
        TSize bbSize = GetSvgBoundingBox().Size();
hgs
parents:
diff changeset
  1218
            if( svgElement->iWidthInPercentage )
hgs
parents:
diff changeset
  1219
            {
hgs
parents:
diff changeset
  1220
                bbSize.iWidth  = ((TReal32)bbSize.iWidth)  * percentWidth / 100.0;    
hgs
parents:
diff changeset
  1221
            }
hgs
parents:
diff changeset
  1222
            else
hgs
parents:
diff changeset
  1223
            {
hgs
parents:
diff changeset
  1224
                bbSize.iWidth = bbSize.iWidth;
hgs
parents:
diff changeset
  1225
            }
hgs
parents:
diff changeset
  1226
        
hgs
parents:
diff changeset
  1227
            if( svgElement->iHeightInPercentage )
hgs
parents:
diff changeset
  1228
            {
hgs
parents:
diff changeset
  1229
                bbSize.iHeight = ((TReal32)bbSize.iHeight) * percentHeight / 100.0;    
hgs
parents:
diff changeset
  1230
            }
hgs
parents:
diff changeset
  1231
            else
hgs
parents:
diff changeset
  1232
            {
hgs
parents:
diff changeset
  1233
                bbSize.iHeight = bbSize.iHeight;
hgs
parents:
diff changeset
  1234
            }
hgs
parents:
diff changeset
  1235
        return bbSize;
hgs
parents:
diff changeset
  1236
        }
hgs
parents:
diff changeset
  1237
    }
hgs
parents:
diff changeset
  1238
hgs
parents:
diff changeset
  1239
// ==========================================================================
hgs
parents:
diff changeset
  1240
// ContentDimensions floating-point value version
hgs
parents:
diff changeset
  1241
//1)  Return the size of the <svg> width/height if given in non-percentage.
hgs
parents:
diff changeset
  1242
//
hgs
parents:
diff changeset
  1243
//2)  If <svg> width/height are given as percentages:
hgs
parents:
diff changeset
  1244
//    A) If viewbox attribute is specified, return the viewbox width/height times the <svg> width/height percentages.
hgs
parents:
diff changeset
  1245
//    B) Return the content bounding-box size times times the <svg> width/height percentages.
hgs
parents:
diff changeset
  1246
// ==========================================================================
hgs
parents:
diff changeset
  1247
EXPORT_C void CSvgEngineInterfaceImpl::ContentDimensions( TReal32& aWidth, TReal32& aHeight, TInt aEngine ) __SOFTFP
hgs
parents:
diff changeset
  1248
    {
hgs
parents:
diff changeset
  1249
    aWidth  = 0.0;
hgs
parents:
diff changeset
  1250
    aHeight = 0.0;
hgs
parents:
diff changeset
  1251
    if ( !ChooseEngine( aEngine ) || !iSvgEngine->Document() )
hgs
parents:
diff changeset
  1252
        {
hgs
parents:
diff changeset
  1253
        return;
hgs
parents:
diff changeset
  1254
        }
hgs
parents:
diff changeset
  1255
hgs
parents:
diff changeset
  1256
    CSvgSvgElementImpl* svgElement = (CSvgSvgElementImpl* )iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1257
hgs
parents:
diff changeset
  1258
    if ( !svgElement )
hgs
parents:
diff changeset
  1259
        {
hgs
parents:
diff changeset
  1260
        return;
hgs
parents:
diff changeset
  1261
        }
hgs
parents:
diff changeset
  1262
hgs
parents:
diff changeset
  1263
    // width/height are given as user-units
hgs
parents:
diff changeset
  1264
        if ( !( svgElement->iWidthInPercentage ) && !( svgElement->iHeightInPercentage) )
hgs
parents:
diff changeset
  1265
        {
hgs
parents:
diff changeset
  1266
        #ifdef _DEBUG
hgs
parents:
diff changeset
  1267
        RDebug::Printf("content size: %.4fx%.4f",
hgs
parents:
diff changeset
  1268
                      svgElement->iWidthInUserCoordinate,
hgs
parents:
diff changeset
  1269
                      svgElement->iHeightInUserCoordinate );
hgs
parents:
diff changeset
  1270
hgs
parents:
diff changeset
  1271
        #endif
hgs
parents:
diff changeset
  1272
        aWidth  = svgElement->iWidthInUserCoordinate;
hgs
parents:
diff changeset
  1273
        aHeight = svgElement->iHeightInUserCoordinate;
hgs
parents:
diff changeset
  1274
        return;
hgs
parents:
diff changeset
  1275
        }
hgs
parents:
diff changeset
  1276
hgs
parents:
diff changeset
  1277
    // width/height are given as percentages
hgs
parents:
diff changeset
  1278
    TReal32 percentWidth  = svgElement->iWidthInUserCoordinate;
hgs
parents:
diff changeset
  1279
    TReal32 percentHeight = svgElement->iHeightInUserCoordinate;
hgs
parents:
diff changeset
  1280
hgs
parents:
diff changeset
  1281
    // Multiply percentages with viewbox if available
hgs
parents:
diff changeset
  1282
    TGfxRectangle2D viewBox;
hgs
parents:
diff changeset
  1283
    if ( svgElement->GetViewBox( viewBox ) )
hgs
parents:
diff changeset
  1284
        {
hgs
parents:
diff changeset
  1285
        #ifdef _DEBUG
hgs
parents:
diff changeset
  1286
        RDebug::Printf("viewbox is defined: %.4fx%.4f",
hgs
parents:
diff changeset
  1287
                      ((TReal32)viewBox.iWidth) * percentWidth / 100.0,
hgs
parents:
diff changeset
  1288
                      ((TReal32)viewBox.iHeight) * percentHeight / 100.0 );
hgs
parents:
diff changeset
  1289
hgs
parents:
diff changeset
  1290
        #endif
hgs
parents:
diff changeset
  1291
            if( svgElement->iWidthInPercentage )
hgs
parents:
diff changeset
  1292
            {
hgs
parents:
diff changeset
  1293
        aWidth  = ((TReal32)viewBox.iWidth)  * percentWidth / 100.0;
hgs
parents:
diff changeset
  1294
            }
hgs
parents:
diff changeset
  1295
            else
hgs
parents:
diff changeset
  1296
            {
hgs
parents:
diff changeset
  1297
                aWidth = viewBox.iWidth;
hgs
parents:
diff changeset
  1298
            }
hgs
parents:
diff changeset
  1299
        
hgs
parents:
diff changeset
  1300
            if( svgElement->iHeightInPercentage )
hgs
parents:
diff changeset
  1301
            {
hgs
parents:
diff changeset
  1302
        aHeight = ((TReal32)viewBox.iHeight) * percentHeight / 100.0;
hgs
parents:
diff changeset
  1303
            }
hgs
parents:
diff changeset
  1304
            else
hgs
parents:
diff changeset
  1305
            {
hgs
parents:
diff changeset
  1306
                aHeight = viewBox.iHeight;
hgs
parents:
diff changeset
  1307
            }
hgs
parents:
diff changeset
  1308
        return;
hgs
parents:
diff changeset
  1309
        }
hgs
parents:
diff changeset
  1310
    // return the <svg> bounding box
hgs
parents:
diff changeset
  1311
    else
hgs
parents:
diff changeset
  1312
        {
hgs
parents:
diff changeset
  1313
        CSvgSvgElementImpl* lRoot = ( CSvgSvgElementImpl* )iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1314
        if( lRoot )
hgs
parents:
diff changeset
  1315
            {
hgs
parents:
diff changeset
  1316
            TReal32 x, y;
hgs
parents:
diff changeset
  1317
            GetElementBoundingbox( lRoot, x, y, aWidth, aHeight );
hgs
parents:
diff changeset
  1318
                if(svgElement->iWidthInPercentage )
hgs
parents:
diff changeset
  1319
                {
hgs
parents:
diff changeset
  1320
            aWidth  = aWidth  * percentWidth / 100.0;
hgs
parents:
diff changeset
  1321
                }
hgs
parents:
diff changeset
  1322
                if(svgElement->iHeightInPercentage )
hgs
parents:
diff changeset
  1323
                {
hgs
parents:
diff changeset
  1324
            aHeight = aHeight * percentHeight / 100.0;
hgs
parents:
diff changeset
  1325
                }
hgs
parents:
diff changeset
  1326
            }
hgs
parents:
diff changeset
  1327
        }
hgs
parents:
diff changeset
  1328
    }
hgs
parents:
diff changeset
  1329
hgs
parents:
diff changeset
  1330
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1331
// EXPORT_C TSize CSvgEngineInterfaceImpl::ContentDimensions()
hgs
parents:
diff changeset
  1332
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1333
EXPORT_C TSize CSvgEngineInterfaceImpl::ContentDimensionsInPercentage( TInt aEngine )
hgs
parents:
diff changeset
  1334
    {
hgs
parents:
diff changeset
  1335
    TSize lSize;
hgs
parents:
diff changeset
  1336
hgs
parents:
diff changeset
  1337
    if( ChooseEngine( aEngine ) && (iSvgEngine->Document() != NULL) )
hgs
parents:
diff changeset
  1338
        {
hgs
parents:
diff changeset
  1339
        CSvgSvgElementImpl* rootElement = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
  1340
                                      iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1341
hgs
parents:
diff changeset
  1342
        if ( rootElement != NULL )
hgs
parents:
diff changeset
  1343
            {
hgs
parents:
diff changeset
  1344
             if(rootElement->iWidthInPercentage)
hgs
parents:
diff changeset
  1345
                {
hgs
parents:
diff changeset
  1346
                lSize.iWidth = ( TFloatFixPt ) ( rootElement->iWidthInUserCoordinate );
hgs
parents:
diff changeset
  1347
             }
hgs
parents:
diff changeset
  1348
             else
hgs
parents:
diff changeset
  1349
             {  
hgs
parents:
diff changeset
  1350
                lSize.iWidth = -1;
hgs
parents:
diff changeset
  1351
             }
hgs
parents:
diff changeset
  1352
             if(rootElement->iHeightInPercentage)
hgs
parents:
diff changeset
  1353
             {
hgs
parents:
diff changeset
  1354
                lSize.iHeight = ( TFloatFixPt ) ( rootElement->iHeightInUserCoordinate );
hgs
parents:
diff changeset
  1355
                }
hgs
parents:
diff changeset
  1356
             else
hgs
parents:
diff changeset
  1357
             {
hgs
parents:
diff changeset
  1358
                lSize.iHeight = -1;
hgs
parents:
diff changeset
  1359
             }
hgs
parents:
diff changeset
  1360
            }
hgs
parents:
diff changeset
  1361
hgs
parents:
diff changeset
  1362
        }
hgs
parents:
diff changeset
  1363
    return lSize;
hgs
parents:
diff changeset
  1364
    }
hgs
parents:
diff changeset
  1365
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1366
// EXPORT_C TRect CSvgEngineInterfaceImpl::FocusNext()
hgs
parents:
diff changeset
  1367
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1368
EXPORT_C TRect CSvgEngineInterfaceImpl::FocusNext()
hgs
parents:
diff changeset
  1369
    {
hgs
parents:
diff changeset
  1370
    if(iSvgEngine->Document())
hgs
parents:
diff changeset
  1371
    iSvgEngine->Document()->IncCurFocusIndex();
hgs
parents:
diff changeset
  1372
    return (GetFocusBbox(ETrue));
hgs
parents:
diff changeset
  1373
    }
hgs
parents:
diff changeset
  1374
hgs
parents:
diff changeset
  1375
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1376
// EXPORT_C TRect CSvgEngineInterfaceImpl::FocusPrevious()
hgs
parents:
diff changeset
  1377
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1378
EXPORT_C TRect CSvgEngineInterfaceImpl::FocusPrevious()
hgs
parents:
diff changeset
  1379
    {
hgs
parents:
diff changeset
  1380
    if(iSvgEngine->Document())
hgs
parents:
diff changeset
  1381
    iSvgEngine->Document()->DecCurFocusIndex();
hgs
parents:
diff changeset
  1382
    return (GetFocusBbox(EFalse));
hgs
parents:
diff changeset
  1383
    }
hgs
parents:
diff changeset
  1384
hgs
parents:
diff changeset
  1385
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1386
// EXPORT_C void CSvgEngineInterfaceImpl::ActivateObjectInFocus()
hgs
parents:
diff changeset
  1387
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1388
EXPORT_C void CSvgEngineInterfaceImpl::ActivateObjectInFocus()
hgs
parents:
diff changeset
  1389
    {
hgs
parents:
diff changeset
  1390
    TGfxRectangle2D lBbox;
hgs
parents:
diff changeset
  1391
hgs
parents:
diff changeset
  1392
    if( iSvgEngine->Document() && iSvgEngine->Document()->GetCurFocusObject() )
hgs
parents:
diff changeset
  1393
        {
hgs
parents:
diff changeset
  1394
        iSvgEngine->Document()->GetCurFocusObject()->GetBBox( lBbox );
hgs
parents:
diff changeset
  1395
        // Send mouse down and mouse up events to the engine
hgs
parents:
diff changeset
  1396
        // This will send message back to the application to handle the activation
hgs
parents:
diff changeset
  1397
        MouseDown( lBbox.CenterX(), lBbox.CenterY() );
hgs
parents:
diff changeset
  1398
        MouseUp( lBbox.CenterX(), lBbox.CenterY() );
hgs
parents:
diff changeset
  1399
        }
hgs
parents:
diff changeset
  1400
    }
hgs
parents:
diff changeset
  1401
hgs
parents:
diff changeset
  1402
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1403
// EXPORT_C TInt32 CSvgEngineInterfaceImpl::MediaTime()
hgs
parents:
diff changeset
  1404
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1405
EXPORT_C TInt32 CSvgEngineInterfaceImpl::MediaTime( TInt aEngine )
hgs
parents:
diff changeset
  1406
    {
hgs
parents:
diff changeset
  1407
    	if (ChooseEngine( aEngine ))
hgs
parents:
diff changeset
  1408
    	{
hgs
parents:
diff changeset
  1409
    		return iSvgEngine->CurrentTIme();
hgs
parents:
diff changeset
  1410
    	}
hgs
parents:
diff changeset
  1411
hgs
parents:
diff changeset
  1412
    	return 0;
hgs
parents:
diff changeset
  1413
    }
hgs
parents:
diff changeset
  1414
hgs
parents:
diff changeset
  1415
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1416
// EXPORT_C void CSvgEngineInterfaceImpl::SetMediaTime(TInt32 aTime)
hgs
parents:
diff changeset
  1417
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1418
EXPORT_C void CSvgEngineInterfaceImpl::SetMediaTime(TInt32 aTime, TInt aEngine )
hgs
parents:
diff changeset
  1419
    {
hgs
parents:
diff changeset
  1420
hgs
parents:
diff changeset
  1421
    // Time given is in milliseconds whereas the time needed by timer is microseconds
hgs
parents:
diff changeset
  1422
    // Resume(aTime * 1000);
hgs
parents:
diff changeset
  1423
    	if ( ChooseEngine( aEngine ) )
hgs
parents:
diff changeset
  1424
    	{
hgs
parents:
diff changeset
  1425
    		iSvgEngine->SetMediaTime(aTime* 1000);
hgs
parents:
diff changeset
  1426
    	}
hgs
parents:
diff changeset
  1427
    }
hgs
parents:
diff changeset
  1428
hgs
parents:
diff changeset
  1429
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1430
// void CSvgEngineInterfaceImpl::ResetFocusIndex(TInt32 aIndex)
hgs
parents:
diff changeset
  1431
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1432
void CSvgEngineInterfaceImpl::ResetFocusIndex(TInt32 /*aIndex*/)
hgs
parents:
diff changeset
  1433
    {
hgs
parents:
diff changeset
  1434
    //iSvgEngine->Document()->SetCurIndex(TInt32 aVal); aIndex;
hgs
parents:
diff changeset
  1435
    }
hgs
parents:
diff changeset
  1436
hgs
parents:
diff changeset
  1437
hgs
parents:
diff changeset
  1438
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1439
// TRect CSvgEngineInterfaceImpl::GetFocusBbox( TBool aNextObj )
hgs
parents:
diff changeset
  1440
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1441
TRect CSvgEngineInterfaceImpl::GetFocusBbox( TBool aNextObj, TInt aEngine )
hgs
parents:
diff changeset
  1442
    {
hgs
parents:
diff changeset
  1443
    TGfxRectangle2D lBbox;
hgs
parents:
diff changeset
  1444
    TInt32 lNewIndex;
hgs
parents:
diff changeset
  1445
hgs
parents:
diff changeset
  1446
    if( ChooseEngine( aEngine ) && iSvgEngine->Document() )
hgs
parents:
diff changeset
  1447
        {
hgs
parents:
diff changeset
  1448
        // Obtain the current focussable object starting with the current index
hgs
parents:
diff changeset
  1449
        
hgs
parents:
diff changeset
  1450
        // The GetEventReceiverElement function takes in parameters as the 
hgs
parents:
diff changeset
  1451
        //current focus objects index and whether we are going next or previous
hgs
parents:
diff changeset
  1452
        // and the mask of the kind of input that we are accepting..
hgs
parents:
diff changeset
  1453
        // It returns the value of the new index through the lNewIndex.
hgs
parents:
diff changeset
  1454
        iSvgEngine->Document()->SetCurFocusObject ( 
hgs
parents:
diff changeset
  1455
         						iSvgEngine->Document()->GetEventReceiverElement(
hgs
parents:
diff changeset
  1456
         						 iSvgEngine->Document()->GetCurFocusIndex(),
hgs
parents:
diff changeset
  1457
         						  aNextObj, KSvgEventMaskExternalUI,
hgs
parents:
diff changeset
  1458
         						   lNewIndex ));
hgs
parents:
diff changeset
  1459
        // Update the index to where the focussable object was found
hgs
parents:
diff changeset
  1460
        iSvgEngine->Document()->SetCurFocusIndex(lNewIndex);
hgs
parents:
diff changeset
  1461
hgs
parents:
diff changeset
  1462
        if( iSvgEngine->Document()->GetCurFocusObject() )
hgs
parents:
diff changeset
  1463
            {
hgs
parents:
diff changeset
  1464
            iSvgEngine->Document()->GetCurFocusObject()->GetBBox(lBbox);
hgs
parents:
diff changeset
  1465
hgs
parents:
diff changeset
  1466
            // Send a mouse move event to the engine
hgs
parents:
diff changeset
  1467
            MouseMove( lBbox.CenterX(), lBbox.CenterY() );
hgs
parents:
diff changeset
  1468
            }
hgs
parents:
diff changeset
  1469
        }
hgs
parents:
diff changeset
  1470
hgs
parents:
diff changeset
  1471
    return TRect( lBbox.iX, lBbox.iY, lBbox.iX + lBbox.iWidth, lBbox.iY + lBbox.iHeight );
hgs
parents:
diff changeset
  1472
    }
hgs
parents:
diff changeset
  1473
hgs
parents:
diff changeset
  1474
hgs
parents:
diff changeset
  1475
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1476
// void CSvgEngineInterfaceImpl::Resume(TInt32 aTime)
hgs
parents:
diff changeset
  1477
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1478
void CSvgEngineInterfaceImpl::Resume(TInt32 aTime, TInt aEngine )
hgs
parents:
diff changeset
  1479
    {
hgs
parents:
diff changeset
  1480
    	if ( ChooseEngine( aEngine ) )
hgs
parents:
diff changeset
  1481
    	{
hgs
parents:
diff changeset
  1482
    		iSvgEngine->Resume(aTime);
hgs
parents:
diff changeset
  1483
    	}
hgs
parents:
diff changeset
  1484
    }
hgs
parents:
diff changeset
  1485
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1486
// EXPORT_C TSize CSvgEngineInterfaceImpl::Size()
hgs
parents:
diff changeset
  1487
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1488
EXPORT_C TSize CSvgEngineInterfaceImpl::Size( TInt aEngine )
hgs
parents:
diff changeset
  1489
    {
hgs
parents:
diff changeset
  1490
    TSize lSize(0,0);
hgs
parents:
diff changeset
  1491
hgs
parents:
diff changeset
  1492
    if( ChooseEngine( aEngine ) )
hgs
parents:
diff changeset
  1493
        {
hgs
parents:
diff changeset
  1494
        CSvgDocumentImpl* lSvgDocument = iSvgEngine->Document();
hgs
parents:
diff changeset
  1495
        if( lSvgDocument )
hgs
parents:
diff changeset
  1496
            {
hgs
parents:
diff changeset
  1497
            CSvgSvgElementImpl* lSvgRootElement = (CSvgSvgElementImpl *)lSvgDocument->RootElement();
hgs
parents:
diff changeset
  1498
            if( lSvgRootElement )
hgs
parents:
diff changeset
  1499
                {
hgs
parents:
diff changeset
  1500
                lSize.iWidth = (TInt)lSvgRootElement->Width();
hgs
parents:
diff changeset
  1501
                lSize.iHeight = (TInt)lSvgRootElement->Height();
hgs
parents:
diff changeset
  1502
                }
hgs
parents:
diff changeset
  1503
            }
hgs
parents:
diff changeset
  1504
        }
hgs
parents:
diff changeset
  1505
    return lSize;
hgs
parents:
diff changeset
  1506
    }
hgs
parents:
diff changeset
  1507
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1508
// EXPORT_C TPoint CSvgEngineInterfaceImpl::Position()
hgs
parents:
diff changeset
  1509
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1510
EXPORT_C TPoint CSvgEngineInterfaceImpl::Position( TInt aEngine )
hgs
parents:
diff changeset
  1511
    {
hgs
parents:
diff changeset
  1512
    TPoint lPoint(0,0);
hgs
parents:
diff changeset
  1513
hgs
parents:
diff changeset
  1514
    if(ChooseEngine( aEngine ))
hgs
parents:
diff changeset
  1515
        {
hgs
parents:
diff changeset
  1516
        CSvgDocumentImpl* lSvgDocument = iSvgEngine->Document();
hgs
parents:
diff changeset
  1517
        if( lSvgDocument )
hgs
parents:
diff changeset
  1518
            {
hgs
parents:
diff changeset
  1519
            CSvgSvgElementImpl* lSvgRootElement = (CSvgSvgElementImpl *)lSvgDocument->RootElement();
hgs
parents:
diff changeset
  1520
            if( lSvgRootElement )
hgs
parents:
diff changeset
  1521
                {
hgs
parents:
diff changeset
  1522
                lPoint.iX = (TInt)lSvgRootElement->X();
hgs
parents:
diff changeset
  1523
                lPoint.iY = (TInt)lSvgRootElement->Y();
hgs
parents:
diff changeset
  1524
                }
hgs
parents:
diff changeset
  1525
            }
hgs
parents:
diff changeset
  1526
        }
hgs
parents:
diff changeset
  1527
    return lPoint;
hgs
parents:
diff changeset
  1528
    }
hgs
parents:
diff changeset
  1529
hgs
parents:
diff changeset
  1530
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1531
// EXPORT_C void CSvgEngineInterfaceImpl::GenerateMask(CFbsBitmap* aMask)
hgs
parents:
diff changeset
  1532
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1533
EXPORT_C void CSvgEngineInterfaceImpl::GenerateMask(CFbsBitmap* aMask, TInt aEngine )
hgs
parents:
diff changeset
  1534
    {
hgs
parents:
diff changeset
  1535
        if ( ChooseEngine( aEngine ) )
hgs
parents:
diff changeset
  1536
        {
hgs
parents:
diff changeset
  1537
            iSvgEngine->GenerateMask(aMask);
hgs
parents:
diff changeset
  1538
        }
hgs
parents:
diff changeset
  1539
    }
hgs
parents:
diff changeset
  1540
hgs
parents:
diff changeset
  1541
hgs
parents:
diff changeset
  1542
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1543
// EXPORT_C void CSvgEngineInterfaceImpl::SetBackgroundColor(TUint32 aRGBA8888Color, CSvgEngineImpl* aEngine)
hgs
parents:
diff changeset
  1544
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1545
EXPORT_C void CSvgEngineInterfaceImpl::SetBackgroundColor(TUint32 aRGBA8888Color, CSvgEngineImpl* aEngine)
hgs
parents:
diff changeset
  1546
    {
hgs
parents:
diff changeset
  1547
    	if (ChooseEngine( (TInt)aEngine ))
hgs
parents:
diff changeset
  1548
    	{
hgs
parents:
diff changeset
  1549
        	iSvgEngine->SetBackgroundColor(aRGBA8888Color);
hgs
parents:
diff changeset
  1550
        }
hgs
parents:
diff changeset
  1551
    }
hgs
parents:
diff changeset
  1552
hgs
parents:
diff changeset
  1553
hgs
parents:
diff changeset
  1554
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1555
// EXPORT_C TInt CSvgEngineInterfaceImpl::CurrentState()
hgs
parents:
diff changeset
  1556
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1557
EXPORT_C TInt CSvgEngineInterfaceImpl::CurrentState( TInt aEngine )
hgs
parents:
diff changeset
  1558
    {
hgs
parents:
diff changeset
  1559
        if (ChooseEngine(aEngine))
hgs
parents:
diff changeset
  1560
        {
hgs
parents:
diff changeset
  1561
            return (TInt) iSvgEngine->SVGEngineState();
hgs
parents:
diff changeset
  1562
        }
hgs
parents:
diff changeset
  1563
hgs
parents:
diff changeset
  1564
    return 0;
hgs
parents:
diff changeset
  1565
    }
hgs
parents:
diff changeset
  1566
hgs
parents:
diff changeset
  1567
hgs
parents:
diff changeset
  1568
hgs
parents:
diff changeset
  1569
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1570
// EXPORT_C TPoint CSvgEngineInterfaceImpl::PanPosition()
hgs
parents:
diff changeset
  1571
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1572
EXPORT_C TPoint CSvgEngineInterfaceImpl::PanPosition( TInt aEngine )
hgs
parents:
diff changeset
  1573
    {
hgs
parents:
diff changeset
  1574
    TPoint lPoint;
hgs
parents:
diff changeset
  1575
hgs
parents:
diff changeset
  1576
    if( ChooseEngine(aEngine) && iSvgEngine->Document() )
hgs
parents:
diff changeset
  1577
        {
hgs
parents:
diff changeset
  1578
        CSvgSvgElementImpl* lRoot = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
  1579
                                        iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  1580
        if ( lRoot )
hgs
parents:
diff changeset
  1581
            {
hgs
parents:
diff changeset
  1582
            MSvgTransformList*  trList = NULL;
hgs
parents:
diff changeset
  1583
hgs
parents:
diff changeset
  1584
            lRoot->GetTransform( trList );
hgs
parents:
diff changeset
  1585
hgs
parents:
diff changeset
  1586
            if( trList )
hgs
parents:
diff changeset
  1587
                {
hgs
parents:
diff changeset
  1588
                TGfxAffineTransform pT = trList->GetItem( 0 );
hgs
parents:
diff changeset
  1589
hgs
parents:
diff changeset
  1590
                lPoint.iX = (TInt) pT.TranslateX();
hgs
parents:
diff changeset
  1591
                lPoint.iY = (TInt) pT.TranslateY();
hgs
parents:
diff changeset
  1592
                }
hgs
parents:
diff changeset
  1593
            }
hgs
parents:
diff changeset
  1594
        }
hgs
parents:
diff changeset
  1595
hgs
parents:
diff changeset
  1596
    return lPoint;
hgs
parents:
diff changeset
  1597
    }
hgs
parents:
diff changeset
  1598
hgs
parents:
diff changeset
  1599
hgs
parents:
diff changeset
  1600
hgs
parents:
diff changeset
  1601
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1602
// EXPORT_C MSvgError*  CSvgEngineInterfaceImpl::Replay()
hgs
parents:
diff changeset
  1603
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1604
EXPORT_C MSvgError*  CSvgEngineInterfaceImpl::Replay( TInt aEngine )
hgs
parents:
diff changeset
  1605
    {
hgs
parents:
diff changeset
  1606
hgs
parents:
diff changeset
  1607
    iTotalRotation = 0;
hgs
parents:
diff changeset
  1608
hgs
parents:
diff changeset
  1609
    if( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  1610
    {
hgs
parents:
diff changeset
  1611
        iSvgEngine->SetMediaTime( 0 );
hgs
parents:
diff changeset
  1612
        return NULL;
hgs
parents:
diff changeset
  1613
    }
hgs
parents:
diff changeset
  1614
    return iSvgError;
hgs
parents:
diff changeset
  1615
    }
hgs
parents:
diff changeset
  1616
hgs
parents:
diff changeset
  1617
/*SVGT DOM API Caching APIs*/
hgs
parents:
diff changeset
  1618
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1619
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::PrepareDom(const TDesC& aFileName, TInt& aHandle)
hgs
parents:
diff changeset
  1620
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1621
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::PrepareDom(const TDesC& aFileName, TInt& aHandle, TInt aEngine)
hgs
parents:
diff changeset
  1622
{
hgs
parents:
diff changeset
  1623
    // Create session to open file
hgs
parents:
diff changeset
  1624
    RFs session;
hgs
parents:
diff changeset
  1625
    CSvgDocumentImpl::OpenSession( session, *iSvgError );
hgs
parents:
diff changeset
  1626
    if ( iSvgError->HasError() )
hgs
parents:
diff changeset
  1627
    {
hgs
parents:
diff changeset
  1628
        return iSvgError;
hgs
parents:
diff changeset
  1629
    }
hgs
parents:
diff changeset
  1630
hgs
parents:
diff changeset
  1631
    // Open file handle
hgs
parents:
diff changeset
  1632
    RFile fileHandle;
hgs
parents:
diff changeset
  1633
    TInt openError = fileHandle.Open( session, aFileName, EFileRead );
hgs
parents:
diff changeset
  1634
    if ( openError != KErrNone )
hgs
parents:
diff changeset
  1635
    {
hgs
parents:
diff changeset
  1636
        _LIT(msg, "Fail to open file for reading: ");
hgs
parents:
diff changeset
  1637
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, openError,
hgs
parents:
diff changeset
  1638
                                        msg, aFileName );
hgs
parents:
diff changeset
  1639
    }
hgs
parents:
diff changeset
  1640
    else
hgs
parents:
diff changeset
  1641
    {
hgs
parents:
diff changeset
  1642
        PrepareDom( fileHandle, aHandle, aEngine );
hgs
parents:
diff changeset
  1643
    }
hgs
parents:
diff changeset
  1644
    session.Close();
hgs
parents:
diff changeset
  1645
    return iSvgError;
hgs
parents:
diff changeset
  1646
}
hgs
parents:
diff changeset
  1647
hgs
parents:
diff changeset
  1648
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1649
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::PrepareDom( RFile& aFileHandle, TInt& aHandle )
hgs
parents:
diff changeset
  1650
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1651
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::PrepareDom( RFile& aFileHandle, TInt& aHandle, TInt aEngine )
hgs
parents:
diff changeset
  1652
	{
hgs
parents:
diff changeset
  1653
  	// reset to start of file
hgs
parents:
diff changeset
  1654
    TInt zero = 0;
hgs
parents:
diff changeset
  1655
    aFileHandle.Seek( ESeekStart, zero );
hgs
parents:
diff changeset
  1656
hgs
parents:
diff changeset
  1657
    TInt fileSize = 0;
hgs
parents:
diff changeset
  1658
    TInt sizeError = aFileHandle.Size( fileSize );
hgs
parents:
diff changeset
  1659
    if ( sizeError != KErrNone )
hgs
parents:
diff changeset
  1660
    	{
hgs
parents:
diff changeset
  1661
        _LIT( KErrorMsg, "Failed to Load Svg Content: Read File Size Error." );
hgs
parents:
diff changeset
  1662
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, sizeError,
hgs
parents:
diff changeset
  1663
                                        KErrorMsg, KNullDesC );
hgs
parents:
diff changeset
  1664
        return iSvgError;
hgs
parents:
diff changeset
  1665
    	}
hgs
parents:
diff changeset
  1666
hgs
parents:
diff changeset
  1667
    //It is the fix for ESMA-7PN9WU
hgs
parents:
diff changeset
  1668
    //file size should be more than 2 bytes
hgs
parents:
diff changeset
  1669
    if ( fileSize < 2)
hgs
parents:
diff changeset
  1670
        {
hgs
parents:
diff changeset
  1671
        _LIT( KErrorMsg, "File is empty" );
hgs
parents:
diff changeset
  1672
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, sizeError,
hgs
parents:
diff changeset
  1673
                                        KErrorMsg, KNullDesC );
hgs
parents:
diff changeset
  1674
        return iSvgError;
hgs
parents:
diff changeset
  1675
        }
hgs
parents:
diff changeset
  1676
hgs
parents:
diff changeset
  1677
	HBufC8* binaryBuffer=NULL;
hgs
parents:
diff changeset
  1678
  	
hgs
parents:
diff changeset
  1679
	binaryBuffer = HBufC8::New ( fileSize ); 
hgs
parents:
diff changeset
  1680
	 if (!binaryBuffer)
hgs
parents:
diff changeset
  1681
    	{
hgs
parents:
diff changeset
  1682
        _LIT( KErrorMsg, "Failed to Load Svg Content: Out of memory");
hgs
parents:
diff changeset
  1683
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, KErrNoMemory,
hgs
parents:
diff changeset
  1684
                                        KErrorMsg, KNullDesC );
hgs
parents:
diff changeset
  1685
        return iSvgError;
hgs
parents:
diff changeset
  1686
    	}
hgs
parents:
diff changeset
  1687
	
hgs
parents:
diff changeset
  1688
	TPtr8 binaryBufferPtr = binaryBuffer->Des();
hgs
parents:
diff changeset
  1689
	TInt readError = aFileHandle.Read(binaryBufferPtr, fileSize);
hgs
parents:
diff changeset
  1690
	if ( readError != KErrNone )
hgs
parents:
diff changeset
  1691
    	{
hgs
parents:
diff changeset
  1692
        _LIT( KErrorMsg, "Failed to Load Svg Content: Read File Data Error");
hgs
parents:
diff changeset
  1693
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, readError,
hgs
parents:
diff changeset
  1694
                                        KErrorMsg, KNullDesC );
hgs
parents:
diff changeset
  1695
        delete binaryBuffer;
hgs
parents:
diff changeset
  1696
        return iSvgError;
hgs
parents:
diff changeset
  1697
    	}
hgs
parents:
diff changeset
  1698
		
hgs
parents:
diff changeset
  1699
	// For files which are in UTF-16 or unicode format the first 2 bytes
hgs
parents:
diff changeset
  1700
	// will be FF and FE. In UTF-16 and unicode format every single character
hgs
parents:
diff changeset
  1701
	// is represented by two bytes. 
hgs
parents:
diff changeset
  1702
	TInt hichar = (CEditableText::EReversedByteOrderMark & 0xFF00)>>8;
hgs
parents:
diff changeset
  1703
	TInt lochar = CEditableText::EReversedByteOrderMark & 0x00FF;
hgs
parents:
diff changeset
  1704
	TInt bytesPerChar = 1;
hgs
parents:
diff changeset
  1705
hgs
parents:
diff changeset
  1706
		if(binaryBufferPtr[0] == hichar && binaryBufferPtr[1] == lochar)
hgs
parents:
diff changeset
  1707
		{
hgs
parents:
diff changeset
  1708
		bytesPerChar = 2;
hgs
parents:
diff changeset
  1709
hgs
parents:
diff changeset
  1710
		HBufC* dataBuffer=NULL;
hgs
parents:
diff changeset
  1711
hgs
parents:
diff changeset
  1712
		dataBuffer = HBufC::New(fileSize/bytesPerChar);
hgs
parents:
diff changeset
  1713
		if ( !dataBuffer)
hgs
parents:
diff changeset
  1714
    		{
hgs
parents:
diff changeset
  1715
        	_LIT( KErrorMsg, "Failed to Load Svg Content: Out of memory");
hgs
parents:
diff changeset
  1716
        	CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, KErrNoMemory,
hgs
parents:
diff changeset
  1717
                                        KErrorMsg, KNullDesC );
hgs
parents:
diff changeset
  1718
        	delete binaryBuffer;
hgs
parents:
diff changeset
  1719
        	return iSvgError;
hgs
parents:
diff changeset
  1720
    		}
hgs
parents:
diff changeset
  1721
	
hgs
parents:
diff changeset
  1722
		TPtr dataBufferPtr = dataBuffer->Des();
hgs
parents:
diff changeset
  1723
		
hgs
parents:
diff changeset
  1724
		// Skip two bytes and set the pointer to the next location
hgs
parents:
diff changeset
  1725
		// from where the actual data starts.
hgs
parents:
diff changeset
  1726
		dataBufferPtr.Set((TUint16*)binaryBufferPtr.Ptr()+1,
hgs
parents:
diff changeset
  1727
							fileSize/bytesPerChar-1, 
hgs
parents:
diff changeset
  1728
							fileSize/bytesPerChar-1);
hgs
parents:
diff changeset
  1729
			
hgs
parents:
diff changeset
  1730
		HBufC8* outputBuffer= NULL;
hgs
parents:
diff changeset
  1731
		outputBuffer=HBufC8::New(fileSize);
hgs
parents:
diff changeset
  1732
		if(!outputBuffer)
hgs
parents:
diff changeset
  1733
			{
hgs
parents:
diff changeset
  1734
			_LIT( KErrorMsg, "Failed to Load Svg Content: Out of memory");
hgs
parents:
diff changeset
  1735
        	CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, KErrNoMemory,
hgs
parents:
diff changeset
  1736
                                        KErrorMsg, KNullDesC );
hgs
parents:
diff changeset
  1737
        	delete dataBuffer;
hgs
parents:
diff changeset
  1738
        	delete binaryBuffer;
hgs
parents:
diff changeset
  1739
        	return iSvgError;
hgs
parents:
diff changeset
  1740
			}
hgs
parents:
diff changeset
  1741
		TPtr8 outputBufferptr=outputBuffer->Des();
hgs
parents:
diff changeset
  1742
		CnvUtfConverter::ConvertFromUnicodeToUtf8(
hgs
parents:
diff changeset
  1743
            							outputBufferptr,   // Destination
hgs
parents:
diff changeset
  1744
            							dataBufferPtr );
hgs
parents:
diff changeset
  1745
		PrepareDom( *outputBuffer, aHandle, aEngine );		
hgs
parents:
diff changeset
  1746
		delete outputBuffer;
hgs
parents:
diff changeset
  1747
		delete dataBuffer;
hgs
parents:
diff changeset
  1748
		}
hgs
parents:
diff changeset
  1749
	else
hgs
parents:
diff changeset
  1750
		{
hgs
parents:
diff changeset
  1751
		PrepareDom( *binaryBuffer, aHandle, aEngine );
hgs
parents:
diff changeset
  1752
		}
hgs
parents:
diff changeset
  1753
    
hgs
parents:
diff changeset
  1754
    delete binaryBuffer;
hgs
parents:
diff changeset
  1755
  	return iSvgError;
hgs
parents:
diff changeset
  1756
	}
hgs
parents:
diff changeset
  1757
hgs
parents:
diff changeset
  1758
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1759
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::PrepareDom(const TDesC8& aByteData, TInt& aHandle)
hgs
parents:
diff changeset
  1760
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1761
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::PrepareDom(const TDesC8& aByteData, TInt& aHandle, TInt aEngine )
hgs
parents:
diff changeset
  1762
    {
hgs
parents:
diff changeset
  1763
    aHandle = 0;
hgs
parents:
diff changeset
  1764
hgs
parents:
diff changeset
  1765
    // Clear Error
hgs
parents:
diff changeset
  1766
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1767
hgs
parents:
diff changeset
  1768
    if( !ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  1769
        {
hgs
parents:
diff changeset
  1770
        _LIT(KEngineFailed, "SvgEngine Internal Failure: SvgEngineImpl not present.");
hgs
parents:
diff changeset
  1771
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  1772
                                        KEngineFailed, KNullDesC );
hgs
parents:
diff changeset
  1773
        return iSvgError;
hgs
parents:
diff changeset
  1774
        }
hgs
parents:
diff changeset
  1775
hgs
parents:
diff changeset
  1776
    CSvgDocumentImpl* newDocument = NULL;
hgs
parents:
diff changeset
  1777
    // Pass EFalse to document creation to indicate it has no parent
hgs
parents:
diff changeset
  1778
    TRAPD( error, newDocument = CSvgDocumentImpl::NewL( iSvgBitmapFontProvider, EFalse ) ); 
hgs
parents:
diff changeset
  1779
hgs
parents:
diff changeset
  1780
    // Check for error
hgs
parents:
diff changeset
  1781
    if(error != KErrNone)
hgs
parents:
diff changeset
  1782
        {
hgs
parents:
diff changeset
  1783
        _LIT(KEngineFailed, "Failed to Create Svg Document: Out of Memory");
hgs
parents:
diff changeset
  1784
        #ifdef _DEBUG
hgs
parents:
diff changeset
  1785
        RDebug::Print(KEngineFailed);
hgs
parents:
diff changeset
  1786
        #endif //_DEBUG
hgs
parents:
diff changeset
  1787
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, error,
hgs
parents:
diff changeset
  1788
                                        KEngineFailed, KNullDesC );
hgs
parents:
diff changeset
  1789
        return iSvgError;
hgs
parents:
diff changeset
  1790
        }
hgs
parents:
diff changeset
  1791
hgs
parents:
diff changeset
  1792
	iSvgDocumentPointers.Append(newDocument);
hgs
parents:
diff changeset
  1793
hgs
parents:
diff changeset
  1794
    // Set appropriate flags to documents
hgs
parents:
diff changeset
  1795
    newDocument->SetWasPrepared( !iIsLoadingRequest );
hgs
parents:
diff changeset
  1796
    newDocument->SetDRMMode( iDrmEnabled );
hgs
parents:
diff changeset
  1797
    newDocument->SetThumbNailMode( iIsThumbNailMode );
hgs
parents:
diff changeset
  1798
    newDocument->SetDRMRights( iDrmRightsConsumptionEnabled);
hgs
parents:
diff changeset
  1799
hgs
parents:
diff changeset
  1800
    CSvgDocumentImpl* currentDocument = iSvgEngine->Document();
hgs
parents:
diff changeset
  1801
hgs
parents:
diff changeset
  1802
    // Hook engine to document
hgs
parents:
diff changeset
  1803
    iSvgEngine->SetDocument( newDocument );
hgs
parents:
diff changeset
  1804
    newDocument->SetEngine( iSvgEngine );
hgs
parents:
diff changeset
  1805
    newDocument->SetLoadingListeners( &iSvgLoadingListeners );
hgs
parents:
diff changeset
  1806
hgs
parents:
diff changeset
  1807
    // Parse document
hgs
parents:
diff changeset
  1808
    newDocument->Load( aByteData, *iSvgError );
hgs
parents:
diff changeset
  1809
hgs
parents:
diff changeset
  1810
    // Put back the document that was attached to document,
hgs
parents:
diff changeset
  1811
    // since this is preparing the dom tree only
hgs
parents:
diff changeset
  1812
    if ( !iIsLoadingRequest )
hgs
parents:
diff changeset
  1813
        {
hgs
parents:
diff changeset
  1814
        iSvgEngine->SetDocument( currentDocument );
hgs
parents:
diff changeset
  1815
        }
hgs
parents:
diff changeset
  1816
hgs
parents:
diff changeset
  1817
    #ifdef _DEBUG
hgs
parents:
diff changeset
  1818
    if ( newDocument->GetError() && newDocument->GetError()->HasError() )
hgs
parents:
diff changeset
  1819
        {
hgs
parents:
diff changeset
  1820
        RDebug::Printf("Load warning: ");
hgs
parents:
diff changeset
  1821
        RDebug::RawPrint( newDocument->GetError()->Description() );
hgs
parents:
diff changeset
  1822
        }
hgs
parents:
diff changeset
  1823
    #endif
hgs
parents:
diff changeset
  1824
hgs
parents:
diff changeset
  1825
    iFileIsLoaded = !iSvgError->HasError() || iSvgError->IsWarning();
hgs
parents:
diff changeset
  1826
hgs
parents:
diff changeset
  1827
    // Parsing error or out of memory
hgs
parents:
diff changeset
  1828
    if ( !iFileIsLoaded )
hgs
parents:
diff changeset
  1829
        {
hgs
parents:
diff changeset
  1830
        DestroyDocument(newDocument);
hgs
parents:
diff changeset
  1831
        return iSvgError;
hgs
parents:
diff changeset
  1832
        }
hgs
parents:
diff changeset
  1833
hgs
parents:
diff changeset
  1834
    aHandle = (TInt)newDocument;
hgs
parents:
diff changeset
  1835
hgs
parents:
diff changeset
  1836
    return iSvgError;
hgs
parents:
diff changeset
  1837
    }
hgs
parents:
diff changeset
  1838
hgs
parents:
diff changeset
  1839
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1840
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::RenderDom(TInt aHandle, CFbsBitmap* aRenderBuffer)
hgs
parents:
diff changeset
  1841
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1842
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::RenderDom(TInt aHandle, CFbsBitmap* aRenderBuffer, CFbsBitmap* aMaskBuffer)
hgs
parents:
diff changeset
  1843
    {
hgs
parents:
diff changeset
  1844
    UseDom( aHandle, aRenderBuffer, aMaskBuffer );
hgs
parents:
diff changeset
  1845
hgs
parents:
diff changeset
  1846
    if ( !iSvgError->HasError() || iSvgError->IsWarning() )
hgs
parents:
diff changeset
  1847
    {
hgs
parents:
diff changeset
  1848
        iSvgEngine->StartEngine();
hgs
parents:
diff changeset
  1849
        iFileIsLoaded = ETrue;
hgs
parents:
diff changeset
  1850
    }
hgs
parents:
diff changeset
  1851
hgs
parents:
diff changeset
  1852
    return iSvgError;
hgs
parents:
diff changeset
  1853
    }
hgs
parents:
diff changeset
  1854
hgs
parents:
diff changeset
  1855
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1856
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::DeleteDom(TInt aHandle)
hgs
parents:
diff changeset
  1857
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1858
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::DeleteDom(TInt aHandle)
hgs
parents:
diff changeset
  1859
    {
hgs
parents:
diff changeset
  1860
    // Clear Error
hgs
parents:
diff changeset
  1861
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1862
hgs
parents:
diff changeset
  1863
    DestroyDocument((CSvgDocumentImpl*)aHandle);
hgs
parents:
diff changeset
  1864
hgs
parents:
diff changeset
  1865
    return iSvgError;
hgs
parents:
diff changeset
  1866
    }
hgs
parents:
diff changeset
  1867
hgs
parents:
diff changeset
  1868
hgs
parents:
diff changeset
  1869
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1870
// EXPORT_C void CSvgEngineInterfaceImpl::SetDRMMode(TBool aEnable)
hgs
parents:
diff changeset
  1871
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1872
EXPORT_C void CSvgEngineInterfaceImpl::SetDRMMode(TBool aEnable, TInt aEngine)
hgs
parents:
diff changeset
  1873
    {
hgs
parents:
diff changeset
  1874
    iDrmEnabled = aEnable;
hgs
parents:
diff changeset
  1875
    if( ChooseEngine( aEngine )  && iSvgEngine->Document())
hgs
parents:
diff changeset
  1876
        iSvgEngine->Document()->SetDRMMode(aEnable);
hgs
parents:
diff changeset
  1877
    }
hgs
parents:
diff changeset
  1878
hgs
parents:
diff changeset
  1879
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1880
// EXPORT_C void CSvgEngineInterfaceImpl::SetDRMRights(TBool aEnable)
hgs
parents:
diff changeset
  1881
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1882
EXPORT_C void CSvgEngineInterfaceImpl::SetDRMRights(TBool aEnable)
hgs
parents:
diff changeset
  1883
    {
hgs
parents:
diff changeset
  1884
	iDrmRightsConsumptionEnabled = aEnable;
hgs
parents:
diff changeset
  1885
	if ( iSvgEngine && iSvgEngine->Document())
hgs
parents:
diff changeset
  1886
	    {
hgs
parents:
diff changeset
  1887
	    iSvgEngine->Document()->SetDRMRights(aEnable);
hgs
parents:
diff changeset
  1888
	    }
hgs
parents:
diff changeset
  1889
	    
hgs
parents:
diff changeset
  1890
	}
hgs
parents:
diff changeset
  1891
hgs
parents:
diff changeset
  1892
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1893
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::UseDom(TInt aHandle, CFbsBitmap* aRenderBuffer)
hgs
parents:
diff changeset
  1894
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1895
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::UseDom(TInt aHandle, CFbsBitmap* aRenderBuffer, CFbsBitmap* aMask, TInt aEngine)
hgs
parents:
diff changeset
  1896
    {
hgs
parents:
diff changeset
  1897
    // Clear Error
hgs
parents:
diff changeset
  1898
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  1899
hgs
parents:
diff changeset
  1900
    // Check for engine: Should not occur
hgs
parents:
diff changeset
  1901
    if( !ChooseEngine( aEngine ) )
hgs
parents:
diff changeset
  1902
        {
hgs
parents:
diff changeset
  1903
        _LIT(KEngineFailed, "SvgEngine Internal Failure: SvgEngineImpl not present.");
hgs
parents:
diff changeset
  1904
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  1905
                                        KEngineFailed, KNullDesC );
hgs
parents:
diff changeset
  1906
        return iSvgError;
hgs
parents:
diff changeset
  1907
        }
hgs
parents:
diff changeset
  1908
hgs
parents:
diff changeset
  1909
    // Check for valid DOM
hgs
parents:
diff changeset
  1910
    if( !IsDomCached( aHandle ) )
hgs
parents:
diff changeset
  1911
        {
hgs
parents:
diff changeset
  1912
        _LIT(KEngineFailed, "Invalid DOM, Use Prepare() to create DOM");
hgs
parents:
diff changeset
  1913
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  1914
                                        KEngineFailed, KNullDesC );
hgs
parents:
diff changeset
  1915
        return iSvgError;
hgs
parents:
diff changeset
  1916
        }
hgs
parents:
diff changeset
  1917
hgs
parents:
diff changeset
  1918
    iTotalRotation = 0;
hgs
parents:
diff changeset
  1919
hgs
parents:
diff changeset
  1920
    iFileIsLoaded = EFalse;
hgs
parents:
diff changeset
  1921
hgs
parents:
diff changeset
  1922
    // Switch GDI context
hgs
parents:
diff changeset
  1923
    TRAPD( gdiError, iSvgEngine->SetGdiContextL( aRenderBuffer, aMask ) );
hgs
parents:
diff changeset
  1924
    if ( gdiError != KErrNone )
hgs
parents:
diff changeset
  1925
        {
hgs
parents:
diff changeset
  1926
        if ( gdiError == KErrNoMemory )
hgs
parents:
diff changeset
  1927
            {
hgs
parents:
diff changeset
  1928
            _LIT(KEngineGDIFailed, "SVG Engine Set Gdi Context Failed");
hgs
parents:
diff changeset
  1929
            CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, KErrNoMemory,
hgs
parents:
diff changeset
  1930
                                             KEngineGDIFailed, KNullDesC );
hgs
parents:
diff changeset
  1931
            return iSvgError;
hgs
parents:
diff changeset
  1932
            }
hgs
parents:
diff changeset
  1933
        _LIT(KEngineGDIFailed, "SVG Engine Set Gdi Context Failed");
hgs
parents:
diff changeset
  1934
            CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  1935
                                             KEngineGDIFailed, KNullDesC );
hgs
parents:
diff changeset
  1936
        return iSvgError;
hgs
parents:
diff changeset
  1937
        }
hgs
parents:
diff changeset
  1938
hgs
parents:
diff changeset
  1939
    CSvgDocumentImpl* document = (CSvgDocumentImpl*)aHandle;
hgs
parents:
diff changeset
  1940
hgs
parents:
diff changeset
  1941
    CSvgDocumentImpl* lExistDoc = iSvgEngine->Document();
hgs
parents:
diff changeset
  1942
hgs
parents:
diff changeset
  1943
    if (lExistDoc != document)
hgs
parents:
diff changeset
  1944
        {
hgs
parents:
diff changeset
  1945
        //this is a new document so swap it out...
hgs
parents:
diff changeset
  1946
        iSvgEngine->SetDocument( document );
hgs
parents:
diff changeset
  1947
        document->SetEngine( iSvgEngine );
hgs
parents:
diff changeset
  1948
        document->ReInitialize();
hgs
parents:
diff changeset
  1949
        }
hgs
parents:
diff changeset
  1950
hgs
parents:
diff changeset
  1951
	if (lExistDoc == iSvgLoadedDocument)
hgs
parents:
diff changeset
  1952
	{
hgs
parents:
diff changeset
  1953
		DestroyDocument(iSvgLoadedDocument);
hgs
parents:
diff changeset
  1954
		iSvgLoadedDocument = NULL;
hgs
parents:
diff changeset
  1955
	}
hgs
parents:
diff changeset
  1956
hgs
parents:
diff changeset
  1957
    // Check for thumbnail restrictions
hgs
parents:
diff changeset
  1958
    if ( !iSvgEngine->PassesThumbNailRestriction() )
hgs
parents:
diff changeset
  1959
        {
hgs
parents:
diff changeset
  1960
        _LIT( KThumbNailRestriction, "Frame buffer is larger than allowable size for thumbnail mode." );
hgs
parents:
diff changeset
  1961
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgThumbNailRestriction, KErrNone,
hgs
parents:
diff changeset
  1962
                                         KThumbNailRestriction, KNullDesC );
hgs
parents:
diff changeset
  1963
        return iSvgError;
hgs
parents:
diff changeset
  1964
        }
hgs
parents:
diff changeset
  1965
hgs
parents:
diff changeset
  1966
    iFileIsLoaded = ETrue;
hgs
parents:
diff changeset
  1967
hgs
parents:
diff changeset
  1968
    return iSvgError;
hgs
parents:
diff changeset
  1969
    }
hgs
parents:
diff changeset
  1970
hgs
parents:
diff changeset
  1971
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1972
// Is DOM cached
hgs
parents:
diff changeset
  1973
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1974
TBool CSvgEngineInterfaceImpl::IsDomCached(TInt aHandle)
hgs
parents:
diff changeset
  1975
    {
hgs
parents:
diff changeset
  1976
    return iSvgDocumentPointers.Find( (CSvgDocumentImpl*)aHandle ) != KErrNotFound;
hgs
parents:
diff changeset
  1977
    }
hgs
parents:
diff changeset
  1978
hgs
parents:
diff changeset
  1979
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  1980
//Resize the view to the rendering buffer
hgs
parents:
diff changeset
  1981
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  1982
EXPORT_C void CSvgEngineInterfaceImpl::SetSvgDimensionToFrameBuffer(TUint aWidth, TUint aHeight, TInt aEngine)
hgs
parents:
diff changeset
  1983
{
hgs
parents:
diff changeset
  1984
hgs
parents:
diff changeset
  1985
     if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  1986
        {
hgs
parents:
diff changeset
  1987
        TRAPD(error,iSvgEngine->SetSvgDimensionToFrameBufferL(aWidth, aHeight) );
hgs
parents:
diff changeset
  1988
        if (error != KErrNone)
hgs
parents:
diff changeset
  1989
            {
hgs
parents:
diff changeset
  1990
            #ifdef _DEBUG
hgs
parents:
diff changeset
  1991
            _LIT(KSetFrameBufferFailed,
hgs
parents:
diff changeset
  1992
                "CSvgEngineInterfaceImpl::SetSvgDimensionToFrameBuffer: SetSvgDimensionToFrameBufferL error.");
hgs
parents:
diff changeset
  1993
            RDebug::Print(KSetFrameBufferFailed);
hgs
parents:
diff changeset
  1994
            #endif //_DEBUG
hgs
parents:
diff changeset
  1995
            }
hgs
parents:
diff changeset
  1996
        }
hgs
parents:
diff changeset
  1997
hgs
parents:
diff changeset
  1998
hgs
parents:
diff changeset
  1999
}
hgs
parents:
diff changeset
  2000
hgs
parents:
diff changeset
  2001
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2002
//Check if content is interactive
hgs
parents:
diff changeset
  2003
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2004
hgs
parents:
diff changeset
  2005
EXPORT_C TBool CSvgEngineInterfaceImpl::IsContentInteractive(CSvgDocumentImpl* aDocument, TInt aEngine )
hgs
parents:
diff changeset
  2006
{
hgs
parents:
diff changeset
  2007
    if ( ( aDocument == NULL ) || ( !ChooseEngine(aEngine) ) || ( aDocument->RootElement() == NULL ) )
hgs
parents:
diff changeset
  2008
        return EFalse;
hgs
parents:
diff changeset
  2009
hgs
parents:
diff changeset
  2010
    return aDocument->IsDocumentContentInteractive();
hgs
parents:
diff changeset
  2011
   /* RPointerArray<CSvgElementImpl> elements;
hgs
parents:
diff changeset
  2012
    aDocument->FindAllElements( (CSvgElementImpl* )aDocument->RootElement(),
hgs
parents:
diff changeset
  2013
                                 KSvgAElement, elements );
hgs
parents:
diff changeset
  2014
    if ( elements.Count() != 0 )
hgs
parents:
diff changeset
  2015
    {
hgs
parents:
diff changeset
  2016
        elements.Close();
hgs
parents:
diff changeset
  2017
        return ETrue;
hgs
parents:
diff changeset
  2018
    }
hgs
parents:
diff changeset
  2019
    elements.Close();
hgs
parents:
diff changeset
  2020
hgs
parents:
diff changeset
  2021
    if ( aDocument->iIsInteractive )
hgs
parents:
diff changeset
  2022
        return ETrue;
hgs
parents:
diff changeset
  2023
    else
hgs
parents:
diff changeset
  2024
        return EFalse;*/
hgs
parents:
diff changeset
  2025
}
hgs
parents:
diff changeset
  2026
hgs
parents:
diff changeset
  2027
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2028
//Copies a new path vector into the the given element's path
hgs
parents:
diff changeset
  2029
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2030
hgs
parents:
diff changeset
  2031
EXPORT_C void CSvgEngineInterfaceImpl::UpdatePath(TInt hPath, CSvgElementImpl* hElement)
hgs
parents:
diff changeset
  2032
{
hgs
parents:
diff changeset
  2033
    if ((hElement != NULL) && (hElement->ElemID() == KSvgPathElement))
hgs
parents:
diff changeset
  2034
    {
hgs
parents:
diff changeset
  2035
        TRAPD(error,hElement->SetAttributePathL(KAtrData, (CGfxGeneralPath*)hPath ));
hgs
parents:
diff changeset
  2036
        if ( error != KErrNone )
hgs
parents:
diff changeset
  2037
           {
hgs
parents:
diff changeset
  2038
            // Error Processing
hgs
parents:
diff changeset
  2039
            return;
hgs
parents:
diff changeset
  2040
           }
hgs
parents:
diff changeset
  2041
    }
hgs
parents:
diff changeset
  2042
}
hgs
parents:
diff changeset
  2043
hgs
parents:
diff changeset
  2044
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2045
//Returns the number of external resources in an svg document (A elements,IMG elements)
hgs
parents:
diff changeset
  2046
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2047
hgs
parents:
diff changeset
  2048
EXPORT_C TInt CSvgEngineInterfaceImpl::GetExternalListSize(CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  2049
{
hgs
parents:
diff changeset
  2050
    if ( ( aDocument == NULL ) || ( aDocument->RootElement() == NULL ) )
hgs
parents:
diff changeset
  2051
        return 0;
hgs
parents:
diff changeset
  2052
hgs
parents:
diff changeset
  2053
    TInt sum = 0;
hgs
parents:
diff changeset
  2054
hgs
parents:
diff changeset
  2055
    RPointerArray<CSvgElementImpl> a_elements;
hgs
parents:
diff changeset
  2056
    RPointerArray<CSvgElementImpl> image_elements;
hgs
parents:
diff changeset
  2057
hgs
parents:
diff changeset
  2058
    aDocument->FindAllElements( (CSvgElementImpl* )aDocument->RootElement(),
hgs
parents:
diff changeset
  2059
                                 KSvgAElement, a_elements );
hgs
parents:
diff changeset
  2060
    if ( a_elements.Count() != 0 )
hgs
parents:
diff changeset
  2061
    {
hgs
parents:
diff changeset
  2062
        sum = sum + a_elements.Count();
hgs
parents:
diff changeset
  2063
    }
hgs
parents:
diff changeset
  2064
        a_elements.Close();
hgs
parents:
diff changeset
  2065
hgs
parents:
diff changeset
  2066
    aDocument->FindAllElements( (CSvgElementImpl* )aDocument->RootElement(),
hgs
parents:
diff changeset
  2067
                                 KSvgImageElement, image_elements );
hgs
parents:
diff changeset
  2068
    if ( image_elements.Count() != 0 )
hgs
parents:
diff changeset
  2069
    {
hgs
parents:
diff changeset
  2070
        sum = sum + image_elements.Count();
hgs
parents:
diff changeset
  2071
    }
hgs
parents:
diff changeset
  2072
        image_elements.Close();
hgs
parents:
diff changeset
  2073
hgs
parents:
diff changeset
  2074
    return sum;
hgs
parents:
diff changeset
  2075
hgs
parents:
diff changeset
  2076
}
hgs
parents:
diff changeset
  2077
hgs
parents:
diff changeset
  2078
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2079
//Returns the uri of an external resource in an svg document (A elements,IMG elements)
hgs
parents:
diff changeset
  2080
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2081
hgs
parents:
diff changeset
  2082
EXPORT_C void CSvgEngineInterfaceImpl::GetExternalListItemL(
hgs
parents:
diff changeset
  2083
										CSvgDocumentImpl* aDocument, TInt aIndex, TPtrC16& aUri)
hgs
parents:
diff changeset
  2084
	{
hgs
parents:
diff changeset
  2085
	TDesC* uri = NULL;
hgs
parents:
diff changeset
  2086
	if ( ( aDocument != NULL ) && ( aDocument->RootElement() != NULL ) )
hgs
parents:
diff changeset
  2087
		{
hgs
parents:
diff changeset
  2088
		RPointerArray<CSvgElementImpl> a_elements;
hgs
parents:
diff changeset
  2089
		RPointerArray<CSvgElementImpl> image_elements;
hgs
parents:
diff changeset
  2090
		RPointerArray<CSvgElementImpl> all_externals;
hgs
parents:
diff changeset
  2091
		// Find & add all <a> elements
hgs
parents:
diff changeset
  2092
		aDocument->FindAllElements( (CSvgElementImpl* )aDocument->RootElement(),
hgs
parents:
diff changeset
  2093
								 KSvgAElement, a_elements );
hgs
parents:
diff changeset
  2094
		for (TInt i=0; i < a_elements.Count(); i++ )
hgs
parents:
diff changeset
  2095
			{
hgs
parents:
diff changeset
  2096
			all_externals.Append(a_elements[i]);
hgs
parents:
diff changeset
  2097
			}
hgs
parents:
diff changeset
  2098
		// Find & add all <image> elements
hgs
parents:
diff changeset
  2099
		aDocument->FindAllElements( (CSvgElementImpl* )aDocument->RootElement(),
hgs
parents:
diff changeset
  2100
								 KSvgImageElement, image_elements );
hgs
parents:
diff changeset
  2101
		for ( TInt i=0; i < image_elements.Count(); i++ )
hgs
parents:
diff changeset
  2102
			{
hgs
parents:
diff changeset
  2103
			all_externals.Append( image_elements[ i ] );
hgs
parents:
diff changeset
  2104
			}
hgs
parents:
diff changeset
  2105
		// Get element according to the given index
hgs
parents:
diff changeset
  2106
		if ( aIndex < all_externals.Count() )
hgs
parents:
diff changeset
  2107
			{
hgs
parents:
diff changeset
  2108
hgs
parents:
diff changeset
  2109
			CSvgElementImpl* myElement = (CSvgElementImpl*)all_externals[ aIndex ];
hgs
parents:
diff changeset
  2110
			if ( myElement )
hgs
parents:
diff changeset
  2111
				{
hgs
parents:
diff changeset
  2112
        		if ( (myElement->ElemID() ==
hgs
parents:
diff changeset
  2113
					KSvgImageElement) && ( ( ( CSvgImageElementImpl* ) myElement )->iIsBase64 ) )
hgs
parents:
diff changeset
  2114
					{
hgs
parents:
diff changeset
  2115
				   //do nothing because this is base64.
hgs
parents:
diff changeset
  2116
				   //want to return null for aValue
hgs
parents:
diff changeset
  2117
					}
hgs
parents:
diff changeset
  2118
				// Get an external resource uri
hgs
parents:
diff changeset
  2119
				else
hgs
parents:
diff changeset
  2120
					{
hgs
parents:
diff changeset
  2121
            		uri = myElement->HrefPointer();
hgs
parents:
diff changeset
  2122
            		// Check if the uri is already downloaded
hgs
parents:
diff changeset
  2123
            		if( ( uri != NULL ) && ( uri->Length() >= 0 ) )
hgs
parents:
diff changeset
  2124
						{
hgs
parents:
diff changeset
  2125
						TDesC* duplicateUri = NULL;
hgs
parents:
diff changeset
  2126
						for ( int index = aIndex - 1; index >= 0; index-- )
hgs
parents:
diff changeset
  2127
							{
hgs
parents:
diff changeset
  2128
							myElement = (CSvgElementImpl*)all_externals[ index ];
hgs
parents:
diff changeset
  2129
							if (myElement)
hgs
parents:
diff changeset
  2130
								{
hgs
parents:
diff changeset
  2131
								duplicateUri = myElement->HrefPointer();
hgs
parents:
diff changeset
  2132
								if ( ( duplicateUri != NULL ) && ( *uri == *duplicateUri ) )
hgs
parents:
diff changeset
  2133
									{
hgs
parents:
diff changeset
  2134
									// External resource is already downloaded. Don't have
hgs
parents:
diff changeset
  2135
									// to equest it again
hgs
parents:
diff changeset
  2136
									return;
hgs
parents:
diff changeset
  2137
									}
hgs
parents:
diff changeset
  2138
								}
hgs
parents:
diff changeset
  2139
							}
hgs
parents:
diff changeset
  2140
						}
hgs
parents:
diff changeset
  2141
					}
hgs
parents:
diff changeset
  2142
				}
hgs
parents:
diff changeset
  2143
			}
hgs
parents:
diff changeset
  2144
		image_elements.Close();
hgs
parents:
diff changeset
  2145
		a_elements.Close();
hgs
parents:
diff changeset
  2146
		all_externals.Close();
hgs
parents:
diff changeset
  2147
		}
hgs
parents:
diff changeset
  2148
	if( uri != NULL )
hgs
parents:
diff changeset
  2149
		{
hgs
parents:
diff changeset
  2150
		// Allocate heap memory
hgs
parents:
diff changeset
  2151
		/*TInt length = uri->Length() + 1;
hgs
parents:
diff changeset
  2152
		TUint16* result = new ( ELeave ) TUint16[ length ];
hgs
parents:
diff changeset
  2153
		TPtr16 resultPtr( result, length );
hgs
parents:
diff changeset
  2154
		resultPtr.Copy( *uri );
hgs
parents:
diff changeset
  2155
		resultPtr.ZeroTerminate();
hgs
parents:
diff changeset
  2156
		return CONST_CAST( TUint16*, resultPtr.Ptr() );*/
hgs
parents:
diff changeset
  2157
hgs
parents:
diff changeset
  2158
		aUri.Set(*uri);
hgs
parents:
diff changeset
  2159
hgs
parents:
diff changeset
  2160
		}
hgs
parents:
diff changeset
  2161
	return;
hgs
parents:
diff changeset
  2162
	}
hgs
parents:
diff changeset
  2163
hgs
parents:
diff changeset
  2164
hgs
parents:
diff changeset
  2165
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2166
// Finds the element with the corresponding uri and then adds the data that was
hgs
parents:
diff changeset
  2167
// passed in by an external resource handler
hgs
parents:
diff changeset
  2168
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  2169
// This code was copied from the CSvgEngineImpl
hgs
parents:
diff changeset
  2170
EXPORT_C CSvgElementImpl* CSvgEngineInterfaceImpl::AddExternalData(
hgs
parents:
diff changeset
  2171
                                        CSvgDocumentImpl* aDocument,
hgs
parents:
diff changeset
  2172
                                        const TDesC& aUri,
hgs
parents:
diff changeset
  2173
                                        const TDesC8& aData,
hgs
parents:
diff changeset
  2174
                                        TBool aMakeCopy,
hgs
parents:
diff changeset
  2175
                                        TInt aSize,
hgs
parents:
diff changeset
  2176
                                        TInt aEngine )
hgs
parents:
diff changeset
  2177
    {
hgs
parents:
diff changeset
  2178
    // Use the internal engine's document if parameter is NULL
hgs
parents:
diff changeset
  2179
    if ( aDocument == NULL )
hgs
parents:
diff changeset
  2180
        {
hgs
parents:
diff changeset
  2181
        if ( ChooseEngine( aEngine) )
hgs
parents:
diff changeset
  2182
            {
hgs
parents:
diff changeset
  2183
            aDocument = iSvgEngine->Document();
hgs
parents:
diff changeset
  2184
            }
hgs
parents:
diff changeset
  2185
        }
hgs
parents:
diff changeset
  2186
hgs
parents:
diff changeset
  2187
    // Check whether document, root element are valid and URI is of 
hgs
parents:
diff changeset
  2188
    // non-zero length
hgs
parents:
diff changeset
  2189
    if ( ( aDocument == NULL ) || ( aDocument->RootElement() == NULL ) ||
hgs
parents:
diff changeset
  2190
         ( aUri.Length() == 0 ) )
hgs
parents:
diff changeset
  2191
        {
hgs
parents:
diff changeset
  2192
        return NULL;
hgs
parents:
diff changeset
  2193
        }
hgs
parents:
diff changeset
  2194
hgs
parents:
diff changeset
  2195
    // Find all <image> elements in current document
hgs
parents:
diff changeset
  2196
    RPointerArray<CSvgElementImpl> lAllImageElements;
hgs
parents:
diff changeset
  2197
    RPointerArray<CSvgElementImpl> lMatchingImageElements;
hgs
parents:
diff changeset
  2198
    aDocument->FindAllElements( (CSvgElementImpl*)aDocument->RootElement(),
hgs
parents:
diff changeset
  2199
                                KSvgImageElement,
hgs
parents:
diff changeset
  2200
                                lAllImageElements,
hgs
parents:
diff changeset
  2201
                                ESvgSearchExcludeUseSubtree ); // Ignore the 
hgs
parents:
diff changeset
  2202
                                                               // cloned image elements
hgs
parents:
diff changeset
  2203
                                                               // under use element
hgs
parents:
diff changeset
  2204
   
hgs
parents:
diff changeset
  2205
    // Set Owner Document to default Doc
hgs
parents:
diff changeset
  2206
    for ( TInt lIndex = 0; lIndex < lAllImageElements.Count(); lIndex++ )
hgs
parents:
diff changeset
  2207
        {
hgs
parents:
diff changeset
  2208
        lAllImageElements[ lIndex ]->SetOwnerDocument( aDocument );
hgs
parents:
diff changeset
  2209
        } // for ( TInt lIndex = 0; ...
hgs
parents:
diff changeset
  2210
hgs
parents:
diff changeset
  2211
    // Search for Image elements inside child document as well
hgs
parents:
diff changeset
  2212
    // First create a list of animation elements. 
hgs
parents:
diff changeset
  2213
    RPointerArray<CSvgElementImpl> lAllAnimationElements;                                
hgs
parents:
diff changeset
  2214
    aDocument->FindAllElements( ( CSvgElementImpl* )aDocument->RootElement(),
hgs
parents:
diff changeset
  2215
                                KSvgMediaAnimationElement,
hgs
parents:
diff changeset
  2216
                                lAllAnimationElements );                                
hgs
parents:
diff changeset
  2217
    // Each animation element has a child document, append the list of image elements
hgs
parents:
diff changeset
  2218
    // found in the child document to lAllImageElements
hgs
parents:
diff changeset
  2219
    TInt lAllAnimationEleCnt = lAllAnimationElements.Count();                            
hgs
parents:
diff changeset
  2220
    for ( TInt i = 0; i < lAllAnimationEleCnt; i++ )
hgs
parents:
diff changeset
  2221
        {
hgs
parents:
diff changeset
  2222
        CSvgMediaAnimationElementImpl* element = 
hgs
parents:
diff changeset
  2223
            ( CSvgMediaAnimationElementImpl* )lAllAnimationElements[i];
hgs
parents:
diff changeset
  2224
        CSvgDocumentImpl* ldoc = element->GetChildDocument();
hgs
parents:
diff changeset
  2225
        if ( ldoc )
hgs
parents:
diff changeset
  2226
            {
hgs
parents:
diff changeset
  2227
            RPointerArray<CSvgElementImpl> lChildImageElements;
hgs
parents:
diff changeset
  2228
            ldoc->FindAllElements( (CSvgElementImpl*)ldoc->RootElement(),
hgs
parents:
diff changeset
  2229
                                KSvgImageElement,
hgs
parents:
diff changeset
  2230
                                lChildImageElements,
hgs
parents:
diff changeset
  2231
                                ESvgSearchExcludeUseSubtree ); // Ignore the 
hgs
parents:
diff changeset
  2232
                                                               // cloned image elements
hgs
parents:
diff changeset
  2233
                                                               // under use element
hgs
parents:
diff changeset
  2234
            // Set Owner Document to child Doc
hgs
parents:
diff changeset
  2235
            for ( TInt lIndex = 0; lIndex < lChildImageElements.Count(); lIndex++ )
hgs
parents:
diff changeset
  2236
                {
hgs
parents:
diff changeset
  2237
                lChildImageElements[ lIndex ]->SetOwnerDocument( ldoc );
hgs
parents:
diff changeset
  2238
                // Also append the image elements into the image list
hgs
parents:
diff changeset
  2239
                lAllImageElements.Append( lChildImageElements[ lIndex ] );
hgs
parents:
diff changeset
  2240
                } // for ( TInt lIndex = 0; ...
hgs
parents:
diff changeset
  2241
              lChildImageElements.Close();  
hgs
parents:
diff changeset
  2242
            }
hgs
parents:
diff changeset
  2243
        } // for ( TInt i = 0; i < lAllAnimationEleCnt; i++ )
hgs
parents:
diff changeset
  2244
hgs
parents:
diff changeset
  2245
    lAllAnimationElements.Close();
hgs
parents:
diff changeset
  2246
    // lAllImageElements now contains image elements in parent as well as child documents
hgs
parents:
diff changeset
  2247
    // Generate a list with only those image elements with same URI
hgs
parents:
diff changeset
  2248
    TInt lAllImageEleCnt = lAllImageElements.Count();
hgs
parents:
diff changeset
  2249
    for ( TInt i = 0; i < lAllImageEleCnt; i++ )
hgs
parents:
diff changeset
  2250
        {
hgs
parents:
diff changeset
  2251
        CSvgImageElementImpl* element = ( CSvgImageElementImpl* )
hgs
parents:
diff changeset
  2252
            lAllImageElements[ i ];
hgs
parents:
diff changeset
  2253
        TPtrC href = element->Href();
hgs
parents:
diff changeset
  2254
        if ( href == aUri )
hgs
parents:
diff changeset
  2255
            {
hgs
parents:
diff changeset
  2256
            lMatchingImageElements.Append( element );
hgs
parents:
diff changeset
  2257
            }
hgs
parents:
diff changeset
  2258
        }
hgs
parents:
diff changeset
  2259
    lAllImageElements.Close();
hgs
parents:
diff changeset
  2260
hgs
parents:
diff changeset
  2261
    // Return if no <image> element matching URI
hgs
parents:
diff changeset
  2262
    if ( lMatchingImageElements.Count() == 0 )
hgs
parents:
diff changeset
  2263
        {
hgs
parents:
diff changeset
  2264
        lMatchingImageElements.Close();
hgs
parents:
diff changeset
  2265
        return NULL;
hgs
parents:
diff changeset
  2266
        }
hgs
parents:
diff changeset
  2267
hgs
parents:
diff changeset
  2268
    // Only first <image> element owns the imageData and all other image 
hgs
parents:
diff changeset
  2269
    // elements refer to this data for decoding.
hgs
parents:
diff changeset
  2270
    CSvgImageElementImpl* firstElement = ( CSvgImageElementImpl* )
hgs
parents:
diff changeset
  2271
        lMatchingImageElements[0];
hgs
parents:
diff changeset
  2272
hgs
parents:
diff changeset
  2273
    // This loop decodes the imageData for every image element which has 
hgs
parents:
diff changeset
  2274
    // the same URI. 
hgs
parents:
diff changeset
  2275
    // Two image elements could have the same URI, yet they may have different sizes
hgs
parents:
diff changeset
  2276
    // hence every image element decodes the same imageData.
hgs
parents:
diff changeset
  2277
    TInt lImageEleCnt = lMatchingImageElements.Count();
hgs
parents:
diff changeset
  2278
    for (TInt j=0; j < lImageEleCnt; j++)
hgs
parents:
diff changeset
  2279
        {
hgs
parents:
diff changeset
  2280
        CSvgImageElementImpl* lImageElement = ( CSvgImageElementImpl* )
hgs
parents:
diff changeset
  2281
            lMatchingImageElements[j];
hgs
parents:
diff changeset
  2282
hgs
parents:
diff changeset
  2283
        // Create bitmap if needed
hgs
parents:
diff changeset
  2284
        CFbsBitmap* bitmap = lImageElement->GetBitmap();
hgs
parents:
diff changeset
  2285
        if ( bitmap == NULL )
hgs
parents:
diff changeset
  2286
            {
hgs
parents:
diff changeset
  2287
            // Can't use ELeave because that this function can't leave
hgs
parents:
diff changeset
  2288
            bitmap = new CFbsBitmap();
hgs
parents:
diff changeset
  2289
            // Check if bitmap was allocated
hgs
parents:
diff changeset
  2290
            if ( !bitmap )
hgs
parents:
diff changeset
  2291
                {
hgs
parents:
diff changeset
  2292
                #ifdef _DBEUG
hgs
parents:
diff changeset
  2293
                RDebug::Printf("ERROR IN BITAMP CREATION: new (ELeave) CFbsBitmap(): %d", bitmapError);
hgs
parents:
diff changeset
  2294
                #endif
hgs
parents:
diff changeset
  2295
                // Return firstElement so that the image data is not deleted.
hgs
parents:
diff changeset
  2296
                // The data needs to be valid as this is happening inside a 
hgs
parents:
diff changeset
  2297
                // loop and previous image elements which have started decoding
hgs
parents:
diff changeset
  2298
                // this image data should not get affected.
hgs
parents:
diff changeset
  2299
                return firstElement;
hgs
parents:
diff changeset
  2300
                }
hgs
parents:
diff changeset
  2301
 
hgs
parents:
diff changeset
  2302
            // Create minimum bitmap size
hgs
parents:
diff changeset
  2303
            TInt createError = bitmap->Create( TSize( 1, 1 ), EColor64K );
hgs
parents:
diff changeset
  2304
            if ( createError != KErrNone )
hgs
parents:
diff changeset
  2305
                {
hgs
parents:
diff changeset
  2306
                #ifdef _DEBUG
hgs
parents:
diff changeset
  2307
                RDebug::Printf( "ERROR IN BITAMP CREATION: bitmap->Create: %d", createError );
hgs
parents:
diff changeset
  2308
                #endif
hgs
parents:
diff changeset
  2309
                delete bitmap;
hgs
parents:
diff changeset
  2310
                // Return firstElement so that the image data is not deleted.
hgs
parents:
diff changeset
  2311
                // The data needs to be valid as this is happening inside a 
hgs
parents:
diff changeset
  2312
                // loop and previous image elements which have started decoding
hgs
parents:
diff changeset
  2313
                // this image data should not get affected.
hgs
parents:
diff changeset
  2314
                return firstElement;
hgs
parents:
diff changeset
  2315
                }
hgs
parents:
diff changeset
  2316
            // Transfer ownership of bitmap to image element    
hgs
parents:
diff changeset
  2317
            lImageElement->SetBitmap( bitmap );
hgs
parents:
diff changeset
  2318
            } // if ( !bitmap )
hgs
parents:
diff changeset
  2319
hgs
parents:
diff changeset
  2320
        if ( aMakeCopy )
hgs
parents:
diff changeset
  2321
            {
hgs
parents:
diff changeset
  2322
            // Make a copy of the image data and transfer ownership for this
hgs
parents:
diff changeset
  2323
            // data to the particular image element
hgs
parents:
diff changeset
  2324
            HBufC8* lImageDataCopy = NULL;
hgs
parents:
diff changeset
  2325
            TRAPD( error, lImageDataCopy = HBufC8::NewL( aData.Length() ) );
hgs
parents:
diff changeset
  2326
 
hgs
parents:
diff changeset
  2327
            if ( error != KErrNone )
hgs
parents:
diff changeset
  2328
                {
hgs
parents:
diff changeset
  2329
                #ifdef _DEBUG
hgs
parents:
diff changeset
  2330
                    RDebug::Printf( "Failed to copy Image: Out of memory" );
hgs
parents:
diff changeset
  2331
                #endif
hgs
parents:
diff changeset
  2332
 
hgs
parents:
diff changeset
  2333
                return NULL;
hgs
parents:
diff changeset
  2334
                }
hgs
parents:
diff changeset
  2335
            // copy the data into the image element 
hgs
parents:
diff changeset
  2336
            lImageDataCopy->Des().Copy(aData);
hgs
parents:
diff changeset
  2337
 
hgs
parents:
diff changeset
  2338
            if (aData.Length() == 0 || aSize == 0)
hgs
parents:
diff changeset
  2339
                {
hgs
parents:
diff changeset
  2340
                // No data available, cleanup allocated memory
hgs
parents:
diff changeset
  2341
                delete lImageDataCopy;
hgs
parents:
diff changeset
  2342
                delete lImageElement->iBitmap;
hgs
parents:
diff changeset
  2343
                lImageElement->iBitmap = NULL;
hgs
parents:
diff changeset
  2344
                }
hgs
parents:
diff changeset
  2345
            else
hgs
parents:
diff changeset
  2346
                {
hgs
parents:
diff changeset
  2347
                // Begin image decoding (asynchronously).
hgs
parents:
diff changeset
  2348
                TInt lImgDecErr = lImageElement->StartImageDecoding( 
hgs
parents:
diff changeset
  2349
                        *lImageDataCopy, 
hgs
parents:
diff changeset
  2350
                        ETrue ); // ETrue means Sync decoding
hgs
parents:
diff changeset
  2351
                if ( lImgDecErr != KErrNone )
hgs
parents:
diff changeset
  2352
                    {
hgs
parents:
diff changeset
  2353
                    // No error processing
hgs
parents:
diff changeset
  2354
                    }
hgs
parents:
diff changeset
  2355
                lImageElement->AssignImageData( lImageDataCopy );
hgs
parents:
diff changeset
  2356
                }
hgs
parents:
diff changeset
  2357
 
hgs
parents:
diff changeset
  2358
            }
hgs
parents:
diff changeset
  2359
        else // if ( aMakeCopy )
hgs
parents:
diff changeset
  2360
            {
hgs
parents:
diff changeset
  2361
            // Do not make a copy of the imageData.
hgs
parents:
diff changeset
  2362
            // Begin image decoding (asynchronously).
hgs
parents:
diff changeset
  2363
            // An asynchronous approach was chosen as AddExternalData is called
hgs
parents:
diff changeset
  2364
            // to asynchronously notify the engine of availability of image 
hgs
parents:
diff changeset
  2365
            // data.
hgs
parents:
diff changeset
  2366
            // The underlying ImageDecoder is an asynchronous API and an 
hgs
parents:
diff changeset
  2367
            // ActiveSchedulerWait object is used to make it synchronous. In 
hgs
parents:
diff changeset
  2368
            // this case the client Active objects get a chance to execute. 
hgs
parents:
diff changeset
  2369
            // While decoding is in progress, if the client exits it used to
hgs
parents:
diff changeset
  2370
            // delete the engine and the document but async service provider is
hgs
parents:
diff changeset
  2371
            // not yet complete. When the async service provider completes 
hgs
parents:
diff changeset
  2372
            // it would cause the access violation error as it would 
hgs
parents:
diff changeset
  2373
            // try to use image element object which has been deleted.
hgs
parents:
diff changeset
  2374
            TInt lImgDecErr = lImageElement->StartImageDecoding( aData, 
hgs
parents:
diff changeset
  2375
                    EFalse ); // EFalse means async decoding
hgs
parents:
diff changeset
  2376
hgs
parents:
diff changeset
  2377
            if ( lImgDecErr != KErrNone )
hgs
parents:
diff changeset
  2378
                {
hgs
parents:
diff changeset
  2379
                // No error processing
hgs
parents:
diff changeset
  2380
                }
hgs
parents:
diff changeset
  2381
            } // if ( aMakeCopy )
hgs
parents:
diff changeset
  2382
        } // for (TInt j=0; j < lImageEleCnt; j++)
hgs
parents:
diff changeset
  2383
hgs
parents:
diff changeset
  2384
    lMatchingImageElements.Close();
hgs
parents:
diff changeset
  2385
hgs
parents:
diff changeset
  2386
    return firstElement;
hgs
parents:
diff changeset
  2387
    }
hgs
parents:
diff changeset
  2388
hgs
parents:
diff changeset
  2389
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2390
// EXPORT_C void CSvgEngineInterfaceImpl::AssignImageData( const TDesC& aUri,
hgs
parents:
diff changeset
  2391
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2392
EXPORT_C void CSvgEngineInterfaceImpl::AssignImageData( const TDesC& aUri,
hgs
parents:
diff changeset
  2393
                                                        HBufC8* aData )
hgs
parents:
diff changeset
  2394
    {
hgs
parents:
diff changeset
  2395
    CSvgImageElementImpl* element =
hgs
parents:
diff changeset
  2396
        (CSvgImageElementImpl*)AddExternalData( NULL, aUri, *aData, EFalse );
hgs
parents:
diff changeset
  2397
    if ( element == NULL )
hgs
parents:
diff changeset
  2398
        {
hgs
parents:
diff changeset
  2399
        // delete image data now -- due to failure
hgs
parents:
diff changeset
  2400
        delete aData;
hgs
parents:
diff changeset
  2401
        }
hgs
parents:
diff changeset
  2402
    else
hgs
parents:
diff changeset
  2403
        {
hgs
parents:
diff changeset
  2404
        // <image> element will delete it after decoding
hgs
parents:
diff changeset
  2405
        element->AssignImageData( aData );
hgs
parents:
diff changeset
  2406
        }
hgs
parents:
diff changeset
  2407
    }
hgs
parents:
diff changeset
  2408
hgs
parents:
diff changeset
  2409
/********************** Wrapper functions for new avoid new exports *******************/
hgs
parents:
diff changeset
  2410
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2411
// EXPORT_C CSvgEngineImpl* CSvgEngineInterfaceImpl::SvgEngineNewL()
hgs
parents:
diff changeset
  2412
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2413
EXPORT_C CSvgEngineImpl* CSvgEngineInterfaceImpl::SvgEngineNewL()
hgs
parents:
diff changeset
  2414
{
hgs
parents:
diff changeset
  2415
    //this is the JSR side creating the engine
hgs
parents:
diff changeset
  2416
    iSvgEngine = CSvgEngineImpl::NewL(iSvgBitmapFontProvider);
hgs
parents:
diff changeset
  2417
    iSvgEnginePointers.Append(iSvgEngine);
hgs
parents:
diff changeset
  2418
    return iSvgEngine;
hgs
parents:
diff changeset
  2419
}
hgs
parents:
diff changeset
  2420
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2421
// EXPORT_C void CSvgEngineInterfaceImpl::StartEngine( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
  2422
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2423
EXPORT_C void CSvgEngineInterfaceImpl::StartEngine( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
  2424
{
hgs
parents:
diff changeset
  2425
    if( ChooseEngine ( (TInt)aEngine ) )
hgs
parents:
diff changeset
  2426
        {
hgs
parents:
diff changeset
  2427
        iSvgEngine->StartEngine();
hgs
parents:
diff changeset
  2428
        }
hgs
parents:
diff changeset
  2429
}
hgs
parents:
diff changeset
  2430
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2431
// EXPORT_C void CSvgEngineInterfaceImpl::RenderFrame( CSvgEngineImpl* aEngine, TUint aCurrentTime )
hgs
parents:
diff changeset
  2432
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2433
EXPORT_C void CSvgEngineInterfaceImpl::RenderFrame( CSvgEngineImpl* aEngine, TUint aCurrentTime )
hgs
parents:
diff changeset
  2434
{
hgs
parents:
diff changeset
  2435
    if( ChooseEngine ( (TInt)aEngine ) )
hgs
parents:
diff changeset
  2436
        {
hgs
parents:
diff changeset
  2437
        iSvgEngine->RenderFrame( aCurrentTime );
hgs
parents:
diff changeset
  2438
        }
hgs
parents:
diff changeset
  2439
}
hgs
parents:
diff changeset
  2440
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2441
// EXPORT_C void CSvgEngineInterfaceImpl::ViewportInit( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  2442
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2443
EXPORT_C void CSvgEngineInterfaceImpl::ViewportInit( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  2444
{
hgs
parents:
diff changeset
  2445
    if( !aDocumentHandle )
hgs
parents:
diff changeset
  2446
        return;
hgs
parents:
diff changeset
  2447
hgs
parents:
diff changeset
  2448
    aDocumentHandle->iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
  2449
hgs
parents:
diff changeset
  2450
hgs
parents:
diff changeset
  2451
    TSize Size = TSize(100, 100); // default viewport size
hgs
parents:
diff changeset
  2452
    aDocumentHandle->iReqExReqFtrSysLTested = EFalse;
hgs
parents:
diff changeset
  2453
    if ( aDocumentHandle->RootElement() != NULL &&
hgs
parents:
diff changeset
  2454
         ((CSvgElementImpl*)aDocumentHandle->RootElement())->ElemID() == KSvgSvgElement )
hgs
parents:
diff changeset
  2455
hgs
parents:
diff changeset
  2456
        {
hgs
parents:
diff changeset
  2457
        // Scale width & height to fit to screen size
hgs
parents:
diff changeset
  2458
        CSvgSvgElementImpl*     el      = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
  2459
                                          (aDocumentHandle->RootElement());
hgs
parents:
diff changeset
  2460
        TFloatFixPt                  width, height;
hgs
parents:
diff changeset
  2461
        TFloatFixPt scrnW( Size.iWidth ), scrnH( Size.iHeight );
hgs
parents:
diff changeset
  2462
        TFloatFixPt                  zero    ( 0 );
hgs
parents:
diff changeset
  2463
        if (((CSvgSvgElementImpl *)(aDocumentHandle->RootElement()))->iWidthInPercentage)
hgs
parents:
diff changeset
  2464
            {
hgs
parents:
diff changeset
  2465
            // since we are mapping the percentage to a viewport that is 100x100 the percentage value can be used directly
hgs
parents:
diff changeset
  2466
            width = ( TFloatFixPt ) (((CSvgSvgElementImpl *)(aDocumentHandle->RootElement()))->iWidthInUserCoordinate);
hgs
parents:
diff changeset
  2467
            }
hgs
parents:
diff changeset
  2468
        else
hgs
parents:
diff changeset
  2469
            {
hgs
parents:
diff changeset
  2470
            width  = (TFloatFixPt)  (((CSvgSvgElementImpl *)(aDocumentHandle->RootElement()))->iWidthInUserCoordinate);
hgs
parents:
diff changeset
  2471
            }
hgs
parents:
diff changeset
  2472
hgs
parents:
diff changeset
  2473
        if (((CSvgSvgElementImpl *)(aDocumentHandle->RootElement()))->iHeightInPercentage)
hgs
parents:
diff changeset
  2474
        {
hgs
parents:
diff changeset
  2475
            height = ( TFloatFixPt ) (((CSvgSvgElementImpl *)(aDocumentHandle->RootElement()))->iHeightInUserCoordinate);
hgs
parents:
diff changeset
  2476
        }
hgs
parents:
diff changeset
  2477
        else
hgs
parents:
diff changeset
  2478
        {
hgs
parents:
diff changeset
  2479
            height = (TFloatFixPt)  (((CSvgSvgElementImpl *)(aDocumentHandle->RootElement()))->iHeightInUserCoordinate);
hgs
parents:
diff changeset
  2480
        }
hgs
parents:
diff changeset
  2481
        if ( ( width <= zero ) && ( height <= zero ) )
hgs
parents:
diff changeset
  2482
            {
hgs
parents:
diff changeset
  2483
            width = 0;
hgs
parents:
diff changeset
  2484
            height = 0;
hgs
parents:
diff changeset
  2485
            return;
hgs
parents:
diff changeset
  2486
            }
hgs
parents:
diff changeset
  2487
hgs
parents:
diff changeset
  2488
        // Set initial viewport
hgs
parents:
diff changeset
  2489
        TInt err;
hgs
parents:
diff changeset
  2490
        TRAP(err, el->SetAttributeFloatL( KAtrX, zero ));
hgs
parents:
diff changeset
  2491
        TRAP(err, el->SetAttributeFloatL( KAtrY, zero ));
hgs
parents:
diff changeset
  2492
        TRAP(err, el->SetAttributeFloatL( KAtrWidth, width ));
hgs
parents:
diff changeset
  2493
        TRAP(err, el->SetAttributeFloatL( KAtrHeight, height ));
hgs
parents:
diff changeset
  2494
        }
hgs
parents:
diff changeset
  2495
}
hgs
parents:
diff changeset
  2496
hgs
parents:
diff changeset
  2497
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2498
// EXPORT_C void CSvgEngineInterfaceImpl::SetGdiContextL( CSvgEngineImpl* aEngine, CFbsBitmap* aFrameBuffer )
hgs
parents:
diff changeset
  2499
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2500
EXPORT_C void CSvgEngineInterfaceImpl::SetGdiContextL( CSvgEngineImpl* aEngine, CFbsBitmap* aFrameBuffer )
hgs
parents:
diff changeset
  2501
{
hgs
parents:
diff changeset
  2502
    if( aEngine )
hgs
parents:
diff changeset
  2503
        {
hgs
parents:
diff changeset
  2504
        aEngine->SetGdiContextL( aFrameBuffer );
hgs
parents:
diff changeset
  2505
        }
hgs
parents:
diff changeset
  2506
}
hgs
parents:
diff changeset
  2507
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2508
// EXPORT_C void CSvgEngineInterfaceImpl::SetDocument( CSvgEngineImpl* aEngine, CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2509
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2510
EXPORT_C void CSvgEngineInterfaceImpl::SetDocument( CSvgEngineImpl* aEngine, CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2511
{
hgs
parents:
diff changeset
  2512
    iTotalRotation = 0;
hgs
parents:
diff changeset
  2513
    if( aEngine && aDocument)
hgs
parents:
diff changeset
  2514
        {
hgs
parents:
diff changeset
  2515
        aEngine->SetDocument( aDocument );
hgs
parents:
diff changeset
  2516
        aDocument->SetEngine( aEngine );
hgs
parents:
diff changeset
  2517
hgs
parents:
diff changeset
  2518
        // costly calls per frame
hgs
parents:
diff changeset
  2519
        SvgElementAssignDocument((CSvgElementImpl*)aDocument->RootElement(), aDocument);
hgs
parents:
diff changeset
  2520
hgs
parents:
diff changeset
  2521
        ((CSvgElementImpl*)aDocument->RootElement())->InitAllSvgStyleProperties((CSvgElementImpl*)aDocument->RootElement());
hgs
parents:
diff changeset
  2522
hgs
parents:
diff changeset
  2523
        }
hgs
parents:
diff changeset
  2524
}
hgs
parents:
diff changeset
  2525
hgs
parents:
diff changeset
  2526
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2527
// void CSvgEngineInterfaceImpl::SvgElementAssignDocument( CSvgElementImpl* aElement, CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
  2528
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2529
void CSvgEngineInterfaceImpl::SvgElementAssignDocument( CSvgElementImpl* aElement, CSvgDocumentImpl* aDoc )
hgs
parents:
diff changeset
  2530
{
hgs
parents:
diff changeset
  2531
    if ( aElement == NULL )
hgs
parents:
diff changeset
  2532
        return;
hgs
parents:
diff changeset
  2533
hgs
parents:
diff changeset
  2534
    aElement->SetOwnerDocument( aDoc );
hgs
parents:
diff changeset
  2535
hgs
parents:
diff changeset
  2536
    CSvgElementImpl* child = (CSvgElementImpl*)aElement->FirstChild();
hgs
parents:
diff changeset
  2537
    if ( child )
hgs
parents:
diff changeset
  2538
        {
hgs
parents:
diff changeset
  2539
        SvgElementAssignDocument( child, aDoc );
hgs
parents:
diff changeset
  2540
        }
hgs
parents:
diff changeset
  2541
hgs
parents:
diff changeset
  2542
    CSvgElementImpl* sibling = (CSvgElementImpl*)aElement->NextSibling();
hgs
parents:
diff changeset
  2543
    if ( sibling )
hgs
parents:
diff changeset
  2544
        {
hgs
parents:
diff changeset
  2545
        SvgElementAssignDocument( sibling, aDoc );
hgs
parents:
diff changeset
  2546
        }
hgs
parents:
diff changeset
  2547
}
hgs
parents:
diff changeset
  2548
hgs
parents:
diff changeset
  2549
hgs
parents:
diff changeset
  2550
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2551
// EXPORT_C CSvgDocumentImpl* CSvgEngineInterfaceImpl::SvgDocumentNewL()
hgs
parents:
diff changeset
  2552
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2553
EXPORT_C CSvgDocumentImpl* CSvgEngineInterfaceImpl::SvgDocumentNewL()
hgs
parents:
diff changeset
  2554
{
hgs
parents:
diff changeset
  2555
	CSvgDocumentImpl* document = CSvgDocumentImpl::NewL(iSvgBitmapFontProvider);
hgs
parents:
diff changeset
  2556
	iSvgDocumentPointers.Append(document);
hgs
parents:
diff changeset
  2557
hgs
parents:
diff changeset
  2558
    return document;
hgs
parents:
diff changeset
  2559
}
hgs
parents:
diff changeset
  2560
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2561
// EXPORT_C void CSvgEngineInterfaceImpl::FillDocumentL( CSvgDocumentImpl* aDocument, const TDesC16& aSvgString )
hgs
parents:
diff changeset
  2562
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2563
EXPORT_C void CSvgEngineInterfaceImpl::FillDocumentL( CSvgDocumentImpl* aDocument, const TDesC16& aSvgString )
hgs
parents:
diff changeset
  2564
{
hgs
parents:
diff changeset
  2565
    if( aDocument )
hgs
parents:
diff changeset
  2566
        {
hgs
parents:
diff changeset
  2567
        aDocument->SetDRMMode( iDrmEnabled );
hgs
parents:
diff changeset
  2568
        SetThumbNailMode( iIsThumbNailMode );
hgs
parents:
diff changeset
  2569
        SetDRMRights( iDrmRightsConsumptionEnabled );
hgs
parents:
diff changeset
  2570
        aDocument->Load16BitString(aSvgString, *iSvgError, EFalse );
hgs
parents:
diff changeset
  2571
        if ( aDocument->HasError() )
hgs
parents:
diff changeset
  2572
            {
hgs
parents:
diff changeset
  2573
            iSvgError->SetErrorCode( aDocument->GetError()->ErrorCode() );
hgs
parents:
diff changeset
  2574
            iSvgError->SetSystemErrorCode( aDocument->GetError()->SystemErrorCode() );
hgs
parents:
diff changeset
  2575
            iSvgError->SetDescription( aDocument->GetError()->Description() );
hgs
parents:
diff changeset
  2576
            User::Leave( iSvgError->SystemErrorCode() );
hgs
parents:
diff changeset
  2577
            }
hgs
parents:
diff changeset
  2578
        }
hgs
parents:
diff changeset
  2579
}
hgs
parents:
diff changeset
  2580
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2581
// EXPORT_C void CSvgEngineInterfaceImpl::DestroyDocument( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2582
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2583
EXPORT_C void CSvgEngineInterfaceImpl::DestroyDocument( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2584
{
hgs
parents:
diff changeset
  2585
    if (aDocument )
hgs
parents:
diff changeset
  2586
    {
hgs
parents:
diff changeset
  2587
        TInt index = iSvgDocumentPointers.Find( aDocument );
hgs
parents:
diff changeset
  2588
        if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2589
        	{
hgs
parents:
diff changeset
  2590
        		//make sure document isnt attached to an engine
hgs
parents:
diff changeset
  2591
        		TInt svgEnginePointersCnt = iSvgEnginePointers.Count();
hgs
parents:
diff changeset
  2592
        		for (TInt i=0; i < svgEnginePointersCnt; i++)
hgs
parents:
diff changeset
  2593
       			{
hgs
parents:
diff changeset
  2594
       				CSvgEngineImpl* engine = iSvgEnginePointers[i];
hgs
parents:
diff changeset
  2595
       				CSvgDocumentImpl* docAttachedToEngine = engine->Document();
hgs
parents:
diff changeset
  2596
hgs
parents:
diff changeset
  2597
       				if (docAttachedToEngine == aDocument)
hgs
parents:
diff changeset
  2598
       				{
hgs
parents:
diff changeset
  2599
       					//remove document attachment to engine
hgs
parents:
diff changeset
  2600
       					engine->SetDocument(NULL);
hgs
parents:
diff changeset
  2601
       				}
hgs
parents:
diff changeset
  2602
       			}
hgs
parents:
diff changeset
  2603
hgs
parents:
diff changeset
  2604
        		delete aDocument;
hgs
parents:
diff changeset
  2605
        		iSvgDocumentPointers.Remove( index );
hgs
parents:
diff changeset
  2606
        	}
hgs
parents:
diff changeset
  2607
    }
hgs
parents:
diff changeset
  2608
}
hgs
parents:
diff changeset
  2609
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2610
// EXPORT_C void CSvgEngineInterfaceImpl::DestroyEngine( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
  2611
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2612
EXPORT_C void CSvgEngineInterfaceImpl::DestroyEngine( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
  2613
{
hgs
parents:
diff changeset
  2614
    if (aEngine)
hgs
parents:
diff changeset
  2615
    {
hgs
parents:
diff changeset
  2616
    	TInt index = iSvgEnginePointers.Find( aEngine );
hgs
parents:
diff changeset
  2617
        if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2618
        	{
hgs
parents:
diff changeset
  2619
        		//make sure no document has this engine attached
hgs
parents:
diff changeset
  2620
        		TInt svgDocPointersCnt = iSvgDocumentPointers.Count();
hgs
parents:
diff changeset
  2621
        		for (TInt i=0; i < svgDocPointersCnt; i++)
hgs
parents:
diff changeset
  2622
       			{
hgs
parents:
diff changeset
  2623
       				CSvgDocumentImpl* document = iSvgDocumentPointers[i];
hgs
parents:
diff changeset
  2624
       				CSvgEngineImpl* engineAttachedToDocument = document->Engine();
hgs
parents:
diff changeset
  2625
hgs
parents:
diff changeset
  2626
       				if (engineAttachedToDocument == aEngine)
hgs
parents:
diff changeset
  2627
       				{
hgs
parents:
diff changeset
  2628
       					//remove engine from document it is attached to
hgs
parents:
diff changeset
  2629
       					document->SetEngine(NULL);
hgs
parents:
diff changeset
  2630
       				}
hgs
parents:
diff changeset
  2631
       			}
hgs
parents:
diff changeset
  2632
hgs
parents:
diff changeset
  2633
       			//make sure there is no handle to this left around
hgs
parents:
diff changeset
  2634
       			if (iSvgEngine == aEngine)
hgs
parents:
diff changeset
  2635
       			{
hgs
parents:
diff changeset
  2636
       				iSvgEngine = NULL;
hgs
parents:
diff changeset
  2637
       			}
hgs
parents:
diff changeset
  2638
hgs
parents:
diff changeset
  2639
        		delete aEngine;
hgs
parents:
diff changeset
  2640
        		iSvgEnginePointers.Remove( index );
hgs
parents:
diff changeset
  2641
        	}
hgs
parents:
diff changeset
  2642
   	}
hgs
parents:
diff changeset
  2643
}
hgs
parents:
diff changeset
  2644
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2645
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetRootElement( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2646
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2647
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetRootElement( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2648
{
hgs
parents:
diff changeset
  2649
    if( aDocument )
hgs
parents:
diff changeset
  2650
        {
hgs
parents:
diff changeset
  2651
        return (CXmlElementImpl*)aDocument->RootElement();
hgs
parents:
diff changeset
  2652
        }
hgs
parents:
diff changeset
  2653
    else
hgs
parents:
diff changeset
  2654
        return NULL;
hgs
parents:
diff changeset
  2655
}
hgs
parents:
diff changeset
  2656
hgs
parents:
diff changeset
  2657
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2658
// EXPORT_C void CSvgEngineInterfaceImpl::InitRootElement( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2659
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2660
EXPORT_C void CSvgEngineInterfaceImpl::InitRootElement( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2661
{
hgs
parents:
diff changeset
  2662
    if( aDocument )
hgs
parents:
diff changeset
  2663
        {
hgs
parents:
diff changeset
  2664
        TRAPD(error,aDocument->AppendChildL(CreateElementL(aDocument,KSvgSvgElement)));
hgs
parents:
diff changeset
  2665
        if (error != KErrNone)
hgs
parents:
diff changeset
  2666
            {
hgs
parents:
diff changeset
  2667
            #ifdef _DEBUG
hgs
parents:
diff changeset
  2668
            _LIT(KAppendChildFailed,
hgs
parents:
diff changeset
  2669
                "CSvgEngineInterfaceImpl::InitRootElement: AppendChildL error.");
hgs
parents:
diff changeset
  2670
            RDebug::Print(KAppendChildFailed);
hgs
parents:
diff changeset
  2671
            #endif //_DEBUG
hgs
parents:
diff changeset
  2672
            }
hgs
parents:
diff changeset
  2673
        }
hgs
parents:
diff changeset
  2674
}
hgs
parents:
diff changeset
  2675
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2676
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetElementById( CSvgDocumentImpl* aDocument, const TDesC& aId )
hgs
parents:
diff changeset
  2677
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2678
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetElementById( CSvgDocumentImpl* aDocument, const TDesC& aId )
hgs
parents:
diff changeset
  2679
{
hgs
parents:
diff changeset
  2680
    if( aDocument )
hgs
parents:
diff changeset
  2681
        {
hgs
parents:
diff changeset
  2682
        return (CXmlElementImpl*)aDocument->GetElementById( aId );
hgs
parents:
diff changeset
  2683
        }
hgs
parents:
diff changeset
  2684
    else
hgs
parents:
diff changeset
  2685
        return NULL;
hgs
parents:
diff changeset
  2686
}
hgs
parents:
diff changeset
  2687
hgs
parents:
diff changeset
  2688
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2689
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetNumberOfIds( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2690
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2691
EXPORT_C TInt CSvgEngineInterfaceImpl::GetNumberOfIds( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  2692
{
hgs
parents:
diff changeset
  2693
    if ( aDocument )
hgs
parents:
diff changeset
  2694
        return (aDocument->GetNumberOfIds( aDocument->RootElement()));
hgs
parents:
diff changeset
  2695
    else
hgs
parents:
diff changeset
  2696
        return 0;
hgs
parents:
diff changeset
  2697
}
hgs
parents:
diff changeset
  2698
hgs
parents:
diff changeset
  2699
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2700
// EXPORT_C TDesC* CSvgEngineInterfaceImpl::GetId(CSvgDocumentImpl* aDocument, TInt index)
hgs
parents:
diff changeset
  2701
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2702
EXPORT_C TDesC* CSvgEngineInterfaceImpl::GetId(CSvgDocumentImpl* aDocument, TInt index)
hgs
parents:
diff changeset
  2703
{
hgs
parents:
diff changeset
  2704
    if ( aDocument )
hgs
parents:
diff changeset
  2705
        return (aDocument->GetId(index));
hgs
parents:
diff changeset
  2706
    else
hgs
parents:
diff changeset
  2707
        return NULL;
hgs
parents:
diff changeset
  2708
}
hgs
parents:
diff changeset
  2709
hgs
parents:
diff changeset
  2710
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2711
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetParentElement( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2712
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2713
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetParentElement( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2714
{
hgs
parents:
diff changeset
  2715
    if( aElement )
hgs
parents:
diff changeset
  2716
        return (CXmlElementImpl*)aElement->ParentNode();
hgs
parents:
diff changeset
  2717
    else
hgs
parents:
diff changeset
  2718
        return NULL;
hgs
parents:
diff changeset
  2719
}
hgs
parents:
diff changeset
  2720
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2721
// EXPORT_C void CSvgEngineInterfaceImpl::SetParentElement( CXmlElementImpl* aElement, CXmlElementImpl* aParentElement )
hgs
parents:
diff changeset
  2722
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2723
EXPORT_C void CSvgEngineInterfaceImpl::SetParentElement( CXmlElementImpl* aElement, CXmlElementImpl* aParentElement )
hgs
parents:
diff changeset
  2724
{
hgs
parents:
diff changeset
  2725
    if( aElement )
hgs
parents:
diff changeset
  2726
        aElement->SetParentNode( aParentElement );
hgs
parents:
diff changeset
  2727
}
hgs
parents:
diff changeset
  2728
hgs
parents:
diff changeset
  2729
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2730
// EXPORT_C void CSvgEngineInterfaceImpl::SetFirstChildElement( CXmlElementImpl* aElement, CXmlElementImpl* aParentElement )
hgs
parents:
diff changeset
  2731
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2732
EXPORT_C void CSvgEngineInterfaceImpl::SetFirstChildElement( CXmlElementImpl* aFirstChildElement, CXmlElementImpl* aParentElement )
hgs
parents:
diff changeset
  2733
{
hgs
parents:
diff changeset
  2734
    if( aFirstChildElement && aParentElement )
hgs
parents:
diff changeset
  2735
        aParentElement->SetFirstChild( aFirstChildElement );
hgs
parents:
diff changeset
  2736
}
hgs
parents:
diff changeset
  2737
hgs
parents:
diff changeset
  2738
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2739
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::CreateElementL( CSvgDocumentImpl* aDocument, TInt aElementType )
hgs
parents:
diff changeset
  2740
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2741
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::CreateElementL( CSvgDocumentImpl* aDocument, TInt aElementType )
hgs
parents:
diff changeset
  2742
{
hgs
parents:
diff changeset
  2743
    if( aDocument )
hgs
parents:
diff changeset
  2744
        return (CXmlElementImpl*)aDocument->CreateElementL( (TUint8)aElementType );
hgs
parents:
diff changeset
  2745
    else
hgs
parents:
diff changeset
  2746
        return NULL;
hgs
parents:
diff changeset
  2747
}
hgs
parents:
diff changeset
  2748
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2749
// EXPORT_C void CSvgEngineInterfaceImpl::DestroyElement( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2750
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2751
EXPORT_C void CSvgEngineInterfaceImpl::DestroyElement( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2752
{
hgs
parents:
diff changeset
  2753
    delete aElement;
hgs
parents:
diff changeset
  2754
}
hgs
parents:
diff changeset
  2755
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2756
// EXPORT_C void CSvgEngineInterfaceImpl::AppendChild( CXmlElementImpl* aParentElement, CXmlElementImpl* aChildElement, TBool aIsJSR226Element)
hgs
parents:
diff changeset
  2757
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2758
EXPORT_C void CSvgEngineInterfaceImpl::AppendChild( CXmlElementImpl* aParentElement, CXmlElementImpl* aChildElement, TBool aIsJSR226Element)
hgs
parents:
diff changeset
  2759
{
hgs
parents:
diff changeset
  2760
    // Note: AppendChildL does not have any leaveble calls
hgs
parents:
diff changeset
  2761
    if( aParentElement && aChildElement )
hgs
parents:
diff changeset
  2762
        {
hgs
parents:
diff changeset
  2763
hgs
parents:
diff changeset
  2764
        MXmlElement* childExisted = NULL;
hgs
parents:
diff changeset
  2765
        // Avoid appending child to parent twice
hgs
parents:
diff changeset
  2766
        if ( aChildElement->ParentNode() == aParentElement )
hgs
parents:
diff changeset
  2767
            {
hgs
parents:
diff changeset
  2768
            //mark the first copy of the element that is already
hgs
parents:
diff changeset
  2769
            //appended as a child that to be removed
hgs
parents:
diff changeset
  2770
            MXmlElement* child = aParentElement->FirstChild();
hgs
parents:
diff changeset
  2771
            if ( child == aChildElement )
hgs
parents:
diff changeset
  2772
                {
hgs
parents:
diff changeset
  2773
                childExisted = child;
hgs
parents:
diff changeset
  2774
                }
hgs
parents:
diff changeset
  2775
            while ( child && !childExisted )
hgs
parents:
diff changeset
  2776
                {
hgs
parents:
diff changeset
  2777
                child = child->NextSibling();
hgs
parents:
diff changeset
  2778
                if ( child == aChildElement )
hgs
parents:
diff changeset
  2779
                    {
hgs
parents:
diff changeset
  2780
                    	//mark the first copy of the element that is already
hgs
parents:
diff changeset
  2781
                    	//appended as a child that to be removed
hgs
parents:
diff changeset
  2782
                    	childExisted = child;
hgs
parents:
diff changeset
  2783
                    	break;
hgs
parents:
diff changeset
  2784
                    }
hgs
parents:
diff changeset
  2785
                }
hgs
parents:
diff changeset
  2786
            }
hgs
parents:
diff changeset
  2787
hgs
parents:
diff changeset
  2788
				if ( childExisted )
hgs
parents:
diff changeset
  2789
				{
hgs
parents:
diff changeset
  2790
					aParentElement->RemoveChild( childExisted );
hgs
parents:
diff changeset
  2791
				}
hgs
parents:
diff changeset
  2792
hgs
parents:
diff changeset
  2793
        TRAPD( error, aParentElement->AppendChildL( aChildElement, aIsJSR226Element ) );
hgs
parents:
diff changeset
  2794
        if (error != KErrNone)
hgs
parents:
diff changeset
  2795
            {
hgs
parents:
diff changeset
  2796
            #ifdef _DEBUG
hgs
parents:
diff changeset
  2797
            _LIT(KAppendChildFailed,
hgs
parents:
diff changeset
  2798
                "CSvgEngineInterfaceImpl::AppendChild: AppendChildL error.");
hgs
parents:
diff changeset
  2799
            RDebug::Print(KAppendChildFailed);
hgs
parents:
diff changeset
  2800
            #endif //_DEBUG
hgs
parents:
diff changeset
  2801
            }
hgs
parents:
diff changeset
  2802
hgs
parents:
diff changeset
  2803
        if ( aChildElement->ElemID() == KSvgUseElement)
hgs
parents:
diff changeset
  2804
        {
hgs
parents:
diff changeset
  2805
        	//we need to set the forward references up now
hgs
parents:
diff changeset
  2806
        	((CSvgUseElementImpl*)aChildElement)->SetRefElemById( ((CSvgUseElementImpl*)aChildElement)->Href() );
hgs
parents:
diff changeset
  2807
hgs
parents:
diff changeset
  2808
        	TRAP_IGNORE( ((CSvgUseElementImpl *)aChildElement)->SetReferenceElementL() );
hgs
parents:
diff changeset
  2809
        }
hgs
parents:
diff changeset
  2810
        
hgs
parents:
diff changeset
  2811
        
hgs
parents:
diff changeset
  2812
        // If aChildElement is a Stop element then add it to Gradient's stop element array.
hgs
parents:
diff changeset
  2813
        TInt lParentId =  ((CXmlElementImpl*)aParentElement)->ElemID();
hgs
parents:
diff changeset
  2814
        TInt lChildId  =  ((CXmlElementImpl*)aChildElement)->ElemID();
hgs
parents:
diff changeset
  2815
            
hgs
parents:
diff changeset
  2816
        if(  ( ( ( lParentId == KSvgRadialGradientElement )||
hgs
parents:
diff changeset
  2817
                 ( lParentId == KSvgLinearGradientElement ) ) &&
hgs
parents:
diff changeset
  2818
                 ( lChildId == KSvgStopElement ) ) )
hgs
parents:
diff changeset
  2819
hgs
parents:
diff changeset
  2820
	        {
hgs
parents:
diff changeset
  2821
		    // Initialize the offset value to 0 if its still -1.
hgs
parents:
diff changeset
  2822
	        TFloatFixPt lOffsetValue;
hgs
parents:
diff changeset
  2823
	        TFloatFixPt lDefaultOffsetValue(-1);
hgs
parents:
diff changeset
  2824
	        TBuf<6>     lAttributeName;
hgs
parents:
diff changeset
  2825
	        TBuf<1>     lValueBuffer;
hgs
parents:
diff changeset
  2826
	                      
hgs
parents:
diff changeset
  2827
	        lAttributeName.Append(OFFSET);
hgs
parents:
diff changeset
  2828
	        lValueBuffer.Append(ZEROVALUE);
hgs
parents:
diff changeset
  2829
	            
hgs
parents:
diff changeset
  2830
	        ((CSvgStopElementImpl*)aChildElement)->GetOffset( lOffsetValue );
hgs
parents:
diff changeset
  2831
	         
hgs
parents:
diff changeset
  2832
	        // Offset Value of -1 indicates that Offset Attribute is not declared in
hgs
parents:
diff changeset
  2833
	        // stop element.      
hgs
parents:
diff changeset
  2834
	        if( lOffsetValue == lDefaultOffsetValue )
hgs
parents:
diff changeset
  2835
	           {  
hgs
parents:
diff changeset
  2836
	           // Deliberately calling SetAttributeL in place of SetAttributeFloatL as the latter inturn
hgs
parents:
diff changeset
  2837
	           // calls UpdateOffsetValues which should be called on any Stop element once it is added to
hgs
parents:
diff changeset
  2838
	           // to the Stop element array Owned by parent Gradient element.
hgs
parents:
diff changeset
  2839
	           TRAP_IGNORE(((CSvgStopElementImpl*)aChildElement)->SetAttributeL( lAttributeName, lValueBuffer ));
hgs
parents:
diff changeset
  2840
	           }
hgs
parents:
diff changeset
  2841
	                
hgs
parents:
diff changeset
  2842
	         // The function not only adds the element in Stop element array but also
hgs
parents:
diff changeset
  2843
	         // Adjusts the offset values of all the previously added elements such that
hgs
parents:
diff changeset
  2844
	         // each gradient offset value is greater than the previous gradient stop's
hgs
parents:
diff changeset
  2845
	         // offset value.It calls UpdateOffsetValues to adjust the values.
hgs
parents:
diff changeset
  2846
	         ((CSvgGradientElementImpl*)aParentElement)->AddStopElementInArray((CSvgStopElementImpl*)aChildElement);
hgs
parents:
diff changeset
  2847
	                                  
hgs
parents:
diff changeset
  2848
	         }                          
hgs
parents:
diff changeset
  2849
hgs
parents:
diff changeset
  2850
        //CTM needs to be updated after appending child so it gets propogated to new children
hgs
parents:
diff changeset
  2851
        ((CSvgElementImpl*)aParentElement)->UpdateCTM();
hgs
parents:
diff changeset
  2852
hgs
parents:
diff changeset
  2853
        }
hgs
parents:
diff changeset
  2854
}
hgs
parents:
diff changeset
  2855
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2856
// EXPORT_C void CSvgEngineInterfaceImpl::RemoveChild( CXmlElementImpl* aParentElement, CXmlElementImpl* aChildElement)
hgs
parents:
diff changeset
  2857
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2858
EXPORT_C void CSvgEngineInterfaceImpl::RemoveChild( CXmlElementImpl* aParentElement, CXmlElementImpl* aChildElement)
hgs
parents:
diff changeset
  2859
{
hgs
parents:
diff changeset
  2860
    if( aParentElement && aChildElement )
hgs
parents:
diff changeset
  2861
        {
hgs
parents:
diff changeset
  2862
        aParentElement->RemoveChild( aChildElement );
hgs
parents:
diff changeset
  2863
        
hgs
parents:
diff changeset
  2864
        if( ((CXmlElementImpl*)aChildElement)->ElemID() == KSvgTextElement )
hgs
parents:
diff changeset
  2865
        	{
hgs
parents:
diff changeset
  2866
        	((CSvgTextElementImpl*)aChildElement)->FreeFontData();
hgs
parents:
diff changeset
  2867
        	}
hgs
parents:
diff changeset
  2868
        
hgs
parents:
diff changeset
  2869
        }
hgs
parents:
diff changeset
  2870
}
hgs
parents:
diff changeset
  2871
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2872
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetFirstChild( CXmlElementImpl* aParentElement )
hgs
parents:
diff changeset
  2873
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2874
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetFirstChild( CXmlElementImpl* aParentElement )
hgs
parents:
diff changeset
  2875
{
hgs
parents:
diff changeset
  2876
    if( aParentElement )
hgs
parents:
diff changeset
  2877
        return (CXmlElementImpl*)aParentElement->FirstChild();
hgs
parents:
diff changeset
  2878
    else
hgs
parents:
diff changeset
  2879
        return NULL;
hgs
parents:
diff changeset
  2880
}
hgs
parents:
diff changeset
  2881
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2882
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetNextSibling( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2883
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2884
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetNextSibling( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2885
{
hgs
parents:
diff changeset
  2886
    if( aElement )
hgs
parents:
diff changeset
  2887
        return (CXmlElementImpl*)aElement->NextSibling();
hgs
parents:
diff changeset
  2888
    else
hgs
parents:
diff changeset
  2889
        return NULL;
hgs
parents:
diff changeset
  2890
}
hgs
parents:
diff changeset
  2891
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2892
// EXPORT_C void CSvgEngineInterfaceImpl::SetNextSibling( CXmlElementImpl* aElement, CXmlElementImpl* aSibling )
hgs
parents:
diff changeset
  2893
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2894
EXPORT_C void CSvgEngineInterfaceImpl::SetNextSibling( CXmlElementImpl* aElement, CXmlElementImpl* aSibling )
hgs
parents:
diff changeset
  2895
{
hgs
parents:
diff changeset
  2896
    if( aElement && aSibling )
hgs
parents:
diff changeset
  2897
        aElement->SetNextSibling( aSibling );
hgs
parents:
diff changeset
  2898
}
hgs
parents:
diff changeset
  2899
hgs
parents:
diff changeset
  2900
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2901
// EXPORT_C CSvgDocumentImpl* CSvgEngineInterfaceImpl::GetOwnerDocument( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2902
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2903
EXPORT_C CSvgDocumentImpl* CSvgEngineInterfaceImpl::GetOwnerDocument( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2904
{
hgs
parents:
diff changeset
  2905
    if( aElement)
hgs
parents:
diff changeset
  2906
        return (CSvgDocumentImpl*)aElement->OwnerDocument();
hgs
parents:
diff changeset
  2907
    else
hgs
parents:
diff changeset
  2908
        return NULL;
hgs
parents:
diff changeset
  2909
}
hgs
parents:
diff changeset
  2910
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2911
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetElementType( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2912
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2913
EXPORT_C TInt CSvgEngineInterfaceImpl::GetElementType( CXmlElementImpl* aElement )
hgs
parents:
diff changeset
  2914
{
hgs
parents:
diff changeset
  2915
    if( aElement )
hgs
parents:
diff changeset
  2916
        return aElement->ElemID();
hgs
parents:
diff changeset
  2917
    else
hgs
parents:
diff changeset
  2918
        return -1;
hgs
parents:
diff changeset
  2919
}
hgs
parents:
diff changeset
  2920
hgs
parents:
diff changeset
  2921
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2922
// EXPORT_C void CSvgEngineInterfaceImpl::SetRequestObserver( CSvgEngineImpl* aEngine, MSvgRequestObserver* aObserver )
hgs
parents:
diff changeset
  2923
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2924
EXPORT_C void CSvgEngineInterfaceImpl::SetRequestObserver( CSvgEngineImpl* aEngine, MSvgRequestObserver* aObserver )
hgs
parents:
diff changeset
  2925
{
hgs
parents:
diff changeset
  2926
    if( aEngine )
hgs
parents:
diff changeset
  2927
        aEngine->iRequestObserver = aObserver;
hgs
parents:
diff changeset
  2928
}
hgs
parents:
diff changeset
  2929
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2930
// EXPORT_C TInt  CSvgEngineInterfaceImpl::GetElementDesAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TDes& aValue)
hgs
parents:
diff changeset
  2931
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2932
EXPORT_C TInt  CSvgEngineInterfaceImpl::GetElementDesAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId, TPtrC16& aValue)
hgs
parents:
diff changeset
  2933
{
hgs
parents:
diff changeset
  2934
    return aElementHandle->GetAttributeDes(aAttributeId, aValue);
hgs
parents:
diff changeset
  2935
}
hgs
parents:
diff changeset
  2936
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2937
// EXPORT_C TReal32 CSvgEngineInterfaceImpl::GetElementFloatAttribute( CSvgElementImpl* aElementHandle, const TInt aAttributeId)
hgs
parents:
diff changeset
  2938
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2939
EXPORT_C TReal32 CSvgEngineInterfaceImpl::GetElementFloatAttribute( CSvgElementImpl* aElementHandle, const TInt aAttributeId) __SOFTFP
hgs
parents:
diff changeset
  2940
{
hgs
parents:
diff changeset
  2941
hgs
parents:
diff changeset
  2942
    TFloatFixPt lValue ;
hgs
parents:
diff changeset
  2943
hgs
parents:
diff changeset
  2944
    //hack for JSR 226 so it can return the original base value when the attribute is animated
hgs
parents:
diff changeset
  2945
    //instead of returning the animated value in the element class
hgs
parents:
diff changeset
  2946
    if ( aElementHandle->HasAnimation() )
hgs
parents:
diff changeset
  2947
    {
hgs
parents:
diff changeset
  2948
    	TInt lResult = ((CSvgAnimationBase*)aElementHandle->iHasAnimationBase)->GetAttributeFloat( aAttributeId, lValue);
hgs
parents:
diff changeset
  2949
hgs
parents:
diff changeset
  2950
    	if(lResult != KErrNoAttribute)
hgs
parents:
diff changeset
  2951
        {
hgs
parents:
diff changeset
  2952
 			return lValue;
hgs
parents:
diff changeset
  2953
        }
hgs
parents:
diff changeset
  2954
    }
hgs
parents:
diff changeset
  2955
hgs
parents:
diff changeset
  2956
    TInt lResult = aElementHandle->GetAttributeFloat( aAttributeId, lValue);
hgs
parents:
diff changeset
  2957
    if(lResult == KErrNoAttribute)
hgs
parents:
diff changeset
  2958
        {
hgs
parents:
diff changeset
  2959
        return KInvalidFloatAttribute;
hgs
parents:
diff changeset
  2960
        }
hgs
parents:
diff changeset
  2961
    return lValue;
hgs
parents:
diff changeset
  2962
}
hgs
parents:
diff changeset
  2963
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2964
// EXPORT_C void CSvgEngineInterfaceImpl::SetElementFloatAttribute( CSvgElementImpl* aElementHandle, const TInt aAttributeId, TReal32 aValue)
hgs
parents:
diff changeset
  2965
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2966
EXPORT_C void CSvgEngineInterfaceImpl::SetElementFloatAttribute( CSvgElementImpl* aElementHandle, const TInt aAttributeId, TReal32 aValue) __SOFTFP
hgs
parents:
diff changeset
  2967
{
hgs
parents:
diff changeset
  2968
    TFloatFixPt lValue = TFloatFixPt(aValue);
hgs
parents:
diff changeset
  2969
    TRAPD(error,aElementHandle->SetAttributeFloatL(aAttributeId,lValue));
hgs
parents:
diff changeset
  2970
    if (error != KErrNone)
hgs
parents:
diff changeset
  2971
        {
hgs
parents:
diff changeset
  2972
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2973
        _LIT(KSetAttributeFloatFailed,
hgs
parents:
diff changeset
  2974
            "CSvgEngineInterfaceImpl::SetElementFloatAttribute: SetElementFloatAttribute error.");
hgs
parents:
diff changeset
  2975
        RDebug::Print(KSetAttributeFloatFailed);
hgs
parents:
diff changeset
  2976
        #endif //_DEBUG
hgs
parents:
diff changeset
  2977
        }
hgs
parents:
diff changeset
  2978
hgs
parents:
diff changeset
  2979
   //hack for JSR 226 so it can return the original base value when the attribute is animated
hgs
parents:
diff changeset
  2980
    //instead of returning the animated value in the element class
hgs
parents:
diff changeset
  2981
    if ( aElementHandle->HasAnimation() )
hgs
parents:
diff changeset
  2982
    {
hgs
parents:
diff changeset
  2983
    	TRAP_IGNORE( ((CSvgAnimationBase*)aElementHandle->iHasAnimationBase)->SetAttributeFloatL( aAttributeId, lValue) );
hgs
parents:
diff changeset
  2984
    }
hgs
parents:
diff changeset
  2985
hgs
parents:
diff changeset
  2986
}
hgs
parents:
diff changeset
  2987
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2988
// EXPORT_C void CSvgEngineInterfaceImpl::SetElementDesAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId, TDesC& lAttributeValue)
hgs
parents:
diff changeset
  2989
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2990
EXPORT_C void CSvgEngineInterfaceImpl::SetElementDesAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId, const TDesC& lAttributeValue)
hgs
parents:
diff changeset
  2991
{
hgs
parents:
diff changeset
  2992
    
hgs
parents:
diff changeset
  2993
    const TDesC* ReferenceElementID = NULL;
hgs
parents:
diff changeset
  2994
    
hgs
parents:
diff changeset
  2995
    // Incase if the xlink-href attribute is set for USE element from JSR226 we need to 
hgs
parents:
diff changeset
  2996
    // create a clone tree under the USE element explicitly same as done in Content handler.
hgs
parents:
diff changeset
  2997
    if( aElementHandle->ElemID() == KSvgUseElement && aAttributeId == KAtrXlinkhref )
hgs
parents:
diff changeset
  2998
    {
hgs
parents:
diff changeset
  2999
        // Check if the USE element is already refereing to some element. If 'YES' we need to 
hgs
parents:
diff changeset
  3000
        // remove the previously refered element.
hgs
parents:
diff changeset
  3001
        CSvgElementImpl* lReferenceElement = ((CSvgUseElementImpl*)aElementHandle)->GetReferenceElementL();
hgs
parents:
diff changeset
  3002
        
hgs
parents:
diff changeset
  3003
        if( lReferenceElement != NULL)
hgs
parents:
diff changeset
  3004
        {
hgs
parents:
diff changeset
  3005
        	// Get the ID of this element.
hgs
parents:
diff changeset
  3006
        	ReferenceElementID = lReferenceElement->Id();
hgs
parents:
diff changeset
  3007
                    	
hgs
parents:
diff changeset
  3008
        	// Get the first child of USE element and compare its ID with previously
hgs
parents:
diff changeset
  3009
        	// refered element's ID. If they are same remove the referenced element branch
hgs
parents:
diff changeset
  3010
        	// from the USE element. Else, continue finding some element under 'USE' element
hgs
parents:
diff changeset
  3011
        	// that has same ID as the previously refered element has.
hgs
parents:
diff changeset
  3012
        	CSvgElementImpl* ChildOfUseElement = (CSvgElementImpl*)aElementHandle->FirstChild();
hgs
parents:
diff changeset
  3013
        	
hgs
parents:
diff changeset
  3014
        	while( ChildOfUseElement && ReferenceElementID )
hgs
parents:
diff changeset
  3015
        	{
hgs
parents:
diff changeset
  3016
        	    const TDesC16* UseElementChildID = ChildOfUseElement->Id();
hgs
parents:
diff changeset
  3017
        	    
hgs
parents:
diff changeset
  3018
        	    // Compare the Child ID with reference element's ID
hgs
parents:
diff changeset
  3019
				if( UseElementChildID && ( ReferenceElementID->Compare(*UseElementChildID) == 0 ))
hgs
parents:
diff changeset
  3020
				{
hgs
parents:
diff changeset
  3021
					// delete the same child and get out of the loop.
hgs
parents:
diff changeset
  3022
					aElementHandle->RemoveChild(ChildOfUseElement);
hgs
parents:
diff changeset
  3023
					break;
hgs
parents:
diff changeset
  3024
				}
hgs
parents:
diff changeset
  3025
				
hgs
parents:
diff changeset
  3026
				ChildOfUseElement = (CSvgUseElementImpl*)ChildOfUseElement->NextSibling();
hgs
parents:
diff changeset
  3027
        	}
hgs
parents:
diff changeset
  3028
        }
hgs
parents:
diff changeset
  3029
    }
hgs
parents:
diff changeset
  3030
        
hgs
parents:
diff changeset
  3031
    TRAPD(error,aElementHandle->SetAttributeDesL(aAttributeId,lAttributeValue));
hgs
parents:
diff changeset
  3032
    
hgs
parents:
diff changeset
  3033
    if (error != KErrNone)
hgs
parents:
diff changeset
  3034
        {
hgs
parents:
diff changeset
  3035
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3036
        _LIT(KSetAttributeDesFailed,
hgs
parents:
diff changeset
  3037
            "CSvgEngineInterfaceImpl::SetElementDesAttribute: SetAttributeDesL error.");
hgs
parents:
diff changeset
  3038
        RDebug::Print(KSetAttributeDesFailed);
hgs
parents:
diff changeset
  3039
        #endif //_DEBUG
hgs
parents:
diff changeset
  3040
        }
hgs
parents:
diff changeset
  3041
    
hgs
parents:
diff changeset
  3042
    if( ( aElementHandle->ElemID() == KSvgUseElement ) && aAttributeId == KAtrXlinkhref )
hgs
parents:
diff changeset
  3043
    {
hgs
parents:
diff changeset
  3044
    	// Create a new branch under the USE element
hgs
parents:
diff changeset
  3045
    	TRAP(error,((CSvgUseElementImpl *)aElementHandle)->SetReferenceElementL());
hgs
parents:
diff changeset
  3046
    	
hgs
parents:
diff changeset
  3047
    	if (error != KErrNone)
hgs
parents:
diff changeset
  3048
        {
hgs
parents:
diff changeset
  3049
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3050
        _LIT(KSetReferenceElementLFailed,
hgs
parents:
diff changeset
  3051
            "CSvgUseElementImpl::SetReferenceElementL: SetReferenceElementL error.");
hgs
parents:
diff changeset
  3052
        RDebug::Print(KSetReferenceElementLFailed);
hgs
parents:
diff changeset
  3053
        #endif //_DEBUG
hgs
parents:
diff changeset
  3054
        }
hgs
parents:
diff changeset
  3055
    }
hgs
parents:
diff changeset
  3056
}
hgs
parents:
diff changeset
  3057
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3058
// EXPORT_C void CSvgEngineInterfaceImpl:: GetElementBoundingbox(CSvgElementImpl* aElementHandle,TReal32& aX ,TReal32& aY,TReal32& aWidth,TReal32& aHeight)
hgs
parents:
diff changeset
  3059
// this is used for ScreenBbox (actual bbox of an element on the screen)
hgs
parents:
diff changeset
  3060
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3061
EXPORT_C void CSvgEngineInterfaceImpl:: GetElementBoundingbox(CSvgElementImpl* aElementHandle,TReal32& aX ,TReal32& aY,TReal32& aWidth,TReal32& aHeight) __SOFTFP
hgs
parents:
diff changeset
  3062
{
hgs
parents:
diff changeset
  3063
    if (aElementHandle)
hgs
parents:
diff changeset
  3064
    {
hgs
parents:
diff changeset
  3065
    	//updates CTM from root
hgs
parents:
diff changeset
  3066
        aElementHandle->UpdateCTM();
hgs
parents:
diff changeset
  3067
hgs
parents:
diff changeset
  3068
        TGfxRectangle2D     bbox;
hgs
parents:
diff changeset
  3069
        aElementHandle->GetBBox(bbox);
hgs
parents:
diff changeset
  3070
        aX = (TReal32)bbox.iX;
hgs
parents:
diff changeset
  3071
        aY = (TReal32)bbox.iY;
hgs
parents:
diff changeset
  3072
        aWidth = (TReal32)bbox.iWidth;
hgs
parents:
diff changeset
  3073
        aHeight = (TReal32)bbox.iHeight;
hgs
parents:
diff changeset
  3074
    }
hgs
parents:
diff changeset
  3075
}
hgs
parents:
diff changeset
  3076
hgs
parents:
diff changeset
  3077
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3078
// EXPORT_C void CSvgEngineInterfaceImpl:: GetElementUnScaledBoundingBox(CSvgElementImpl* aElementHandle,TReal32& aX ,TReal32& aY,TReal32& aWidth,TReal32& aHeight)
hgs
parents:
diff changeset
  3079
// this is used for UserBBox (unscaled bbox)
hgs
parents:
diff changeset
  3080
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3081
EXPORT_C void CSvgEngineInterfaceImpl::GetElementUnScaledBoundingBox( CSvgElementImpl* aElementHandle,TReal32& aX ,TReal32& aY,TReal32& aWidth,TReal32& aHeight) __SOFTFP
hgs
parents:
diff changeset
  3082
{
hgs
parents:
diff changeset
  3083
		if (aElementHandle)
hgs
parents:
diff changeset
  3084
    {
hgs
parents:
diff changeset
  3085
		//updates CTM from root
hgs
parents:
diff changeset
  3086
        aElementHandle->UpdateCTM();
hgs
parents:
diff changeset
  3087
hgs
parents:
diff changeset
  3088
        TGfxRectangle2D     bbox;
hgs
parents:
diff changeset
  3089
        aElementHandle->GetUnscaledBBox(bbox);
hgs
parents:
diff changeset
  3090
        aX = (TReal32)bbox.iX;
hgs
parents:
diff changeset
  3091
        aY = (TReal32)bbox.iY;
hgs
parents:
diff changeset
  3092
        aWidth = (TReal32)bbox.iWidth;
hgs
parents:
diff changeset
  3093
        aHeight = (TReal32)bbox.iHeight;
hgs
parents:
diff changeset
  3094
    }
hgs
parents:
diff changeset
  3095
}
hgs
parents:
diff changeset
  3096
hgs
parents:
diff changeset
  3097
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3098
// EXPORT_C void CSvgEngineInterfaceImpl::GetFourPointElementBoundingBox(CSvgTextElementImpl* aTextElementHandle, TPoint& aPoint1, TPoint& aPoint2, TPoint& aPoint3, TPoint& aPoint4)
hgs
parents:
diff changeset
  3099
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3100
EXPORT_C void CSvgEngineInterfaceImpl::GetFourPointElementBoundingBox(CSvgTextElementImpl* aTextElementHandle, TPoint& aPoint1, TPoint& aPoint2, TPoint& aPoint3, TPoint& aPoint4)
hgs
parents:
diff changeset
  3101
{
hgs
parents:
diff changeset
  3102
    TSvgFourPointRect fourPointRect;
hgs
parents:
diff changeset
  3103
hgs
parents:
diff changeset
  3104
	//updates CTM from root
hgs
parents:
diff changeset
  3105
	aTextElementHandle->UpdateCTM();
hgs
parents:
diff changeset
  3106
hgs
parents:
diff changeset
  3107
    if (aTextElementHandle)
hgs
parents:
diff changeset
  3108
    {
hgs
parents:
diff changeset
  3109
        aTextElementHandle->GetFourPointBBox(fourPointRect);
hgs
parents:
diff changeset
  3110
    }
hgs
parents:
diff changeset
  3111
hgs
parents:
diff changeset
  3112
    fourPointRect.GetPoints(aPoint1, aPoint2, aPoint3, aPoint4);
hgs
parents:
diff changeset
  3113
}
hgs
parents:
diff changeset
  3114
hgs
parents:
diff changeset
  3115
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3116
// EXPORT_C void CSvgEngineInterfaceImpl:: SetElementColorAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TInt32 lColorValue)
hgs
parents:
diff changeset
  3117
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3118
EXPORT_C void CSvgEngineInterfaceImpl:: SetElementColorAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TInt32 lColorValue)
hgs
parents:
diff changeset
  3119
{
hgs
parents:
diff changeset
  3120
    TRAPD(error, aElementHandle->SetAttributeIntL(aAttributeId,lColorValue));
hgs
parents:
diff changeset
  3121
    if (error != KErrNone)
hgs
parents:
diff changeset
  3122
        {
hgs
parents:
diff changeset
  3123
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3124
        _LIT(KSetAttributeIntFailed,
hgs
parents:
diff changeset
  3125
            "CSvgEngineInterfaceImpl::SetElementColorAttribute: SetAttributeIntL( error.");
hgs
parents:
diff changeset
  3126
        RDebug::Print(KSetAttributeIntFailed);
hgs
parents:
diff changeset
  3127
        #endif //_DEBUG
hgs
parents:
diff changeset
  3128
        }
hgs
parents:
diff changeset
  3129
hgs
parents:
diff changeset
  3130
}
hgs
parents:
diff changeset
  3131
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3132
// EXPORT_C TInt32 CSvgEngineInterfaceImpl::GetElementColorAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId)
hgs
parents:
diff changeset
  3133
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3134
EXPORT_C TInt32 CSvgEngineInterfaceImpl::GetElementColorAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId)
hgs
parents:
diff changeset
  3135
{
hgs
parents:
diff changeset
  3136
    TInt lResult = KErrNone;
hgs
parents:
diff changeset
  3137
    TInt32 lValue = KErrNone;
hgs
parents:
diff changeset
  3138
    TRAPD(error,lResult = aElementHandle->GetAttributeIntL( aAttributeId, lValue));
hgs
parents:
diff changeset
  3139
    if (error != KErrNone)
hgs
parents:
diff changeset
  3140
        {
hgs
parents:
diff changeset
  3141
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3142
        _LIT(KGetAttributeIntFailed,
hgs
parents:
diff changeset
  3143
            "CSvgEngineInterfaceImpl::GetElementColorAttribute: GetElementColorAttribute( error.");
hgs
parents:
diff changeset
  3144
        RDebug::Print(KGetAttributeIntFailed);
hgs
parents:
diff changeset
  3145
        #endif //_DEBUG
hgs
parents:
diff changeset
  3146
        }
hgs
parents:
diff changeset
  3147
hgs
parents:
diff changeset
  3148
    if (lResult == KErrInvalidAttribute && error == KErrNone)
hgs
parents:
diff changeset
  3149
    {
hgs
parents:
diff changeset
  3150
    	//attribute requested was invalid return an error
hgs
parents:
diff changeset
  3151
    	return KInvalidEnumAttribute;
hgs
parents:
diff changeset
  3152
    }
hgs
parents:
diff changeset
  3153
    else if ( lResult == KErrNone && error == KErrNone)
hgs
parents:
diff changeset
  3154
    {
hgs
parents:
diff changeset
  3155
    	//got the attribute ok.
hgs
parents:
diff changeset
  3156
    	return lValue;
hgs
parents:
diff changeset
  3157
    }
hgs
parents:
diff changeset
  3158
    else if(lResult == KErrNoAttribute && error == KErrNone)
hgs
parents:
diff changeset
  3159
    {
hgs
parents:
diff changeset
  3160
        //everything went ok that element just didnt have the attribute requested
hgs
parents:
diff changeset
  3161
        return KErrNoAttribute;
hgs
parents:
diff changeset
  3162
    }
hgs
parents:
diff changeset
  3163
    else
hgs
parents:
diff changeset
  3164
        {
hgs
parents:
diff changeset
  3165
        return KInvalidEnumAttribute;
hgs
parents:
diff changeset
  3166
        }
hgs
parents:
diff changeset
  3167
hgs
parents:
diff changeset
  3168
}
hgs
parents:
diff changeset
  3169
hgs
parents:
diff changeset
  3170
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3171
// EXPORT_C void CSvgEngineInterfaceImpl::SetPreserveApsectRatio( TPreserveAspectRatio aType )
hgs
parents:
diff changeset
  3172
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3173
EXPORT_C void CSvgEngineInterfaceImpl::SetPreserveAspectRatio( CSvgDocumentImpl* aDocument, TSvgPreserveAspectAlignType aPreserveAspectRatioSetting, TSvgMeetOrSliceType aMeetSliceType, TBool aFrameBuffOverridesViewport)
hgs
parents:
diff changeset
  3174
{
hgs
parents:
diff changeset
  3175
	if ( !aDocument )
hgs
parents:
diff changeset
  3176
	{
hgs
parents:
diff changeset
  3177
		aDocument = iSvgLoadedDocument;
hgs
parents:
diff changeset
  3178
hgs
parents:
diff changeset
  3179
		if ( !aDocument )
hgs
parents:
diff changeset
  3180
		{
hgs
parents:
diff changeset
  3181
			if (iSvgEngine)
hgs
parents:
diff changeset
  3182
			{
hgs
parents:
diff changeset
  3183
				aDocument = iSvgEngine->Document();
hgs
parents:
diff changeset
  3184
			}
hgs
parents:
diff changeset
  3185
		}
hgs
parents:
diff changeset
  3186
hgs
parents:
diff changeset
  3187
		if ( !aDocument )
hgs
parents:
diff changeset
  3188
		return;
hgs
parents:
diff changeset
  3189
	}
hgs
parents:
diff changeset
  3190
hgs
parents:
diff changeset
  3191
	if (iSvgEngine)
hgs
parents:
diff changeset
  3192
			{
hgs
parents:
diff changeset
  3193
				iSvgEngine->iFrameBufferOverridesViewport = aFrameBuffOverridesViewport;
hgs
parents:
diff changeset
  3194
			}
hgs
parents:
diff changeset
  3195
hgs
parents:
diff changeset
  3196
	CSvgSvgElementImpl* el = ( CSvgSvgElementImpl* )(aDocument->RootElement());
hgs
parents:
diff changeset
  3197
hgs
parents:
diff changeset
  3198
	if (el == NULL)
hgs
parents:
diff changeset
  3199
	{
hgs
parents:
diff changeset
  3200
		return;
hgs
parents:
diff changeset
  3201
	}
hgs
parents:
diff changeset
  3202
hgs
parents:
diff changeset
  3203
	TRAPD(error, el->SetPreserveAspectRatioL( aPreserveAspectRatioSetting, aMeetSliceType));
hgs
parents:
diff changeset
  3204
hgs
parents:
diff changeset
  3205
	if (error != KErrNone)
hgs
parents:
diff changeset
  3206
  	{
hgs
parents:
diff changeset
  3207
    	#ifdef _DEBUG
hgs
parents:
diff changeset
  3208
      _LIT(KSetPreserveAspectRatioFailed,
hgs
parents:
diff changeset
  3209
      "CSvgEngineInterfaceImpl::SetPreserveAspectRatio: error.");
hgs
parents:
diff changeset
  3210
      RDebug::Print(KSetPreserveAspectRatioFailed);
hgs
parents:
diff changeset
  3211
      #endif //_DEBUG
hgs
parents:
diff changeset
  3212
    }
hgs
parents:
diff changeset
  3213
hgs
parents:
diff changeset
  3214
}
hgs
parents:
diff changeset
  3215
hgs
parents:
diff changeset
  3216
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3217
// EXPORT_C void CSvgEngineInterfaceImpl::SetEnumAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TInt32 lValue)
hgs
parents:
diff changeset
  3218
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3219
EXPORT_C void CSvgEngineInterfaceImpl::SetEnumAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TInt32 lValue)
hgs
parents:
diff changeset
  3220
    {
hgs
parents:
diff changeset
  3221
hgs
parents:
diff changeset
  3222
    if(aAttributeId == KAtrPreserveAspectRatio)
hgs
parents:
diff changeset
  3223
        {
hgs
parents:
diff changeset
  3224
        // convert in to desc and Call set attribute
hgs
parents:
diff changeset
  3225
        _LIT( KNone, "none" );
hgs
parents:
diff changeset
  3226
        _LIT( KXMidYMid, "xMidYMid" );
hgs
parents:
diff changeset
  3227
        _LIT( KPreserveAspectRatio, "preserveAspectRatio" );
hgs
parents:
diff changeset
  3228
        if(!lValue)
hgs
parents:
diff changeset
  3229
            {
hgs
parents:
diff changeset
  3230
            TRAPD(error,aElementHandle->SetAttributeL(KPreserveAspectRatio,KNone));
hgs
parents:
diff changeset
  3231
            if (error != KErrNone)
hgs
parents:
diff changeset
  3232
                {
hgs
parents:
diff changeset
  3233
                #ifdef _DEBUG
hgs
parents:
diff changeset
  3234
                _LIT(KSetAttributeFailed,
hgs
parents:
diff changeset
  3235
                    "CSvgEngineInterfaceImpl::SetEnumAttribute: SetAttributeL error.");
hgs
parents:
diff changeset
  3236
                RDebug::Print(KSetAttributeFailed);
hgs
parents:
diff changeset
  3237
                #endif //_DEBUG
hgs
parents:
diff changeset
  3238
                }
hgs
parents:
diff changeset
  3239
            }
hgs
parents:
diff changeset
  3240
        if(lValue == 1)
hgs
parents:
diff changeset
  3241
            {
hgs
parents:
diff changeset
  3242
            TRAPD(error,aElementHandle->SetAttributeL(KPreserveAspectRatio,KXMidYMid));
hgs
parents:
diff changeset
  3243
            if (error != KErrNone)
hgs
parents:
diff changeset
  3244
                {
hgs
parents:
diff changeset
  3245
                #ifdef _DEBUG
hgs
parents:
diff changeset
  3246
                _LIT(KSetAttributeFailed,
hgs
parents:
diff changeset
  3247
                    "CSvgEngineInterfaceImpl::SetEnumAttribute: SetAttributeL error.");
hgs
parents:
diff changeset
  3248
                RDebug::Print(KSetAttributeFailed);
hgs
parents:
diff changeset
  3249
                #endif //_DEBUG
hgs
parents:
diff changeset
  3250
                }
hgs
parents:
diff changeset
  3251
            }
hgs
parents:
diff changeset
  3252
        return ;
hgs
parents:
diff changeset
  3253
        }
hgs
parents:
diff changeset
  3254
    if( aAttributeId == KAtrZoomAndPan)
hgs
parents:
diff changeset
  3255
        {
hgs
parents:
diff changeset
  3256
        if( aElementHandle->ElemID() == KSvgSvgElement )
hgs
parents:
diff changeset
  3257
            {
hgs
parents:
diff changeset
  3258
            ((CSvgSvgElementImpl*)aElementHandle)->SetZoomAndPan((TSvgZoomAndPanType)lValue);
hgs
parents:
diff changeset
  3259
            }
hgs
parents:
diff changeset
  3260
        return;
hgs
parents:
diff changeset
  3261
        }
hgs
parents:
diff changeset
  3262
    // for fill and stroke if the value is specified as enum need to
hgs
parents:
diff changeset
  3263
    // convert it in to "string"
hgs
parents:
diff changeset
  3264
    // also check that it is not a animation elements.
hgs
parents:
diff changeset
  3265
    // get enum for these values is not possible.
hgs
parents:
diff changeset
  3266
    if((aAttributeId == KCSS_ATTR_FILL || aAttributeId == KCSS_ATTR_STROKE)
hgs
parents:
diff changeset
  3267
         && ! (   aElementHandle->IsAnimatedElement() ))
hgs
parents:
diff changeset
  3268
        {
hgs
parents:
diff changeset
  3269
        if(lValue == 2)
hgs
parents:
diff changeset
  3270
            {
hgs
parents:
diff changeset
  3271
            _LIT( KNone, "none" );
hgs
parents:
diff changeset
  3272
            TRAPD(error,aElementHandle->SetPropertyL(aAttributeId,KNone));
hgs
parents:
diff changeset
  3273
            if (error != KErrNone)
hgs
parents:
diff changeset
  3274
                {
hgs
parents:
diff changeset
  3275
                #ifdef _DEBUG
hgs
parents:
diff changeset
  3276
                _LIT(KSetPropertyFailed,
hgs
parents:
diff changeset
  3277
                    "CSvgEngineInterfaceImpl::SetEnumAttribute: SetPropertyL error.");
hgs
parents:
diff changeset
  3278
                RDebug::Print(KSetPropertyFailed);
hgs
parents:
diff changeset
  3279
                #endif //_DEBUG
hgs
parents:
diff changeset
  3280
                }
hgs
parents:
diff changeset
  3281
            return;
hgs
parents:
diff changeset
  3282
            }
hgs
parents:
diff changeset
  3283
        if(lValue == 3)
hgs
parents:
diff changeset
  3284
            {
hgs
parents:
diff changeset
  3285
            _LIT( KCurrentColor, "currentColor" );
hgs
parents:
diff changeset
  3286
            TRAPD(error,aElementHandle->SetPropertyL(aAttributeId,KCurrentColor));
hgs
parents:
diff changeset
  3287
            if (error != KErrNone)
hgs
parents:
diff changeset
  3288
                {
hgs
parents:
diff changeset
  3289
                #ifdef _DEBUG
hgs
parents:
diff changeset
  3290
                _LIT(KSetPropertyFailed,
hgs
parents:
diff changeset
  3291
                    "CSvgEngineInterfaceImpl::SetEnumAttribute: SetPropertyL error.");
hgs
parents:
diff changeset
  3292
                RDebug::Print(KSetPropertyFailed);
hgs
parents:
diff changeset
  3293
                #endif //_DEBUG
hgs
parents:
diff changeset
  3294
                }
hgs
parents:
diff changeset
  3295
            return;
hgs
parents:
diff changeset
  3296
            }
hgs
parents:
diff changeset
  3297
        if(lValue == 4)
hgs
parents:
diff changeset
  3298
            {
hgs
parents:
diff changeset
  3299
            if (!(aElementHandle->StyleInParent(aElementHandle, aAttributeId)))
hgs
parents:
diff changeset
  3300
            {
hgs
parents:
diff changeset
  3301
            aElementHandle->RemoveAttribute(aAttributeId);
hgs
parents:
diff changeset
  3302
            }
hgs
parents:
diff changeset
  3303
            return;
hgs
parents:
diff changeset
  3304
            }
hgs
parents:
diff changeset
  3305
        }
hgs
parents:
diff changeset
  3306
hgs
parents:
diff changeset
  3307
    TRAPD(error, aElementHandle->SetAttributeIntL(aAttributeId,lValue));
hgs
parents:
diff changeset
  3308
    if (error != KErrNone)
hgs
parents:
diff changeset
  3309
        {
hgs
parents:
diff changeset
  3310
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3311
        _LIT(KSetAttributeIntFailed,
hgs
parents:
diff changeset
  3312
            "CSvgEngineInterfaceImpl::SetEnumAttribute: SetAttributeIntL error.");
hgs
parents:
diff changeset
  3313
        RDebug::Print(KSetAttributeIntFailed);
hgs
parents:
diff changeset
  3314
        #endif //_DEBUG
hgs
parents:
diff changeset
  3315
        }
hgs
parents:
diff changeset
  3316
    }
hgs
parents:
diff changeset
  3317
hgs
parents:
diff changeset
  3318
hgs
parents:
diff changeset
  3319
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3320
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetEnumAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TInt32& aValue)
hgs
parents:
diff changeset
  3321
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3322
EXPORT_C TInt CSvgEngineInterfaceImpl::GetEnumAttribute(CSvgElementImpl* aElementHandle,const TInt aAttributeId,TInt32& aValue)
hgs
parents:
diff changeset
  3323
{
hgs
parents:
diff changeset
  3324
hgs
parents:
diff changeset
  3325
    if(aAttributeId == KAtrPreserveAspectRatio)
hgs
parents:
diff changeset
  3326
        {
hgs
parents:
diff changeset
  3327
        // convert in to desc and Call set attribute
hgs
parents:
diff changeset
  3328
hgs
parents:
diff changeset
  3329
        if(aElementHandle->ElemID() == KSvgSvgElement)
hgs
parents:
diff changeset
  3330
            {
hgs
parents:
diff changeset
  3331
            MSvgPreserveAspectRatio *lTestObject;
hgs
parents:
diff changeset
  3332
            ((CSvgSvgElementImpl*)aElementHandle)->GetPreserveAspectRatio(lTestObject);
hgs
parents:
diff changeset
  3333
            if(lTestObject != NULL)
hgs
parents:
diff changeset
  3334
                {
hgs
parents:
diff changeset
  3335
                aValue = (TInt32)lTestObject->GetAlign();
hgs
parents:
diff changeset
  3336
                return KErrNone;
hgs
parents:
diff changeset
  3337
                }
hgs
parents:
diff changeset
  3338
            return KInvalidEnumAttribute;
hgs
parents:
diff changeset
  3339
            }
hgs
parents:
diff changeset
  3340
        if(aElementHandle->ElemID() == KSvgImageElement)
hgs
parents:
diff changeset
  3341
            {
hgs
parents:
diff changeset
  3342
            _LIT( KNone, "none" );
hgs
parents:
diff changeset
  3343
            _LIT( KXMidYMid, "xMidYMid" );
hgs
parents:
diff changeset
  3344
            TPtrC16 lParValue;
hgs
parents:
diff changeset
  3345
            aElementHandle->GetAttributeDes( KAtrPreserveAspectRatio, lParValue );
hgs
parents:
diff changeset
  3346
            if(lParValue == KNone)
hgs
parents:
diff changeset
  3347
                {
hgs
parents:
diff changeset
  3348
                aValue = 0;
hgs
parents:
diff changeset
  3349
                return KErrNone;
hgs
parents:
diff changeset
  3350
                }
hgs
parents:
diff changeset
  3351
            if(lParValue == KXMidYMid)
hgs
parents:
diff changeset
  3352
                {
hgs
parents:
diff changeset
  3353
                aValue = 1;
hgs
parents:
diff changeset
  3354
                return KErrNone;
hgs
parents:
diff changeset
  3355
                }
hgs
parents:
diff changeset
  3356
            return KInvalidEnumAttribute;
hgs
parents:
diff changeset
  3357
            }
hgs
parents:
diff changeset
  3358
hgs
parents:
diff changeset
  3359
        }
hgs
parents:
diff changeset
  3360
    if( aAttributeId == KAtrZoomAndPan)
hgs
parents:
diff changeset
  3361
        {
hgs
parents:
diff changeset
  3362
        if( aElementHandle->ElemID() == KSvgSvgElement )
hgs
parents:
diff changeset
  3363
            {
hgs
parents:
diff changeset
  3364
            aValue = (TInt32)((CSvgSvgElementImpl*)aElementHandle)->GetZoomAndPan();
hgs
parents:
diff changeset
  3365
            return KErrNone;
hgs
parents:
diff changeset
  3366
            }
hgs
parents:
diff changeset
  3367
        return KInvalidEnumAttribute;
hgs
parents:
diff changeset
  3368
        }
hgs
parents:
diff changeset
  3369
    TInt lResult = KErrNone;
hgs
parents:
diff changeset
  3370
    TRAPD(error, lResult = aElementHandle->GetAttributeIntL(aAttributeId,aValue));
hgs
parents:
diff changeset
  3371
    if (error != KErrNone)
hgs
parents:
diff changeset
  3372
        {
hgs
parents:
diff changeset
  3373
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3374
        _LIT(KGetAttributeIntFailed,
hgs
parents:
diff changeset
  3375
            "CSvgEngineInterfaceImpl::GetEnumAttribute: GetAttributeIntL error.");
hgs
parents:
diff changeset
  3376
        RDebug::Print(KGetAttributeIntFailed);
hgs
parents:
diff changeset
  3377
        #endif //_DEBUG
hgs
parents:
diff changeset
  3378
        }
hgs
parents:
diff changeset
  3379
    if(lResult == KErrNoAttribute)
hgs
parents:
diff changeset
  3380
        {
hgs
parents:
diff changeset
  3381
         return KInvalidEnumAttribute;
hgs
parents:
diff changeset
  3382
        }
hgs
parents:
diff changeset
  3383
    return KErrNone;
hgs
parents:
diff changeset
  3384
}
hgs
parents:
diff changeset
  3385
hgs
parents:
diff changeset
  3386
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3387
// EXPORT_C void CSvgEngineInterfaceImpl::SetRectAttribute( CXmlElementImpl* aElementHandle,
hgs
parents:
diff changeset
  3388
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3389
EXPORT_C void CSvgEngineInterfaceImpl::SetRectAttribute( CXmlElementImpl* aElementHandle,
hgs
parents:
diff changeset
  3390
                                                        float aX, float aY, float aWidth, float aHeight )
hgs
parents:
diff changeset
  3391
{
hgs
parents:
diff changeset
  3392
    if ( aElementHandle->ElemID() ==  KSvgRectElement )
hgs
parents:
diff changeset
  3393
        {
hgs
parents:
diff changeset
  3394
        CSvgRectElementImpl*  rect = (CSvgRectElementImpl*)aElementHandle;
hgs
parents:
diff changeset
  3395
        rect->SetRectValues(TFloatFixPt(aX), TFloatFixPt(aY), TFloatFixPt(aWidth), TFloatFixPt(aHeight));
hgs
parents:
diff changeset
  3396
        }
hgs
parents:
diff changeset
  3397
    // added as a part of update of get and set API's.
hgs
parents:
diff changeset
  3398
    if ( aElementHandle->ElemID() ==  KSvgSvgElement)
hgs
parents:
diff changeset
  3399
        {
hgs
parents:
diff changeset
  3400
        // for svg element it must be viewBox.
hgs
parents:
diff changeset
  3401
        TGfxRectangle2D     viewBox(aX, aY,aWidth,aHeight);
hgs
parents:
diff changeset
  3402
        CSvgSvgElementImpl *lSvgSvgElement = (CSvgSvgElementImpl*)(aElementHandle);
hgs
parents:
diff changeset
  3403
        TRAPD(error,lSvgSvgElement->SetViewBoxL( viewBox));
hgs
parents:
diff changeset
  3404
        if (error != KErrNone)
hgs
parents:
diff changeset
  3405
            {
hgs
parents:
diff changeset
  3406
            #ifdef _DEBUG
hgs
parents:
diff changeset
  3407
            _LIT(KSetRectAttributeFailed,
hgs
parents:
diff changeset
  3408
                "CSvgEngineInterfaceImpl::SetRectAttribute: SetViewBoxL error.");
hgs
parents:
diff changeset
  3409
            RDebug::Print(KSetRectAttributeFailed);
hgs
parents:
diff changeset
  3410
            #endif //_DEBUG
hgs
parents:
diff changeset
  3411
            }
hgs
parents:
diff changeset
  3412
hgs
parents:
diff changeset
  3413
         //CTM must be updated since viewbox changed
hgs
parents:
diff changeset
  3414
         lSvgSvgElement->UpdateCTM();
hgs
parents:
diff changeset
  3415
hgs
parents:
diff changeset
  3416
        }
hgs
parents:
diff changeset
  3417
}
hgs
parents:
diff changeset
  3418
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3419
// EXPORT_C TBool CSvgEngineInterfaceImpl::GetRectAttribute( CXmlElementImpl* aElementHandle,
hgs
parents:
diff changeset
  3420
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3421
EXPORT_C TBool CSvgEngineInterfaceImpl::GetRectAttribute( CXmlElementImpl* aElementHandle,
hgs
parents:
diff changeset
  3422
                                                        float* aX, float* aY, float* aWidth, float* aHeight )
hgs
parents:
diff changeset
  3423
{
hgs
parents:
diff changeset
  3424
    // added as a part of update of get and set API's.
hgs
parents:
diff changeset
  3425
    TBool viewBoxExisted = EFalse;
hgs
parents:
diff changeset
  3426
hgs
parents:
diff changeset
  3427
    if ( aElementHandle->ElemID() ==  KSvgSvgElement)
hgs
parents:
diff changeset
  3428
        {
hgs
parents:
diff changeset
  3429
        // for svg element it must be viewBox.
hgs
parents:
diff changeset
  3430
        TGfxRectangle2D     viewBox;
hgs
parents:
diff changeset
  3431
        CSvgSvgElementImpl *lSvgSvgElemet = (CSvgSvgElementImpl*)(aElementHandle);
hgs
parents:
diff changeset
  3432
hgs
parents:
diff changeset
  3433
        viewBoxExisted = lSvgSvgElemet->GetViewBox(viewBox);
hgs
parents:
diff changeset
  3434
        *aX = viewBox.iX;
hgs
parents:
diff changeset
  3435
        *aY = viewBox.iY;
hgs
parents:
diff changeset
  3436
        *aWidth  = viewBox.iWidth;
hgs
parents:
diff changeset
  3437
        *aHeight = viewBox.iHeight;
hgs
parents:
diff changeset
  3438
        }
hgs
parents:
diff changeset
  3439
    else if ( aElementHandle->ElemID() ==  KSvgRectElement )
hgs
parents:
diff changeset
  3440
        {
hgs
parents:
diff changeset
  3441
        CSvgRectElementImpl*  rect = (CSvgRectElementImpl*)aElementHandle;
hgs
parents:
diff changeset
  3442
        *aX = rect->X();
hgs
parents:
diff changeset
  3443
        *aY = rect->Y();
hgs
parents:
diff changeset
  3444
        *aWidth  = rect->Width();
hgs
parents:
diff changeset
  3445
        *aHeight = rect->Height();
hgs
parents:
diff changeset
  3446
        }
hgs
parents:
diff changeset
  3447
     else
hgs
parents:
diff changeset
  3448
        {
hgs
parents:
diff changeset
  3449
         aX = NULL;
hgs
parents:
diff changeset
  3450
        }
hgs
parents:
diff changeset
  3451
hgs
parents:
diff changeset
  3452
        return viewBoxExisted;
hgs
parents:
diff changeset
  3453
}
hgs
parents:
diff changeset
  3454
hgs
parents:
diff changeset
  3455
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3456
// EXPORT_C void CSvgEngineInterfaceImpl::GetMatrixAttribute( CXmlElementImpl* aElementHandle, float* aAVal,
hgs
parents:
diff changeset
  3457
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3458
EXPORT_C void CSvgEngineInterfaceImpl::GetMatrixAttribute( CXmlElementImpl* aElementHandle, float* aAVal,
hgs
parents:
diff changeset
  3459
                                                           float* aBVal, float* aCVal, float* aDVal,
hgs
parents:
diff changeset
  3460
                                                           float* aEVal, float* aFVal )
hgs
parents:
diff changeset
  3461
{
hgs
parents:
diff changeset
  3462
		//this should have been taken care of in the set only -
hgs
parents:
diff changeset
  3463
		//what about updating from the root all the way down here.
hgs
parents:
diff changeset
  3464
		//((CSvgElementImpl*)aElementHandle)->UpdateCTM();
hgs
parents:
diff changeset
  3465
hgs
parents:
diff changeset
  3466
    const TGfxAffineTransform& matrix = ((CSvgElementImpl*)aElementHandle)->GetCTM();
hgs
parents:
diff changeset
  3467
hgs
parents:
diff changeset
  3468
    *aAVal = matrix.iM00;
hgs
parents:
diff changeset
  3469
    *aBVal = matrix.iM10;
hgs
parents:
diff changeset
  3470
    *aCVal = matrix.iM01;
hgs
parents:
diff changeset
  3471
    *aDVal = matrix.iM11;
hgs
parents:
diff changeset
  3472
    *aEVal = matrix.iM02;
hgs
parents:
diff changeset
  3473
    *aFVal = matrix.iM12;
hgs
parents:
diff changeset
  3474
}
hgs
parents:
diff changeset
  3475
hgs
parents:
diff changeset
  3476
hgs
parents:
diff changeset
  3477
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3478
// EXPORT_C void CSvgEngineInterfaceImpl::GetMatrixAttribute( CXmlElementImpl* aElementHandle, float* aAVal,
hgs
parents:
diff changeset
  3479
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3480
EXPORT_C void CSvgEngineInterfaceImpl::GetMatrixAttribute( CXmlElementImpl* aElementHandle, TInt aAttributeType,
hgs
parents:
diff changeset
  3481
														   float* aAVal, float* aBVal, 
hgs
parents:
diff changeset
  3482
														   float* aCVal, float* aDVal,
hgs
parents:
diff changeset
  3483
                                                           float* aEVal, float* aFVal )
hgs
parents:
diff changeset
  3484
{
hgs
parents:
diff changeset
  3485
    if( aAttributeType == KAtrTransform)
hgs
parents:
diff changeset
  3486
    {
hgs
parents:
diff changeset
  3487
	    MSvgTransformList*  trList;
hgs
parents:
diff changeset
  3488
	    ((CSvgElementImpl*)aElementHandle)->GetTransform( trList );
hgs
parents:
diff changeset
  3489
	    TGfxAffineTransform matrix = 
hgs
parents:
diff changeset
  3490
	      trList->Consolidate( ((CSvgElementImpl*)aElementHandle)->IsOverwriteTransforms() );
hgs
parents:
diff changeset
  3491
hgs
parents:
diff changeset
  3492
	    *aAVal = matrix.iM00;
hgs
parents:
diff changeset
  3493
	    *aBVal = matrix.iM10;
hgs
parents:
diff changeset
  3494
	    *aCVal = matrix.iM01;
hgs
parents:
diff changeset
  3495
	    *aDVal = matrix.iM11;
hgs
parents:
diff changeset
  3496
	    *aEVal = matrix.iM02;
hgs
parents:
diff changeset
  3497
	    *aFVal = matrix.iM12;
hgs
parents:
diff changeset
  3498
    }
hgs
parents:
diff changeset
  3499
}
hgs
parents:
diff changeset
  3500
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3501
// EXPORT_C void CSvgEngineInterfaceImpl::SetMatrixAttribute( CXmlElementImpl* aElementHandle, float aAVal,
hgs
parents:
diff changeset
  3502
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3503
EXPORT_C void CSvgEngineInterfaceImpl::SetMatrixAttribute( CXmlElementImpl* aElementHandle, float aAVal,
hgs
parents:
diff changeset
  3504
                                                           float aBVal, float aCVal, float aDVal,
hgs
parents:
diff changeset
  3505
                                                           float aEVal, float aFVal )
hgs
parents:
diff changeset
  3506
{
hgs
parents:
diff changeset
  3507
    if ((CSvgElementImpl*)aElementHandle)
hgs
parents:
diff changeset
  3508
    {
hgs
parents:
diff changeset
  3509
        TGfxAffineTransform matrix;
hgs
parents:
diff changeset
  3510
        matrix.SetTransform( TReal32(aAVal), TReal32(aBVal), TReal32(aCVal),
hgs
parents:
diff changeset
  3511
                         TReal32(aDVal), TReal32(aEVal), TReal32(aFVal) );
hgs
parents:
diff changeset
  3512
        MSvgTransformList*  trList;
hgs
parents:
diff changeset
  3513
        ((CSvgElementImpl*)aElementHandle)->GetTransform( trList );
hgs
parents:
diff changeset
  3514
        trList->ReplaceItem( matrix, 0 );
hgs
parents:
diff changeset
  3515
hgs
parents:
diff changeset
  3516
        // we need to update the CTM on this element and below it....
hgs
parents:
diff changeset
  3517
hgs
parents:
diff changeset
  3518
        ((CSvgElementImpl*)aElementHandle)->UpdateCTM();
hgs
parents:
diff changeset
  3519
    }
hgs
parents:
diff changeset
  3520
}
hgs
parents:
diff changeset
  3521
hgs
parents:
diff changeset
  3522
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3523
// EXPORT_C void CSvgEngineInterfaceImpl::ClearFrameBuffer(CFbsBitmap* aFrameBuffer, TUint32 aClearingColor)
hgs
parents:
diff changeset
  3524
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3525
EXPORT_C void CSvgEngineInterfaceImpl::ClearFrameBuffer(CFbsBitmap* /* aFrameBuffer */,
hgs
parents:
diff changeset
  3526
                                                        TUint32 /* aClearingColor */,
hgs
parents:
diff changeset
  3527
                                                        TInt /* aEngine */ )
hgs
parents:
diff changeset
  3528
{
hgs
parents:
diff changeset
  3529
}
hgs
parents:
diff changeset
  3530
hgs
parents:
diff changeset
  3531
hgs
parents:
diff changeset
  3532
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3533
// EXPORT_C void CSvgEngineInterfaceImpl:: SetFrameBuffer(CFbsBitmap* aRenderBuffer)
hgs
parents:
diff changeset
  3534
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3535
EXPORT_C void CSvgEngineInterfaceImpl:: SetFrameBuffer(CFbsBitmap* aRenderBuffer, TInt aEngine)
hgs
parents:
diff changeset
  3536
    {
hgs
parents:
diff changeset
  3537
    if( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3538
        {
hgs
parents:
diff changeset
  3539
        iSvgEngine->SetSVGEngineState(ESVGEnginePaused);
hgs
parents:
diff changeset
  3540
        TRAPD( error1,iSvgEngine->SetGdiContextL(aRenderBuffer));
hgs
parents:
diff changeset
  3541
hgs
parents:
diff changeset
  3542
         if( error1 == KErrNone )
hgs
parents:
diff changeset
  3543
            {
hgs
parents:
diff changeset
  3544
hgs
parents:
diff changeset
  3545
            TRAPD( error2, iSvgEngine->InitializeEngineL()); // set the viewport and viewbox
hgs
parents:
diff changeset
  3546
            if (error2 != KErrNone)
hgs
parents:
diff changeset
  3547
                {
hgs
parents:
diff changeset
  3548
                #ifdef _DEBUG
hgs
parents:
diff changeset
  3549
                _LIT(KSetFrameBufferFailed,
hgs
parents:
diff changeset
  3550
                    "CSvgEngineInterfaceImpl::SetFrameBuffer: InitializeEngineL error.");
hgs
parents:
diff changeset
  3551
                RDebug::Print(KSetFrameBufferFailed);
hgs
parents:
diff changeset
  3552
                #endif //_DEBUG
hgs
parents:
diff changeset
  3553
                }
hgs
parents:
diff changeset
  3554
hgs
parents:
diff changeset
  3555
            if( iSvgEngine->Document() )
hgs
parents:
diff changeset
  3556
                {
hgs
parents:
diff changeset
  3557
                if( iSvgEngine->Document()->IsAnimationFile() ) // If it is animation file
hgs
parents:
diff changeset
  3558
                    {
hgs
parents:
diff changeset
  3559
                    iSvgEngine->SetSVGEngineState(ESVGEngineRunning);
hgs
parents:
diff changeset
  3560
                    }
hgs
parents:
diff changeset
  3561
                else
hgs
parents:
diff changeset
  3562
                    {
hgs
parents:
diff changeset
  3563
                    // If static file, just redraw it
hgs
parents:
diff changeset
  3564
                    TSvgTimerEvent tmev( 0 );
hgs
parents:
diff changeset
  3565
                    TRAPD( error2,iSvgEngine->ProcessEventL( 
hgs
parents:
diff changeset
  3566
                        iSvgEngine->Document(), &tmev ));
hgs
parents:
diff changeset
  3567
                    if (error2 != KErrNone)
hgs
parents:
diff changeset
  3568
                        {
hgs
parents:
diff changeset
  3569
                        #ifdef _DEBUG
hgs
parents:
diff changeset
  3570
                        _LIT(KRedrawFailed, "CSvgEngineInterfaceImpl::SetFrameBuffer: Redraw error.");
hgs
parents:
diff changeset
  3571
                        RDebug::Print(KRedrawFailed);
hgs
parents:
diff changeset
  3572
                        #endif //_DEBUG
hgs
parents:
diff changeset
  3573
                        }
hgs
parents:
diff changeset
  3574
                    }
hgs
parents:
diff changeset
  3575
                }
hgs
parents:
diff changeset
  3576
            }
hgs
parents:
diff changeset
  3577
        }
hgs
parents:
diff changeset
  3578
    }
hgs
parents:
diff changeset
  3579
hgs
parents:
diff changeset
  3580
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3581
// EXPORT_C TBool CSvgEngineInterfaceImpl::SearchForText( const TDesC& aSearchString,
hgs
parents:
diff changeset
  3582
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3583
EXPORT_C TBool CSvgEngineInterfaceImpl::SearchForText( const TDesC& aSearchString,
hgs
parents:
diff changeset
  3584
                                                       RPointerArray<MRect>& aBoundingBoxes,
hgs
parents:
diff changeset
  3585
                                                       RArray<TPtrC>& aTexts,
hgs
parents:
diff changeset
  3586
                                                       RArray<TInt>& aElementIds,
hgs
parents:
diff changeset
  3587
                                                       TBool aCaseSensitive,
hgs
parents:
diff changeset
  3588
                                                       TInt aEngine )
hgs
parents:
diff changeset
  3589
{
hgs
parents:
diff changeset
  3590
    if ( !ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3591
    {
hgs
parents:
diff changeset
  3592
        return EFalse;
hgs
parents:
diff changeset
  3593
    }
hgs
parents:
diff changeset
  3594
hgs
parents:
diff changeset
  3595
    TInt initialCount = aBoundingBoxes.Count();
hgs
parents:
diff changeset
  3596
hgs
parents:
diff changeset
  3597
    iSvgEngine->FindBBoxesForRotatedText( aSearchString, aBoundingBoxes, aTexts, aElementIds, aCaseSensitive );
hgs
parents:
diff changeset
  3598
hgs
parents:
diff changeset
  3599
    return aBoundingBoxes.Count() > initialCount;
hgs
parents:
diff changeset
  3600
}
hgs
parents:
diff changeset
  3601
hgs
parents:
diff changeset
  3602
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3603
// EXPORT_C TBool CSvgEngineInterfaceImpl::AddTextListener( MSvgTextListener* aListener)
hgs
parents:
diff changeset
  3604
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3605
EXPORT_C TBool CSvgEngineInterfaceImpl::AddTextListener( MSvgTextListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3606
{
hgs
parents:
diff changeset
  3607
    if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3608
    {
hgs
parents:
diff changeset
  3609
        iSvgEngine->AddTextListener( aListener );
hgs
parents:
diff changeset
  3610
    }
hgs
parents:
diff changeset
  3611
hgs
parents:
diff changeset
  3612
    return ETrue;
hgs
parents:
diff changeset
  3613
}
hgs
parents:
diff changeset
  3614
hgs
parents:
diff changeset
  3615
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3616
// EXPORT_C TBool CSvgEngineInterfaceImpl::RemoveTextListener( MSvgTextListener* aListener)
hgs
parents:
diff changeset
  3617
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3618
EXPORT_C TBool CSvgEngineInterfaceImpl::RemoveTextListener( MSvgTextListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3619
{
hgs
parents:
diff changeset
  3620
     if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3621
     {
hgs
parents:
diff changeset
  3622
        iSvgEngine->RemoveTextListener( aListener );
hgs
parents:
diff changeset
  3623
     }
hgs
parents:
diff changeset
  3624
hgs
parents:
diff changeset
  3625
     return ETrue;
hgs
parents:
diff changeset
  3626
}
hgs
parents:
diff changeset
  3627
hgs
parents:
diff changeset
  3628
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3629
// EXPORT_C TBool CSvgEngineInterfaceImpl::SetTextForTextElement( TInt aTextElementId, TDesC& aXmlString )
hgs
parents:
diff changeset
  3630
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3631
EXPORT_C TBool CSvgEngineInterfaceImpl::SetTextForTextElement( TInt aTextElementId, TDesC& aXmlString )
hgs
parents:
diff changeset
  3632
{
hgs
parents:
diff changeset
  3633
    TRAPD(err, ((CSvgTextElementImpl*)aTextElementId)->SetTextL(aXmlString));
hgs
parents:
diff changeset
  3634
    if ( err != KErrNone )
hgs
parents:
diff changeset
  3635
        {
hgs
parents:
diff changeset
  3636
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3637
        RDebug::Printf("CSvgEngineInterfaceImpl::SetTextForTextElement failed");
hgs
parents:
diff changeset
  3638
        #endif
hgs
parents:
diff changeset
  3639
        return EFalse;
hgs
parents:
diff changeset
  3640
        }
hgs
parents:
diff changeset
  3641
hgs
parents:
diff changeset
  3642
    return ETrue;
hgs
parents:
diff changeset
  3643
}
hgs
parents:
diff changeset
  3644
hgs
parents:
diff changeset
  3645
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3646
// EXPORT_C TBool CSvgEngineInterfaceImpl::GetTextForTextElement( TInt aTextElementId, TBool& aEditable, TDes& aXmlString )
hgs
parents:
diff changeset
  3647
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3648
EXPORT_C TBool CSvgEngineInterfaceImpl::GetTextForTextElement( TInt aTextElementId, TBool& aEditable, TDes& aXmlString )
hgs
parents:
diff changeset
  3649
{
hgs
parents:
diff changeset
  3650
    if(aXmlString.MaxLength() < ((CSvgTextElementImpl*)aTextElementId)->GetText().Length() )
hgs
parents:
diff changeset
  3651
        {
hgs
parents:
diff changeset
  3652
        aXmlString = ((CSvgTextElementImpl*)aTextElementId)->GetText().Left( aXmlString.MaxLength() );
hgs
parents:
diff changeset
  3653
        }
hgs
parents:
diff changeset
  3654
    else
hgs
parents:
diff changeset
  3655
        {
hgs
parents:
diff changeset
  3656
        aXmlString = ((CSvgTextElementImpl*)aTextElementId)->GetText();
hgs
parents:
diff changeset
  3657
        }
hgs
parents:
diff changeset
  3658
hgs
parents:
diff changeset
  3659
    aEditable = ((CSvgTextElementImpl*)aTextElementId)->IsEditable();
hgs
parents:
diff changeset
  3660
hgs
parents:
diff changeset
  3661
    return aEditable;
hgs
parents:
diff changeset
  3662
}
hgs
parents:
diff changeset
  3663
hgs
parents:
diff changeset
  3664
hgs
parents:
diff changeset
  3665
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3666
// EXPORT_C TBool CSvgEngineInterfaceImpl::AddTextAreaListener( MSvgTextAreaListener* aListener)
hgs
parents:
diff changeset
  3667
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3668
EXPORT_C TBool CSvgEngineInterfaceImpl::AddTextAreaListener( MSvgTextAreaListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3669
{
hgs
parents:
diff changeset
  3670
    if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3671
    {
hgs
parents:
diff changeset
  3672
        iSvgEngine->AddTextAreaListener( aListener );
hgs
parents:
diff changeset
  3673
    }
hgs
parents:
diff changeset
  3674
hgs
parents:
diff changeset
  3675
    return ETrue;
hgs
parents:
diff changeset
  3676
}
hgs
parents:
diff changeset
  3677
hgs
parents:
diff changeset
  3678
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3679
// EXPORT_C TBool CSvgEngineInterfaceImpl::RemoveTextAreaListener( MSvgTextAreaListener* aListener)
hgs
parents:
diff changeset
  3680
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3681
EXPORT_C TBool CSvgEngineInterfaceImpl::RemoveTextAreaListener( MSvgTextAreaListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3682
{
hgs
parents:
diff changeset
  3683
     if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3684
     {
hgs
parents:
diff changeset
  3685
        iSvgEngine->RemoveTextAreaListener( aListener );
hgs
parents:
diff changeset
  3686
     }
hgs
parents:
diff changeset
  3687
hgs
parents:
diff changeset
  3688
     return ETrue;
hgs
parents:
diff changeset
  3689
}
hgs
parents:
diff changeset
  3690
hgs
parents:
diff changeset
  3691
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3692
// EXPORT_C TBool CSvgEngineInterfaceImpl::SetTextForTextAreaElement( TInt aTextAreaElementId, TDesC& aXmlString )
hgs
parents:
diff changeset
  3693
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3694
EXPORT_C TBool CSvgEngineInterfaceImpl::SetTextForTextAreaElement( TInt aTextAreaElementId, TDesC& aXmlString )
hgs
parents:
diff changeset
  3695
{
hgs
parents:
diff changeset
  3696
    TRAPD(err, ((CSvgTextAreaElementImpl*)aTextAreaElementId)->SetTextL(aXmlString));
hgs
parents:
diff changeset
  3697
hgs
parents:
diff changeset
  3698
    if ( err != KErrNone )
hgs
parents:
diff changeset
  3699
        {
hgs
parents:
diff changeset
  3700
        #ifdef _DEBUG
hgs
parents:
diff changeset
  3701
        RDebug::Printf("CSvgEngineInterfaceImpl::SetTextForTextElement failed");
hgs
parents:
diff changeset
  3702
        #endif
hgs
parents:
diff changeset
  3703
        return EFalse;
hgs
parents:
diff changeset
  3704
        }
hgs
parents:
diff changeset
  3705
hgs
parents:
diff changeset
  3706
    return ETrue;
hgs
parents:
diff changeset
  3707
}
hgs
parents:
diff changeset
  3708
hgs
parents:
diff changeset
  3709
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3710
// EXPORT_C TBool CSvgEngineInterfaceImpl::GetTextForTextAreaElement( TInt aTextAreaElementId, TBool& aEditable, TDes& aXmlString )
hgs
parents:
diff changeset
  3711
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3712
EXPORT_C TBool CSvgEngineInterfaceImpl::GetTextForTextAreaElement( TInt aTextAreaElementId, TBool& aEditable, TDes& aXmlString )
hgs
parents:
diff changeset
  3713
{
hgs
parents:
diff changeset
  3714
    ((CSvgTextAreaElementImpl*)aTextAreaElementId)->GetText( aXmlString );
hgs
parents:
diff changeset
  3715
hgs
parents:
diff changeset
  3716
    aEditable = ((CSvgTextAreaElementImpl*)aTextAreaElementId)->IsEditable();
hgs
parents:
diff changeset
  3717
hgs
parents:
diff changeset
  3718
    return aEditable;
hgs
parents:
diff changeset
  3719
}
hgs
parents:
diff changeset
  3720
hgs
parents:
diff changeset
  3721
hgs
parents:
diff changeset
  3722
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3723
// EXPORT_C void CSvgEngineInterfaceImpl::AddHyperlinkListener( MSvgHyperlinkListener* aListener )
hgs
parents:
diff changeset
  3724
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3725
EXPORT_C void CSvgEngineInterfaceImpl::AddHyperlinkListener( MSvgHyperlinkListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3726
{
hgs
parents:
diff changeset
  3727
    if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3728
    {
hgs
parents:
diff changeset
  3729
        iSvgEngine->AddHyperlinkListener( aListener );
hgs
parents:
diff changeset
  3730
    }
hgs
parents:
diff changeset
  3731
}
hgs
parents:
diff changeset
  3732
hgs
parents:
diff changeset
  3733
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3734
// EXPORT_C void CSvgEngineInterfaceImpl::RemoveHyperlinkListener( MSvgHyperlinkListener* aListener )
hgs
parents:
diff changeset
  3735
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3736
EXPORT_C void CSvgEngineInterfaceImpl::RemoveHyperlinkListener( MSvgHyperlinkListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3737
{
hgs
parents:
diff changeset
  3738
    if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3739
    {
hgs
parents:
diff changeset
  3740
        iSvgEngine->RemoveHyperlinkListener( aListener );
hgs
parents:
diff changeset
  3741
    }
hgs
parents:
diff changeset
  3742
}
hgs
parents:
diff changeset
  3743
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3744
// EXPORT_C void CSvgEngineInterfaceImpl::AddAnimationListener( MSvgAnimationListener* aListener )
hgs
parents:
diff changeset
  3745
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3746
EXPORT_C void CSvgEngineInterfaceImpl::AddAnimationListener( MSvgAnimationListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3747
{
hgs
parents:
diff changeset
  3748
    if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3749
    {
hgs
parents:
diff changeset
  3750
        iSvgEngine->AddAnimationListener( aListener );
hgs
parents:
diff changeset
  3751
    }
hgs
parents:
diff changeset
  3752
}
hgs
parents:
diff changeset
  3753
hgs
parents:
diff changeset
  3754
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3755
// EXPORT_C void CSvgEngineInterfaceImpl::RemoveAnimationListener( MSvgAnimationListener* aListener )
hgs
parents:
diff changeset
  3756
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3757
EXPORT_C void CSvgEngineInterfaceImpl::RemoveAnimationListener( MSvgAnimationListener* aListener, TInt aEngine )
hgs
parents:
diff changeset
  3758
{
hgs
parents:
diff changeset
  3759
    if ( ChooseEngine ( aEngine ) )
hgs
parents:
diff changeset
  3760
    {
hgs
parents:
diff changeset
  3761
        iSvgEngine->RemoveAnimationListener( aListener );
hgs
parents:
diff changeset
  3762
    }
hgs
parents:
diff changeset
  3763
}
hgs
parents:
diff changeset
  3764
hgs
parents:
diff changeset
  3765
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3766
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetViewportWidth( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3767
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3768
EXPORT_C TInt CSvgEngineInterfaceImpl::GetViewportWidth( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3769
{
hgs
parents:
diff changeset
  3770
    TFloatFixPt width = 0;
hgs
parents:
diff changeset
  3771
    CSvgSvgElementImpl*  el = (CSvgSvgElementImpl*)(aDocumentHandle->RootElement());
hgs
parents:
diff changeset
  3772
hgs
parents:
diff changeset
  3773
    if ( el != NULL )
hgs
parents:
diff changeset
  3774
    {
hgs
parents:
diff changeset
  3775
    	width = el->Width( );
hgs
parents:
diff changeset
  3776
    	    
hgs
parents:
diff changeset
  3777
    	// this means the values were provided in % and the Engine is not initialized.
hgs
parents:
diff changeset
  3778
      if((TInt)(width) == -1)
hgs
parents:
diff changeset
  3779
        {
hgs
parents:
diff changeset
  3780
        return (TInt)(el->iWidthInUserCoordinate);
hgs
parents:
diff changeset
  3781
        }
hgs
parents:
diff changeset
  3782
   	}
hgs
parents:
diff changeset
  3783
hgs
parents:
diff changeset
  3784
hgs
parents:
diff changeset
  3785
    return (TInt)width;
hgs
parents:
diff changeset
  3786
}
hgs
parents:
diff changeset
  3787
hgs
parents:
diff changeset
  3788
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3789
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetViewportHeight( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3790
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3791
EXPORT_C TInt CSvgEngineInterfaceImpl::GetViewportHeight( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3792
{
hgs
parents:
diff changeset
  3793
    TFloatFixPt height = 0;
hgs
parents:
diff changeset
  3794
    CSvgSvgElementImpl*  el = (CSvgSvgElementImpl*)(aDocumentHandle->RootElement());
hgs
parents:
diff changeset
  3795
hgs
parents:
diff changeset
  3796
    if ( el != NULL )
hgs
parents:
diff changeset
  3797
    {
hgs
parents:
diff changeset
  3798
    	height = el->Height( );
hgs
parents:
diff changeset
  3799
    	
hgs
parents:
diff changeset
  3800
    	// this means the values were provided in % and the Engine is not initialized.
hgs
parents:
diff changeset
  3801
        if((TInt)(height) == -1)
hgs
parents:
diff changeset
  3802
        {
hgs
parents:
diff changeset
  3803
        return (TInt)(el->iHeightInUserCoordinate);
hgs
parents:
diff changeset
  3804
        }
hgs
parents:
diff changeset
  3805
   	}
hgs
parents:
diff changeset
  3806
    
hgs
parents:
diff changeset
  3807
    return (TInt)height;
hgs
parents:
diff changeset
  3808
}
hgs
parents:
diff changeset
  3809
hgs
parents:
diff changeset
  3810
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3811
// EXPORT_C void CSvgEngineInterfaceImpl::SetViewportWidth( CSvgDocumentImpl* aDocumentHandle, TInt aWidth )
hgs
parents:
diff changeset
  3812
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3813
EXPORT_C void CSvgEngineInterfaceImpl::SetViewportWidth( CSvgDocumentImpl* aDocumentHandle, TInt aWidth )
hgs
parents:
diff changeset
  3814
{
hgs
parents:
diff changeset
  3815
    CSvgSvgElementImpl*  el = (CSvgSvgElementImpl*)( aDocumentHandle->RootElement());
hgs
parents:
diff changeset
  3816
    if ( el != NULL )
hgs
parents:
diff changeset
  3817
        {
hgs
parents:
diff changeset
  3818
        TRAP_IGNORE( el->SetAttributeFloatL( KAtrWidth, (TFloatFixPt)aWidth ) );
hgs
parents:
diff changeset
  3819
        el->iWidthInPercentage = EFalse;
hgs
parents:
diff changeset
  3820
        }
hgs
parents:
diff changeset
  3821
}
hgs
parents:
diff changeset
  3822
hgs
parents:
diff changeset
  3823
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3824
// EXPORT_C void CSvgEngineInterfaceImpl::SetViewportHeight( CSvgDocumentImpl* aDocumentHandle, TInt aHeight )
hgs
parents:
diff changeset
  3825
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3826
EXPORT_C void CSvgEngineInterfaceImpl::SetViewportHeight( CSvgDocumentImpl* aDocumentHandle, TInt aHeight )
hgs
parents:
diff changeset
  3827
{
hgs
parents:
diff changeset
  3828
    CSvgSvgElementImpl*  el = (CSvgSvgElementImpl*)( aDocumentHandle->RootElement());
hgs
parents:
diff changeset
  3829
    if ( el != NULL )
hgs
parents:
diff changeset
  3830
        {
hgs
parents:
diff changeset
  3831
        TRAP_IGNORE( el->SetAttributeFloatL( KAtrHeight, (TFloatFixPt)aHeight ) );
hgs
parents:
diff changeset
  3832
        el->iHeightInPercentage = EFalse;
hgs
parents:
diff changeset
  3833
        }
hgs
parents:
diff changeset
  3834
}
hgs
parents:
diff changeset
  3835
hgs
parents:
diff changeset
  3836
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3837
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetViewportUnits( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3838
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3839
EXPORT_C TInt CSvgEngineInterfaceImpl::GetViewportUnits( CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3840
{
hgs
parents:
diff changeset
  3841
    if ( 
hgs
parents:
diff changeset
  3842
    ((CSvgSvgElementImpl*)aDocumentHandle->RootElement() )->iWidthInPercentage 
hgs
parents:
diff changeset
  3843
    && ((CSvgSvgElementImpl*)aDocumentHandle->RootElement() )->iHeightInPercentage 
hgs
parents:
diff changeset
  3844
    )
hgs
parents:
diff changeset
  3845
    {
hgs
parents:
diff changeset
  3846
        return SvgUnitPercent;
hgs
parents:
diff changeset
  3847
    }
hgs
parents:
diff changeset
  3848
    else
hgs
parents:
diff changeset
  3849
    {
hgs
parents:
diff changeset
  3850
        return SvgUnitPixels;
hgs
parents:
diff changeset
  3851
    }
hgs
parents:
diff changeset
  3852
}
hgs
parents:
diff changeset
  3853
hgs
parents:
diff changeset
  3854
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3855
// EXPORT_C void CSvgEngineInterfaceImpl::SvgBeginElementAt(CXmlElementImpl* aElementHandle , TUint32 aTimeInMilliSeconds, CSvgDocumentImpl* aDocumentHandle)
hgs
parents:
diff changeset
  3856
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3857
EXPORT_C void CSvgEngineInterfaceImpl::SvgBeginElementAt( 
hgs
parents:
diff changeset
  3858
        CXmlElementImpl* aElementHandle , 
hgs
parents:
diff changeset
  3859
        TUint32 aTimeInMilliSeconds, 
hgs
parents:
diff changeset
  3860
        CSvgDocumentImpl* /* aDocumentHandle */ )
hgs
parents:
diff changeset
  3861
    {
hgs
parents:
diff changeset
  3862
    if  ( ((CSvgElementImpl*)aElementHandle)->IsAnimatedElement() )
hgs
parents:
diff changeset
  3863
        {
hgs
parents:
diff changeset
  3864
        // do this only when this is  an animation element.
hgs
parents:
diff changeset
  3865
		CSvgAnimationBase*  lAnimationBasePtr = (CSvgAnimationBase*)aElementHandle;
hgs
parents:
diff changeset
  3866
		TRAPD( err, lAnimationBasePtr->SetBeginByEventL( lAnimationBasePtr,
hgs
parents:
diff changeset
  3867
			aTimeInMilliSeconds, ETrue ));
hgs
parents:
diff changeset
  3868
hgs
parents:
diff changeset
  3869
        lAnimationBasePtr->SaveBeginTimeToList(aTimeInMilliSeconds);
hgs
parents:
diff changeset
  3870
        if ( err != KErrNone )
hgs
parents:
diff changeset
  3871
            {
hgs
parents:
diff changeset
  3872
            #ifdef _DEBUG
hgs
parents:
diff changeset
  3873
            RDebug::Printf("CSvgEngineInterfaceImpl::SvgBeginElementAt SetBeginByEventL() failed");
hgs
parents:
diff changeset
  3874
            #endif
hgs
parents:
diff changeset
  3875
            }
hgs
parents:
diff changeset
  3876
        }
hgs
parents:
diff changeset
  3877
    }
hgs
parents:
diff changeset
  3878
hgs
parents:
diff changeset
  3879
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  3880
//Old begine element at...
hgs
parents:
diff changeset
  3881
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  3882
/*EXPORT_C void CSvgEngineInterfaceImpl::SvgBeginElementAt(CXmlElementImpl* aElementHandle , TUint32 aTimeInMilliSeconds)
hgs
parents:
diff changeset
  3883
{
hgs
parents:
diff changeset
  3884
  if  (   aElementHandle->ElemID() >= KSvgAnimElemsStartIndex &&
hgs
parents:
diff changeset
  3885
                        aElementHandle->ElemID() <= KSvgAnimElemsEndIndex
hgs
parents:
diff changeset
  3886
        )
hgs
parents:
diff changeset
  3887
        {
hgs
parents:
diff changeset
  3888
        // do this only when this is  an animation element.
hgs
parents:
diff changeset
  3889
        CSvgAnimationBase*  lAnimationBasePtr = (CSvgAnimationBase*)aElementHandle;
hgs
parents:
diff changeset
  3890
        lAnimationBasePtr->SetBeginTime(aTimeInMilliSeconds);
hgs
parents:
diff changeset
  3891
        // what if the animation has already started. reflect the change in the end Time.
hgs
parents:
diff changeset
  3892
        TUint32 lSimpleDuration = lAnimationBasePtr->SimpleDuration();
hgs
parents:
diff changeset
  3893
        if( lSimpleDuration )
hgs
parents:
diff changeset
  3894
            {
hgs
parents:
diff changeset
  3895
            lAnimationBasePtr->SetEndTime(lSimpleDuration);
hgs
parents:
diff changeset
  3896
            }
hgs
parents:
diff changeset
  3897
        // should we change the animation status.
hgs
parents:
diff changeset
  3898
        // if the animation has finished then it will not start here again
hgs
parents:
diff changeset
  3899
        // Reset the status and reset the repeatCount.
hgs
parents:
diff changeset
  3900
hgs
parents:
diff changeset
  3901
        }
hgs
parents:
diff changeset
  3902
}*/
hgs
parents:
diff changeset
  3903
hgs
parents:
diff changeset
  3904
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3905
// EXPORT_C void CSvgEngineInterfaceImpl::SvgEndElementAt(CXmlElementImpl* aElementHandle , TUint32 aTimeInMilliSeconds, CSvgDocumentImpl* aDocumentHandle)
hgs
parents:
diff changeset
  3906
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3907
EXPORT_C void CSvgEngineInterfaceImpl::SvgEndElementAt( CXmlElementImpl* aElementHandle , TUint32 aTimeInMilliSeconds, CSvgDocumentImpl*  aDocumentHandle )
hgs
parents:
diff changeset
  3908
{
hgs
parents:
diff changeset
  3909
  if  ( ((CSvgElementImpl*)aElementHandle)->IsAnimatedElement() )
hgs
parents:
diff changeset
  3910
        {
hgs
parents:
diff changeset
  3911
        // do this only when this is  an animation element.
hgs
parents:
diff changeset
  3912
        CSvgAnimationBase*  lAnimationBasePtr = (CSvgAnimationBase*)aElementHandle;
hgs
parents:
diff changeset
  3913
        lAnimationBasePtr->SetEndByEvent(lAnimationBasePtr, aTimeInMilliSeconds);
hgs
parents:
diff changeset
  3914
hgs
parents:
diff changeset
  3915
        //this may be more efficient then SetMediaTime below because it only does this element.
hgs
parents:
diff changeset
  3916
        //lAnimationBasePtr->ReInitializeAnimation();
hgs
parents:
diff changeset
  3917
hgs
parents:
diff changeset
  3918
        SvgSetMediaTime(aDocumentHandle, SvgGetMediaTime(aDocumentHandle) );
hgs
parents:
diff changeset
  3919
hgs
parents:
diff changeset
  3920
        }
hgs
parents:
diff changeset
  3921
}
hgs
parents:
diff changeset
  3922
hgs
parents:
diff changeset
  3923
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3924
// EXPORT_C void CSvgEngineInterfaceImpl::SvgSetMediaTime(CSvgDocumentImpl* aDocumentHandle ,TUint32 aTimeInMilliSeconds)
hgs
parents:
diff changeset
  3925
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3926
EXPORT_C void CSvgEngineInterfaceImpl::SvgSetMediaTime(CSvgDocumentImpl* aDocumentHandle ,TUint32 aTimeInMilliSeconds)
hgs
parents:
diff changeset
  3927
{
hgs
parents:
diff changeset
  3928
    if(aDocumentHandle && aDocumentHandle->Engine())
hgs
parents:
diff changeset
  3929
    {
hgs
parents:
diff changeset
  3930
        aDocumentHandle->Engine()->SetMediaTime(aTimeInMilliSeconds);
hgs
parents:
diff changeset
  3931
        //Reset the document only if time is 0. This change is just to meet JSR request.
hgs
parents:
diff changeset
  3932
        if(aTimeInMilliSeconds == 0 && !aDocumentHandle->Engine()->iTimer)
hgs
parents:
diff changeset
  3933
        {
hgs
parents:
diff changeset
  3934
        	TSvgTimerEvent timeEvent( aTimeInMilliSeconds );
hgs
parents:
diff changeset
  3935
	       	aDocumentHandle->Reset( &timeEvent );	
hgs
parents:
diff changeset
  3936
        }
hgs
parents:
diff changeset
  3937
    }
hgs
parents:
diff changeset
  3938
    else if (aDocumentHandle && !aDocumentHandle->Engine())
hgs
parents:
diff changeset
  3939
 	{
hgs
parents:
diff changeset
  3940
	//JSR226 Change in question
hgs
parents:
diff changeset
  3941
    		#ifdef _DEBUG
hgs
parents:
diff changeset
  3942
    		RDebug::Printf("CSvgEngineInterfaceImpl::SvgSetMediaTime--doc doesnt know its engine!");
hgs
parents:
diff changeset
  3943
    		#endif
hgs
parents:
diff changeset
  3944
hgs
parents:
diff changeset
  3945
    		//creating a fake engine for the JSR 226 to be able to get valid numbers
hgs
parents:
diff changeset
  3946
    		//before rendering.  Don't try this at home kids
hgs
parents:
diff changeset
  3947
hgs
parents:
diff changeset
  3948
			CSvgEngineImpl* fakeEngine = NULL;
hgs
parents:
diff changeset
  3949
hgs
parents:
diff changeset
  3950
    		TRAP_IGNORE( fakeEngine  = CSvgEngineImpl::NewL(iSvgBitmapFontProvider) );
hgs
parents:
diff changeset
  3951
hgs
parents:
diff changeset
  3952
    		if (fakeEngine == NULL)
hgs
parents:
diff changeset
  3953
    		{
hgs
parents:
diff changeset
  3954
    			return;
hgs
parents:
diff changeset
  3955
    		}
hgs
parents:
diff changeset
  3956
hgs
parents:
diff changeset
  3957
    		aDocumentHandle->SetEngine(fakeEngine );
hgs
parents:
diff changeset
  3958
    		fakeEngine ->SetDocument(aDocumentHandle);
hgs
parents:
diff changeset
  3959
hgs
parents:
diff changeset
  3960
    		aDocumentHandle->Engine()->SetMediaTime(aTimeInMilliSeconds);
hgs
parents:
diff changeset
  3961
hgs
parents:
diff changeset
  3962
    		TSvgTimerEvent timeEvent( aTimeInMilliSeconds );
hgs
parents:
diff changeset
  3963
hgs
parents:
diff changeset
  3964
        	//AJD I think this needs to be down in the event handler where it sets the time...
hgs
parents:
diff changeset
  3965
        	fakeEngine ->Document()->Reset( &timeEvent );
hgs
parents:
diff changeset
  3966
hgs
parents:
diff changeset
  3967
        	TRAPD( error3, fakeEngine ->ProcessEventL( 
hgs
parents:
diff changeset
  3968
        	    aDocumentHandle, &timeEvent, EFalse ));
hgs
parents:
diff changeset
  3969
hgs
parents:
diff changeset
  3970
            if( error3 != KErrNone)
hgs
parents:
diff changeset
  3971
            {
hgs
parents:
diff changeset
  3972
                // Error Processing
hgs
parents:
diff changeset
  3973
            }
hgs
parents:
diff changeset
  3974
hgs
parents:
diff changeset
  3975
        	fakeEngine ->UpdateCTM(aDocumentHandle);
hgs
parents:
diff changeset
  3976
hgs
parents:
diff changeset
  3977
    		aDocumentHandle->SetEngine(NULL);
hgs
parents:
diff changeset
  3978
    		fakeEngine ->SetDocument(NULL);
hgs
parents:
diff changeset
  3979
hgs
parents:
diff changeset
  3980
    		delete fakeEngine ;
hgs
parents:
diff changeset
  3981
hgs
parents:
diff changeset
  3982
    		//store off time on document because this was with a fake engine
hgs
parents:
diff changeset
  3983
    		//because at this point it hasn't rendered
hgs
parents:
diff changeset
  3984
    		aDocumentHandle->iTimeForJSR226 = aTimeInMilliSeconds;
hgs
parents:
diff changeset
  3985
    }
hgs
parents:
diff changeset
  3986
    else
hgs
parents:
diff changeset
  3987
    {
hgs
parents:
diff changeset
  3988
    		#ifdef _DEBUG
hgs
parents:
diff changeset
  3989
    		RDebug::Printf("CSvgEngineInterfaceImpl::SvgSetMediaTime-- engine or doc null!");
hgs
parents:
diff changeset
  3990
    		#endif
hgs
parents:
diff changeset
  3991
    }
hgs
parents:
diff changeset
  3992
}
hgs
parents:
diff changeset
  3993
hgs
parents:
diff changeset
  3994
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3995
// EXPORT_C TReal32 CSvgEngineInterfaceImpl::SvgGetMediaTime(CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  3996
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3997
EXPORT_C TReal32 CSvgEngineInterfaceImpl::SvgGetMediaTime(CSvgDocumentImpl* aDocumentHandle ) __SOFTFP
hgs
parents:
diff changeset
  3998
{
hgs
parents:
diff changeset
  3999
    // returns time in  milliseconds
hgs
parents:
diff changeset
  4000
    if(aDocumentHandle && aDocumentHandle->Engine())
hgs
parents:
diff changeset
  4001
    {
hgs
parents:
diff changeset
  4002
        return (TReal32)(aDocumentHandle->Engine()->CurrentTIme());
hgs
parents:
diff changeset
  4003
    }
hgs
parents:
diff changeset
  4004
    else
hgs
parents:
diff changeset
  4005
    {
hgs
parents:
diff changeset
  4006
    	if (aDocumentHandle && !aDocumentHandle->Engine())
hgs
parents:
diff changeset
  4007
    	{
hgs
parents:
diff changeset
  4008
    		#ifdef _DEBUG
hgs
parents:
diff changeset
  4009
    		RDebug::Printf("CSvgEngineInterfaceImpl::SvgGetMediaTime--doc doesnt know its engine!");
hgs
parents:
diff changeset
  4010
    		#endif
hgs
parents:
diff changeset
  4011
hgs
parents:
diff changeset
  4012
    		return ( (TReal32)(aDocumentHandle->iTimeForJSR226) );
hgs
parents:
diff changeset
  4013
    	}
hgs
parents:
diff changeset
  4014
    	else
hgs
parents:
diff changeset
  4015
    	{
hgs
parents:
diff changeset
  4016
    		#ifdef _DEBUG
hgs
parents:
diff changeset
  4017
    		RDebug::Printf("CSvgEngineInterfaceImpl::SvgGetMediaTime-- engine or doc null!");
hgs
parents:
diff changeset
  4018
    		#endif
hgs
parents:
diff changeset
  4019
    	}
hgs
parents:
diff changeset
  4020
    }
hgs
parents:
diff changeset
  4021
hgs
parents:
diff changeset
  4022
    return 0;
hgs
parents:
diff changeset
  4023
}
hgs
parents:
diff changeset
  4024
hgs
parents:
diff changeset
  4025
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4026
// EXPORT_C TBool CSvgEngineInterfaceImpl::SvgHasAnimation(CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  4027
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4028
EXPORT_C TBool CSvgEngineInterfaceImpl::SvgHasAnimation(CSvgDocumentImpl* aDocumentHandle )
hgs
parents:
diff changeset
  4029
{
hgs
parents:
diff changeset
  4030
    if (aDocumentHandle)
hgs
parents:
diff changeset
  4031
    {
hgs
parents:
diff changeset
  4032
        return aDocumentHandle->IsAnimationFile();
hgs
parents:
diff changeset
  4033
    }
hgs
parents:
diff changeset
  4034
hgs
parents:
diff changeset
  4035
    return EFalse;
hgs
parents:
diff changeset
  4036
}
hgs
parents:
diff changeset
  4037
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4038
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetFocusedElement(CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  4039
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4040
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::GetFocusedElement(CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  4041
{
hgs
parents:
diff changeset
  4042
    if(aDocument)
hgs
parents:
diff changeset
  4043
    {
hgs
parents:
diff changeset
  4044
        return aDocument->GetFocusElement();
hgs
parents:
diff changeset
  4045
    }
hgs
parents:
diff changeset
  4046
hgs
parents:
diff changeset
  4047
        return 0;
hgs
parents:
diff changeset
  4048
}
hgs
parents:
diff changeset
  4049
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4050
// EXPORT_C void CSvgEngineInterfaceImpl::SetFocusElement(CXmlElementImpl* aElement , CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  4051
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4052
EXPORT_C void CSvgEngineInterfaceImpl::SetFocusElement(CXmlElementImpl* aElement , CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  4053
{
hgs
parents:
diff changeset
  4054
    if(aDocument)
hgs
parents:
diff changeset
  4055
    {
hgs
parents:
diff changeset
  4056
        aDocument->SetFocusElement(aElement);
hgs
parents:
diff changeset
  4057
    }
hgs
parents:
diff changeset
  4058
}
hgs
parents:
diff changeset
  4059
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4060
// EXPORT_C TBool CSvgEngineInterfaceImpl::SVGElementInDom(CSvgDocumentImpl* aDocument,  CXmlElementImpl* aElement)
hgs
parents:
diff changeset
  4061
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4062
EXPORT_C TBool CSvgEngineInterfaceImpl::SVGElementInDom(CSvgDocumentImpl* aDocument,  CXmlElementImpl* aElement)
hgs
parents:
diff changeset
  4063
{
hgs
parents:
diff changeset
  4064
    if (aDocument)
hgs
parents:
diff changeset
  4065
    {
hgs
parents:
diff changeset
  4066
        return aDocument->SvgElementPresent((CSvgElementImpl*) aElement);
hgs
parents:
diff changeset
  4067
    }
hgs
parents:
diff changeset
  4068
hgs
parents:
diff changeset
  4069
    return EFalse;
hgs
parents:
diff changeset
  4070
}
hgs
parents:
diff changeset
  4071
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4072
// EXPORT_C void CSvgEngineInterfaceImpl::SvgActivateAnimation(CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  4073
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4074
EXPORT_C void CSvgEngineInterfaceImpl::SvgActivateAnimation(CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  4075
{
hgs
parents:
diff changeset
  4076
    // this means that if the focus element is an animation element
hgs
parents:
diff changeset
  4077
    // than the animation element should begin. // SVGACTIVATEANIMATION.
hgs
parents:
diff changeset
  4078
    if(aDocument)
hgs
parents:
diff changeset
  4079
        {
hgs
parents:
diff changeset
  4080
        CXmlElementImpl* lCurrentFocusElement= aDocument->GetFocusElement();
hgs
parents:
diff changeset
  4081
        if(lCurrentFocusElement)
hgs
parents:
diff changeset
  4082
            {
hgs
parents:
diff changeset
  4083
            // Get the element ID
hgs
parents:
diff changeset
  4084
            TInt lId = lCurrentFocusElement->ElemID() ;
hgs
parents:
diff changeset
  4085
hgs
parents:
diff changeset
  4086
            // make sure that this is an animation element.
hgs
parents:
diff changeset
  4087
            if( ((CSvgElementImpl*)lCurrentFocusElement)->IsAnimatedElement() )
hgs
parents:
diff changeset
  4088
                {
hgs
parents:
diff changeset
  4089
                // now we have to start the animations
hgs
parents:
diff changeset
  4090
                // get the current media time for the engine and set
hgs
parents:
diff changeset
  4091
                // the animations to begine at this time only.
hgs
parents:
diff changeset
  4092
                SvgBeginElementAt( (CXmlElementImpl*) lCurrentFocusElement , (TUint32)SvgGetMediaTime(aDocument), aDocument);
hgs
parents:
diff changeset
  4093
hgs
parents:
diff changeset
  4094
                //dont need this anymore because it is done in begin element at now
hgs
parents:
diff changeset
  4095
                //CSvgAnimationBase*  lAnimationBasePtr = (CSvgAnimationBase*)lCurrentFocusElement;
hgs
parents:
diff changeset
  4096
                //lAnimationBasePtr->ReInitializeAnimation();
hgs
parents:
diff changeset
  4097
                }
hgs
parents:
diff changeset
  4098
hgs
parents:
diff changeset
  4099
            }
hgs
parents:
diff changeset
  4100
        }
hgs
parents:
diff changeset
  4101
}
hgs
parents:
diff changeset
  4102
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4103
// EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::SVGElementGetUsedElement(CXmlElementImpl* aElement)
hgs
parents:
diff changeset
  4104
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4105
EXPORT_C CXmlElementImpl* CSvgEngineInterfaceImpl::SVGElementGetUsedElement(CXmlElementImpl* aElement)
hgs
parents:
diff changeset
  4106
{
hgs
parents:
diff changeset
  4107
    // this is for the reason that id's are not cloned.
hgs
parents:
diff changeset
  4108
    // should there be a check for the element type for the parent element.
hgs
parents:
diff changeset
  4109
    if(aElement && aElement->ParentNode())
hgs
parents:
diff changeset
  4110
        {
hgs
parents:
diff changeset
  4111
        if(aElement->OwnerDocument())
hgs
parents:
diff changeset
  4112
            {
hgs
parents:
diff changeset
  4113
            // get the xlink:href of the use element
hgs
parents:
diff changeset
  4114
            TPtrC refElemId =  ( ((CSvgElementImpl*)(aElement->ParentNode()))->Href() );
hgs
parents:
diff changeset
  4115
hgs
parents:
diff changeset
  4116
            return (CXmlElementImpl*)((CSvgDocumentImpl*)(aElement->OwnerDocument()))->GetElementById(refElemId);
hgs
parents:
diff changeset
  4117
            }
hgs
parents:
diff changeset
  4118
        }
hgs
parents:
diff changeset
  4119
    return 0;
hgs
parents:
diff changeset
  4120
hgs
parents:
diff changeset
  4121
}
hgs
parents:
diff changeset
  4122
hgs
parents:
diff changeset
  4123
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4124
// EXPORT_C TBool CSvgEngineInterfaceImpl::IsRemoveable( CSvgElementImpl* hElement )
hgs
parents:
diff changeset
  4125
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4126
EXPORT_C TBool CSvgEngineInterfaceImpl::IsRemoveable( CSvgElementImpl* aElement, TBool aCheckSibling )
hgs
parents:
diff changeset
  4127
{
hgs
parents:
diff changeset
  4128
    if ( !aElement )
hgs
parents:
diff changeset
  4129
        {
hgs
parents:
diff changeset
  4130
        return ETrue;
hgs
parents:
diff changeset
  4131
        }
hgs
parents:
diff changeset
  4132
hgs
parents:
diff changeset
  4133
    if ( aElement->Id() )
hgs
parents:
diff changeset
  4134
        {
hgs
parents:
diff changeset
  4135
        return EFalse;
hgs
parents:
diff changeset
  4136
        }
hgs
parents:
diff changeset
  4137
hgs
parents:
diff changeset
  4138
    CSvgElementImpl* child = (CSvgElementImpl*)aElement->FirstChild();
hgs
parents:
diff changeset
  4139
    if ( !IsRemoveable( child, ETrue ) )
hgs
parents:
diff changeset
  4140
        {
hgs
parents:
diff changeset
  4141
        return EFalse;
hgs
parents:
diff changeset
  4142
        }
hgs
parents:
diff changeset
  4143
hgs
parents:
diff changeset
  4144
    if (aCheckSibling)
hgs
parents:
diff changeset
  4145
    {
hgs
parents:
diff changeset
  4146
    	return IsRemoveable( (CSvgElementImpl*)aElement->NextSibling(), ETrue );
hgs
parents:
diff changeset
  4147
	}
hgs
parents:
diff changeset
  4148
hgs
parents:
diff changeset
  4149
	return ETrue;
hgs
parents:
diff changeset
  4150
}
hgs
parents:
diff changeset
  4151
hgs
parents:
diff changeset
  4152
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4153
// EXPORT_C TBool CSvgEngineInterfaceImpl::IsElementActive( CSvgElementImpl* hElement )
hgs
parents:
diff changeset
  4154
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4155
EXPORT_C TBool CSvgEngineInterfaceImpl::IsElementActive( CSvgElementImpl* hElement )
hgs
parents:
diff changeset
  4156
{
hgs
parents:
diff changeset
  4157
    if (hElement)
hgs
parents:
diff changeset
  4158
    {
hgs
parents:
diff changeset
  4159
        return  (hElement->IsAnimating());
hgs
parents:
diff changeset
  4160
    }
hgs
parents:
diff changeset
  4161
hgs
parents:
diff changeset
  4162
    return EFalse;
hgs
parents:
diff changeset
  4163
}
hgs
parents:
diff changeset
  4164
hgs
parents:
diff changeset
  4165
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4166
// EXPORT_C void CSvgEngineInterfaceImpl::AddToEventReceiverList(CXmlElementImpl* aElement, const TUint8 aEventMask)
hgs
parents:
diff changeset
  4167
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4168
EXPORT_C void CSvgEngineInterfaceImpl::AddToEventReceiverList(CXmlElementImpl* aElement, const TUint8 aEventMask)
hgs
parents:
diff changeset
  4169
{
hgs
parents:
diff changeset
  4170
    TRAPD(error,((CSvgDocumentImpl*)(aElement->OwnerDocument()))->AddToEventReceiverListL((CSvgElementImpl*)aElement, aEventMask));
hgs
parents:
diff changeset
  4171
    if (error != KErrNone)
hgs
parents:
diff changeset
  4172
        {
hgs
parents:
diff changeset
  4173
        #ifdef _DEBUG
hgs
parents:
diff changeset
  4174
        _LIT(KAddToEventReceiverListFailed,
hgs
parents:
diff changeset
  4175
            "CSvgEngineInterfaceImpl::AddToEventReceiverList: AddToEventReceiverList error.");
hgs
parents:
diff changeset
  4176
        RDebug::Print(KAddToEventReceiverListFailed);
hgs
parents:
diff changeset
  4177
        #endif //_DEBUG
hgs
parents:
diff changeset
  4178
        }
hgs
parents:
diff changeset
  4179
}
hgs
parents:
diff changeset
  4180
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4181
// EXPORT_C void CSvgEngineInterfaceImpl::RemoveFromEventReceiverList(CXmlElementImpl* aElement)
hgs
parents:
diff changeset
  4182
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4183
EXPORT_C void CSvgEngineInterfaceImpl::RemoveFromEventReceiverList(CXmlElementImpl* aElement)
hgs
parents:
diff changeset
  4184
{
hgs
parents:
diff changeset
  4185
    if ( aElement )
hgs
parents:
diff changeset
  4186
    {
hgs
parents:
diff changeset
  4187
        ((CSvgDocumentImpl*)(aElement->OwnerDocument()))->RemoveFromEventReceiverList((CSvgElementImpl*)aElement );
hgs
parents:
diff changeset
  4188
    }
hgs
parents:
diff changeset
  4189
}
hgs
parents:
diff changeset
  4190
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4191
// EXPORT_C int CSvgEngineInterfaceImpl::DispatchMouseEventsAt(CSvgDocumentImpl* aDocumentHandle, TInt aX, TInt aY)
hgs
parents:
diff changeset
  4192
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4193
EXPORT_C TInt CSvgEngineInterfaceImpl::DispatchMouseEventsAt(CSvgDocumentImpl* aDocumentHandle, TInt aX, TInt aY, MSvgMouseListener* aListener)
hgs
parents:
diff changeset
  4194
{
hgs
parents:
diff changeset
  4195
    if(aDocumentHandle)
hgs
parents:
diff changeset
  4196
    {
hgs
parents:
diff changeset
  4197
        CSvgEngineImpl *lEngine= aDocumentHandle->Engine();
hgs
parents:
diff changeset
  4198
hgs
parents:
diff changeset
  4199
        TBool fakeEngine  = EFalse;
hgs
parents:
diff changeset
  4200
hgs
parents:
diff changeset
  4201
        if (!lEngine)
hgs
parents:
diff changeset
  4202
        {
hgs
parents:
diff changeset
  4203
        	fakeEngine  = ETrue;
hgs
parents:
diff changeset
  4204
        	//no engine with the document pass in so use a fake one
hgs
parents:
diff changeset
  4205
        	TRAPD(error, lEngine = SvgEngineNewL());
hgs
parents:
diff changeset
  4206
        	if (error != KErrNone)
hgs
parents:
diff changeset
  4207
        	{
hgs
parents:
diff changeset
  4208
        		delete lEngine;
hgs
parents:
diff changeset
  4209
        		return 0;
hgs
parents:
diff changeset
  4210
        	}
hgs
parents:
diff changeset
  4211
hgs
parents:
diff changeset
  4212
        	if ( fakeEngine  && lEngine && aListener )
hgs
parents:
diff changeset
  4213
            {
hgs
parents:
diff changeset
  4214
            	lEngine->AddMouseListener( (MSvgMouseListener*)aListener );
hgs
parents:
diff changeset
  4215
            }
hgs
parents:
diff changeset
  4216
hgs
parents:
diff changeset
  4217
   			aDocumentHandle->SetEngine(lEngine);
hgs
parents:
diff changeset
  4218
   			lEngine->SetDocument(aDocumentHandle);
hgs
parents:
diff changeset
  4219
        }
hgs
parents:
diff changeset
  4220
hgs
parents:
diff changeset
  4221
        TInt topSelectedElement  = 0;
hgs
parents:
diff changeset
  4222
hgs
parents:
diff changeset
  4223
        // Framework generates MouseDown,MouseMove and MouseUp
hgs
parents:
diff changeset
  4224
        // The order needs to be maintained
hgs
parents:
diff changeset
  4225
        topSelectedElement  = MouseDown( aX, aY, (TInt)lEngine);
hgs
parents:
diff changeset
  4226
        MouseMove(aX, aY, (TInt)lEngine);
hgs
parents:
diff changeset
  4227
        MouseUp(aX, aY, (TInt)lEngine);
hgs
parents:
diff changeset
  4228
hgs
parents:
diff changeset
  4229
		//TSize lSize = ContentDimensions( (TInt)lEngine );
hgs
parents:
diff changeset
  4230
hgs
parents:
diff changeset
  4231
		if (fakeEngine )
hgs
parents:
diff changeset
  4232
		{
hgs
parents:
diff changeset
  4233
			DestroyEngine(lEngine);
hgs
parents:
diff changeset
  4234
			aDocumentHandle->SetEngine(NULL) ;
hgs
parents:
diff changeset
  4235
		}
hgs
parents:
diff changeset
  4236
hgs
parents:
diff changeset
  4237
		//this code was to make sure the click was on the screen, but this isn't the right way to do that
hgs
parents:
diff changeset
  4238
		//at all since the screen can be scaled but from negative coordinates...etc.
hgs
parents:
diff changeset
  4239
hgs
parents:
diff changeset
  4240
        //if ( (aX < lSize.iWidth) && (aX > 0 ) && (aY < lSize.iHeight) && (aY > 0))
hgs
parents:
diff changeset
  4241
        //{
hgs
parents:
diff changeset
  4242
             //really should return a handle to the element that was clicked here
hgs
parents:
diff changeset
  4243
             return topSelectedElement ;
hgs
parents:
diff changeset
  4244
        //}
hgs
parents:
diff changeset
  4245
    }
hgs
parents:
diff changeset
  4246
hgs
parents:
diff changeset
  4247
    return 0;
hgs
parents:
diff changeset
  4248
}
hgs
parents:
diff changeset
  4249
hgs
parents:
diff changeset
  4250
//Triggers the Focusin event for the SvgElement passed as a paramenter
hgs
parents:
diff changeset
  4251
EXPORT_C void CSvgEngineInterfaceImpl::DispatchFocusInEvent(CSvgDocumentImpl* aDocumentHandle,CSvgElementImpl *aElement)
hgs
parents:
diff changeset
  4252
{
hgs
parents:
diff changeset
  4253
	 if(aDocumentHandle)
hgs
parents:
diff changeset
  4254
    	 {
hgs
parents:
diff changeset
  4255
       	CSvgEngineImpl *lEngine = aDocumentHandle->Engine();
hgs
parents:
diff changeset
  4256
		TBool fakeEngine  = EFalse;
hgs
parents:
diff changeset
  4257
hgs
parents:
diff changeset
  4258
        	if (!lEngine)
hgs
parents:
diff changeset
  4259
        	{
hgs
parents:
diff changeset
  4260
			lEngine = SvgEngineNewL() ;
hgs
parents:
diff changeset
  4261
		 	fakeEngine = ETrue ;
hgs
parents:
diff changeset
  4262
			//Set Engine for the document
hgs
parents:
diff changeset
  4263
			aDocumentHandle->SetEngine(lEngine );
hgs
parents:
diff changeset
  4264
	  		}
hgs
parents:
diff changeset
  4265
       	//Set document Handle for the engine
hgs
parents:
diff changeset
  4266
       	lEngine->SetDocument(aDocumentHandle);
hgs
parents:
diff changeset
  4267
        //sets the focus as well as the mouse inside the element on which
hgs
parents:
diff changeset
  4268
        //this function is called   	
hgs
parents:
diff changeset
  4269
       	TGfxRectangle2D boundingBox;
hgs
parents:
diff changeset
  4270
       	aElement->GetBBox( boundingBox );
hgs
parents:
diff changeset
  4271
        MouseMove (boundingBox.CenterX() , boundingBox.CenterY());
hgs
parents:
diff changeset
  4272
hgs
parents:
diff changeset
  4273
		if(fakeEngine)
hgs
parents:
diff changeset
  4274
		{
hgs
parents:
diff changeset
  4275
			DestroyEngine(lEngine) ;
hgs
parents:
diff changeset
  4276
			aDocumentHandle->SetEngine(NULL) ;
hgs
parents:
diff changeset
  4277
		}
hgs
parents:
diff changeset
  4278
	}
hgs
parents:
diff changeset
  4279
}
hgs
parents:
diff changeset
  4280
hgs
parents:
diff changeset
  4281
//Triggers the Focusout event for the SvgElement passed as a paramenter
hgs
parents:
diff changeset
  4282
EXPORT_C void CSvgEngineInterfaceImpl::DispatchFocusOutEvent(CSvgDocumentImpl* aDocumentHandle,CSvgElementImpl* /*aElement */)
hgs
parents:
diff changeset
  4283
{
hgs
parents:
diff changeset
  4284
	 if(aDocumentHandle)
hgs
parents:
diff changeset
  4285
    	 {
hgs
parents:
diff changeset
  4286
       	CSvgEngineImpl *lEngine = aDocumentHandle->Engine();
hgs
parents:
diff changeset
  4287
		TBool fakeEngine  = EFalse;
hgs
parents:
diff changeset
  4288
hgs
parents:
diff changeset
  4289
        	if (!lEngine)
hgs
parents:
diff changeset
  4290
        	{
hgs
parents:
diff changeset
  4291
			lEngine = SvgEngineNewL() ;
hgs
parents:
diff changeset
  4292
		 	fakeEngine = ETrue ;
hgs
parents:
diff changeset
  4293
			//Set Engine for the document
hgs
parents:
diff changeset
  4294
			aDocumentHandle->SetEngine(lEngine );
hgs
parents:
diff changeset
  4295
	  		}
hgs
parents:
diff changeset
  4296
       	//Set document Handle for the engine
hgs
parents:
diff changeset
  4297
       	lEngine->SetDocument(aDocumentHandle);
hgs
parents:
diff changeset
  4298
hgs
parents:
diff changeset
  4299
		// Move the mouse outside the screen so that mouse is exitting
hgs
parents:
diff changeset
  4300
		// from all the elements in the DOM tree. 
hgs
parents:
diff changeset
  4301
		// After this, "focus out" internal event is generated by the 
hgs
parents:
diff changeset
  4302
		// element which is in focus. 
hgs
parents:
diff changeset
  4303
		MouseMove( KMINFLOATFIXVALUE, KMINFLOATFIXVALUE );
hgs
parents:
diff changeset
  4304
hgs
parents:
diff changeset
  4305
		if(fakeEngine)
hgs
parents:
diff changeset
  4306
		{
hgs
parents:
diff changeset
  4307
			DestroyEngine(lEngine) ;
hgs
parents:
diff changeset
  4308
			aDocumentHandle->SetEngine(NULL) ;
hgs
parents:
diff changeset
  4309
		}
hgs
parents:
diff changeset
  4310
	}
hgs
parents:
diff changeset
  4311
}
hgs
parents:
diff changeset
  4312
hgs
parents:
diff changeset
  4313
hgs
parents:
diff changeset
  4314
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4315
// EXPORT_C CGfxGeneralPath* CSvgEngineInterfaceImpl::SvgCreatePath()
hgs
parents:
diff changeset
  4316
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4317
EXPORT_C CGfxGeneralPath* CSvgEngineInterfaceImpl::SvgCreatePath()
hgs
parents:
diff changeset
  4318
{
hgs
parents:
diff changeset
  4319
    CGfxGeneralPath* path = NULL;
hgs
parents:
diff changeset
  4320
    TRAPD(error , path = CGfxGeneralPath::NewL());
hgs
parents:
diff changeset
  4321
    if (error != KErrNone)
hgs
parents:
diff changeset
  4322
        {
hgs
parents:
diff changeset
  4323
        #ifdef _DEBUG
hgs
parents:
diff changeset
  4324
        _LIT(KCreateCGfxGeneralPathFailed,
hgs
parents:
diff changeset
  4325
            "CSvgEngineInterfaceImpl::SvgCreatePath: Can't create CGfxGeneralPath.");
hgs
parents:
diff changeset
  4326
        RDebug::Print(KCreateCGfxGeneralPathFailed);
hgs
parents:
diff changeset
  4327
        #endif //_DEBUG
hgs
parents:
diff changeset
  4328
        }
hgs
parents:
diff changeset
  4329
    return path;
hgs
parents:
diff changeset
  4330
}
hgs
parents:
diff changeset
  4331
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4332
// EXPORT_C void CSvgEngineInterfaceImpl::SvgDestroyPath(CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4333
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4334
EXPORT_C void CSvgEngineInterfaceImpl::SvgDestroyPath(CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4335
{
hgs
parents:
diff changeset
  4336
    if (aPathHandle)
hgs
parents:
diff changeset
  4337
    {
hgs
parents:
diff changeset
  4338
        delete aPathHandle;
hgs
parents:
diff changeset
  4339
    }
hgs
parents:
diff changeset
  4340
}
hgs
parents:
diff changeset
  4341
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4342
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetSegmentCount(CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4343
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4344
EXPORT_C TInt CSvgEngineInterfaceImpl::GetSegmentCount(CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4345
{
hgs
parents:
diff changeset
  4346
    if(aPathHandle)
hgs
parents:
diff changeset
  4347
    {
hgs
parents:
diff changeset
  4348
        return (aPathHandle)->GetSegmentCount();
hgs
parents:
diff changeset
  4349
    }
hgs
parents:
diff changeset
  4350
hgs
parents:
diff changeset
  4351
    return 0;
hgs
parents:
diff changeset
  4352
}
hgs
parents:
diff changeset
  4353
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4354
// EXPORT_C TInt CSvgEngineInterfaceImpl::GetSegmentType(CGfxGeneralPath* aPathHandle, TInt aSegmentIndex)
hgs
parents:
diff changeset
  4355
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4356
EXPORT_C TInt CSvgEngineInterfaceImpl::GetSegmentType(CGfxGeneralPath* aPathHandle, TInt aSegmentIndex)
hgs
parents:
diff changeset
  4357
{
hgs
parents:
diff changeset
  4358
    if(aPathHandle)
hgs
parents:
diff changeset
  4359
    {
hgs
parents:
diff changeset
  4360
        return ( aPathHandle)->GetSegmentType(aSegmentIndex);
hgs
parents:
diff changeset
  4361
    }
hgs
parents:
diff changeset
  4362
hgs
parents:
diff changeset
  4363
    return 0; // this should be verified that this is an error code.
hgs
parents:
diff changeset
  4364
}
hgs
parents:
diff changeset
  4365
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4366
// EXPORT_C TReal32 CSvgEngineInterfaceImpl::GetSegmentParameter(CGfxGeneralPath* aPathHandle,TInt aSegmentIndex,TInt aSegmentParameterIndex)
hgs
parents:
diff changeset
  4367
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4368
EXPORT_C TReal32 CSvgEngineInterfaceImpl::GetSegmentParameter(CGfxGeneralPath* aPathHandle,TInt aSegmentIndex,TInt aSegmentParameterIndex) __SOFTFP
hgs
parents:
diff changeset
  4369
{
hgs
parents:
diff changeset
  4370
hgs
parents:
diff changeset
  4371
    if(aPathHandle)
hgs
parents:
diff changeset
  4372
        {
hgs
parents:
diff changeset
  4373
        return (aPathHandle)->GetSegmentParameter( aSegmentIndex,  aSegmentParameterIndex);
hgs
parents:
diff changeset
  4374
        }
hgs
parents:
diff changeset
  4375
    return 0; // this should be treated as error.
hgs
parents:
diff changeset
  4376
}
hgs
parents:
diff changeset
  4377
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4378
// EXPORT_C void CSvgEngineInterfaceImpl::ADDMoveTo(CGfxGeneralPath* aPathHandle, TReal32 aX,TReal32 aY)
hgs
parents:
diff changeset
  4379
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4380
EXPORT_C void CSvgEngineInterfaceImpl::ADDMoveTo(CGfxGeneralPath* aPathHandle, TReal32 aX,TReal32 aY) __SOFTFP
hgs
parents:
diff changeset
  4381
{
hgs
parents:
diff changeset
  4382
     if(aPathHandle)
hgs
parents:
diff changeset
  4383
        {
hgs
parents:
diff changeset
  4384
        TFloatFixPt lX = TFloatFixPt(aX);
hgs
parents:
diff changeset
  4385
        TFloatFixPt lY = TFloatFixPt(aY);
hgs
parents:
diff changeset
  4386
        TRAPD(error ,aPathHandle->MoveToL( lX, lY, ETrue));
hgs
parents:
diff changeset
  4387
        if (error != KErrNone)
hgs
parents:
diff changeset
  4388
            {
hgs
parents:
diff changeset
  4389
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4390
            _LIT(KMoveToFailed,
hgs
parents:
diff changeset
  4391
                "CSvgEngineInterfaceImpl::ADDMoveTo: MoveToL error.");
hgs
parents:
diff changeset
  4392
            RDebug::Print(KMoveToFailed);
hgs
parents:
diff changeset
  4393
            #endif //_DEBUG
hgs
parents:
diff changeset
  4394
            }
hgs
parents:
diff changeset
  4395
        }
hgs
parents:
diff changeset
  4396
}
hgs
parents:
diff changeset
  4397
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4398
// EXPORT_C void CSvgEngineInterfaceImpl::ADDLineTo(CGfxGeneralPath* aPathHandle,TReal32 aX,TReal32 aY)
hgs
parents:
diff changeset
  4399
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4400
EXPORT_C void CSvgEngineInterfaceImpl::ADDLineTo(CGfxGeneralPath* aPathHandle,TReal32 aX,TReal32 aY) __SOFTFP
hgs
parents:
diff changeset
  4401
{
hgs
parents:
diff changeset
  4402
    if(aPathHandle)
hgs
parents:
diff changeset
  4403
        {
hgs
parents:
diff changeset
  4404
        TFloatFixPt lX = TFloatFixPt(aX);
hgs
parents:
diff changeset
  4405
        TFloatFixPt lY = TFloatFixPt(aY);
hgs
parents:
diff changeset
  4406
        TRAPD(error , aPathHandle->LineToL( lX, lY, ETrue));
hgs
parents:
diff changeset
  4407
        if (error != KErrNone)
hgs
parents:
diff changeset
  4408
            {
hgs
parents:
diff changeset
  4409
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4410
            _LIT(KLineToLFailed,
hgs
parents:
diff changeset
  4411
                "CSvgEngineInterfaceImpl::ADDLineTo: LineToL error.");
hgs
parents:
diff changeset
  4412
            RDebug::Print(KLineToLFailed);
hgs
parents:
diff changeset
  4413
            #endif //_DEBUG
hgs
parents:
diff changeset
  4414
            }
hgs
parents:
diff changeset
  4415
        }
hgs
parents:
diff changeset
  4416
}
hgs
parents:
diff changeset
  4417
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4418
// EXPORT_C void CSvgEngineInterfaceImpl::ADDQuadTo(CGfxGeneralPath* aPathHandle,TReal32 aX1,TReal32 aY1,TReal32 aX2,TReal32 aY2)
hgs
parents:
diff changeset
  4419
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4420
EXPORT_C void CSvgEngineInterfaceImpl::ADDQuadTo(CGfxGeneralPath* aPathHandle,TReal32 aX1,TReal32 aY1,TReal32 aX2,TReal32 aY2) __SOFTFP
hgs
parents:
diff changeset
  4421
{
hgs
parents:
diff changeset
  4422
    if(aPathHandle)
hgs
parents:
diff changeset
  4423
        {
hgs
parents:
diff changeset
  4424
hgs
parents:
diff changeset
  4425
        TFloatFixPt lX1 = TFloatFixPt(aX1);
hgs
parents:
diff changeset
  4426
        TFloatFixPt lY1 = TFloatFixPt(aY1);
hgs
parents:
diff changeset
  4427
        TFloatFixPt lX2 = TFloatFixPt(aX2);
hgs
parents:
diff changeset
  4428
        TFloatFixPt lY2 = TFloatFixPt(aY2);
hgs
parents:
diff changeset
  4429
        TRAPD(error ,aPathHandle->QuadToL( lX1, lY1, lX2, lY2, ETrue ));
hgs
parents:
diff changeset
  4430
        if (error != KErrNone)
hgs
parents:
diff changeset
  4431
            {
hgs
parents:
diff changeset
  4432
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4433
            _LIT(KQuadToLLFailed,
hgs
parents:
diff changeset
  4434
                "CSvgEngineInterfaceImpl::ADDQuadTo: QuadToL error.");
hgs
parents:
diff changeset
  4435
            RDebug::Print(KQuadToLLFailed);
hgs
parents:
diff changeset
  4436
            #endif //_DEBUG
hgs
parents:
diff changeset
  4437
            }
hgs
parents:
diff changeset
  4438
        }
hgs
parents:
diff changeset
  4439
}
hgs
parents:
diff changeset
  4440
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4441
// EXPORT_C void CSvgEngineInterfaceImpl::ADDCurveTo(CGfxGeneralPath* aPathHandle,TReal32 aX1,TReal32 aY1,TReal32 aX2,TReal32 aY2, TReal32 aX3, TReal32 aY3)
hgs
parents:
diff changeset
  4442
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4443
EXPORT_C void CSvgEngineInterfaceImpl::ADDCurveTo(CGfxGeneralPath* aPathHandle,TReal32 aX1,TReal32 aY1,TReal32 aX2,TReal32 aY2, TReal32 aX3, TReal32 aY3) __SOFTFP
hgs
parents:
diff changeset
  4444
{
hgs
parents:
diff changeset
  4445
hgs
parents:
diff changeset
  4446
    if(aPathHandle)
hgs
parents:
diff changeset
  4447
        {
hgs
parents:
diff changeset
  4448
hgs
parents:
diff changeset
  4449
        TFloatFixPt lX1 = TFloatFixPt(aX1);
hgs
parents:
diff changeset
  4450
        TFloatFixPt lY1 = TFloatFixPt(aY1);
hgs
parents:
diff changeset
  4451
        TFloatFixPt lX2 = TFloatFixPt(aX2);
hgs
parents:
diff changeset
  4452
        TFloatFixPt lY2 = TFloatFixPt(aY2);
hgs
parents:
diff changeset
  4453
        TFloatFixPt lX3 = TFloatFixPt(aX3);
hgs
parents:
diff changeset
  4454
        TFloatFixPt lY3 = TFloatFixPt(aY3);
hgs
parents:
diff changeset
  4455
hgs
parents:
diff changeset
  4456
        TRAPD(error ,aPathHandle->CubicToL( lX1,
hgs
parents:
diff changeset
  4457
                                         lY1,
hgs
parents:
diff changeset
  4458
                                         lX2,
hgs
parents:
diff changeset
  4459
                                         lY2,
hgs
parents:
diff changeset
  4460
                                         lX3,
hgs
parents:
diff changeset
  4461
                                         lY3,
hgs
parents:
diff changeset
  4462
                                         ETrue ));
hgs
parents:
diff changeset
  4463
        if (error != KErrNone)
hgs
parents:
diff changeset
  4464
            {
hgs
parents:
diff changeset
  4465
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4466
            _LIT(KCubicToLFailed,
hgs
parents:
diff changeset
  4467
                "CSvgEngineInterfaceImpl::ADDCurveTo: CubicToL error.");
hgs
parents:
diff changeset
  4468
            RDebug::Print(KCubicToLFailed);
hgs
parents:
diff changeset
  4469
            #endif //_DEBUG
hgs
parents:
diff changeset
  4470
            }
hgs
parents:
diff changeset
  4471
        }
hgs
parents:
diff changeset
  4472
}
hgs
parents:
diff changeset
  4473
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4474
// EXPORT_C void CSvgEngineInterfaceImpl::ADDCloseTo(CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4475
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4476
EXPORT_C void CSvgEngineInterfaceImpl::ADDCloseTo(CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4477
{
hgs
parents:
diff changeset
  4478
    if(aPathHandle)
hgs
parents:
diff changeset
  4479
        {
hgs
parents:
diff changeset
  4480
        TRAPD(error ,aPathHandle->ClosePathL());
hgs
parents:
diff changeset
  4481
        if (error != KErrNone)
hgs
parents:
diff changeset
  4482
            {
hgs
parents:
diff changeset
  4483
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4484
            _LIT(KClosePathLFailed,
hgs
parents:
diff changeset
  4485
                "CSvgEngineInterfaceImpl::ADDCloseTo: ClosePathL error.");
hgs
parents:
diff changeset
  4486
            RDebug::Print(KClosePathLFailed);
hgs
parents:
diff changeset
  4487
            #endif //_DEBUG
hgs
parents:
diff changeset
  4488
            }
hgs
parents:
diff changeset
  4489
        }
hgs
parents:
diff changeset
  4490
}
hgs
parents:
diff changeset
  4491
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4492
// EXPORT_C CGfxGeneralPath* CSvgEngineInterfaceImpl::GetPathAttribute(CXmlElementImpl* aElementHandle, TInt aAttributeId)
hgs
parents:
diff changeset
  4493
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4494
EXPORT_C CGfxGeneralPath* CSvgEngineInterfaceImpl::GetPathAttribute(CXmlElementImpl* aElementHandle, TInt aAttributeId)
hgs
parents:
diff changeset
  4495
{
hgs
parents:
diff changeset
  4496
    if(aElementHandle)
hgs
parents:
diff changeset
  4497
        {
hgs
parents:
diff changeset
  4498
hgs
parents:
diff changeset
  4499
            CGfxGeneralPath* path =
hgs
parents:
diff changeset
  4500
                ((CSvgElementImpl*)aElementHandle)->GetPathAttribute(aAttributeId);
hgs
parents:
diff changeset
  4501
hgs
parents:
diff changeset
  4502
        if( path )
hgs
parents:
diff changeset
  4503
            {
hgs
parents:
diff changeset
  4504
            CGfxGeneralPath*  lClonePath = NULL;
hgs
parents:
diff changeset
  4505
            TInt error = KErrNone;
hgs
parents:
diff changeset
  4506
            TRAP(error,lClonePath = path->CloneL());
hgs
parents:
diff changeset
  4507
            return lClonePath;
hgs
parents:
diff changeset
  4508
            }
hgs
parents:
diff changeset
  4509
hgs
parents:
diff changeset
  4510
        }
hgs
parents:
diff changeset
  4511
hgs
parents:
diff changeset
  4512
        return NULL;
hgs
parents:
diff changeset
  4513
}
hgs
parents:
diff changeset
  4514
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4515
// EXPORT_C void CSvgEngineInterfaceImpl::SetPathAttribute(CSvgElementImpl* aElementHandle, TInt lSvgAttrId, CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4516
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4517
EXPORT_C void CSvgEngineInterfaceImpl::SetPathAttribute(CSvgElementImpl* aElementHandle, TInt lSvgAttrId, CGfxGeneralPath* aPathHandle)
hgs
parents:
diff changeset
  4518
{
hgs
parents:
diff changeset
  4519
    if(aElementHandle)
hgs
parents:
diff changeset
  4520
        {
hgs
parents:
diff changeset
  4521
        if(aPathHandle)
hgs
parents:
diff changeset
  4522
            {
hgs
parents:
diff changeset
  4523
            CGfxGeneralPath* clone = NULL;
hgs
parents:
diff changeset
  4524
            TInt error = KErrNone;
hgs
parents:
diff changeset
  4525
            TRAP(error,clone = aPathHandle->CloneL());
hgs
parents:
diff changeset
  4526
            aElementHandle->SetPathAttribute(lSvgAttrId, clone);
hgs
parents:
diff changeset
  4527
            }
hgs
parents:
diff changeset
  4528
        }
hgs
parents:
diff changeset
  4529
}
hgs
parents:
diff changeset
  4530
hgs
parents:
diff changeset
  4531
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4532
// EXPORT_C TRect  CSvgEngineInterfaceImpl::GetSvgBoundingBox()
hgs
parents:
diff changeset
  4533
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4534
EXPORT_C TRect  CSvgEngineInterfaceImpl::GetSvgBoundingBox( TInt aEngine )
hgs
parents:
diff changeset
  4535
{
hgs
parents:
diff changeset
  4536
    TRect lBBox(TSize(0,0));
hgs
parents:
diff changeset
  4537
hgs
parents:
diff changeset
  4538
    if( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  4539
        {
hgs
parents:
diff changeset
  4540
        if( iSvgEngine->Document() )
hgs
parents:
diff changeset
  4541
            {
hgs
parents:
diff changeset
  4542
            CSvgSvgElementImpl* lRoot = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
  4543
                                    iSvgEngine->Document()->RootElement();
hgs
parents:
diff changeset
  4544
            if(lRoot)
hgs
parents:
diff changeset
  4545
                {
hgs
parents:
diff changeset
  4546
                TGfxRectangle2D     bbox;
hgs
parents:
diff changeset
  4547
                lRoot->GetBBox(bbox );
hgs
parents:
diff changeset
  4548
hgs
parents:
diff changeset
  4549
                TInt lX = (TInt)bbox.iX;
hgs
parents:
diff changeset
  4550
                TInt lY = (TInt)bbox.iY;
hgs
parents:
diff changeset
  4551
                TInt lWidth = (TInt)bbox.iWidth;
hgs
parents:
diff changeset
  4552
                TInt lHeight = (TInt)bbox.iHeight;
hgs
parents:
diff changeset
  4553
                lBBox.SetRect(TPoint(lX,  lY),TSize(lWidth, lHeight));
hgs
parents:
diff changeset
  4554
                }
hgs
parents:
diff changeset
  4555
hgs
parents:
diff changeset
  4556
           }
hgs
parents:
diff changeset
  4557
hgs
parents:
diff changeset
  4558
    }
hgs
parents:
diff changeset
  4559
    return lBBox;
hgs
parents:
diff changeset
  4560
}
hgs
parents:
diff changeset
  4561
hgs
parents:
diff changeset
  4562
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4563
//Getting BoundingBox of Root Element
hgs
parents:
diff changeset
  4564
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4565
EXPORT_C TSize CSvgEngineInterfaceImpl::GetUnscaledContentSize( TInt aDomHandle )
hgs
parents:
diff changeset
  4566
    {
hgs
parents:
diff changeset
  4567
    TSize size( 0, 0 );
hgs
parents:
diff changeset
  4568
    if ( IsDomCached( aDomHandle ) )
hgs
parents:
diff changeset
  4569
        {
hgs
parents:
diff changeset
  4570
        CSvgDocumentImpl* document = (CSvgDocumentImpl*)aDomHandle;
hgs
parents:
diff changeset
  4571
        CSvgSvgElementImpl* root = (CSvgSvgElementImpl*)document->RootElement();
hgs
parents:
diff changeset
  4572
        if ( root )
hgs
parents:
diff changeset
  4573
            {
hgs
parents:
diff changeset
  4574
            TGfxRectangle2D bbox;
hgs
parents:
diff changeset
  4575
            root->GetUnscaledBBox( bbox );
hgs
parents:
diff changeset
  4576
            size.iWidth = (TInt)bbox.iWidth;
hgs
parents:
diff changeset
  4577
            size.iHeight = (TInt)bbox.iHeight;
hgs
parents:
diff changeset
  4578
            }
hgs
parents:
diff changeset
  4579
        }
hgs
parents:
diff changeset
  4580
    return size;
hgs
parents:
diff changeset
  4581
    }
hgs
parents:
diff changeset
  4582
hgs
parents:
diff changeset
  4583
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4584
// EXPORT_C TBool CSvgEngineInterfaceImpl::IsElementVisible( TInt aElementHandle )
hgs
parents:
diff changeset
  4585
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4586
EXPORT_C TBool CSvgEngineInterfaceImpl::IsElementVisible( TInt aElementHandle, TInt aEngine )
hgs
parents:
diff changeset
  4587
{
hgs
parents:
diff changeset
  4588
	if (ChooseEngine( aEngine ))
hgs
parents:
diff changeset
  4589
	{
hgs
parents:
diff changeset
  4590
		return iSvgEngine->IsElementVisible( aElementHandle );
hgs
parents:
diff changeset
  4591
	}
hgs
parents:
diff changeset
  4592
	else
hgs
parents:
diff changeset
  4593
	{
hgs
parents:
diff changeset
  4594
    	return EFalse;
hgs
parents:
diff changeset
  4595
    }
hgs
parents:
diff changeset
  4596
}
hgs
parents:
diff changeset
  4597
hgs
parents:
diff changeset
  4598
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4599
// EXPORT_C void CSvgEngineInterfaceImpl::SetThumbNailMode( TBool aThumbNailMode )
hgs
parents:
diff changeset
  4600
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4601
EXPORT_C void CSvgEngineInterfaceImpl::SetThumbNailMode( TBool aThumbNailMode, TInt aEngine )
hgs
parents:
diff changeset
  4602
{
hgs
parents:
diff changeset
  4603
    iIsThumbNailMode = aThumbNailMode;
hgs
parents:
diff changeset
  4604
    if ( ChooseEngine(aEngine) && iSvgEngine->Document() )
hgs
parents:
diff changeset
  4605
    {
hgs
parents:
diff changeset
  4606
        iSvgEngine->Document()->SetThumbNailMode( aThumbNailMode );
hgs
parents:
diff changeset
  4607
    }
hgs
parents:
diff changeset
  4608
}
hgs
parents:
diff changeset
  4609
hgs
parents:
diff changeset
  4610
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4611
// EXPORT_C void CSvgEngineInterfaceImpl::CustomOption( TBool aThumbNailMode )
hgs
parents:
diff changeset
  4612
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4613
EXPORT_C void CSvgEngineInterfaceImpl::CustomOption(TBool aCustomOption, TInt aEngine  )
hgs
parents:
diff changeset
  4614
    {
hgs
parents:
diff changeset
  4615
    if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  4616
        {
hgs
parents:
diff changeset
  4617
        iSvgEngine->CustomOption(aCustomOption);
hgs
parents:
diff changeset
  4618
        }
hgs
parents:
diff changeset
  4619
    }
hgs
parents:
diff changeset
  4620
hgs
parents:
diff changeset
  4621
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4622
// EXPORT_C TReal CSvgEngineInterfaceImpl::FramesPerSecond(TBool aShowOn)
hgs
parents:
diff changeset
  4623
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4624
EXPORT_C TReal CSvgEngineInterfaceImpl::FramesPerSecond(TBool aShowOn, TInt aEngine ) __SOFTFP
hgs
parents:
diff changeset
  4625
    {
hgs
parents:
diff changeset
  4626
hgs
parents:
diff changeset
  4627
    //take the width in here..
hgs
parents:
diff changeset
  4628
    CSvgDocumentImpl* doc = SvgDocument();
hgs
parents:
diff changeset
  4629
hgs
parents:
diff changeset
  4630
    if (aShowOn && ChooseEngine(aEngine) && iSvgEngine->Document() )
hgs
parents:
diff changeset
  4631
    	{
hgs
parents:
diff changeset
  4632
        TReal ret = 0.0;
hgs
parents:
diff changeset
  4633
        TRAPD( error, ret = FramesPerSecondL() );
hgs
parents:
diff changeset
  4634
        if ( error != KErrNone )
hgs
parents:
diff changeset
  4635
        	{
hgs
parents:
diff changeset
  4636
            RDebug::Printf("CSvgEngineInterfaceImpl::FramesPerSecond() Error in FramesPerSecondL");
hgs
parents:
diff changeset
  4637
        	}
hgs
parents:
diff changeset
  4638
hgs
parents:
diff changeset
  4639
        return ret;
hgs
parents:
diff changeset
  4640
    	}
hgs
parents:
diff changeset
  4641
    else
hgs
parents:
diff changeset
  4642
    	{
hgs
parents:
diff changeset
  4643
    	_LIT(fps, "fps");
hgs
parents:
diff changeset
  4644
        if (iSvgEngine && iSvgEngine->Document() && iSvgEngine->Document()->iPerfText && GetElementById(doc, fps))
hgs
parents:
diff changeset
  4645
        	{
hgs
parents:
diff changeset
  4646
            RemoveChild( (CXmlElementImpl*)iSvgEngine->Document()->RootElement(), (CXmlElementImpl*) iSvgEngine->Document()->iPerfText);
hgs
parents:
diff changeset
  4647
            delete iSvgEngine->Document()->iPerfText;
hgs
parents:
diff changeset
  4648
            iSvgEngine->Document()->iPerfText = NULL;
hgs
parents:
diff changeset
  4649
        	}
hgs
parents:
diff changeset
  4650
hgs
parents:
diff changeset
  4651
        if ((iSvgEngine) && ( iSvgEngine->iTimer ))
hgs
parents:
diff changeset
  4652
        	{
hgs
parents:
diff changeset
  4653
            return (iSvgEngine->iTimer->Fps() / 10);
hgs
parents:
diff changeset
  4654
        	}
hgs
parents:
diff changeset
  4655
        else
hgs
parents:
diff changeset
  4656
        	{
hgs
parents:
diff changeset
  4657
            return 0;
hgs
parents:
diff changeset
  4658
        	}
hgs
parents:
diff changeset
  4659
    	}
hgs
parents:
diff changeset
  4660
	}
hgs
parents:
diff changeset
  4661
hgs
parents:
diff changeset
  4662
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4663
// TReal CSvgEngineInterfaceImpl::FramesPerSecondL()
hgs
parents:
diff changeset
  4664
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4665
TReal CSvgEngineInterfaceImpl::FramesPerSecondL( TInt aEngine )
hgs
parents:
diff changeset
  4666
    {
hgs
parents:
diff changeset
  4667
hgs
parents:
diff changeset
  4668
    if (!ChooseEngine( aEngine ))
hgs
parents:
diff changeset
  4669
	{
hgs
parents:
diff changeset
  4670
	return 0;
hgs
parents:
diff changeset
  4671
	}
hgs
parents:
diff changeset
  4672
hgs
parents:
diff changeset
  4673
    CSvgDocumentImpl* doc = SvgDocument();
hgs
parents:
diff changeset
  4674
hgs
parents:
diff changeset
  4675
    TSize svgSize = ContentDimensions();
hgs
parents:
diff changeset
  4676
    TBuf<10> fps;
hgs
parents:
diff changeset
  4677
    _LIT(msg, "FPS: ");
hgs
parents:
diff changeset
  4678
    _LIT(FPS, "fps");
hgs
parents:
diff changeset
  4679
    fps.Append(msg);
hgs
parents:
diff changeset
  4680
hgs
parents:
diff changeset
  4681
    fps.AppendNum((iSvgEngine->iTimer->Fps() / 10));
hgs
parents:
diff changeset
  4682
hgs
parents:
diff changeset
  4683
    if (!iSvgEngine->Document()->iPerfText || !(GetElementById(doc, FPS)))
hgs
parents:
diff changeset
  4684
    {
hgs
parents:
diff changeset
  4685
        TRAPD(err, iSvgEngine->Document()->iPerfText = (CSvgElementImpl*)doc->CreateElementL(25));
hgs
parents:
diff changeset
  4686
        if (err)
hgs
parents:
diff changeset
  4687
            {
hgs
parents:
diff changeset
  4688
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4689
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::FramesPerSecond() Error in CreateElementL" );
hgs
parents:
diff changeset
  4690
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4691
            #endif //_DEBUG
hgs
parents:
diff changeset
  4692
            }
hgs
parents:
diff changeset
  4693
        AppendChild((CXmlElementImpl*)doc->RootElement(), (CXmlElementImpl*)iSvgEngine->Document()->iPerfText);
hgs
parents:
diff changeset
  4694
    }
hgs
parents:
diff changeset
  4695
hgs
parents:
diff changeset
  4696
    const TGfxAffineTransform& tmtx  = ((CSvgSvgElementImpl* )iSvgEngine->Document()->RootElement())->GetCTM();
hgs
parents:
diff changeset
  4697
    TGfxPoint2D whPt(svgSize.iWidth,svgSize.iHeight), whDstPt(1,1);
hgs
parents:
diff changeset
  4698
    tmtx.Transform(&whPt,&whDstPt,1);
hgs
parents:
diff changeset
  4699
hgs
parents:
diff changeset
  4700
    //<text x="x" y ="y" font-family="verdana" font-size="6" fill= "grey">Testing 'text' element: </text>
hgs
parents:
diff changeset
  4701
    iSvgEngine->Document()->iPerfText->SetAttributeDesL(KAtrCdata,fps);
hgs
parents:
diff changeset
  4702
    iSvgEngine->Document()->iPerfText->SetAttributeDesL(KAtrId, FPS);
hgs
parents:
diff changeset
  4703
    iSvgEngine->Document()->iPerfText->SetAttributeFloatL(KAtrX, (float)whDstPt.iX * (float).95);
hgs
parents:
diff changeset
  4704
    iSvgEngine->Document()->iPerfText->SetAttributeFloatL(KAtrY, (float)whDstPt.iY * (float).05);
hgs
parents:
diff changeset
  4705
    iSvgEngine->Document()->iPerfText->SetAttributeFloatL(KAtrWidth, ((float).05 * (float)whDstPt.iX));
hgs
parents:
diff changeset
  4706
    iSvgEngine->Document()->iPerfText->SetAttributeFloatL(KAtrHeight,((float).05 * (float)whDstPt.iY));
hgs
parents:
diff changeset
  4707
hgs
parents:
diff changeset
  4708
    _LIT(RED, "red");
hgs
parents:
diff changeset
  4709
    iSvgEngine->Document()->iPerfText->SetPropertyL( KCSS_ATTR_STROKE, RED);
hgs
parents:
diff changeset
  4710
    iSvgEngine->Document()->iPerfText->SetPropertyL( KCSS_ATTR_FILL, RED);
hgs
parents:
diff changeset
  4711
hgs
parents:
diff changeset
  4712
    return (iSvgEngine->iTimer->Fps() / 10);
hgs
parents:
diff changeset
  4713
    }
hgs
parents:
diff changeset
  4714
hgs
parents:
diff changeset
  4715
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4716
////debugging method to draw a rectangle on the screen
hgs
parents:
diff changeset
  4717
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4718
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4719
// EXPORT_C CSvgElementImpl* CSvgEngineInterfaceImpl::DrawBox(TRect aRect)
hgs
parents:
diff changeset
  4720
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4721
EXPORT_C CSvgElementImpl* CSvgEngineInterfaceImpl::DrawBox(TRect aRect, TInt aEngine)
hgs
parents:
diff changeset
  4722
{
hgs
parents:
diff changeset
  4723
	if (!ChooseEngine( aEngine ))
hgs
parents:
diff changeset
  4724
	{
hgs
parents:
diff changeset
  4725
	return NULL;
hgs
parents:
diff changeset
  4726
	}
hgs
parents:
diff changeset
  4727
hgs
parents:
diff changeset
  4728
    CSvgElementImpl* lBox = NULL;
hgs
parents:
diff changeset
  4729
    TRAPD(err, lBox = (CSvgElementImpl*)CreateElementL(SvgDocument(), KSvgRectElement));
hgs
parents:
diff changeset
  4730
    if (err)
hgs
parents:
diff changeset
  4731
        {
hgs
parents:
diff changeset
  4732
        _LIT(msg1, "DrawBox error: ");
hgs
parents:
diff changeset
  4733
        _LIT(msg2, "Can't create element");
hgs
parents:
diff changeset
  4734
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, err, msg1, msg2);
hgs
parents:
diff changeset
  4735
        return lBox;
hgs
parents:
diff changeset
  4736
        }
hgs
parents:
diff changeset
  4737
hgs
parents:
diff changeset
  4738
    AppendChild((CXmlElementImpl*)iSvgEngine->Document()->RootElement(), (CXmlElementImpl*)lBox);
hgs
parents:
diff changeset
  4739
hgs
parents:
diff changeset
  4740
    if (lBox)
hgs
parents:
diff changeset
  4741
    {
hgs
parents:
diff changeset
  4742
        //<rect fill="none" x="lBbox.iX" y="lBbox.iY" width="iBbox.iWidth" height="iBbox.iHeight" stroke="blue"/>
hgs
parents:
diff changeset
  4743
        //fill
hgs
parents:
diff changeset
  4744
        _LIT(NONE, "none");
hgs
parents:
diff changeset
  4745
        TRAPD(err, lBox->SetPropertyL( KCSS_ATTR_FILL, NONE));
hgs
parents:
diff changeset
  4746
        if (err)
hgs
parents:
diff changeset
  4747
            {
hgs
parents:
diff changeset
  4748
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4749
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::DrawBox) Error in SetPropertyL" );
hgs
parents:
diff changeset
  4750
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4751
            #endif //_DEBUG
hgs
parents:
diff changeset
  4752
            }
hgs
parents:
diff changeset
  4753
hgs
parents:
diff changeset
  4754
        //stroke
hgs
parents:
diff changeset
  4755
        _LIT(BLUE, "blue");
hgs
parents:
diff changeset
  4756
        TRAP(err, lBox->SetPropertyL( KCSS_ATTR_STROKE, BLUE));
hgs
parents:
diff changeset
  4757
        if (err)
hgs
parents:
diff changeset
  4758
            {
hgs
parents:
diff changeset
  4759
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4760
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::DrawBox) Error in SetPropertyL" );
hgs
parents:
diff changeset
  4761
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4762
            #endif //_DEBUG
hgs
parents:
diff changeset
  4763
            }
hgs
parents:
diff changeset
  4764
hgs
parents:
diff changeset
  4765
        //x
hgs
parents:
diff changeset
  4766
        TRAP(err, lBox->SetAttributeFloatL( KAtrX, ((TFloatFixPt)(float) aRect.iTl.iX)));
hgs
parents:
diff changeset
  4767
        if (err)
hgs
parents:
diff changeset
  4768
            {
hgs
parents:
diff changeset
  4769
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4770
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::DrawBox) Error in SetPropertyL" );
hgs
parents:
diff changeset
  4771
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4772
            #endif //_DEBUG
hgs
parents:
diff changeset
  4773
            }
hgs
parents:
diff changeset
  4774
hgs
parents:
diff changeset
  4775
        //y
hgs
parents:
diff changeset
  4776
        TRAP(err, lBox->SetAttributeFloatL( KAtrY, ((TFloatFixPt)(float) aRect.iTl.iY)));
hgs
parents:
diff changeset
  4777
        if (err)
hgs
parents:
diff changeset
  4778
            {
hgs
parents:
diff changeset
  4779
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4780
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::DrawBox) Error in SetPropertyL" );
hgs
parents:
diff changeset
  4781
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4782
            #endif //_DEBUG
hgs
parents:
diff changeset
  4783
            }
hgs
parents:
diff changeset
  4784
hgs
parents:
diff changeset
  4785
        //width
hgs
parents:
diff changeset
  4786
        TRAP(err, lBox->SetAttributeFloatL( KAtrWidth, ((TFloatFixPt)(float) aRect.Width())));
hgs
parents:
diff changeset
  4787
        if (err)
hgs
parents:
diff changeset
  4788
            {
hgs
parents:
diff changeset
  4789
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4790
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::DrawBox) Error in SetPropertyL" );
hgs
parents:
diff changeset
  4791
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4792
            #endif //_DEBUG
hgs
parents:
diff changeset
  4793
            }
hgs
parents:
diff changeset
  4794
        //height
hgs
parents:
diff changeset
  4795
        TRAP(err, lBox->SetAttributeFloatL( KAtrHeight, ((TFloatFixPt)(float) aRect.Height())));
hgs
parents:
diff changeset
  4796
        if (err)
hgs
parents:
diff changeset
  4797
            {
hgs
parents:
diff changeset
  4798
            #ifdef _DEBUG
hgs
parents:
diff changeset
  4799
            _LIT( KErrMsg, "CSvgEngineInterfaceImpl::DrawBox) Error in SetPropertyL" );
hgs
parents:
diff changeset
  4800
            RDebug::Print(KErrMsg);
hgs
parents:
diff changeset
  4801
            #endif //_DEBUG
hgs
parents:
diff changeset
  4802
            }
hgs
parents:
diff changeset
  4803
    }
hgs
parents:
diff changeset
  4804
hgs
parents:
diff changeset
  4805
    return lBox;
hgs
parents:
diff changeset
  4806
}
hgs
parents:
diff changeset
  4807
hgs
parents:
diff changeset
  4808
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4809
//Returns array of pointers to all elements of a certain type or all elements if aElementId = -1
hgs
parents:
diff changeset
  4810
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4811
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  4812
// EXPORT_C void CSvgEngineInterfaceImpl::FindAllElements( CSvgElementImpl* aStartElement, TInt aElementId,
hgs
parents:
diff changeset
  4813
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  4814
EXPORT_C void CSvgEngineInterfaceImpl::FindAllElements( CSvgElementImpl* aStartElement, TInt aElementId,
hgs
parents:
diff changeset
  4815
                                      RPointerArray<CSvgElementImpl>& aList, TInt aEngine )
hgs
parents:
diff changeset
  4816
{
hgs
parents:
diff changeset
  4817
    if ( ChooseEngine(aEngine) && iSvgEngine->Document())
hgs
parents:
diff changeset
  4818
    {
hgs
parents:
diff changeset
  4819
        iSvgEngine->Document()->FindAllElements(aStartElement, aElementId, aList);
hgs
parents:
diff changeset
  4820
    }
hgs
parents:
diff changeset
  4821
}
hgs
parents:
diff changeset
  4822
hgs
parents:
diff changeset
  4823
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4824
////DOM Element Traversal
hgs
parents:
diff changeset
  4825
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4826
hgs
parents:
diff changeset
  4827
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4828
//Returns the first child element node of this element. null if this element has no child elements.
hgs
parents:
diff changeset
  4829
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4830
CSvgElementImpl* CSvgEngineInterfaceImpl::FirstElementChild(CSvgElementImpl* aParentElement)
hgs
parents:
diff changeset
  4831
{
hgs
parents:
diff changeset
  4832
    if ( aParentElement )
hgs
parents:
diff changeset
  4833
    {
hgs
parents:
diff changeset
  4834
        return (CSvgElementImpl*)aParentElement->FirstChild();
hgs
parents:
diff changeset
  4835
    }
hgs
parents:
diff changeset
  4836
hgs
parents:
diff changeset
  4837
    return NULL;
hgs
parents:
diff changeset
  4838
}
hgs
parents:
diff changeset
  4839
hgs
parents:
diff changeset
  4840
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4841
//last child element node of this element. null if this element has no child elements.
hgs
parents:
diff changeset
  4842
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4843
CSvgElementImpl* CSvgEngineInterfaceImpl::LastElementChild(CSvgElementImpl* aParentElement)
hgs
parents:
diff changeset
  4844
{
hgs
parents:
diff changeset
  4845
    if ( aParentElement )
hgs
parents:
diff changeset
  4846
    {
hgs
parents:
diff changeset
  4847
        return (CSvgElementImpl*)aParentElement->LastChild();
hgs
parents:
diff changeset
  4848
    }
hgs
parents:
diff changeset
  4849
hgs
parents:
diff changeset
  4850
    return NULL;
hgs
parents:
diff changeset
  4851
hgs
parents:
diff changeset
  4852
}
hgs
parents:
diff changeset
  4853
hgs
parents:
diff changeset
  4854
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4855
//Returns the next sibling element node of this element. null if this element has no element sibling nodes that come after this one in the document tree.
hgs
parents:
diff changeset
  4856
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4857
CSvgElementImpl* CSvgEngineInterfaceImpl::PreviousElementSibling(CSvgElementImpl* aSiblingElement)
hgs
parents:
diff changeset
  4858
{
hgs
parents:
diff changeset
  4859
    if ( aSiblingElement )
hgs
parents:
diff changeset
  4860
    {
hgs
parents:
diff changeset
  4861
        return (CSvgElementImpl*)aSiblingElement->PreviousSibling();
hgs
parents:
diff changeset
  4862
    }
hgs
parents:
diff changeset
  4863
hgs
parents:
diff changeset
  4864
    return NULL;
hgs
parents:
diff changeset
  4865
}
hgs
parents:
diff changeset
  4866
hgs
parents:
diff changeset
  4867
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4868
//previous sibling element node of this element. null if this element has no element sibling nodes that come before this one in the document tree.
hgs
parents:
diff changeset
  4869
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4870
CSvgElementImpl* CSvgEngineInterfaceImpl::NextElementSibling(CSvgElementImpl* aSiblingElement)
hgs
parents:
diff changeset
  4871
{
hgs
parents:
diff changeset
  4872
    if ( aSiblingElement )
hgs
parents:
diff changeset
  4873
    {
hgs
parents:
diff changeset
  4874
        return (CSvgElementImpl*)aSiblingElement->NextSibling();
hgs
parents:
diff changeset
  4875
    }
hgs
parents:
diff changeset
  4876
hgs
parents:
diff changeset
  4877
    return NULL;
hgs
parents:
diff changeset
  4878
}
hgs
parents:
diff changeset
  4879
hgs
parents:
diff changeset
  4880
hgs
parents:
diff changeset
  4881
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4882
// Precondition: bitmap A & B has same dimension and display mode.
hgs
parents:
diff changeset
  4883
// Return ETrue if both bitmaps are the same, bit for bit.
hgs
parents:
diff changeset
  4884
// Used by RenderFrames
hgs
parents:
diff changeset
  4885
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4886
TBool CSvgEngineInterfaceImpl::AreBitmapsTheSame( CFbsBitmap& aBitmapA, CFbsBitmap& aBitmapB )
hgs
parents:
diff changeset
  4887
{
hgs
parents:
diff changeset
  4888
hgs
parents:
diff changeset
  4889
    TInt bitsPerPixel = TDisplayModeUtils::NumDisplayModeBitsPerPixel( aBitmapA.DisplayMode() );
hgs
parents:
diff changeset
  4890
    TSize size = aBitmapA.SizeInPixels();
hgs
parents:
diff changeset
  4891
hgs
parents:
diff changeset
  4892
    // Number of bytes of each scan line
hgs
parents:
diff changeset
  4893
    // This is aligned to a 4 byte(DWORD) boundary for performance reasons.
hgs
parents:
diff changeset
  4894
    TInt scanLineLength = CFbsBitmap::ScanLineLength( size.iWidth, aBitmapA.DisplayMode() );
hgs
parents:
diff changeset
  4895
hgs
parents:
diff changeset
  4896
    aBitmapA.LockHeap();
hgs
parents:
diff changeset
  4897
    aBitmapB.LockHeap();
hgs
parents:
diff changeset
  4898
    TUint32* dataA = aBitmapA.DataAddress();
hgs
parents:
diff changeset
  4899
    TUint32* dataB = aBitmapB.DataAddress();
hgs
parents:
diff changeset
  4900
    aBitmapA.UnlockHeap();
hgs
parents:
diff changeset
  4901
    aBitmapB.UnlockHeap();
hgs
parents:
diff changeset
  4902
    TInt dwords = scanLineLength / 4;
hgs
parents:
diff changeset
  4903
    TInt bytesLeftOver = scanLineLength - ( 4 * dwords );
hgs
parents:
diff changeset
  4904
hgs
parents:
diff changeset
  4905
	TInt sizeHeight = size.iHeight;
hgs
parents:
diff changeset
  4906
	for ( TInt y = 0; y < sizeHeight; y++ )
hgs
parents:
diff changeset
  4907
    {
hgs
parents:
diff changeset
  4908
        // compare 4 bytes are at time
hgs
parents:
diff changeset
  4909
        TInt i = 0;
hgs
parents:
diff changeset
  4910
        for ( ; i < dwords; i++ )
hgs
parents:
diff changeset
  4911
            if ( dataA[i] != dataB[i] )
hgs
parents:
diff changeset
  4912
                return EFalse;
hgs
parents:
diff changeset
  4913
hgs
parents:
diff changeset
  4914
        // compare left over bytes
hgs
parents:
diff changeset
  4915
        if ( bytesLeftOver > 0 )
hgs
parents:
diff changeset
  4916
        {
hgs
parents:
diff changeset
  4917
            TUint8* bytesA = (TUint8*)dataA[i];
hgs
parents:
diff changeset
  4918
            TUint8* bytesB = (TUint8*)dataB[i];
hgs
parents:
diff changeset
  4919
            for ( TInt k = 0; k < bytesLeftOver; k++ )
hgs
parents:
diff changeset
  4920
                if ( bytesA[k] != bytesB[k] )
hgs
parents:
diff changeset
  4921
                    return EFalse;
hgs
parents:
diff changeset
  4922
            // next scanline
hgs
parents:
diff changeset
  4923
            dataA = &dataA[dwords+1];
hgs
parents:
diff changeset
  4924
            dataB = &dataB[dwords+1];
hgs
parents:
diff changeset
  4925
        }
hgs
parents:
diff changeset
  4926
        else
hgs
parents:
diff changeset
  4927
        {
hgs
parents:
diff changeset
  4928
            // next scanline
hgs
parents:
diff changeset
  4929
            dataA = &dataA[dwords];
hgs
parents:
diff changeset
  4930
            dataB = &dataB[dwords];
hgs
parents:
diff changeset
  4931
        }
hgs
parents:
diff changeset
  4932
    }
hgs
parents:
diff changeset
  4933
    return ETrue;
hgs
parents:
diff changeset
  4934
}
hgs
parents:
diff changeset
  4935
hgs
parents:
diff changeset
  4936
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4937
// Create a bitmap with the specified size, colormode.
hgs
parents:
diff changeset
  4938
// Used by RenderFrames
hgs
parents:
diff changeset
  4939
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4940
CFbsBitmap* CSvgEngineInterfaceImpl::CreateBitmapL( TSize aSize, TDisplayMode aColorMode,
hgs
parents:
diff changeset
  4941
                                                   CSvgErrorImpl& aError )
hgs
parents:
diff changeset
  4942
{
hgs
parents:
diff changeset
  4943
    CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
hgs
parents:
diff changeset
  4944
    CleanupStack::PushL(bitmap);
hgs
parents:
diff changeset
  4945
hgs
parents:
diff changeset
  4946
    User::LeaveIfError( bitmap->Create( aSize, aColorMode ));
hgs
parents:
diff changeset
  4947
hgs
parents:
diff changeset
  4948
    CleanupStack::Pop(); // bitmap
hgs
parents:
diff changeset
  4949
hgs
parents:
diff changeset
  4950
    aError.SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  4951
    return bitmap;
hgs
parents:
diff changeset
  4952
}
hgs
parents:
diff changeset
  4953
hgs
parents:
diff changeset
  4954
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4955
// Generate animation frames
hgs
parents:
diff changeset
  4956
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  4957
hgs
parents:
diff changeset
  4958
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::RenderFrames(
hgs
parents:
diff changeset
  4959
                                  TInt aDomHandle,
hgs
parents:
diff changeset
  4960
                                  const TSize& aDimensionOfBitmaps,
hgs
parents:
diff changeset
  4961
                                  TUint aStartTime,
hgs
parents:
diff changeset
  4962
                                  TUint aDuration,
hgs
parents:
diff changeset
  4963
                                  TUint aMillisecondsPerFrame,
hgs
parents:
diff changeset
  4964
                                  TDisplayMode aColorDepth,
hgs
parents:
diff changeset
  4965
                                  TDisplayMode aMaskType,
hgs
parents:
diff changeset
  4966
                                  RPointerArray<CFbsBitmap>& aBitmapFrames,
hgs
parents:
diff changeset
  4967
                                  RPointerArray<CFbsBitmap>& aMaskFrames,
hgs
parents:
diff changeset
  4968
                                  RArray<TUint>& aDelayIntervals,
hgs
parents:
diff changeset
  4969
                                  TBool aRemoveRedundantFrames )
hgs
parents:
diff changeset
  4970
{
hgs
parents:
diff changeset
  4971
    iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  4972
hgs
parents:
diff changeset
  4973
    //-----------------------------------------------------
hgs
parents:
diff changeset
  4974
    // Validate parameters
hgs
parents:
diff changeset
  4975
    //-----------------------------------------------------
hgs
parents:
diff changeset
  4976
    if ( aDimensionOfBitmaps.iWidth < 1 || aDimensionOfBitmaps.iHeight < 1 )
hgs
parents:
diff changeset
  4977
        {
hgs
parents:
diff changeset
  4978
        TBuf<100> buf;
hgs
parents:
diff changeset
  4979
        buf.AppendNum( aDimensionOfBitmaps.iWidth );
hgs
parents:
diff changeset
  4980
        _LIT(X, "x");
hgs
parents:
diff changeset
  4981
        buf.Append( X );
hgs
parents:
diff changeset
  4982
        buf.AppendNum( aDimensionOfBitmaps.iHeight );
hgs
parents:
diff changeset
  4983
        _LIT(msg, "RenderFrames: Invalid bitmap dimensions: ");
hgs
parents:
diff changeset
  4984
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone, msg, buf );
hgs
parents:
diff changeset
  4985
        return iSvgError;
hgs
parents:
diff changeset
  4986
        }
hgs
parents:
diff changeset
  4987
    if ( aMillisecondsPerFrame == 0 )
hgs
parents:
diff changeset
  4988
        {
hgs
parents:
diff changeset
  4989
        _LIT(msg1, "RenderFrames: Invalid delay per frame: 0");
hgs
parents:
diff changeset
  4990
        _LIT(msg2, "");
hgs
parents:
diff changeset
  4991
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone, msg1, msg2);
hgs
parents:
diff changeset
  4992
        return iSvgError;
hgs
parents:
diff changeset
  4993
        }
hgs
parents:
diff changeset
  4994
    if ( !( aMaskType == EGray2 || aMaskType == EGray256 ) )
hgs
parents:
diff changeset
  4995
        {
hgs
parents:
diff changeset
  4996
        _LIT(msg1, "RenderFrames: Unsupported Mask Type.");
hgs
parents:
diff changeset
  4997
        _LIT(msg2, "Must be EGray2 or EGray256");
hgs
parents:
diff changeset
  4998
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone, msg1, msg2);
hgs
parents:
diff changeset
  4999
        return iSvgError;
hgs
parents:
diff changeset
  5000
        }
hgs
parents:
diff changeset
  5001
hgs
parents:
diff changeset
  5002
    if ( !IsDomCached( aDomHandle ) )
hgs
parents:
diff changeset
  5003
        {
hgs
parents:
diff changeset
  5004
        _LIT(msg1, "RenderFrames: Invalid Dom Handle.");
hgs
parents:
diff changeset
  5005
        _LIT(msg2, "");
hgs
parents:
diff changeset
  5006
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone, msg1, msg2);
hgs
parents:
diff changeset
  5007
        return iSvgError;
hgs
parents:
diff changeset
  5008
        }
hgs
parents:
diff changeset
  5009
hgs
parents:
diff changeset
  5010
    // Create separate svg engine for operation, leaving intact
hgs
parents:
diff changeset
  5011
    // default engine.
hgs
parents:
diff changeset
  5012
    CSvgEngineImpl* svgEngine = NULL;
hgs
parents:
diff changeset
  5013
    TRAPD( engineError, svgEngine = CSvgEngineImpl::NewL( iSvgEngine->iFrameBuffer,
hgs
parents:
diff changeset
  5014
                                                          iSvgEngine->iRequestObserver,
hgs
parents:
diff changeset
  5015
                                                          iSvgEngine->iBitmapFontSpec, iSvgBitmapFontProvider ) );
hgs
parents:
diff changeset
  5016
    CleanupStack::PushL(svgEngine);                                                      
hgs
parents:
diff changeset
  5017
    if ( engineError != KErrNone )
hgs
parents:
diff changeset
  5018
        {
hgs
parents:
diff changeset
  5019
        _LIT(msg1, "RenderFrames: Failed to instantiate SvgEngine.");
hgs
parents:
diff changeset
  5020
        _LIT(msg2, "");
hgs
parents:
diff changeset
  5021
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, engineError, msg1, msg2);
hgs
parents:
diff changeset
  5022
        return iSvgError;
hgs
parents:
diff changeset
  5023
        }
hgs
parents:
diff changeset
  5024
	svgEngine->SetBackgroundColor(KBackgroundColor);
hgs
parents:
diff changeset
  5025
    // Initialize engine with document
hgs
parents:
diff changeset
  5026
    CSvgDocumentImpl* document = (CSvgDocumentImpl*)aDomHandle;
hgs
parents:
diff changeset
  5027
    
hgs
parents:
diff changeset
  5028
	if(!document)
hgs
parents:
diff changeset
  5029
	   {
hgs
parents:
diff changeset
  5030
        _LIT(msg1, "RenderFrames: Failed to get document.");
hgs
parents:
diff changeset
  5031
        _LIT(msg2, "");
hgs
parents:
diff changeset
  5032
        CSvgDocumentImpl::PrepareError( *iSvgError, ESvgDocumentNotAvailable, KErrUnknown, msg1, msg2);
hgs
parents:
diff changeset
  5033
        return iSvgError;
hgs
parents:
diff changeset
  5034
        }
hgs
parents:
diff changeset
  5035
		
hgs
parents:
diff changeset
  5036
    // Before changing the engine, if the current engine is valid
hgs
parents:
diff changeset
  5037
    // and it is pointing to this document set the engine's document to NULL
hgs
parents:
diff changeset
  5038
    if (document->Engine() )
hgs
parents:
diff changeset
  5039
        {
hgs
parents:
diff changeset
  5040
        CSvgEngineImpl* lCurEngine = document->Engine();
hgs
parents:
diff changeset
  5041
        lCurEngine->SetDocument( NULL );
hgs
parents:
diff changeset
  5042
        }
hgs
parents:
diff changeset
  5043
	
hgs
parents:
diff changeset
  5044
        
hgs
parents:
diff changeset
  5045
    svgEngine->SetDocument( document );
hgs
parents:
diff changeset
  5046
    document->SetEngine( svgEngine );
hgs
parents:
diff changeset
  5047
hgs
parents:
diff changeset
  5048
    svgEngine->SetIgnoreUpdateScreen( ETrue );
hgs
parents:
diff changeset
  5049
hgs
parents:
diff changeset
  5050
    // Flag to indicate content is an animation
hgs
parents:
diff changeset
  5051
    TBool isAnimationContent = SvgHasAnimation( document );
hgs
parents:
diff changeset
  5052
hgs
parents:
diff changeset
  5053
    CFbsBitmap* bitmap = NULL;
hgs
parents:
diff changeset
  5054
    TBool usePreviousBitmap = EFalse;
hgs
parents:
diff changeset
  5055
    TBool engineInitialized = EFalse;
hgs
parents:
diff changeset
  5056
hgs
parents:
diff changeset
  5057
    for ( TUint time = 0; time <= aDuration; time += aMillisecondsPerFrame )
hgs
parents:
diff changeset
  5058
        {
hgs
parents:
diff changeset
  5059
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5060
        // Create bitmap if needed
hgs
parents:
diff changeset
  5061
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5062
        if ( !usePreviousBitmap )
hgs
parents:
diff changeset
  5063
            {
hgs
parents:
diff changeset
  5064
            TRAPD(err, bitmap = CreateBitmapL( aDimensionOfBitmaps,
hgs
parents:
diff changeset
  5065
                aColorDepth, *iSvgError ));
hgs
parents:
diff changeset
  5066
            if ( err != KErrNone )
hgs
parents:
diff changeset
  5067
                {
hgs
parents:
diff changeset
  5068
                _LIT(msg1, "RenderFrames: Failed to create bitmap.");
hgs
parents:
diff changeset
  5069
                _LIT(msg2, "");
hgs
parents:
diff changeset
  5070
                CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, engineError, msg1, msg2);
hgs
parents:
diff changeset
  5071
                break;
hgs
parents:
diff changeset
  5072
                }
hgs
parents:
diff changeset
  5073
            //-----------------------------------------------------
hgs
parents:
diff changeset
  5074
            // Set the bitmap to render with the dom
hgs
parents:
diff changeset
  5075
            //-----------------------------------------------------
hgs
parents:
diff changeset
  5076
            TRAPD( setGdiError, svgEngine->SetGdiContextL( bitmap ) );
hgs
parents:
diff changeset
  5077
            if ( setGdiError != KErrNone )
hgs
parents:
diff changeset
  5078
               {
hgs
parents:
diff changeset
  5079
               // Delete the bitmap
hgs
parents:
diff changeset
  5080
               delete bitmap;
hgs
parents:
diff changeset
  5081
               bitmap = NULL;
hgs
parents:
diff changeset
  5082
               
hgs
parents:
diff changeset
  5083
               CleanupStack::PopAndDestroy(svgEngine);
hgs
parents:
diff changeset
  5084
                
hgs
parents:
diff changeset
  5085
               if ( setGdiError == KErrNoMemory )
hgs
parents:
diff changeset
  5086
                  {
hgs
parents:
diff changeset
  5087
                  _LIT(msg1, "RenderFrames: Set Bitmap to SVG Engine failed.");
hgs
parents:
diff changeset
  5088
                  _LIT(msg2, "");
hgs
parents:
diff changeset
  5089
                  CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, setGdiError, msg1, msg2);
hgs
parents:
diff changeset
  5090
                  return iSvgError;
hgs
parents:
diff changeset
  5091
                  }
hgs
parents:
diff changeset
  5092
                  
hgs
parents:
diff changeset
  5093
                _LIT(msg1, "RenderFrames: Set Bitmap to SVG Engine failed.");
hgs
parents:
diff changeset
  5094
                _LIT(msg2, "");
hgs
parents:
diff changeset
  5095
                CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, setGdiError, msg1, msg2);
hgs
parents:
diff changeset
  5096
                return iSvgError;
hgs
parents:
diff changeset
  5097
                }
hgs
parents:
diff changeset
  5098
            // Need to initialize after new bitmap is set
hgs
parents:
diff changeset
  5099
            // for engine to set viewbox, etc.
hgs
parents:
diff changeset
  5100
            if ( !engineInitialized )
hgs
parents:
diff changeset
  5101
                {
hgs
parents:
diff changeset
  5102
                TRAPD( initError, svgEngine->InitializeEngineL() );
hgs
parents:
diff changeset
  5103
                if ( initError != KErrNone )
hgs
parents:
diff changeset
  5104
                    {
hgs
parents:
diff changeset
  5105
                    _LIT(msg1, "RenderFrames: Initializing Svg Engine failed.");
hgs
parents:
diff changeset
  5106
                    _LIT(msg2, "");
hgs
parents:
diff changeset
  5107
                    CSvgDocumentImpl::PrepareError(
hgs
parents:
diff changeset
  5108
                        *iSvgError, ESvgUnknown, initError, msg1, msg2);
hgs
parents:
diff changeset
  5109
                    break;
hgs
parents:
diff changeset
  5110
                    }
hgs
parents:
diff changeset
  5111
                engineInitialized = ETrue;
hgs
parents:
diff changeset
  5112
                }
hgs
parents:
diff changeset
  5113
            }
hgs
parents:
diff changeset
  5114
hgs
parents:
diff changeset
  5115
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5116
        // draw to bitmap
hgs
parents:
diff changeset
  5117
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5118
        TSvgTimerEvent timeEvent( aStartTime + time );
hgs
parents:
diff changeset
  5119
        TRAPD( renderError, svgEngine->ProcessEventL( 
hgs
parents:
diff changeset
  5120
            document, &timeEvent ) );
hgs
parents:
diff changeset
  5121
        if ( renderError != KErrNone )
hgs
parents:
diff changeset
  5122
            {
hgs
parents:
diff changeset
  5123
            _LIT(msg1, "RenderFrames: Rendering image failed.");
hgs
parents:
diff changeset
  5124
            _LIT(msg2, "");
hgs
parents:
diff changeset
  5125
            CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, renderError,msg1, msg2);
hgs
parents:
diff changeset
  5126
            break;
hgs
parents:
diff changeset
  5127
            }
hgs
parents:
diff changeset
  5128
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5129
        // compare new bitmap with previous bitmap to combine delay time
hgs
parents:
diff changeset
  5130
        // if images are the same
hgs
parents:
diff changeset
  5131
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5132
        usePreviousBitmap = aRemoveRedundantFrames &&
hgs
parents:
diff changeset
  5133
                            ( aBitmapFrames.Count() > 0 ) &&
hgs
parents:
diff changeset
  5134
                            AreBitmapsTheSame( *bitmap, *aBitmapFrames[aBitmapFrames.Count()-1] );
hgs
parents:
diff changeset
  5135
hgs
parents:
diff changeset
  5136
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5137
        // Use previous bitmap: add delay time
hgs
parents:
diff changeset
  5138
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5139
        if ( usePreviousBitmap )
hgs
parents:
diff changeset
  5140
            {
hgs
parents:
diff changeset
  5141
            TInt index = aDelayIntervals.Count() - 1;
hgs
parents:
diff changeset
  5142
            aDelayIntervals[index] += aMillisecondsPerFrame;
hgs
parents:
diff changeset
  5143
            // In case this is the very last frame and it's the same with previous frame,
hgs
parents:
diff changeset
  5144
            // then destroy it
hgs
parents:
diff changeset
  5145
            if ( time + aMillisecondsPerFrame > aDuration )
hgs
parents:
diff changeset
  5146
                {
hgs
parents:
diff changeset
  5147
                delete bitmap;
hgs
parents:
diff changeset
  5148
                bitmap = NULL;
hgs
parents:
diff changeset
  5149
                }
hgs
parents:
diff changeset
  5150
            continue;
hgs
parents:
diff changeset
  5151
            }
hgs
parents:
diff changeset
  5152
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5153
        // add new bitmap to array: bitmap is different than previous
hgs
parents:
diff changeset
  5154
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5155
        TInt bitmapAppendError = aBitmapFrames.Append( bitmap );
hgs
parents:
diff changeset
  5156
        if ( bitmapAppendError != KErrNone )
hgs
parents:
diff changeset
  5157
            {
hgs
parents:
diff changeset
  5158
            _LIT(msg1, "RenderFrames: Failed to append new bitmap to frames.");
hgs
parents:
diff changeset
  5159
            _LIT(msg2, "");
hgs
parents:
diff changeset
  5160
            CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, bitmapAppendError, msg1, msg2);
hgs
parents:
diff changeset
  5161
            break;
hgs
parents:
diff changeset
  5162
            }
hgs
parents:
diff changeset
  5163
hgs
parents:
diff changeset
  5164
        // Set the bitmap NULL as the ownership is transferred to
hgs
parents:
diff changeset
  5165
        // aBitmapFrames
hgs
parents:
diff changeset
  5166
        bitmap = NULL;
hgs
parents:
diff changeset
  5167
hgs
parents:
diff changeset
  5168
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5169
        // Render mask
hgs
parents:
diff changeset
  5170
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5171
        // Create Mask
hgs
parents:
diff changeset
  5172
        CFbsBitmap* maskBitmap = NULL;
hgs
parents:
diff changeset
  5173
        TRAPD( err, maskBitmap = CreateBitmapL( aDimensionOfBitmaps, aMaskType, *iSvgError ));
hgs
parents:
diff changeset
  5174
        if ( err != KErrNone || maskBitmap == NULL )
hgs
parents:
diff changeset
  5175
            {
hgs
parents:
diff changeset
  5176
            break;
hgs
parents:
diff changeset
  5177
            }
hgs
parents:
diff changeset
  5178
        GenerateMask( maskBitmap );
hgs
parents:
diff changeset
  5179
        TInt appendMaskError = aMaskFrames.Append( maskBitmap );
hgs
parents:
diff changeset
  5180
        if ( appendMaskError != KErrNone )
hgs
parents:
diff changeset
  5181
            {
hgs
parents:
diff changeset
  5182
            _LIT(msg1, "RenderFrames: Failed to append new mask to mask frames.");
hgs
parents:
diff changeset
  5183
            _LIT(msg2, "");
hgs
parents:
diff changeset
  5184
            CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, appendMaskError, msg1, msg2);
hgs
parents:
diff changeset
  5185
            delete maskBitmap;
hgs
parents:
diff changeset
  5186
            break;
hgs
parents:
diff changeset
  5187
            }
hgs
parents:
diff changeset
  5188
hgs
parents:
diff changeset
  5189
        // Set the mask NULL as the ownership is transferred to
hgs
parents:
diff changeset
  5190
        // aMaskFrames
hgs
parents:
diff changeset
  5191
        maskBitmap = NULL;
hgs
parents:
diff changeset
  5192
hgs
parents:
diff changeset
  5193
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5194
        // Append delay interval
hgs
parents:
diff changeset
  5195
        //-----------------------------------------------------
hgs
parents:
diff changeset
  5196
        TUint delay = ( aDuration - time < aMillisecondsPerFrame ) ?
hgs
parents:
diff changeset
  5197
                      aDuration - time : aMillisecondsPerFrame;
hgs
parents:
diff changeset
  5198
        TInt appendIntervalError = aDelayIntervals.Append( delay );
hgs
parents:
diff changeset
  5199
        if ( appendIntervalError != KErrNone )
hgs
parents:
diff changeset
  5200
            {
hgs
parents:
diff changeset
  5201
            _LIT(msg1, "RenderFrames: Failed to append delay interval to list.");
hgs
parents:
diff changeset
  5202
            _LIT(msg2, "");
hgs
parents:
diff changeset
  5203
            CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, appendIntervalError,msg1, msg2);
hgs
parents:
diff changeset
  5204
            break;
hgs
parents:
diff changeset
  5205
            }
hgs
parents:
diff changeset
  5206
hgs
parents:
diff changeset
  5207
        // Only process one frame for non-animation content
hgs
parents:
diff changeset
  5208
        if ( !isAnimationContent )
hgs
parents:
diff changeset
  5209
            {
hgs
parents:
diff changeset
  5210
            // Set the duration for the whole frame for non-animation
hgs
parents:
diff changeset
  5211
            if ( aDelayIntervals.Count() > 0 )
hgs
parents:
diff changeset
  5212
                {
hgs
parents:
diff changeset
  5213
                aDelayIntervals[0] = aDuration;
hgs
parents:
diff changeset
  5214
                }
hgs
parents:
diff changeset
  5215
            break;
hgs
parents:
diff changeset
  5216
            }
hgs
parents:
diff changeset
  5217
        }
hgs
parents:
diff changeset
  5218
    // Cleanup the bitmap
hgs
parents:
diff changeset
  5219
    delete bitmap;
hgs
parents:
diff changeset
  5220
    //remove engine from document it is attached to
hgs
parents:
diff changeset
  5221
    document->SetEngine( NULL );
hgs
parents:
diff changeset
  5222
    // Delete  the engine
hgs
parents:
diff changeset
  5223
    iSvgDocumentPointers.ResetAndDestroy();
hgs
parents:
diff changeset
  5224
    iSvgDocumentPointers.Close();
hgs
parents:
diff changeset
  5225
    CleanupStack::PopAndDestroy(svgEngine);
hgs
parents:
diff changeset
  5226
    return iSvgError;
hgs
parents:
diff changeset
  5227
    }
hgs
parents:
diff changeset
  5228
hgs
parents:
diff changeset
  5229
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5230
// EXPORT_C void CSvgEngineInterfaceImpl::AddListener( 
hgs
parents:
diff changeset
  5231
//  const MSvgListener* aListener, 
hgs
parents:
diff changeset
  5232
//  TSvgListenerType aType )
hgs
parents:
diff changeset
  5233
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5234
EXPORT_C void CSvgEngineInterfaceImpl::AddListener( 
hgs
parents:
diff changeset
  5235
        const MSvgListener* aListener, 
hgs
parents:
diff changeset
  5236
        TSvgListenerType aType, 
hgs
parents:
diff changeset
  5237
        TInt aEngine )
hgs
parents:
diff changeset
  5238
    {
hgs
parents:
diff changeset
  5239
    if ( aListener == NULL )
hgs
parents:
diff changeset
  5240
        {
hgs
parents:
diff changeset
  5241
        return;
hgs
parents:
diff changeset
  5242
        }
hgs
parents:
diff changeset
  5243
hgs
parents:
diff changeset
  5244
	ChooseEngine( aEngine );
hgs
parents:
diff changeset
  5245
    
hgs
parents:
diff changeset
  5246
    TInt index = 0;
hgs
parents:
diff changeset
  5247
    // Loading listeners
hgs
parents:
diff changeset
  5248
    switch( aType )
hgs
parents:
diff changeset
  5249
        {
hgs
parents:
diff changeset
  5250
        case ESvgLoadingListener:
hgs
parents:
diff changeset
  5251
            index = iSvgLoadingListeners.Find( 
hgs
parents:
diff changeset
  5252
                    (MSvgLoadingListener*)aListener );
hgs
parents:
diff changeset
  5253
            if (  index == KErrNotFound )
hgs
parents:
diff changeset
  5254
                {
hgs
parents:
diff changeset
  5255
                iSvgLoadingListeners.Append( (MSvgLoadingListener*)aListener );
hgs
parents:
diff changeset
  5256
                }
hgs
parents:
diff changeset
  5257
                break;
hgs
parents:
diff changeset
  5258
        // Mouse listeners
hgs
parents:
diff changeset
  5259
        case ESvgMouseListener:
hgs
parents:
diff changeset
  5260
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5261
                {
hgs
parents:
diff changeset
  5262
                iSvgEngine->AddMouseListener( (MSvgMouseListener*)aListener );
hgs
parents:
diff changeset
  5263
                }
hgs
parents:
diff changeset
  5264
            break;
hgs
parents:
diff changeset
  5265
        case ESvgTextAreaListener:
hgs
parents:
diff changeset
  5266
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5267
                {
hgs
parents:
diff changeset
  5268
                iSvgEngine->AddTextAreaListener( 
hgs
parents:
diff changeset
  5269
                        (MSvgTextAreaListener*)aListener );
hgs
parents:
diff changeset
  5270
                }
hgs
parents:
diff changeset
  5271
            break;
hgs
parents:
diff changeset
  5272
        case ESvgTextListener:
hgs
parents:
diff changeset
  5273
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5274
                {
hgs
parents:
diff changeset
  5275
                iSvgEngine->AddTextListener( (MSvgTextListener*)aListener );
hgs
parents:
diff changeset
  5276
                }
hgs
parents:
diff changeset
  5277
            break;
hgs
parents:
diff changeset
  5278
        case ESvgViewPortListener:
hgs
parents:
diff changeset
  5279
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5280
                {
hgs
parents:
diff changeset
  5281
                iSvgEngine->AddViewPortListener( 
hgs
parents:
diff changeset
  5282
                        (MSvgViewPortListener*)aListener );
hgs
parents:
diff changeset
  5283
                }
hgs
parents:
diff changeset
  5284
            break;
hgs
parents:
diff changeset
  5285
        case ESvgInteractiveElementListener:
hgs
parents:
diff changeset
  5286
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5287
                {
hgs
parents:
diff changeset
  5288
                iSvgEngine->AddInteractiveElementListener( 
hgs
parents:
diff changeset
  5289
                        (MSvgInteractiveElementListener*)aListener );
hgs
parents:
diff changeset
  5290
                }
hgs
parents:
diff changeset
  5291
            break;
hgs
parents:
diff changeset
  5292
        
hgs
parents:
diff changeset
  5293
        
hgs
parents:
diff changeset
  5294
        default:
hgs
parents:
diff changeset
  5295
            break;
hgs
parents:
diff changeset
  5296
        }
hgs
parents:
diff changeset
  5297
    }
hgs
parents:
diff changeset
  5298
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5299
// EXPORT_C void CSvgEngineInterfaceImpl::RemoveListener( const MSvgListener* aListener, TSvgListenerType aType )
hgs
parents:
diff changeset
  5300
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5301
EXPORT_C void CSvgEngineInterfaceImpl::RemoveListener( const MSvgListener* aListener, TSvgListenerType aType, TInt aEngine )
hgs
parents:
diff changeset
  5302
    {
hgs
parents:
diff changeset
  5303
hgs
parents:
diff changeset
  5304
    ChooseEngine(aEngine);
hgs
parents:
diff changeset
  5305
hgs
parents:
diff changeset
  5306
    // Loading listeners
hgs
parents:
diff changeset
  5307
    if ( aType == ESvgLoadingListener )
hgs
parents:
diff changeset
  5308
        {
hgs
parents:
diff changeset
  5309
        TInt index = iSvgLoadingListeners.Find( (MSvgLoadingListener*)aListener );
hgs
parents:
diff changeset
  5310
        if ( index != KErrNotFound )
hgs
parents:
diff changeset
  5311
            {
hgs
parents:
diff changeset
  5312
            iSvgLoadingListeners.Remove( index );
hgs
parents:
diff changeset
  5313
            }
hgs
parents:
diff changeset
  5314
        }
hgs
parents:
diff changeset
  5315
    // Mouse listeners
hgs
parents:
diff changeset
  5316
    else if ( aType == ESvgMouseListener )
hgs
parents:
diff changeset
  5317
        {
hgs
parents:
diff changeset
  5318
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5319
            {
hgs
parents:
diff changeset
  5320
                iSvgEngine->RemoveMouseListener( (MSvgMouseListener*)aListener );
hgs
parents:
diff changeset
  5321
            }
hgs
parents:
diff changeset
  5322
        }
hgs
parents:
diff changeset
  5323
    // Text area listeners
hgs
parents:
diff changeset
  5324
    else if ( aType == ESvgTextAreaListener )
hgs
parents:
diff changeset
  5325
        {
hgs
parents:
diff changeset
  5326
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5327
            {
hgs
parents:
diff changeset
  5328
                iSvgEngine->RemoveTextAreaListener( (MSvgTextAreaListener*)aListener );
hgs
parents:
diff changeset
  5329
            }
hgs
parents:
diff changeset
  5330
        }
hgs
parents:
diff changeset
  5331
    else if ( aType == ESvgTextListener )
hgs
parents:
diff changeset
  5332
        {
hgs
parents:
diff changeset
  5333
            if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5334
            {
hgs
parents:
diff changeset
  5335
                iSvgEngine->RemoveTextListener( (MSvgTextListener*)aListener );
hgs
parents:
diff changeset
  5336
            }
hgs
parents:
diff changeset
  5337
hgs
parents:
diff changeset
  5338
        }
hgs
parents:
diff changeset
  5339
    else if ( aType == ESvgInteractiveElementListener )
hgs
parents:
diff changeset
  5340
        {
hgs
parents:
diff changeset
  5341
        if ( iSvgEngine != NULL )
hgs
parents:
diff changeset
  5342
            {
hgs
parents:
diff changeset
  5343
            iSvgEngine->RemoveInteractiveElementListener( (MSvgInteractiveElementListener*)aListener );
hgs
parents:
diff changeset
  5344
            }
hgs
parents:
diff changeset
  5345
         }
hgs
parents:
diff changeset
  5346
    }
hgs
parents:
diff changeset
  5347
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5348
// EXPORT_C void CSvgEngineInterfaceImpl::InitSvgStylePropertiesWithNullL( CSvgElementImpl* aElement )
hgs
parents:
diff changeset
  5349
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5350
EXPORT_C void CSvgEngineInterfaceImpl::InitSvgStylePropertiesWithNullL( CSvgElementImpl* aElement )
hgs
parents:
diff changeset
  5351
{
hgs
parents:
diff changeset
  5352
    if ( aElement )
hgs
parents:
diff changeset
  5353
    {
hgs
parents:
diff changeset
  5354
        aElement->InitSvgStylePropertiesWithNullL();
hgs
parents:
diff changeset
  5355
    }
hgs
parents:
diff changeset
  5356
}
hgs
parents:
diff changeset
  5357
hgs
parents:
diff changeset
  5358
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  5359
// Initialize engine with <svg> information in attached document.
hgs
parents:
diff changeset
  5360
//---------------------------------------------------------------------------=
hgs
parents:
diff changeset
  5361
EXPORT_C void CSvgEngineInterfaceImpl::InitializeEngine(
hgs
parents:
diff changeset
  5362
                                       CSvgEngineImpl* aEngine,
hgs
parents:
diff changeset
  5363
                                       TBool /*aIsMainThread*/ )
hgs
parents:
diff changeset
  5364
    {
hgs
parents:
diff changeset
  5365
        if ( ChooseEngine( (TInt)aEngine ) )
hgs
parents:
diff changeset
  5366
        {
hgs
parents:
diff changeset
  5367
hgs
parents:
diff changeset
  5368
        	TRAPD( error, iSvgEngine->InitializeEngineL() );
hgs
parents:
diff changeset
  5369
        	if ( error != KErrNone )
hgs
parents:
diff changeset
  5370
            {
hgs
parents:
diff changeset
  5371
            	return;
hgs
parents:
diff changeset
  5372
            }
hgs
parents:
diff changeset
  5373
hgs
parents:
diff changeset
  5374
        	iSvgEngine->SetMediaTime( 0 );
hgs
parents:
diff changeset
  5375
        	// pause is so progressive parsing doesnt animate
hgs
parents:
diff changeset
  5376
        	// before everything is there. This could be removed to
hgs
parents:
diff changeset
  5377
        	// load and animate on the fly
hgs
parents:
diff changeset
  5378
        	iSvgEngine->SetSVGEngineState( ESVGEnginePaused );
hgs
parents:
diff changeset
  5379
hgs
parents:
diff changeset
  5380
    	}
hgs
parents:
diff changeset
  5381
    }
hgs
parents:
diff changeset
  5382
hgs
parents:
diff changeset
  5383
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5384
// EXPORT_C void CSvgEngineInterfaceImpl::SetDataRetrievalTimeOut( TUint aTimeoutSeconds )
hgs
parents:
diff changeset
  5385
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5386
EXPORT_C void CSvgEngineInterfaceImpl::SetDataRetrievalTimeOut( TUint /*aTimeoutSeconds*/, TInt /*aEngine*/ )
hgs
parents:
diff changeset
  5387
{
hgs
parents:
diff changeset
  5388
// Function is no more required
hgs
parents:
diff changeset
  5389
}
hgs
parents:
diff changeset
  5390
hgs
parents:
diff changeset
  5391
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5392
// EXPORT_C void CSvgEngineInterfaceImpl::CancelLoad()
hgs
parents:
diff changeset
  5393
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5394
EXPORT_C void CSvgEngineInterfaceImpl::CancelLoad( TInt aEngine )
hgs
parents:
diff changeset
  5395
    {
hgs
parents:
diff changeset
  5396
    	if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  5397
    	{
hgs
parents:
diff changeset
  5398
    		if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
  5399
        	{
hgs
parents:
diff changeset
  5400
        	iSvgEngine->Document()->CancelParsing();
hgs
parents:
diff changeset
  5401
       	 	}
hgs
parents:
diff changeset
  5402
    	}
hgs
parents:
diff changeset
  5403
    }
hgs
parents:
diff changeset
  5404
hgs
parents:
diff changeset
  5405
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5406
// EXPORT_C TBool CSvgEngineInterfaceImpl::IsLoading()
hgs
parents:
diff changeset
  5407
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5408
EXPORT_C TBool CSvgEngineInterfaceImpl::IsLoading( TInt aEngine )
hgs
parents:
diff changeset
  5409
    {
hgs
parents:
diff changeset
  5410
    	if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  5411
    	{
hgs
parents:
diff changeset
  5412
    		if ( iSvgEngine->Document() )
hgs
parents:
diff changeset
  5413
        	{
hgs
parents:
diff changeset
  5414
        	return iSvgEngine->Document()->IsParsing();
hgs
parents:
diff changeset
  5415
        	}
hgs
parents:
diff changeset
  5416
    	}
hgs
parents:
diff changeset
  5417
hgs
parents:
diff changeset
  5418
    return EFalse;
hgs
parents:
diff changeset
  5419
	}
hgs
parents:
diff changeset
  5420
hgs
parents:
diff changeset
  5421
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5422
//Print all of the elements in the DOM tree and most of their attributes (only works in _DEBUG mode)
hgs
parents:
diff changeset
  5423
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5424
EXPORT_C void CSvgEngineInterfaceImpl::PrintAllElements( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  5425
{
hgs
parents:
diff changeset
  5426
	if (aDocument)
hgs
parents:
diff changeset
  5427
	{
hgs
parents:
diff changeset
  5428
		aDocument->PrintAllElements((CSvgElementImpl*)aDocument->RootElement());
hgs
parents:
diff changeset
  5429
	}
hgs
parents:
diff changeset
  5430
	else if (iSvgEngine && iSvgEngine->Document())
hgs
parents:
diff changeset
  5431
	{
hgs
parents:
diff changeset
  5432
		iSvgEngine->Document()->PrintAllElements((CSvgElementImpl*)	iSvgEngine->Document()->RootElement());
hgs
parents:
diff changeset
  5433
	}
hgs
parents:
diff changeset
  5434
}
hgs
parents:
diff changeset
  5435
hgs
parents:
diff changeset
  5436
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5437
//Print all of the styles that the element has access to (only works in _DEBUG mode)
hgs
parents:
diff changeset
  5438
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5439
EXPORT_C void CSvgEngineInterfaceImpl::PrintElementsStyles( CSvgElementImpl* aElement )
hgs
parents:
diff changeset
  5440
{
hgs
parents:
diff changeset
  5441
	if (aElement)
hgs
parents:
diff changeset
  5442
	{
hgs
parents:
diff changeset
  5443
		aElement->PrintStyleProperties();
hgs
parents:
diff changeset
  5444
	}
hgs
parents:
diff changeset
  5445
}
hgs
parents:
diff changeset
  5446
hgs
parents:
diff changeset
  5447
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5448
// EXPORT_C void CSvgEngineInterfaceImpl::WaitForImages( TBool aBool )
hgs
parents:
diff changeset
  5449
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5450
EXPORT_C void CSvgEngineInterfaceImpl::WaitForImages( TBool /* aBool */, TInt /* aEngine */ )
hgs
parents:
diff changeset
  5451
    {
hgs
parents:
diff changeset
  5452
    // Method is obsolete: image loading is synchronous now
hgs
parents:
diff changeset
  5453
    }
hgs
parents:
diff changeset
  5454
hgs
parents:
diff changeset
  5455
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5456
// EXPORT_C void CSvgEngineInterfaceImpl::SetClientWindow( RWindow* /*aWindow*/ )
hgs
parents:
diff changeset
  5457
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5458
EXPORT_C void CSvgEngineInterfaceImpl::SetClientWindow( RWindow* /*aWindow*/ )
hgs
parents:
diff changeset
  5459
    {
hgs
parents:
diff changeset
  5460
hgs
parents:
diff changeset
  5461
    }
hgs
parents:
diff changeset
  5462
hgs
parents:
diff changeset
  5463
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5464
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::SaveSvgDom(TInt aHandle, const TDesC& aFileName)
hgs
parents:
diff changeset
  5465
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5466
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::SaveSvgDom(TInt /*aHandle*/, const TDesC& aFileName, TInt aEngine)
hgs
parents:
diff changeset
  5467
    {
hgs
parents:
diff changeset
  5468
hgs
parents:
diff changeset
  5469
    	if (!ChooseEngine(aEngine))
hgs
parents:
diff changeset
  5470
    	{
hgs
parents:
diff changeset
  5471
    		return iSvgError;
hgs
parents:
diff changeset
  5472
    	}
hgs
parents:
diff changeset
  5473
hgs
parents:
diff changeset
  5474
    	//UseDom( aHandle, NULL );
hgs
parents:
diff changeset
  5475
hgs
parents:
diff changeset
  5476
    	TRAPD(error, iSvgEngine->SaveSvgL(aFileName));
hgs
parents:
diff changeset
  5477
hgs
parents:
diff changeset
  5478
    	if (error != KErrNone)
hgs
parents:
diff changeset
  5479
    	{
hgs
parents:
diff changeset
  5480
    		#ifdef _DEBUG
hgs
parents:
diff changeset
  5481
    		RDebug::Printf("CSvgEngineInterfaceImpl: SaveSvgL threw an exception while saving");
hgs
parents:
diff changeset
  5482
    		#endif
hgs
parents:
diff changeset
  5483
    	}
hgs
parents:
diff changeset
  5484
hgs
parents:
diff changeset
  5485
   	return iSvgError;
hgs
parents:
diff changeset
  5486
    }
hgs
parents:
diff changeset
  5487
hgs
parents:
diff changeset
  5488
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5489
// EXPORT_C void CSvgEngineInterfaceImpl::SaveSvg( TBool aIsEncodeOn, const TDesC& aFileName, TInt aEngine )
hgs
parents:
diff changeset
  5490
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5491
EXPORT_C void CSvgEngineInterfaceImpl::SaveSvg( TBool /*aIsEncodeOn*/, const TDesC& /*aFileName*/, TInt aEngine )
hgs
parents:
diff changeset
  5492
    {
hgs
parents:
diff changeset
  5493
hgs
parents:
diff changeset
  5494
    	if (!ChooseEngine(aEngine))
hgs
parents:
diff changeset
  5495
    	{
hgs
parents:
diff changeset
  5496
hgs
parents:
diff changeset
  5497
    	}
hgs
parents:
diff changeset
  5498
hgs
parents:
diff changeset
  5499
    	//UseDom( aHandle, NULL );
hgs
parents:
diff changeset
  5500
hgs
parents:
diff changeset
  5501
    	//TRAPD(error, iSvgEngine->SaveSvgL(aFileName));
hgs
parents:
diff changeset
  5502
    }
hgs
parents:
diff changeset
  5503
hgs
parents:
diff changeset
  5504
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5505
// EXPORT_C void SetAudioVolume( TInt aPercentage , TInt aEngine );
hgs
parents:
diff changeset
  5506
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5507
EXPORT_C void CSvgEngineInterfaceImpl::SetAudioVolume( TInt aPercentage ,
hgs
parents:
diff changeset
  5508
        TInt aEngine )
hgs
parents:
diff changeset
  5509
    {
hgs
parents:
diff changeset
  5510
    if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  5511
        {
hgs
parents:
diff changeset
  5512
       	iSvgEngine->SetAudioVolume( aPercentage );
hgs
parents:
diff changeset
  5513
        }
hgs
parents:
diff changeset
  5514
    }
hgs
parents:
diff changeset
  5515
hgs
parents:
diff changeset
  5516
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5517
// EXPORT_C void MuteAudioVolume();
hgs
parents:
diff changeset
  5518
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5519
EXPORT_C void CSvgEngineInterfaceImpl::MuteAudioVolume( TInt aEngine )
hgs
parents:
diff changeset
  5520
    {
hgs
parents:
diff changeset
  5521
    if ( ChooseEngine(aEngine) )
hgs
parents:
diff changeset
  5522
        {
hgs
parents:
diff changeset
  5523
       	iSvgEngine->SetAudioVolume( 0 );
hgs
parents:
diff changeset
  5524
        }
hgs
parents:
diff changeset
  5525
    }
hgs
parents:
diff changeset
  5526
hgs
parents:
diff changeset
  5527
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5528
// TInt CSvgEngineInterfaceImpl::ChooseEngine( CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
  5529
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5530
CSvgEngineImpl* CSvgEngineInterfaceImpl::ChooseEngine( TInt aEngine )
hgs
parents:
diff changeset
  5531
	{
hgs
parents:
diff changeset
  5532
		if (aEngine)
hgs
parents:
diff changeset
  5533
		{
hgs
parents:
diff changeset
  5534
			iSvgEngine = (CSvgEngineImpl*)aEngine;
hgs
parents:
diff changeset
  5535
			return (CSvgEngineImpl*)aEngine;
hgs
parents:
diff changeset
  5536
		}
hgs
parents:
diff changeset
  5537
		else if (iSvgEngine)
hgs
parents:
diff changeset
  5538
		{
hgs
parents:
diff changeset
  5539
			return iSvgEngine;
hgs
parents:
diff changeset
  5540
		}
hgs
parents:
diff changeset
  5541
		else
hgs
parents:
diff changeset
  5542
		{
hgs
parents:
diff changeset
  5543
			return NULL;
hgs
parents:
diff changeset
  5544
		}
hgs
parents:
diff changeset
  5545
	}
hgs
parents:
diff changeset
  5546
hgs
parents:
diff changeset
  5547
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5548
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::ChooseViewBox(TInt aDomHandle)
hgs
parents:
diff changeset
  5549
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5550
EXPORT_C void CSvgEngineInterfaceImpl::ChooseViewBoxIfNotSet(TInt aDomHandle)
hgs
parents:
diff changeset
  5551
    {
hgs
parents:
diff changeset
  5552
        if ( IsDomCached( aDomHandle ) )
hgs
parents:
diff changeset
  5553
        {
hgs
parents:
diff changeset
  5554
        CSvgDocumentImpl* document = (CSvgDocumentImpl*)aDomHandle;
hgs
parents:
diff changeset
  5555
        CSvgSvgElementImpl* root = (CSvgSvgElementImpl*)document->RootElement();
hgs
parents:
diff changeset
  5556
        if ( root )
hgs
parents:
diff changeset
  5557
            {
hgs
parents:
diff changeset
  5558
            if(!root->ViewBoxDefined())
hgs
parents:
diff changeset
  5559
                {
hgs
parents:
diff changeset
  5560
                 // If viewbox is missing in the content, the content
hgs
parents:
diff changeset
  5561
                 // rendering in the frame buffer is many time as expected
hgs
parents:
diff changeset
  5562
                 // Some part of the content can get clipped, since content
hgs
parents:
diff changeset
  5563
                 // doesn't scale proportionately to the framebuffer.
hgs
parents:
diff changeset
  5564
                 TGfxRectangle2D bbox;
hgs
parents:
diff changeset
  5565
                 root->GetUnscaledBBox( bbox );
hgs
parents:
diff changeset
  5566
                 TFloatFixPt lDefault= TFloatFixPt(0);
hgs
parents:
diff changeset
  5567
                 if(bbox.iWidth > lDefault && bbox.iHeight > lDefault)
hgs
parents:
diff changeset
  5568
                    {
hgs
parents:
diff changeset
  5569
                    TRAP_IGNORE( root->SetViewBoxL( bbox ) );
hgs
parents:
diff changeset
  5570
                    }
hgs
parents:
diff changeset
  5571
                }
hgs
parents:
diff changeset
  5572
            }
hgs
parents:
diff changeset
  5573
        }
hgs
parents:
diff changeset
  5574
    }
hgs
parents:
diff changeset
  5575
hgs
parents:
diff changeset
  5576
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5577
// void CSvgEngineInterfaceImpl::ConvertBitmapToFileL(CFbsBitmap* aBitmap, const TDesC& aText)
hgs
parents:
diff changeset
  5578
//
hgs
parents:
diff changeset
  5579
// Utility function to dump out the svg engine framebuffer
hgs
parents:
diff changeset
  5580
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5581
void CSvgEngineInterfaceImpl::ConvertBitmapToFileL(CFbsBitmap* aBitmap, const TDesC& /*aText*/)
hgs
parents:
diff changeset
  5582
{
hgs
parents:
diff changeset
  5583
	//set size for bitmap
hgs
parents:
diff changeset
  5584
	//if it is new
hgs
parents:
diff changeset
  5585
	/*TInt aWidth = 200, aHeight = 200;
hgs
parents:
diff changeset
  5586
hgs
parents:
diff changeset
  5587
	aBitmap = new(ELeave)CFbsBitmap();
hgs
parents:
diff changeset
  5588
	CleanupStack::PushL(aBitmap);
hgs
parents:
diff changeset
  5589
	User::LeaveIfError(aBitmap->Create(TSize(aWidth, aHeight), EColor64K));
hgs
parents:
diff changeset
  5590
	*/
hgs
parents:
diff changeset
  5591
hgs
parents:
diff changeset
  5592
	//draw text on bitmap here!!
hgs
parents:
diff changeset
  5593
	/*CFbsBitmapDevice* bitDevice = CFbsBitmapDevice::NewL(aBitmap);
hgs
parents:
diff changeset
  5594
	CFbsBitGc* bitGc;
hgs
parents:
diff changeset
  5595
	User::LeaveIfError(bitDevice->CreateContext(bitGc));
hgs
parents:
diff changeset
  5596
hgs
parents:
diff changeset
  5597
	CleanupStack::Pop(aBitmap);
hgs
parents:
diff changeset
  5598
hgs
parents:
diff changeset
  5599
	bitGc->SetPenColor(KRgbBlack);
hgs
parents:
diff changeset
  5600
	bitGc->UseFont( LatinBold19() ); // a font has to be set otherwise it panics!
hgs
parents:
diff changeset
  5601
	bitGc->SetPenStyle(CGraphicsContext::ESolidPen);
hgs
parents:
diff changeset
  5602
	bitGc->DrawText(aText, TPoint(10, 10));
hgs
parents:
diff changeset
  5603
	*/
hgs
parents:
diff changeset
  5604
hgs
parents:
diff changeset
  5605
	RFs fs;
hgs
parents:
diff changeset
  5606
	User::LeaveIfError( fs.Connect() );
hgs
parents:
diff changeset
  5607
hgs
parents:
diff changeset
  5608
	// constructing encoder
hgs
parents:
diff changeset
  5609
	CImageEncoder* imgEncoder = CImageEncoder::FileNewL( fs, _L("svg_engine_bitmap.bmp"), _L8("image/bmp"),
hgs
parents:
diff changeset
  5610
	CImageEncoder::EOptionAlwaysThread );
hgs
parents:
diff changeset
  5611
hgs
parents:
diff changeset
  5612
	// Following settings are for JPG file format
hgs
parents:
diff changeset
  5613
	// TJpegImageData* imageData = new (ELeave) TJpegImageData;
hgs
parents:
diff changeset
  5614
	// Set some format specific data
hgs
parents:
diff changeset
  5615
	// imageData->iSampleScheme = TJpegImageData::EColor444;
hgs
parents:
diff changeset
  5616
	// imageData->iQualityFactor = 95;
hgs
parents:
diff changeset
  5617
hgs
parents:
diff changeset
  5618
	// Following settings are for BMP file format
hgs
parents:
diff changeset
  5619
	TBmpImageData* imgData = new(ELeave) TBmpImageData;
hgs
parents:
diff changeset
  5620
	imgData->iBitsPerPixel = 24;
hgs
parents:
diff changeset
  5621
hgs
parents:
diff changeset
  5622
	CFrameImageData* lFrameImageData = CFrameImageData::NewL();
hgs
parents:
diff changeset
  5623
hgs
parents:
diff changeset
  5624
	// frameData - ownership passed to lFrameImageData after AppendImageData
hgs
parents:
diff changeset
  5625
	User::LeaveIfError(lFrameImageData->AppendImageData(imgData)); // or append imageData for jpg file
hgs
parents:
diff changeset
  5626
hgs
parents:
diff changeset
  5627
	// Do the convert
hgs
parents:
diff changeset
  5628
	TRequestStatus iRequesStatus;
hgs
parents:
diff changeset
  5629
	imgEncoder->Convert( &iRequesStatus, *aBitmap, lFrameImageData);
hgs
parents:
diff changeset
  5630
	User::WaitForRequest( iRequesStatus );
hgs
parents:
diff changeset
  5631
hgs
parents:
diff changeset
  5632
	fs.Close();
hgs
parents:
diff changeset
  5633
	delete lFrameImageData;
hgs
parents:
diff changeset
  5634
	//delete aBitmap;
hgs
parents:
diff changeset
  5635
	delete imgEncoder;
hgs
parents:
diff changeset
  5636
	//delete bitGc;
hgs
parents:
diff changeset
  5637
	//delete bitDevice;
hgs
parents:
diff changeset
  5638
}
hgs
parents:
diff changeset
  5639
hgs
parents:
diff changeset
  5640
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5641
// EXPORT_C void CSvgEngineInterfaceImpl::ResetContext( TInt aEngine )
hgs
parents:
diff changeset
  5642
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5643
EXPORT_C void CSvgEngineInterfaceImpl::ResetContext( TInt aEngine )
hgs
parents:
diff changeset
  5644
{
hgs
parents:
diff changeset
  5645
	if ( ChooseEngine((TInt)aEngine) )
hgs
parents:
diff changeset
  5646
        {
hgs
parents:
diff changeset
  5647
        iSvgEngine->ResetContext();
hgs
parents:
diff changeset
  5648
        }	
hgs
parents:
diff changeset
  5649
}
hgs
parents:
diff changeset
  5650
hgs
parents:
diff changeset
  5651
hgs
parents:
diff changeset
  5652
EXPORT_C void CSvgEngineInterfaceImpl::Start(MSvgError*& aError, const TDesC8* aHeaderData ,
hgs
parents:
diff changeset
  5653
        CSvgEngineImpl* aEngine )
hgs
parents:
diff changeset
  5654
    {
hgs
parents:
diff changeset
  5655
    if (aHeaderData)
hgs
parents:
diff changeset
  5656
            {
hgs
parents:
diff changeset
  5657
            iSvgEngine->SetBitmapHeader((const TDesC16 *)aHeaderData);
hgs
parents:
diff changeset
  5658
            }
hgs
parents:
diff changeset
  5659
    Start(aError, aEngine);
hgs
parents:
diff changeset
  5660
    }
hgs
parents:
diff changeset
  5661
hgs
parents:
diff changeset
  5662
EXPORT_C void CSvgEngineInterfaceImpl::Start( const TDesC8* aHeaderData, CSvgEngineImpl* aEngine,
hgs
parents:
diff changeset
  5663
        TBool aIsMainThread)
hgs
parents:
diff changeset
  5664
    {
hgs
parents:
diff changeset
  5665
hgs
parents:
diff changeset
  5666
    if (aHeaderData)
hgs
parents:
diff changeset
  5667
        {
hgs
parents:
diff changeset
  5668
        iSvgEngine->SetBitmapHeader((const TDesC16 *)aHeaderData);
hgs
parents:
diff changeset
  5669
        }
hgs
parents:
diff changeset
  5670
    Start(aEngine, aIsMainThread);
hgs
parents:
diff changeset
  5671
    }
hgs
parents:
diff changeset
  5672
// Get the NVG-TLV data
hgs
parents:
diff changeset
  5673
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5674
// EXPORT_C TPtr CSvgEngineInterfaceImpl::TLVEncodedData()
hgs
parents:
diff changeset
  5675
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5676
EXPORT_C const TPtrC8 CSvgEngineInterfaceImpl::TLVEncodedData() const
hgs
parents:
diff changeset
  5677
    {
hgs
parents:
diff changeset
  5678
    return (iSvgEngine->TLVEncodedData());
hgs
parents:
diff changeset
  5679
    }
hgs
parents:
diff changeset
  5680
//NGA
hgs
parents:
diff changeset
  5681
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  5682
// EXPORT_C MSvgError* CSvgEngineInterfaceImpl::UseDom(TInt aHandle, TSize aRenderBufferSize,TDisplayMode aRenderDisplayMode,TDisplayMode aMaskDisplayMode,TInt aEngine = NULL)
hgs
parents:
diff changeset
  5683
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  5684
EXPORT_C MSvgError* CSvgEngineInterfaceImpl::UseDom(TInt aHandle,CFbsBitmap* aRenderBuffer, CFbsBitmap* aMaskBuffer,TSize aRenderBufferSize,TDisplayMode aRenderDisplayMode,TDisplayMode aMaskDisplayMode,TInt aEngine)
hgs
parents:
diff changeset
  5685
    {
hgs
parents:
diff changeset
  5686
      // Clear Error
hgs
parents:
diff changeset
  5687
      iSvgError->SetErrorCode( ESvgNoError );
hgs
parents:
diff changeset
  5688
hgs
parents:
diff changeset
  5689
      // Check for engine: Should not occur
hgs
parents:
diff changeset
  5690
      if( !ChooseEngine( aEngine ) )
hgs
parents:
diff changeset
  5691
          {
hgs
parents:
diff changeset
  5692
          _LIT(KEngineFailed, "SvgEngine Internal Failure: SvgEngineImpl not present.");
hgs
parents:
diff changeset
  5693
          CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  5694
                                          KEngineFailed, KNullDesC );
hgs
parents:
diff changeset
  5695
          return iSvgError;
hgs
parents:
diff changeset
  5696
          }
hgs
parents:
diff changeset
  5697
hgs
parents:
diff changeset
  5698
      // Check for valid DOM
hgs
parents:
diff changeset
  5699
      if( !IsDomCached( aHandle ) )
hgs
parents:
diff changeset
  5700
          {
hgs
parents:
diff changeset
  5701
          _LIT(KEngineFailed, "Invalid DOM, Use Prepare() to create DOM");
hgs
parents:
diff changeset
  5702
          CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  5703
                                          KEngineFailed, KNullDesC );
hgs
parents:
diff changeset
  5704
          return iSvgError;
hgs
parents:
diff changeset
  5705
          }
hgs
parents:
diff changeset
  5706
hgs
parents:
diff changeset
  5707
      iTotalRotation = 0;
hgs
parents:
diff changeset
  5708
hgs
parents:
diff changeset
  5709
      iFileIsLoaded = EFalse;
hgs
parents:
diff changeset
  5710
hgs
parents:
diff changeset
  5711
      // Switch GDI context
hgs
parents:
diff changeset
  5712
      TRAPD( gdiError, iSvgEngine->SetGdiContextL( aRenderBuffer, aMaskBuffer,aRenderBufferSize,aRenderDisplayMode,aMaskDisplayMode ) );//Modify this setgdi context
hgs
parents:
diff changeset
  5713
      if ( gdiError != KErrNone )
hgs
parents:
diff changeset
  5714
          {
hgs
parents:
diff changeset
  5715
          if ( gdiError == KErrNoMemory )
hgs
parents:
diff changeset
  5716
              {
hgs
parents:
diff changeset
  5717
              _LIT(KEngineGDIFailed, "SVG Engine Set Gdi Context Failed");
hgs
parents:
diff changeset
  5718
              CSvgDocumentImpl::PrepareError( *iSvgError, ESvgNoMemory, KErrNoMemory,
hgs
parents:
diff changeset
  5719
                                               KEngineGDIFailed, KNullDesC );
hgs
parents:
diff changeset
  5720
              return iSvgError;
hgs
parents:
diff changeset
  5721
              }
hgs
parents:
diff changeset
  5722
          _LIT(KEngineGDIFailed, "SVG Engine Set Gdi Context Failed");
hgs
parents:
diff changeset
  5723
              CSvgDocumentImpl::PrepareError( *iSvgError, ESvgUnknown, KErrNone,
hgs
parents:
diff changeset
  5724
                                               KEngineGDIFailed, KNullDesC );
hgs
parents:
diff changeset
  5725
          return iSvgError;
hgs
parents:
diff changeset
  5726
          }
hgs
parents:
diff changeset
  5727
hgs
parents:
diff changeset
  5728
      CSvgDocumentImpl* document = (CSvgDocumentImpl*)aHandle;
hgs
parents:
diff changeset
  5729
hgs
parents:
diff changeset
  5730
      CSvgDocumentImpl* lExistDoc = iSvgEngine->Document();
hgs
parents:
diff changeset
  5731
hgs
parents:
diff changeset
  5732
      if (lExistDoc != document)
hgs
parents:
diff changeset
  5733
          {
hgs
parents:
diff changeset
  5734
          //this is a new document so swap it out...
hgs
parents:
diff changeset
  5735
          iSvgEngine->SetDocument( document );
hgs
parents:
diff changeset
  5736
          document->SetEngine( iSvgEngine );
hgs
parents:
diff changeset
  5737
          document->ReInitialize();
hgs
parents:
diff changeset
  5738
          }
hgs
parents:
diff changeset
  5739
hgs
parents:
diff changeset
  5740
      if (lExistDoc == iSvgLoadedDocument)
hgs
parents:
diff changeset
  5741
      {
hgs
parents:
diff changeset
  5742
          DestroyDocument(iSvgLoadedDocument);
hgs
parents:
diff changeset
  5743
          iSvgLoadedDocument = NULL;
hgs
parents:
diff changeset
  5744
      }
hgs
parents:
diff changeset
  5745
hgs
parents:
diff changeset
  5746
      // Check for thumbnail restrictions
hgs
parents:
diff changeset
  5747
      if ( !iSvgEngine->PassesThumbNailRestriction() )
hgs
parents:
diff changeset
  5748
          {
hgs
parents:
diff changeset
  5749
          _LIT( KThumbNailRestriction, "Frame buffer is larger than allowable size for thumbnail mode." );
hgs
parents:
diff changeset
  5750
          CSvgDocumentImpl::PrepareError( *iSvgError, ESvgThumbNailRestriction, KErrNone,
hgs
parents:
diff changeset
  5751
                                           KThumbNailRestriction, KNullDesC );
hgs
parents:
diff changeset
  5752
          return iSvgError;
hgs
parents:
diff changeset
  5753
          }
hgs
parents:
diff changeset
  5754
hgs
parents:
diff changeset
  5755
      iFileIsLoaded = ETrue;
hgs
parents:
diff changeset
  5756
hgs
parents:
diff changeset
  5757
      return iSvgError;
hgs
parents:
diff changeset
  5758
      }