svgtopt/gfx2d/src/GfxGeom/GfxGeneralPath.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002 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:  Graphics Extension Library 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 "GfxGeneralPath.h"
hgs
parents:
diff changeset
    20
#include "GfxGeneralPathIteratorP.h"
hgs
parents:
diff changeset
    21
#include "GfxFlatteningPathIterator.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    26
// Constructors
hgs
parents:
diff changeset
    27
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    28
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    29
//  CGfxGeneralPath* CGfxGeneralPath::NewL()
hgs
parents:
diff changeset
    30
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    31
 CGfxGeneralPath* CGfxGeneralPath::NewL()
hgs
parents:
diff changeset
    32
    {
hgs
parents:
diff changeset
    33
    CGfxGeneralPath* self = NewLC();
hgs
parents:
diff changeset
    34
    CleanupStack::Pop();
hgs
parents:
diff changeset
    35
    return self;
hgs
parents:
diff changeset
    36
    }
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    39
//  CGfxGeneralPath* CGfxGeneralPath::NewLC()
hgs
parents:
diff changeset
    40
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    41
 CGfxGeneralPath* CGfxGeneralPath::NewLC()
hgs
parents:
diff changeset
    42
    {
hgs
parents:
diff changeset
    43
    CGfxGeneralPath* self = new ( ELeave ) CGfxGeneralPath;
hgs
parents:
diff changeset
    44
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    45
    self->ConstructL();
hgs
parents:
diff changeset
    46
    return self;
hgs
parents:
diff changeset
    47
    }
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
// CGfxGeneralPath::CGfxGeneralPath()
hgs
parents:
diff changeset
    51
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    52
CGfxGeneralPath::CGfxGeneralPath()
hgs
parents:
diff changeset
    53
{
hgs
parents:
diff changeset
    54
}
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
// void CGfxGeneralPath::ConstructL()
hgs
parents:
diff changeset
    58
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
void CGfxGeneralPath::ConstructL()
hgs
parents:
diff changeset
    60
    {
hgs
parents:
diff changeset
    61
    iPointTypes = new ( ELeave ) RArray<TUint32>( 4 );
hgs
parents:
diff changeset
    62
    iPointTypes->AppendL(NULL);
hgs
parents:
diff changeset
    63
    iPointTypes->Remove(0);
hgs
parents:
diff changeset
    64
    iPointCoords = new ( ELeave ) RArray<TFloatFixPt>( 8 );
hgs
parents:
diff changeset
    65
    iPointCoords->AppendL(NULL);
hgs
parents:
diff changeset
    66
    iPointCoords->Remove(0);
hgs
parents:
diff changeset
    67
    iPathSegmentTypeArray = NULL;
hgs
parents:
diff changeset
    68
    iCount = 0;
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
//  CGfxGeneralPath::~CGfxGeneralPath()
hgs
parents:
diff changeset
    73
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
 CGfxGeneralPath::~CGfxGeneralPath()
hgs
parents:
diff changeset
    75
    {
hgs
parents:
diff changeset
    76
	if ( iPointTypes )
hgs
parents:
diff changeset
    77
		{
hgs
parents:
diff changeset
    78
		iPointTypes->Close();
hgs
parents:
diff changeset
    79
		delete iPointTypes;
hgs
parents:
diff changeset
    80
		iPointTypes = NULL;
hgs
parents:
diff changeset
    81
		}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
	if ( iPointCoords )
hgs
parents:
diff changeset
    84
		{
hgs
parents:
diff changeset
    85
	    iPointCoords->Close();
hgs
parents:
diff changeset
    86
		delete iPointCoords;
hgs
parents:
diff changeset
    87
		iPointCoords = NULL;
hgs
parents:
diff changeset
    88
		}
hgs
parents:
diff changeset
    89
    if (iPathSegmentTypeArray)
hgs
parents:
diff changeset
    90
       {
hgs
parents:
diff changeset
    91
    	delete [] iPathSegmentTypeArray;
hgs
parents:
diff changeset
    92
    	iPathSegmentTypeArray = NULL;
hgs
parents:
diff changeset
    93
       }
hgs
parents:
diff changeset
    94
    }
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
const TUint32 KSegClose = ( TUint32 ) EGfxSegClose;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    99
// TFloatFixPt CGfxGeneralPath::AreaSize()
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   101
TFloatFixPt CGfxGeneralPath::AreaSize()
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
    return TFloatFixPt(0);
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
//  void CGfxGeneralPath::ClosePathL()
hgs
parents:
diff changeset
   108
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
 void CGfxGeneralPath::ClosePathL()
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
    TInt count = iPointTypes->Count();
hgs
parents:
diff changeset
   112
    if ( count > 0 && (*iPointTypes)[count - 1] != KSegClose )
hgs
parents:
diff changeset
   113
        {
hgs
parents:
diff changeset
   114
        iPointTypes->AppendL( KSegClose );
hgs
parents:
diff changeset
   115
            }
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   119
//  void CGfxGeneralPath::HorizonToL( TFloatFixPt& aX, TBool aAbsolute )
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
 void CGfxGeneralPath::HorizonToL( TFloatFixPt& aX, TBool aAbsolute )
hgs
parents:
diff changeset
   122
    {
hgs
parents:
diff changeset
   123
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   124
        {
hgs
parents:
diff changeset
   125
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   126
        // the current point is the initial point
hgs
parents:
diff changeset
   127
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   128
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   129
            {
hgs
parents:
diff changeset
   130
            aX += iLastX;
hgs
parents:
diff changeset
   131
            }
hgs
parents:
diff changeset
   132
        else
hgs
parents:
diff changeset
   133
            {
hgs
parents:
diff changeset
   134
            aX += iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   135
            }
hgs
parents:
diff changeset
   136
        }
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
    TUint32 KSegLineto = ( TUint32 ) EGfxSegLineTo;  // const
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    iPointTypes->AppendL( KSegLineto );
hgs
parents:
diff changeset
   141
    iPointCoords->AppendL( aX );
hgs
parents:
diff changeset
   142
    TFloatFixPt tmpY = ( iPointCoords->Count() < 2 ) ? TFloatFixPt( 0 ) : iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   143
    iPointCoords->AppendL( tmpY );
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   147
//  void CGfxGeneralPath::VertToL( TFloatFixPt& aY, TBool aAbsolute )
hgs
parents:
diff changeset
   148
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   149
 void CGfxGeneralPath::VertToL( TFloatFixPt& aY, TBool aAbsolute )
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   152
        {
hgs
parents:
diff changeset
   153
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   154
        // the current point is the initial point
hgs
parents:
diff changeset
   155
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   156
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   157
            {
hgs
parents:
diff changeset
   158
            aY += iLastY;
hgs
parents:
diff changeset
   159
            }
hgs
parents:
diff changeset
   160
        else
hgs
parents:
diff changeset
   161
            {
hgs
parents:
diff changeset
   162
            aY += iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   163
            }
hgs
parents:
diff changeset
   164
        }
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    TUint32 KSegLineto = ( TUint32 ) EGfxSegLineTo;  // const
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
    iPointTypes->AppendL( KSegLineto );
hgs
parents:
diff changeset
   169
    TFloatFixPt tmpX = ( iPointCoords->Count() < 2 ) ? TFloatFixPt( 0 ) : iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   170
    iPointCoords->AppendL( tmpX );
hgs
parents:
diff changeset
   171
    iPointCoords->AppendL( aY );
hgs
parents:
diff changeset
   172
    }
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   175
//  void CGfxGeneralPath::LineToL( TFloatFixPt& aX,
hgs
parents:
diff changeset
   176
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   177
 void CGfxGeneralPath::LineToL( TFloatFixPt& aX,
hgs
parents:
diff changeset
   178
                                        TFloatFixPt& aY,
hgs
parents:
diff changeset
   179
                                        TBool aAbsolute )
hgs
parents:
diff changeset
   180
    {
hgs
parents:
diff changeset
   181
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   182
        {
hgs
parents:
diff changeset
   183
        TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   184
        TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   185
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   186
        // the current point is the initial point
hgs
parents:
diff changeset
   187
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   188
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   189
            {
hgs
parents:
diff changeset
   190
            lastX = iLastX;
hgs
parents:
diff changeset
   191
            lastY = iLastY;
hgs
parents:
diff changeset
   192
            }
hgs
parents:
diff changeset
   193
        aX += lastX;
hgs
parents:
diff changeset
   194
        aY += lastY;
hgs
parents:
diff changeset
   195
        }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
    TUint32 KSegLineto = ( TUint32 ) EGfxSegLineTo;  // const
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    iPointTypes->AppendL( KSegLineto );
hgs
parents:
diff changeset
   200
    iPointCoords->AppendL( aX );
hgs
parents:
diff changeset
   201
    iPointCoords->AppendL( aY );
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   205
//  void CGfxGeneralPath::RemoveLastPathCommand()
hgs
parents:
diff changeset
   206
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   207
 void CGfxGeneralPath::RemoveLastPathCommand()
hgs
parents:
diff changeset
   208
	{
hgs
parents:
diff changeset
   209
	TInt aTypeCount = iPointTypes->Count();
hgs
parents:
diff changeset
   210
	TInt aPointCount = iPointCoords->Count();
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
	if ( aPointCount >= 2 )
hgs
parents:
diff changeset
   213
    	{
hgs
parents:
diff changeset
   214
        //we need to remove the last amount from iLastX
hgs
parents:
diff changeset
   215
        iLastX -= (*iPointCoords)[aPointCount - 2];
hgs
parents:
diff changeset
   216
        iLastY -= (*iPointCoords)[aPointCount - 1];
hgs
parents:
diff changeset
   217
	    }
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
	if ( aTypeCount > 0 )
hgs
parents:
diff changeset
   220
		{
hgs
parents:
diff changeset
   221
		iPointTypes->Remove( aTypeCount - 1 );
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
		if ( aPointCount >= 2 )
hgs
parents:
diff changeset
   224
			{
hgs
parents:
diff changeset
   225
            iPointCoords->Remove( aPointCount - 1 );
hgs
parents:
diff changeset
   226
            iPointCoords->Remove( aPointCount - 2 );
hgs
parents:
diff changeset
   227
			}
hgs
parents:
diff changeset
   228
		}
hgs
parents:
diff changeset
   229
	}
hgs
parents:
diff changeset
   230
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   231
//  void CGfxGeneralPath::MoveToL( TFloatFixPt& aX,
hgs
parents:
diff changeset
   232
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   233
 void CGfxGeneralPath::MoveToL( TFloatFixPt& aX,
hgs
parents:
diff changeset
   234
                                        TFloatFixPt& aY,
hgs
parents:
diff changeset
   235
                                        TBool aAbsolute )
hgs
parents:
diff changeset
   236
    {
hgs
parents:
diff changeset
   237
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   238
        {
hgs
parents:
diff changeset
   239
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   240
        // the current point is the initial point
hgs
parents:
diff changeset
   241
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   242
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   243
            {
hgs
parents:
diff changeset
   244
            aX += iLastX;
hgs
parents:
diff changeset
   245
            aY += iLastY;
hgs
parents:
diff changeset
   246
            }
hgs
parents:
diff changeset
   247
        else
hgs
parents:
diff changeset
   248
            {
hgs
parents:
diff changeset
   249
            TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() -
hgs
parents:
diff changeset
   250
                                                     2 );
hgs
parents:
diff changeset
   251
            TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() -
hgs
parents:
diff changeset
   252
                                                     1 );
hgs
parents:
diff changeset
   253
            aX += lastX;
hgs
parents:
diff changeset
   254
            aY += lastY;
hgs
parents:
diff changeset
   255
            }
hgs
parents:
diff changeset
   256
        }
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
    TUint32 KSegMoveto = ( TUint32 ) EGfxSegMoveTo;  // const
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
    iPointTypes->AppendL( KSegMoveto );
hgs
parents:
diff changeset
   261
    iPointCoords->AppendL( aX );
hgs
parents:
diff changeset
   262
    iPointCoords->AppendL( aY );
hgs
parents:
diff changeset
   263
    // Save initial point of a new segment
hgs
parents:
diff changeset
   264
    // Could be the next initial point
hgs
parents:
diff changeset
   265
    iLastX = aX;
hgs
parents:
diff changeset
   266
    iLastY = aY;
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   270
//  void CGfxGeneralPath::QuadToL( TFloatFixPt& aX1,
hgs
parents:
diff changeset
   271
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   272
 void CGfxGeneralPath::QuadToL( TFloatFixPt& aX1,
hgs
parents:
diff changeset
   273
                                        TFloatFixPt& aY1,
hgs
parents:
diff changeset
   274
                                        TFloatFixPt& aX2,
hgs
parents:
diff changeset
   275
                                        TFloatFixPt& aY2,
hgs
parents:
diff changeset
   276
                                        TBool aAbsolute )
hgs
parents:
diff changeset
   277
    {
hgs
parents:
diff changeset
   278
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   279
        {
hgs
parents:
diff changeset
   280
        TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   281
        TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   284
        // the current point is the initial point
hgs
parents:
diff changeset
   285
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   286
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   287
            {
hgs
parents:
diff changeset
   288
            lastX = iLastX;
hgs
parents:
diff changeset
   289
            lastY = iLastY;
hgs
parents:
diff changeset
   290
            }
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
        aX1 += lastX;
hgs
parents:
diff changeset
   293
        aY1 += lastY;
hgs
parents:
diff changeset
   294
        aX2 += lastX;
hgs
parents:
diff changeset
   295
        aY2 += lastY;
hgs
parents:
diff changeset
   296
        }
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
       TUint32 KSegQuadto = ( TUint32 ) EGfxSegQuadTo;
hgs
parents:
diff changeset
   299
       iPointTypes->AppendL( KSegQuadto );
hgs
parents:
diff changeset
   300
       iPointCoords->AppendL( aX1 );
hgs
parents:
diff changeset
   301
       iPointCoords->AppendL( aY1 );  
hgs
parents:
diff changeset
   302
       iPointCoords->AppendL( aX2 );
hgs
parents:
diff changeset
   303
       iPointCoords->AppendL( aY2 );	
hgs
parents:
diff changeset
   304
       
hgs
parents:
diff changeset
   305
    }
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   308
//  void CGfxGeneralPath::CubicToL( TFloatFixPt& aX1,
hgs
parents:
diff changeset
   309
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   310
 void CGfxGeneralPath::CubicToL( TFloatFixPt& aX1,
hgs
parents:
diff changeset
   311
                                         TFloatFixPt& aY1,
hgs
parents:
diff changeset
   312
                                         TFloatFixPt& aX2,
hgs
parents:
diff changeset
   313
                                         TFloatFixPt& aY2,
hgs
parents:
diff changeset
   314
                                         TFloatFixPt& aX3,
hgs
parents:
diff changeset
   315
                                         TFloatFixPt& aY3,
hgs
parents:
diff changeset
   316
                                         TBool aAbsolute )
hgs
parents:
diff changeset
   317
    {
hgs
parents:
diff changeset
   318
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   319
        {
hgs
parents:
diff changeset
   320
        TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   321
        TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   322
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   323
        // the current point is the initial point
hgs
parents:
diff changeset
   324
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   325
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   326
            {
hgs
parents:
diff changeset
   327
            lastX = iLastX;
hgs
parents:
diff changeset
   328
            lastY = iLastY;
hgs
parents:
diff changeset
   329
            }
hgs
parents:
diff changeset
   330
        aX1 += lastX;
hgs
parents:
diff changeset
   331
        aY1 += lastY;
hgs
parents:
diff changeset
   332
        aX2 += lastX;
hgs
parents:
diff changeset
   333
        aY2 += lastY;
hgs
parents:
diff changeset
   334
        aX3 += lastX;
hgs
parents:
diff changeset
   335
        aY3 += lastY;
hgs
parents:
diff changeset
   336
        }
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
    TUint32 KSegCubicto = ( TUint32 ) EGfxSegCubicTo;  // const
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
    iPointTypes->AppendL( KSegCubicto );
hgs
parents:
diff changeset
   341
    iPointCoords->AppendL( aX1 );
hgs
parents:
diff changeset
   342
    iPointCoords->AppendL( aY1 );
hgs
parents:
diff changeset
   343
    iPointCoords->AppendL( aX2 );
hgs
parents:
diff changeset
   344
    iPointCoords->AppendL( aY2 );
hgs
parents:
diff changeset
   345
    iPointCoords->AppendL( aX3 );
hgs
parents:
diff changeset
   346
    iPointCoords->AppendL( aY3 );
hgs
parents:
diff changeset
   347
    }
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   350
//  void CGfxGeneralPath::ShortQuadToL( TFloatFixPt& aX2,
hgs
parents:
diff changeset
   351
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   352
 void CGfxGeneralPath::ShortQuadToL( TFloatFixPt& aX2,
hgs
parents:
diff changeset
   353
                                             TFloatFixPt& aY2,
hgs
parents:
diff changeset
   354
                                             TBool aAbsolute )
hgs
parents:
diff changeset
   355
    {
hgs
parents:
diff changeset
   356
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   357
        {
hgs
parents:
diff changeset
   358
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   359
        // the current point is the initial point
hgs
parents:
diff changeset
   360
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   361
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   362
            {
hgs
parents:
diff changeset
   363
            aX2 += iLastX;
hgs
parents:
diff changeset
   364
            aY2 += iLastY;
hgs
parents:
diff changeset
   365
            }
hgs
parents:
diff changeset
   366
        else
hgs
parents:
diff changeset
   367
            {
hgs
parents:
diff changeset
   368
            aX2 += iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   369
            aY2 += iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   370
            }
hgs
parents:
diff changeset
   371
        }
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
    TFloatFixPt aX1, aY1;
hgs
parents:
diff changeset
   374
    GetCurveRefPoint( aX1, aY1 );
hgs
parents:
diff changeset
   375
    QuadToL( aX1, aY1, aX2, aY2, ETrue );
hgs
parents:
diff changeset
   376
    }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   379
//  void CGfxGeneralPath::ShortCubicToL( TFloatFixPt& aX2,
hgs
parents:
diff changeset
   380
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   381
 void CGfxGeneralPath::ShortCubicToL( TFloatFixPt& aX2,
hgs
parents:
diff changeset
   382
                                              TFloatFixPt& aY2,
hgs
parents:
diff changeset
   383
                                              TFloatFixPt& aX3,
hgs
parents:
diff changeset
   384
                                              TFloatFixPt& aY3,
hgs
parents:
diff changeset
   385
                                              TBool aAbsolute )
hgs
parents:
diff changeset
   386
    {
hgs
parents:
diff changeset
   387
    if ( !aAbsolute && iPointCoords->Count() >= 2 )
hgs
parents:
diff changeset
   388
        {
hgs
parents:
diff changeset
   389
        TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   390
        TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   391
        // If the last command was 'Z'/'z'
hgs
parents:
diff changeset
   392
        // the current point is the initial point
hgs
parents:
diff changeset
   393
        // of the previous segment - 'M'/'m' usually
hgs
parents:
diff changeset
   394
        if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose )
hgs
parents:
diff changeset
   395
            {
hgs
parents:
diff changeset
   396
            lastX = iLastX;
hgs
parents:
diff changeset
   397
            lastY = iLastY;
hgs
parents:
diff changeset
   398
            }
hgs
parents:
diff changeset
   399
        aX2 += lastX;
hgs
parents:
diff changeset
   400
        aY2 += lastY;
hgs
parents:
diff changeset
   401
        aX3 += lastX;
hgs
parents:
diff changeset
   402
        aY3 += lastY;
hgs
parents:
diff changeset
   403
        }
hgs
parents:
diff changeset
   404
    TFloatFixPt aX1, aY1;
hgs
parents:
diff changeset
   405
    GetCurveRefPoint( aX1, aY1 );
hgs
parents:
diff changeset
   406
    // If there is no previous command or if the previous command
hgs
parents:
diff changeset
   407
   //  was not an C, c, S or s, the first control point shall be coincident 
hgs
parents:
diff changeset
   408
   //  with the current point.
hgs
parents:
diff changeset
   409
    TUint32 KSegCubicto = ( TUint32 ) EGfxSegCubicTo;  // const    
hgs
parents:
diff changeset
   410
    if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) != KSegCubicto )
hgs
parents:
diff changeset
   411
        {
hgs
parents:
diff changeset
   412
        aX1 = iLastX;
hgs
parents:
diff changeset
   413
        aY1 = iLastY;
hgs
parents:
diff changeset
   414
        }
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
    CubicToL( aX1, aY1, aX2, aY2, aX3, aY3, ETrue );
hgs
parents:
diff changeset
   417
    }
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   420
// void CGfxGeneralPath::GetCurveRefPoint( TFloatFixPt& aX, TFloatFixPt& aY )
hgs
parents:
diff changeset
   421
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   422
void CGfxGeneralPath::GetCurveRefPoint( TFloatFixPt& aX, TFloatFixPt& aY )
hgs
parents:
diff changeset
   423
    {
hgs
parents:
diff changeset
   424
    if ( iPointCoords->Count() < 4 )
hgs
parents:
diff changeset
   425
        {
hgs
parents:
diff changeset
   426
        aX = TFloatFixPt( 0 );
hgs
parents:
diff changeset
   427
        aY = TFloatFixPt( 0 );
hgs
parents:
diff changeset
   428
        return;
hgs
parents:
diff changeset
   429
        }
hgs
parents:
diff changeset
   430
    TFloatFixPt x0 = iPointCoords->operator[]( iPointCoords->Count() - 4 );
hgs
parents:
diff changeset
   431
    TFloatFixPt y0 = iPointCoords->operator[]( iPointCoords->Count() - 3 );
hgs
parents:
diff changeset
   432
    TFloatFixPt x1 = iPointCoords->operator[]( iPointCoords->Count() - 2 );
hgs
parents:
diff changeset
   433
    TFloatFixPt y1 = iPointCoords->operator[]( iPointCoords->Count() - 1 );
hgs
parents:
diff changeset
   434
    aX = x1 + x1 - x0;
hgs
parents:
diff changeset
   435
    aY = y1 + y1 - y0;
hgs
parents:
diff changeset
   436
    }
hgs
parents:
diff changeset
   437
hgs
parents:
diff changeset
   438
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   439
//  void CGfxGeneralPath::Reset()
hgs
parents:
diff changeset
   440
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   441
 void CGfxGeneralPath::Reset()
hgs
parents:
diff changeset
   442
    {
hgs
parents:
diff changeset
   443
    iPointTypes->Reset();
hgs
parents:
diff changeset
   444
    iPointCoords->Reset();
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   448
//  void CGfxGeneralPath::AppendL( CGfxPathIterator* aItr )
hgs
parents:
diff changeset
   449
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   450
 void CGfxGeneralPath::AppendL( CGfxPathIterator* aItr )
hgs
parents:
diff changeset
   451
    {
hgs
parents:
diff changeset
   452
    TFloatFixPt tmpcoords[6];
hgs
parents:
diff changeset
   453
hgs
parents:
diff changeset
   454
    // Set path data...
hgs
parents:
diff changeset
   455
    while ( !aItr->IsDone() )
hgs
parents:
diff changeset
   456
        {
hgs
parents:
diff changeset
   457
        switch ( aItr->CurrentSegment( tmpcoords ) )
hgs
parents:
diff changeset
   458
            {
hgs
parents:
diff changeset
   459
            case EGfxSegMoveTo:
hgs
parents:
diff changeset
   460
                MoveToL( tmpcoords[0], tmpcoords[1], ETrue );
hgs
parents:
diff changeset
   461
                break;
hgs
parents:
diff changeset
   462
            case EGfxSegLineTo:
hgs
parents:
diff changeset
   463
                LineToL( tmpcoords[0], tmpcoords[1], ETrue );
hgs
parents:
diff changeset
   464
                break;
hgs
parents:
diff changeset
   465
            case EGfxSegQuadTo:
hgs
parents:
diff changeset
   466
                QuadToL( tmpcoords[0],
hgs
parents:
diff changeset
   467
                         tmpcoords[1],
hgs
parents:
diff changeset
   468
                         tmpcoords[2],
hgs
parents:
diff changeset
   469
                         tmpcoords[3],
hgs
parents:
diff changeset
   470
                         ETrue );
hgs
parents:
diff changeset
   471
                break;
hgs
parents:
diff changeset
   472
            case EGfxSegCubicTo:
hgs
parents:
diff changeset
   473
                CubicToL( tmpcoords[0],
hgs
parents:
diff changeset
   474
                          tmpcoords[1],
hgs
parents:
diff changeset
   475
                          tmpcoords[2],
hgs
parents:
diff changeset
   476
                          tmpcoords[3],
hgs
parents:
diff changeset
   477
                          tmpcoords[4],
hgs
parents:
diff changeset
   478
                          tmpcoords[5],
hgs
parents:
diff changeset
   479
                          ETrue );
hgs
parents:
diff changeset
   480
                break;
hgs
parents:
diff changeset
   481
            case EGfxSegClose:
hgs
parents:
diff changeset
   482
                ClosePathL();
hgs
parents:
diff changeset
   483
            }
hgs
parents:
diff changeset
   484
        aItr->NextL();
hgs
parents:
diff changeset
   485
        }
hgs
parents:
diff changeset
   486
    }
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   489
//  void CGfxGeneralPath::GetBounds( const TGfxAffineTransform& aAt,
hgs
parents:
diff changeset
   490
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   491
 void CGfxGeneralPath::GetBounds( const TGfxAffineTransform& aAt,
hgs
parents:
diff changeset
   492
                                          TGfxRectangle2D& aRect )
hgs
parents:
diff changeset
   493
    {
hgs
parents:
diff changeset
   494
     TFloatFixPt xMin(KMAXFLOATFIX), yMin(KMAXFLOATFIX), xMax(KMINFLOATFIX), yMax(KMINFLOATFIX);
hgs
parents:
diff changeset
   495
     for (TInt i=0; i<iPointCoords->Count(); i+=2)
hgs
parents:
diff changeset
   496
     {
hgs
parents:
diff changeset
   497
        TGfxPoint2D p((*iPointCoords)[i], (*iPointCoords)[i+1]);
hgs
parents:
diff changeset
   498
        aAt.Transform(&p, &p, 1);
hgs
parents:
diff changeset
   499
        if (p.iX < xMin) xMin = p.iX;
hgs
parents:
diff changeset
   500
        if (p.iX > xMax) xMax = p.iX;
hgs
parents:
diff changeset
   501
        if (p.iY < yMin) yMin = p.iY;
hgs
parents:
diff changeset
   502
        if (p.iY > yMax) yMax = p.iY;
hgs
parents:
diff changeset
   503
     }
hgs
parents:
diff changeset
   504
     aRect.iX = xMin;
hgs
parents:
diff changeset
   505
     aRect.iY = yMin;
hgs
parents:
diff changeset
   506
     aRect.iWidth = xMax - xMin;
hgs
parents:
diff changeset
   507
     aRect.iHeight = yMax - yMin;
hgs
parents:
diff changeset
   508
    }
hgs
parents:
diff changeset
   509
hgs
parents:
diff changeset
   510
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   511
//  void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt,
hgs
parents:
diff changeset
   512
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   513
 void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt,
hgs
parents:
diff changeset
   514
                                                 CGfxPathIterator*& aPitr )
hgs
parents:
diff changeset
   515
    {
hgs
parents:
diff changeset
   516
    aPitr = new ( ELeave ) CGfxGeneralPathIteratorP( this, aAt );
hgs
parents:
diff changeset
   517
    }
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   520
//  void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt,
hgs
parents:
diff changeset
   521
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   522
 void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt,
hgs
parents:
diff changeset
   523
                                                 TInt aLimit,
hgs
parents:
diff changeset
   524
                                                 CGfxPathIterator*& aPitr )
hgs
parents:
diff changeset
   525
    {
hgs
parents:
diff changeset
   526
    aPitr = CGfxFlatteningPathIterator::NewL( this, aAt, aLimit );
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
    }
hgs
parents:
diff changeset
   529
hgs
parents:
diff changeset
   530
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   531
//  void CGfxGeneralPath::SetPointTypeArrayL( RArray<TUint32>* aTypesArray )
hgs
parents:
diff changeset
   532
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   533
 void CGfxGeneralPath::SetPointTypeArrayL( RArray<TUint32>* aTypesArray )
hgs
parents:
diff changeset
   534
    {
hgs
parents:
diff changeset
   535
    TInt count = aTypesArray->Count();
hgs
parents:
diff changeset
   536
    iPointTypes->Reset();
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
    for ( TInt i = 0; i < count; i++ )
hgs
parents:
diff changeset
   539
        {
hgs
parents:
diff changeset
   540
        iPointTypes->AppendL( (*aTypesArray)[i] );
hgs
parents:
diff changeset
   541
        }
hgs
parents:
diff changeset
   542
    }
hgs
parents:
diff changeset
   543
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   546
//  void CGfxGeneralPath::SetPointTypeArrayRef( RArray<TUint32>*& aTypesArray )
hgs
parents:
diff changeset
   547
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   548
 void CGfxGeneralPath::SetPointTypeArrayRef( RArray<TUint32>*& aTypesArray )
hgs
parents:
diff changeset
   549
	{
hgs
parents:
diff changeset
   550
	if (iPointTypes)
hgs
parents:
diff changeset
   551
		{
hgs
parents:
diff changeset
   552
		iPointTypes->Reset();
hgs
parents:
diff changeset
   553
		delete iPointTypes;
hgs
parents:
diff changeset
   554
		iPointTypes= NULL;
hgs
parents:
diff changeset
   555
		}
hgs
parents:
diff changeset
   556
	iPointTypes= aTypesArray;
hgs
parents:
diff changeset
   557
	}
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   561
//  void CGfxGeneralPath::SetPointCoordsArrayRef( RArray<TFloatFixPt>*& aPointCoords )
hgs
parents:
diff changeset
   562
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   563
 void CGfxGeneralPath::SetPointCoordsArrayRef( RArray<TFloatFixPt>*& aPointCoords )
hgs
parents:
diff changeset
   564
    {
hgs
parents:
diff changeset
   565
    TInt count = aPointCoords->Count();
hgs
parents:
diff changeset
   566
    if (iPointCoords)
hgs
parents:
diff changeset
   567
        {
hgs
parents:
diff changeset
   568
        iPointCoords->Reset();
hgs
parents:
diff changeset
   569
        delete iPointCoords;
hgs
parents:
diff changeset
   570
        iPointCoords= NULL;
hgs
parents:
diff changeset
   571
        }
hgs
parents:
diff changeset
   572
    iPointCoords= aPointCoords;
hgs
parents:
diff changeset
   573
    }
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   577
//  void CGfxGeneralPath::SetPointCoordsArrayL( RArray<TFloatFixPt>* aPointCoords )
hgs
parents:
diff changeset
   578
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   579
 void CGfxGeneralPath::SetPointCoordsArrayL( RArray<TFloatFixPt>* aPointCoords )
hgs
parents:
diff changeset
   580
    {
hgs
parents:
diff changeset
   581
    TInt count = aPointCoords->Count();
hgs
parents:
diff changeset
   582
    iPointCoords->Reset();
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
    for ( TInt i = 0; (i+1) < count; i+=2 )
hgs
parents:
diff changeset
   585
        {
hgs
parents:
diff changeset
   586
        iPointCoords->AppendL( (*aPointCoords)[i] );
hgs
parents:
diff changeset
   587
        iPointCoords->AppendL( (*aPointCoords)[i+1] );
hgs
parents:
diff changeset
   588
        }
hgs
parents:
diff changeset
   589
    }
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   592
//  RArray<TUint32>* CGfxGeneralPath::PointTypeArray()
hgs
parents:
diff changeset
   593
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   594
 RArray<TUint32>* CGfxGeneralPath::PointTypeArray()
hgs
parents:
diff changeset
   595
    {
hgs
parents:
diff changeset
   596
    return iPointTypes;
hgs
parents:
diff changeset
   597
    }
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
 unsigned char* CGfxGeneralPath::PathSegmentTypeArray()
hgs
parents:
diff changeset
   600
 {
hgs
parents:
diff changeset
   601
 	return iPathSegmentTypeArray;
hgs
parents:
diff changeset
   602
 }
hgs
parents:
diff changeset
   603
 
hgs
parents:
diff changeset
   604
 void CGfxGeneralPath::PathSegmentTypeArray(unsigned char* aSegmentTypeArray)
hgs
parents:
diff changeset
   605
 {
hgs
parents:
diff changeset
   606
 	iPathSegmentTypeArray = aSegmentTypeArray;
hgs
parents:
diff changeset
   607
 }
hgs
parents:
diff changeset
   608
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   609
//  TFloatFixPt* CGfxGeneralPath::PointCoordsArray()
hgs
parents:
diff changeset
   610
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   611
 TFloatFixPt* CGfxGeneralPath::PointCoordsArray()
hgs
parents:
diff changeset
   612
    {
hgs
parents:
diff changeset
   613
    if((iPointCoords) && (iPointCoords->Count() > 0))
hgs
parents:
diff changeset
   614
		return &( iPointCoords->operator[]( 0 ) );
hgs
parents:
diff changeset
   615
	else
hgs
parents:
diff changeset
   616
		return NULL;
hgs
parents:
diff changeset
   617
    }
hgs
parents:
diff changeset
   618
hgs
parents:
diff changeset
   619
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   620
//  RArray<TFloatFixPt>* CGfxGeneralPath::PointCoordsArrayAll()
hgs
parents:
diff changeset
   621
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   622
 RArray<TFloatFixPt>* CGfxGeneralPath::PointCoordsArrayAll()
hgs
parents:
diff changeset
   623
    {
hgs
parents:
diff changeset
   624
    return iPointCoords;
hgs
parents:
diff changeset
   625
    }
hgs
parents:
diff changeset
   626
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   627
//  TInt CGfxGeneralPath::GetSegmentCount()
hgs
parents:
diff changeset
   628
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   629
 TInt CGfxGeneralPath::GetSegmentCount()
hgs
parents:
diff changeset
   630
    {
hgs
parents:
diff changeset
   631
    return iPointTypes->Count();
hgs
parents:
diff changeset
   632
    }
hgs
parents:
diff changeset
   633
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   634
//  TInt CGfxGeneralPath::GetSegmentType(TInt aSegmentIndex)
hgs
parents:
diff changeset
   635
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   636
 TInt CGfxGeneralPath::GetSegmentType(TInt aSegmentIndex)
hgs
parents:
diff changeset
   637
	{
hgs
parents:
diff changeset
   638
	if(aSegmentIndex > 0 && aSegmentIndex <= iPointTypes->Count())
hgs
parents:
diff changeset
   639
		{
hgs
parents:
diff changeset
   640
		TInt SegmentType =  iPointTypes->operator[]( aSegmentIndex - 1 );
hgs
parents:
diff changeset
   641
		TInt KSegLineto = ( TInt ) EGfxSegLineTo;
hgs
parents:
diff changeset
   642
		if( SegmentType == KSegLineto)
hgs
parents:
diff changeset
   643
			{
hgs
parents:
diff changeset
   644
			// differentiate between vertical and horizontal lines.
hgs
parents:
diff changeset
   645
			TBool isVertical = EFalse;
hgs
parents:
diff changeset
   646
			TBool isHorizontal = EFalse;
hgs
parents:
diff changeset
   647
			// the following function will tel us that this line segment is horizontal
hgs
parents:
diff changeset
   648
			// or vertical.
hgs
parents:
diff changeset
   649
			IsHorizontalLineOrVertical(aSegmentIndex-1, isHorizontal, isVertical);
hgs
parents:
diff changeset
   650
			if( !isHorizontal )
hgs
parents:
diff changeset
   651
				{
hgs
parents:
diff changeset
   652
				if(isVertical)
hgs
parents:
diff changeset
   653
					{
hgs
parents:
diff changeset
   654
					TUint32 KVertical = 6;
hgs
parents:
diff changeset
   655
					return KVertical ;
hgs
parents:
diff changeset
   656
					}
hgs
parents:
diff changeset
   657
				}
hgs
parents:
diff changeset
   658
			else
hgs
parents:
diff changeset
   659
				{
hgs
parents:
diff changeset
   660
				TUint32 KHorizontal = 5;
hgs
parents:
diff changeset
   661
				return KHorizontal ;
hgs
parents:
diff changeset
   662
				}
hgs
parents:
diff changeset
   663
			return SegmentType;
hgs
parents:
diff changeset
   664
			}
hgs
parents:
diff changeset
   665
		return SegmentType;
hgs
parents:
diff changeset
   666
		}
hgs
parents:
diff changeset
   667
	else
hgs
parents:
diff changeset
   668
		{
hgs
parents:
diff changeset
   669
		return KErrBadHandle;
hgs
parents:
diff changeset
   670
		}
hgs
parents:
diff changeset
   671
	}
hgs
parents:
diff changeset
   672
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   673
//  TReal32 CGfxGeneralPath::GetSegmentParameter(TInt aSegmentIndex , TInt aParameterIndex)
hgs
parents:
diff changeset
   674
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   675
 TReal32 CGfxGeneralPath::GetSegmentParameter(TInt aSegmentIndex , TInt aParameterIndex)
hgs
parents:
diff changeset
   676
{
hgs
parents:
diff changeset
   677
	if( aSegmentIndex <= 0 && aSegmentIndex >= iPointTypes->Count())
hgs
parents:
diff changeset
   678
		{
hgs
parents:
diff changeset
   679
		return 0.0;
hgs
parents:
diff changeset
   680
		}
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
	TInt count =0;
hgs
parents:
diff changeset
   683
	TInt Param = 0;
hgs
parents:
diff changeset
   684
hgs
parents:
diff changeset
   685
	while(count < (aSegmentIndex -1))
hgs
parents:
diff changeset
   686
		{
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
		switch(iPointTypes->operator[]( count))
hgs
parents:
diff changeset
   689
			{
hgs
parents:
diff changeset
   690
hgs
parents:
diff changeset
   691
			case EGfxSegClose:
hgs
parents:
diff changeset
   692
			break;
hgs
parents:
diff changeset
   693
			case EGfxSegLineTo:
hgs
parents:
diff changeset
   694
			Param+=2;
hgs
parents:
diff changeset
   695
			break;
hgs
parents:
diff changeset
   696
			case EGfxSegQuadTo:
hgs
parents:
diff changeset
   697
			Param+= 4;
hgs
parents:
diff changeset
   698
			break;
hgs
parents:
diff changeset
   699
			case EGfxSegCubicTo:
hgs
parents:
diff changeset
   700
			Param +=6;
hgs
parents:
diff changeset
   701
			break;
hgs
parents:
diff changeset
   702
			case EGfxSegMoveTo:
hgs
parents:
diff changeset
   703
			Param+= 2;
hgs
parents:
diff changeset
   704
			break;
hgs
parents:
diff changeset
   705
			default:
hgs
parents:
diff changeset
   706
			break;
hgs
parents:
diff changeset
   707
			}
hgs
parents:
diff changeset
   708
		count++;
hgs
parents:
diff changeset
   709
		}
hgs
parents:
diff changeset
   710
hgs
parents:
diff changeset
   711
	Param--;
hgs
parents:
diff changeset
   712
hgs
parents:
diff changeset
   713
	if((Param + aParameterIndex) >= iPointCoords->Count())
hgs
parents:
diff changeset
   714
		{
hgs
parents:
diff changeset
   715
		return 0;
hgs
parents:
diff changeset
   716
		}
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
	return (TReal32)iPointCoords->operator[](Param + aParameterIndex);
hgs
parents:
diff changeset
   719
}
hgs
parents:
diff changeset
   720
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   721
// void CGfxGeneralPath::IsHorizontalLineOrVertical(TInt aSegmentIndex, TBool& aHorizontal, TBool& aVertical)
hgs
parents:
diff changeset
   722
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   723
void CGfxGeneralPath::IsHorizontalLineOrVertical(TInt aSegmentIndex, TBool& aHorizontal, TBool& aVertical)
hgs
parents:
diff changeset
   724
{
hgs
parents:
diff changeset
   725
	// see the previous segment.
hgs
parents:
diff changeset
   726
	if( aSegmentIndex <= 0 && aSegmentIndex >= iPointTypes->Count())
hgs
parents:
diff changeset
   727
		{
hgs
parents:
diff changeset
   728
		return;
hgs
parents:
diff changeset
   729
		}
hgs
parents:
diff changeset
   730
	TInt count =0;
hgs
parents:
diff changeset
   731
	TInt Param =0;
hgs
parents:
diff changeset
   732
	TInt LastPram = 0;
hgs
parents:
diff changeset
   733
	while(count <= aSegmentIndex )
hgs
parents:
diff changeset
   734
		{
hgs
parents:
diff changeset
   735
		// this will contain the Index to the last Segment.
hgs
parents:
diff changeset
   736
		LastPram= Param;
hgs
parents:
diff changeset
   737
hgs
parents:
diff changeset
   738
		// search for the current segment.
hgs
parents:
diff changeset
   739
		switch(iPointTypes->operator[]( count))
hgs
parents:
diff changeset
   740
			{
hgs
parents:
diff changeset
   741
			// here increment the Param based on the number of attribute each command needs.
hgs
parents:
diff changeset
   742
			case EGfxSegClose:
hgs
parents:
diff changeset
   743
			break;
hgs
parents:
diff changeset
   744
			case EGfxSegLineTo:
hgs
parents:
diff changeset
   745
			Param+=2;
hgs
parents:
diff changeset
   746
			break;
hgs
parents:
diff changeset
   747
			case EGfxSegQuadTo:
hgs
parents:
diff changeset
   748
			Param+= 4;
hgs
parents:
diff changeset
   749
			break;
hgs
parents:
diff changeset
   750
			case EGfxSegCubicTo:
hgs
parents:
diff changeset
   751
			Param +=6;
hgs
parents:
diff changeset
   752
			break;
hgs
parents:
diff changeset
   753
			case EGfxSegMoveTo:
hgs
parents:
diff changeset
   754
			Param+= 2;
hgs
parents:
diff changeset
   755
			break;
hgs
parents:
diff changeset
   756
			default:
hgs
parents:
diff changeset
   757
			break;
hgs
parents:
diff changeset
   758
			}
hgs
parents:
diff changeset
   759
		count++;
hgs
parents:
diff changeset
   760
		}
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
hgs
parents:
diff changeset
   763
	Param--;
hgs
parents:
diff changeset
   764
	LastPram--;
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
	if ( ( (Param-1) >= 0) && ( (LastPram - 1) >= 0) )
hgs
parents:
diff changeset
   767
	{
hgs
parents:
diff changeset
   768
hgs
parents:
diff changeset
   769
	if(iPointCoords->operator[](Param-1) == iPointCoords->operator[](LastPram-1))
hgs
parents:
diff changeset
   770
		{
hgs
parents:
diff changeset
   771
		aVertical = ETrue;
hgs
parents:
diff changeset
   772
		return;
hgs
parents:
diff changeset
   773
		}
hgs
parents:
diff changeset
   774
	if(iPointCoords->operator[](Param) == iPointCoords->operator[](LastPram))
hgs
parents:
diff changeset
   775
		{
hgs
parents:
diff changeset
   776
		aHorizontal = ETrue;
hgs
parents:
diff changeset
   777
		return;
hgs
parents:
diff changeset
   778
		}
hgs
parents:
diff changeset
   779
	}
hgs
parents:
diff changeset
   780
	else if ( (Param - 1 ) >= 0 )
hgs
parents:
diff changeset
   781
	{
hgs
parents:
diff changeset
   782
		//this is the case where there is just a LineTo and nothing else
hgs
parents:
diff changeset
   783
		if ( iPointCoords->operator[](Param - 1) >= TFloatFixPt(0) )
hgs
parents:
diff changeset
   784
		{
hgs
parents:
diff changeset
   785
			aHorizontal = ETrue;
hgs
parents:
diff changeset
   786
			return;
hgs
parents:
diff changeset
   787
		}
hgs
parents:
diff changeset
   788
		else if ( iPointCoords->operator[](Param) >= TFloatFixPt(0) )
hgs
parents:
diff changeset
   789
		{
hgs
parents:
diff changeset
   790
			aVertical = ETrue;
hgs
parents:
diff changeset
   791
			return;
hgs
parents:
diff changeset
   792
		}
hgs
parents:
diff changeset
   793
	}
hgs
parents:
diff changeset
   794
}
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
TUint8 CGfxGeneralPath::Count()
hgs
parents:
diff changeset
   797
{
hgs
parents:
diff changeset
   798
	return iCount;
hgs
parents:
diff changeset
   799
}
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
void CGfxGeneralPath::Count(TUint8 aCount)
hgs
parents:
diff changeset
   802
{
hgs
parents:
diff changeset
   803
	iCount = aCount;
hgs
parents:
diff changeset
   804
}
hgs
parents:
diff changeset
   805
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   806
//  CGfxGeneralPath*  CGfxGeneralPath::CloneL()
hgs
parents:
diff changeset
   807
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   808
 CGfxGeneralPath*  CGfxGeneralPath::CloneL()
hgs
parents:
diff changeset
   809
{
hgs
parents:
diff changeset
   810
    CGfxGeneralPath* path = CGfxGeneralPath::NewLC();
hgs
parents:
diff changeset
   811
    TInt index = 0;
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
    for( index = 0; index < iPointTypes->Count(); index++ )
hgs
parents:
diff changeset
   814
        {
hgs
parents:
diff changeset
   815
        path->iPointTypes->AppendL( iPointTypes->operator[]( index ) );
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
    for( index = 0; index < iPointCoords->Count(); index++ )
hgs
parents:
diff changeset
   818
        {
hgs
parents:
diff changeset
   819
        path->iPointCoords->AppendL( iPointCoords->operator[]( index ) );
hgs
parents:
diff changeset
   820
        }
hgs
parents:
diff changeset
   821
    path->iLastX = iLastX;
hgs
parents:
diff changeset
   822
    path->iLastY = iLastY;
hgs
parents:
diff changeset
   823
    if(TUint8 count = path->Count())
hgs
parents:
diff changeset
   824
    {
hgs
parents:
diff changeset
   825
        path->iPathSegmentTypeArray = new unsigned char[count];
hgs
parents:
diff changeset
   826
        for(int i =0; i<count ; i++)
hgs
parents:
diff changeset
   827
            path->iPathSegmentTypeArray[i] = iPathSegmentTypeArray[i];
hgs
parents:
diff changeset
   828
    }
hgs
parents:
diff changeset
   829
    else 
hgs
parents:
diff changeset
   830
    {
hgs
parents:
diff changeset
   831
    	path->iPathSegmentTypeArray = NULL;
hgs
parents:
diff changeset
   832
    }
hgs
parents:
diff changeset
   833
    CleanupStack::Pop();
hgs
parents:
diff changeset
   834
    return path;
hgs
parents:
diff changeset
   835
}
hgs
parents:
diff changeset
   836
hgs
parents:
diff changeset
   837
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   838
//  void  CGfxGeneralPath::QuadToLWithNoControlPoint()
hgs
parents:
diff changeset
   839
//  If there is no previous command or if the previous command was not a 
hgs
parents:
diff changeset
   840
//  Q, q, T or t, the control point shall be current point.
hgs
parents:
diff changeset
   841
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   842
void CGfxGeneralPath::QuadToLWithNoControlPoint(TFloatFixPt aX, TFloatFixPt aY)
hgs
parents:
diff changeset
   843
{
hgs
parents:
diff changeset
   844
    TUint32 KSegQuadto = ( TUint32 ) EGfxSegQuadTo;
hgs
parents:
diff changeset
   845
    iPointTypes->AppendL( KSegQuadto );
hgs
parents:
diff changeset
   846
    iPointCoords->AppendL( iLastX );
hgs
parents:
diff changeset
   847
    iPointCoords->AppendL( iLastY );  
hgs
parents:
diff changeset
   848
    iPointCoords->AppendL( aX );
hgs
parents:
diff changeset
   849
    iPointCoords->AppendL( aY );	
hgs
parents:
diff changeset
   850
}