|
1 /* |
|
2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Graphics Extension Library source file |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 #include "GfxShape.h" |
|
20 #include "GfxAffineTransform.h" |
|
21 |
|
22 |
|
23 // --------------------------------------------------------------------------- |
|
24 // Constructors |
|
25 // --------------------------------------------------------------------------- |
|
26 // -------------------------------------------------------------------------- |
|
27 // TGfxCurveFlattener::TGfxCurveFlattener( TGfxAffineTransform* aTransform ) |
|
28 // --------------------------------------------------------------------------- |
|
29 TGfxCurveFlattener::TGfxCurveFlattener( TGfxAffineTransform* aTransform ) |
|
30 { |
|
31 iTransform = aTransform; |
|
32 } |
|
33 |
|
34 |
|
35 |
|
36 // -------------------------------------------------------------------------- |
|
37 // void TGfxCurveFlattener::AddSubCurveQuadL( CGfxEdgeListP* aRenderer, |
|
38 // --------------------------------------------------------------------------- |
|
39 void TGfxCurveFlattener::AddSubCurveQuadL( CGfxEdgeListP* aRenderer, |
|
40 TFixPt* aCtrlPoints, |
|
41 TInt32 aLimit ) |
|
42 { |
|
43 if ( aLimit <= 0 ) |
|
44 { |
|
45 // Add segments to renderer |
|
46 // the first point doesn't have to be transformed |
|
47 // because it is same as the last vertex |
|
48 TFixPt* p2 = aCtrlPoints + 2; |
|
49 iTransform->Transform( p2, 2 ); |
|
50 aRenderer->AddPoint( aCtrlPoints[2], aCtrlPoints[3], EFalse, EFalse ); |
|
51 aRenderer->AddPoint( aCtrlPoints[4], aCtrlPoints[5], EFalse, EFalse ); |
|
52 return; |
|
53 } |
|
54 |
|
55 TFixPt left[6], right[6]; |
|
56 TFixPt x0, y0, xm, ym, x1, y1; |
|
57 x0 = aCtrlPoints[0]; |
|
58 y0 = aCtrlPoints[1]; |
|
59 xm = aCtrlPoints[2]; |
|
60 ym = aCtrlPoints[3]; |
|
61 x1 = aCtrlPoints[4]; |
|
62 y1 = aCtrlPoints[5]; |
|
63 x0 = ( x0 + xm ) >> 1; |
|
64 y0 = ( y0 + ym ) >> 1; |
|
65 x1 = ( x1 + xm ) >> 1; |
|
66 y1 = ( y1 + ym ) >> 1; |
|
67 xm = ( x0 + x1 ) >> 1; |
|
68 ym = ( y0 + y1 ) >> 1; |
|
69 left[0] = aCtrlPoints[0]; |
|
70 left[1] = aCtrlPoints[1]; |
|
71 left[2] = x0; |
|
72 left[3] = y0; |
|
73 left[4] = xm; |
|
74 left[5] = ym; |
|
75 right[0] = xm; |
|
76 right[1] = ym; |
|
77 right[2] = x1; |
|
78 right[3] = y1; |
|
79 right[4] = aCtrlPoints[4]; |
|
80 right[5] = aCtrlPoints[5]; |
|
81 AddSubCurveQuadL( aRenderer, left, aLimit - 1 ); |
|
82 AddSubCurveQuadL( aRenderer, right, aLimit - 1 ); |
|
83 } |
|
84 |
|
85 // -------------------------------------------------------------------------- |
|
86 // void TGfxCurveFlattener::AddSubCurveCubicL( CGfxEdgeListP* aRenderer, |
|
87 // --------------------------------------------------------------------------- |
|
88 void TGfxCurveFlattener::AddSubCurveCubicL( CGfxEdgeListP* aRenderer, |
|
89 TFixPt* aCtrlPoints, |
|
90 TInt32 aLimit ) |
|
91 { |
|
92 if ( aLimit <= 0 ) |
|
93 { |
|
94 // Add segments to renderer |
|
95 TFixPt* p2 = aCtrlPoints + 2; |
|
96 iTransform->Transform( p2, 3 ); |
|
97 aRenderer->AddPoint( aCtrlPoints[2], aCtrlPoints[3], EFalse, EFalse ); |
|
98 aRenderer->AddPoint( aCtrlPoints[4], aCtrlPoints[5], EFalse, EFalse ); |
|
99 aRenderer->AddPoint( aCtrlPoints[6], aCtrlPoints[7], EFalse, EFalse ); |
|
100 return; |
|
101 } |
|
102 |
|
103 TFixPt left[8], right[8]; |
|
104 TFixPt x0, y0, xm, ym, xm1, ym1, xm2, ym2, x1, y1; |
|
105 |
|
106 x0 = aCtrlPoints[0]; |
|
107 y0 = aCtrlPoints[1]; |
|
108 xm1 = aCtrlPoints[2]; |
|
109 ym1 = aCtrlPoints[3]; |
|
110 xm2 = aCtrlPoints[4]; |
|
111 ym2 = aCtrlPoints[5]; |
|
112 x1 = aCtrlPoints[6]; |
|
113 y1 = aCtrlPoints[7]; |
|
114 |
|
115 x0 = ( x0 + xm1 ) >> 1; |
|
116 y0 = ( y0 + ym1 ) >> 1; |
|
117 x1 = ( x1 + xm2 ) >> 1; |
|
118 y1 = ( y1 + ym2 ) >> 1; |
|
119 xm = ( xm1 + xm2 ) >> 1; |
|
120 ym = ( ym1 + ym2 ) >> 1; |
|
121 xm1 = ( x0 + xm ) >> 1; |
|
122 ym1 = ( y0 + ym ) >> 1; |
|
123 xm2 = ( x1 + xm ) >> 1; |
|
124 ym2 = ( y1 + ym ) >> 1; |
|
125 xm = ( xm1 + xm2 ) >> 1; |
|
126 ym = ( ym1 + ym2 ) >> 1; |
|
127 |
|
128 left[0] = aCtrlPoints[0]; |
|
129 left[1] = aCtrlPoints[1]; |
|
130 left[2] = x0; |
|
131 left[3] = y0; |
|
132 left[4] = xm1; |
|
133 left[5] = ym1; |
|
134 left[6] = xm; |
|
135 left[7] = ym; |
|
136 right[0] = xm; |
|
137 right[1] = ym; |
|
138 right[2] = xm2; |
|
139 right[3] = ym2; |
|
140 right[4] = x1; |
|
141 right[5] = y1; |
|
142 right[6] = aCtrlPoints[6]; |
|
143 right[7] = aCtrlPoints[7]; |
|
144 AddSubCurveCubicL( aRenderer, left, aLimit - 1 ); |
|
145 AddSubCurveCubicL( aRenderer, right, aLimit - 1 ); |
|
146 } |