1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _SVX_ESCHEREX_HXX
25 #define _SVX_ESCHEREX_HXX
26 
27 #include <memory>
28 #include <vector>
29 #include <boost/shared_ptr.hpp>
30 #include <tools/solar.h>
31 #include <tools/gen.hxx>
32 #include <tools/list.hxx>
33 #include <tools/stream.hxx>
34 #include <com/sun/star/uno/Reference.h>
35 #include <svtools/grfmgr.hxx>
36 #include <com/sun/star/awt/Size.hpp>
37 #include <com/sun/star/awt/Point.hpp>
38 #include <com/sun/star/awt/Rectangle.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <com/sun/star/beans/PropertyState.hpp>
41 #include <com/sun/star/beans/PropertyValue.hpp>
42 #include <com/sun/star/drawing/BitmapMode.hpp>
43 #include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
44 #include <com/sun/star/drawing/Hatch.hpp>
45 #include <svx/msdffdef.hxx>
46 #include "filter/msfilter/msfilterdllapi.h"
47 
48 		/*Record Name       FBT-Value   Instance                  Contents                                                          Wrd Exl PPt Ver*/
49 // In der Mickysoft-Doku heissen die msofbt... statt ESCHER_...
50 #define ESCHER_DggContainer      0xF000 /*                           per-document data                                                  X   X   X     */
51 #define   ESCHER_Dgg             0xF006 /*                           an FDGG and several FIDCLs                                         X   X   X   0 */
52 #define   ESCHER_CLSID           0xF016 /*                           the CLSID of the application that put the data on the clipboard    C   C   C   0 */
53 #define   ESCHER_OPT             0xF00B /* count of properties       the document-wide default shape properties                         X   X   X   3 */
54 #define   ESCHER_ColorMRU        0xF11A /* count of colors           the colors in the MRU swatch                                       X   X   X   0 */
55 #define   ESCHER_SplitMenuColors 0xF11E /* count of colors           the colors in the top-level split menus                            X   X   X   0 */
56 #define   ESCHER_BstoreContainer 0xF001 /* count of BLIPs            all images in the document (JPEGs, metafiles, etc.)                X   X   X     */
57 #define     ESCHER_BSE           0xF007 /* BLIP type                 an FBSE (one per BLIP)                                             X   X   X   2 */
58 #define     ESCHER_BlipFirst     0xF018 /*                           range of fbts reserved for various kinds of BLIPs                  X   X   X     */
59 #define     ESCHER_BlipLast      0xF117 /*                           range of fbts reserved for various kinds of BLIPs                  X   X   X     */
60 
61 #define ESCHER_DgContainer       0xF002 /*                           per-sheet/page/slide data                                          X   X   X     */
62 #define   ESCHER_Dg              0xF008 /* drawing ID                an FDG                                                             X   X   X   0 */
63 #define   ESCHER_RegroupItems    0xF118 /* count of regroup entries  several FRITs                                                      X   X   X   0 */
64 #define   ESCHER_ColorScheme     0xF120 /* count of colors           the colors of the source host's color scheme                           C   C   0 */
65 #define   ESCHER_SpgrContainer   0xF003 /*                           several SpContainers, the first of which is the group shape itself X   X   X     */
66 #define   ESCHER_SpContainer     0xF004 /*                           a shape                                                            X   X   X     */
67 #define     ESCHER_Spgr          0xF009 /*                           an FSPGR; only present if the shape is a group shape               X   X   X   1 */
68 #define     ESCHER_Sp            0xF00A /* shape type                an FSP                                                             X   X   X   2 */
69 //#define     ESCHER_OPT           0xF00B /* count of properties       a shape property table                                             X   X   X   3 */
70 #define     ESCHER_Textbox       0xF00C /*                           RTF text                                                           C   C   C   0 */
71 #define     ESCHER_ClientTextbox 0xF00D /* host-defined              the text in the textbox, in host-defined format                    X   X   X     */
72 #define     ESCHER_Anchor        0xF00E /*                           a RECT, in 100000ths of an inch                                    C   C   C   0 */
73 #define     ESCHER_ChildAnchor   0xF00F /*                           a RECT, in units relative to the parent group                      X   X   X   0 */
74 #define     ESCHER_ClientAnchor  0xF010 /* host-defined              the location of the shape, in a host-defined format                X   X   X     */
75 #define     ESCHER_ClientData    0xF011 /* host-defined              host-specific data                                                 X   X   X     */
76 #define     ESCHER_OleObject     0xF11F /*                           a serialized IStorage for an OLE object                            C   C   C   0 */
77 #define     ESCHER_DeletedPspl   0xF11D /*                           an FPSPL; only present in top-level deleted shapes                 X           0 */
78 #define   ESCHER_SolverContainer 0xF005 /* count of rules            the rules governing shapes                                         X   X   X     */
79 #define     ESCHER_ConnectorRule 0xF012 /*                           an FConnectorRule                                                      X   X   1 */
80 #define     ESCHER_AlignRule     0xF013 /*                           an FAlignRule                                                      X   X   X   0 */
81 #define     ESCHER_ArcRule       0xF014 /*                           an FARCRU                                                          X   X   X   0 */
82 #define     ESCHER_ClientRule    0xF015 /* host-defined              host-defined                                                                     */
83 #define     ESCHER_CalloutRule   0xF017 /*                           an FCORU                                                           X   X   X   0 */
84 #define ESCHER_Selection         0xF119 /*                           an FDGSL followed by the SPIDs of the shapes in the selection              X   0 */
85 #define ESCHER_UDefProp			 0xF122
86 
87 #define SHAPEFLAG_GROUP			0x001	// This shape is a group shape
88 #define SHAPEFLAG_CHILD			0x002	// Not a top-level shape
89 #define SHAPEFLAG_PATRIARCH		0x004	// This is the topmost group shape. Exactly one of these per drawing.
90 #define SHAPEFLAG_DELETED		0x008	// The shape has been deleted
91 #define SHAPEFLAG_OLESHAPE		0x010	// The shape is an OLE object
92 #define SHAPEFLAG_HAVEMASTER	0x020	// Shape has a hspMaster property
93 #define SHAPEFLAG_FLIPH			0x040	// Shape is flipped horizontally
94 #define SHAPEFLAG_FLIPV			0x080	// Shape is flipped vertically
95 #define SHAPEFLAG_CONNECTOR		0x100	// Connector type of shape
96 #define SHAPEFLAG_HAVEANCHOR	0x200	// Shape has an anchor of some kind
97 #define SHAPEFLAG_BACKGROUND	0x400	// Background shape
98 #define SHAPEFLAG_HAVESPT		0x800	// Shape has a shape type property
99 
100 #define ESCHER_ShpInst_Min				0
101 #define ESCHER_ShpInst_NotPrimitive		ESCHER_ShpInst_Min
102 #define ESCHER_ShpInst_Rectangle		1
103 #define ESCHER_ShpInst_RoundRectangle	2
104 #define ESCHER_ShpInst_Ellipse			3
105 #define ESCHER_ShpInst_Diamond			4
106 #define ESCHER_ShpInst_IsocelesTriangle	5
107 #define ESCHER_ShpInst_RightTriangle	6
108 #define ESCHER_ShpInst_Parallelogram	7
109 #define ESCHER_ShpInst_Trapezoid		8
110 #define ESCHER_ShpInst_Hexagon			9
111 #define ESCHER_ShpInst_Octagon			10
112 #define ESCHER_ShpInst_Plus				11
113 #define ESCHER_ShpInst_Star				12
114 #define ESCHER_ShpInst_Arrow			13
115 #define ESCHER_ShpInst_ThickArrow		14
116 #define ESCHER_ShpInst_HomePlate		15
117 #define ESCHER_ShpInst_Cube				16
118 #define ESCHER_ShpInst_Balloon			17
119 #define ESCHER_ShpInst_Seal				18
120 #define ESCHER_ShpInst_Arc				19
121 #define ESCHER_ShpInst_Line				20
122 #define ESCHER_ShpInst_Plaque			21
123 #define ESCHER_ShpInst_Can				22
124 #define ESCHER_ShpInst_Donut			23
125 #define ESCHER_ShpInst_TextSimple		24
126 #define ESCHER_ShpInst_TextOctagon		25
127 #define ESCHER_ShpInst_TextHexagon		26
128 #define ESCHER_ShpInst_TextCurve		27
129 #define ESCHER_ShpInst_TextWave			28
130 #define ESCHER_ShpInst_TextRing			29
131 #define ESCHER_ShpInst_TextOnCurve		30
132 #define ESCHER_ShpInst_TextOnRing		31
133 #define ESCHER_ShpInst_StraightConnector1 32
134 #define ESCHER_ShpInst_BentConnector2	33
135 #define ESCHER_ShpInst_BentConnector3	34
136 #define ESCHER_ShpInst_BentConnector4	35
137 #define ESCHER_ShpInst_BentConnector5	36
138 #define ESCHER_ShpInst_CurvedConnector2	37
139 #define ESCHER_ShpInst_CurvedConnector3	38
140 #define ESCHER_ShpInst_CurvedConnector4	39
141 #define ESCHER_ShpInst_CurvedConnector5	40
142 #define ESCHER_ShpInst_Callout1			41
143 #define ESCHER_ShpInst_Callout2			42
144 #define ESCHER_ShpInst_Callout3			43
145 #define ESCHER_ShpInst_AccentCallout1	44
146 #define ESCHER_ShpInst_AccentCallout2	45
147 #define ESCHER_ShpInst_AccentCallout3	46
148 #define ESCHER_ShpInst_BorderCallout1	47
149 #define ESCHER_ShpInst_BorderCallout2	48
150 #define ESCHER_ShpInst_BorderCallout3	49
151 #define ESCHER_ShpInst_AccentBorderCallout1	50
152 #define ESCHER_ShpInst_AccentBorderCallout2	51
153 #define ESCHER_ShpInst_AccentBorderCallout3	52
154 #define ESCHER_ShpInst_Ribbon			53
155 #define ESCHER_ShpInst_Ribbon2			54
156 #define ESCHER_ShpInst_Chevron			55
157 #define ESCHER_ShpInst_Pentagon			56
158 #define ESCHER_ShpInst_NoSmoking		57
159 #define ESCHER_ShpInst_Seal8			58
160 #define ESCHER_ShpInst_Seal16			59
161 #define ESCHER_ShpInst_Seal32			60
162 #define ESCHER_ShpInst_WedgeRectCallout	61
163 #define ESCHER_ShpInst_WedgeRRectCallout	62
164 #define ESCHER_ShpInst_WedgeEllipseCallout	63
165 #define ESCHER_ShpInst_Wave				64
166 #define ESCHER_ShpInst_FoldedCorner		65
167 #define ESCHER_ShpInst_LeftArrow		66
168 #define ESCHER_ShpInst_DownArrow		67
169 #define ESCHER_ShpInst_UpArrow			68
170 #define ESCHER_ShpInst_LeftRightArrow	69
171 #define ESCHER_ShpInst_UpDownArrow		70
172 #define ESCHER_ShpInst_IrregularSeal1	71
173 #define ESCHER_ShpInst_IrregularSeal2	72
174 #define ESCHER_ShpInst_LightningBolt	73
175 #define ESCHER_ShpInst_Heart			74
176 #define ESCHER_ShpInst_PictureFrame		75
177 #define ESCHER_ShpInst_QuadArrow		76
178 #define ESCHER_ShpInst_LeftArrowCallout	77
179 #define ESCHER_ShpInst_RightArrowCallout	78
180 #define ESCHER_ShpInst_UpArrowCallout	79
181 #define ESCHER_ShpInst_DownArrowCallout	80
182 #define ESCHER_ShpInst_LeftRightArrowCallout	81
183 #define ESCHER_ShpInst_UpDownArrowCallout	82
184 #define ESCHER_ShpInst_QuadArrowCallout	83
185 #define ESCHER_ShpInst_Bevel			84
186 #define ESCHER_ShpInst_LeftBracket		85
187 #define ESCHER_ShpInst_RightBracket		86
188 #define ESCHER_ShpInst_LeftBrace		87
189 #define ESCHER_ShpInst_RightBrace		88
190 #define ESCHER_ShpInst_LeftUpArrow		89
191 #define ESCHER_ShpInst_BentUpArrow		90
192 #define ESCHER_ShpInst_BentArrow		91
193 #define ESCHER_ShpInst_Seal24			92
194 #define ESCHER_ShpInst_StripedRightArrow	93
195 #define ESCHER_ShpInst_NotchedRightArrow	94
196 #define ESCHER_ShpInst_BlockArc			95
197 #define ESCHER_ShpInst_SmileyFace		96
198 #define ESCHER_ShpInst_VerticalScroll	97
199 #define ESCHER_ShpInst_HorizontalScroll	98
200 #define ESCHER_ShpInst_CircularArrow	99
201 #define ESCHER_ShpInst_NotchedCircularArrow	100
202 #define ESCHER_ShpInst_UturnArrow		101
203 #define ESCHER_ShpInst_CurvedRightArrow	102
204 #define ESCHER_ShpInst_CurvedLeftArrow	103
205 #define ESCHER_ShpInst_CurvedUpArrow	104
206 #define ESCHER_ShpInst_CurvedDownArrow	105
207 #define ESCHER_ShpInst_CloudCallout		106
208 #define ESCHER_ShpInst_EllipseRibbon	107
209 #define ESCHER_ShpInst_EllipseRibbon2	108
210 #define ESCHER_ShpInst_FlowChartProcess	109
211 #define ESCHER_ShpInst_FlowChartDecision	110
212 #define ESCHER_ShpInst_FlowChartInputOutput	111
213 #define ESCHER_ShpInst_FlowChartPredefinedProcess	112
214 #define ESCHER_ShpInst_FlowChartInternalStorage	113
215 #define ESCHER_ShpInst_FlowChartDocument	114
216 #define ESCHER_ShpInst_FlowChartMultidocument	115
217 #define ESCHER_ShpInst_FlowChartTerminator	116
218 #define ESCHER_ShpInst_FlowChartPreparation	117
219 #define ESCHER_ShpInst_FlowChartManualInput	118
220 #define ESCHER_ShpInst_FlowChartManualOperation	119
221 #define ESCHER_ShpInst_FlowChartConnector	120
222 #define ESCHER_ShpInst_FlowChartPunchedCard	121
223 #define ESCHER_ShpInst_FlowChartPunchedTape	122
224 #define ESCHER_ShpInst_FlowChartSummingJunction	123
225 #define ESCHER_ShpInst_FlowChartOr		124
226 #define ESCHER_ShpInst_FlowChartCollate	125
227 #define ESCHER_ShpInst_FlowChartSort	126
228 #define ESCHER_ShpInst_FlowChartExtract	127
229 #define ESCHER_ShpInst_FlowChartMerge	128
230 #define ESCHER_ShpInst_FlowChartOfflineStorage	129
231 #define ESCHER_ShpInst_FlowChartOnlineStorage	130
232 #define ESCHER_ShpInst_FlowChartMagneticTape	131
233 #define ESCHER_ShpInst_FlowChartMagneticDisk	132
234 #define ESCHER_ShpInst_FlowChartMagneticDrum	133
235 #define ESCHER_ShpInst_FlowChartDisplay	134
236 #define ESCHER_ShpInst_FlowChartDelay	135
237 #define ESCHER_ShpInst_TextPlainText	136
238 #define ESCHER_ShpInst_TextStop			137
239 #define ESCHER_ShpInst_TextTriangle		138
240 #define ESCHER_ShpInst_TextTriangleInverted	139
241 #define ESCHER_ShpInst_TextChevron		140
242 #define ESCHER_ShpInst_TextChevronInverted	141
243 #define ESCHER_ShpInst_TextRingInside	142
244 #define ESCHER_ShpInst_TextRingOutside	143
245 #define ESCHER_ShpInst_TextArchUpCurve	144
246 #define ESCHER_ShpInst_TextArchDownCurve	145
247 #define ESCHER_ShpInst_TextCircleCurve	146
248 #define ESCHER_ShpInst_TextButtonCurve	147
249 #define ESCHER_ShpInst_TextArchUpPour	148
250 #define ESCHER_ShpInst_TextArchDownPour	149
251 #define ESCHER_ShpInst_TextCirclePour	150
252 #define ESCHER_ShpInst_TextButtonPour	151
253 #define ESCHER_ShpInst_TextCurveUp		152
254 #define ESCHER_ShpInst_TextCurveDown	153
255 #define ESCHER_ShpInst_TextCascadeUp	154
256 #define ESCHER_ShpInst_TextCascadeDown	155
257 #define ESCHER_ShpInst_TextWave1		156
258 #define ESCHER_ShpInst_TextWave2		157
259 #define ESCHER_ShpInst_TextWave3		158
260 #define ESCHER_ShpInst_TextWave4		159
261 #define ESCHER_ShpInst_TextInflate		160
262 #define ESCHER_ShpInst_TextDeflate		161
263 #define ESCHER_ShpInst_TextInflateBottom	162
264 #define ESCHER_ShpInst_TextDeflateBottom	163
265 #define ESCHER_ShpInst_TextInflateTop		164
266 #define ESCHER_ShpInst_TextDeflateTop		165
267 #define ESCHER_ShpInst_TextDeflateInflate	166
268 #define ESCHER_ShpInst_TextDeflateInflateDeflate	167
269 #define ESCHER_ShpInst_TextFadeRight	168
270 #define ESCHER_ShpInst_TextFadeLeft		169
271 #define ESCHER_ShpInst_TextFadeUp		170
272 #define ESCHER_ShpInst_TextFadeDown		171
273 #define ESCHER_ShpInst_TextSlantUp		172
274 #define ESCHER_ShpInst_TextSlantDown	173
275 #define ESCHER_ShpInst_TextCanUp		174
276 #define ESCHER_ShpInst_TextCanDown		175
277 #define ESCHER_ShpInst_FlowChartAlternateProcess	176
278 #define ESCHER_ShpInst_FlowChartOffpageConnector	177
279 #define ESCHER_ShpInst_Callout90		178
280 #define ESCHER_ShpInst_AccentCallout90	179
281 #define ESCHER_ShpInst_BorderCallout90	180
282 #define ESCHER_ShpInst_AccentBorderCallout90	181
283 #define ESCHER_ShpInst_LeftRightUpArrow	182
284 #define ESCHER_ShpInst_Sun				183
285 #define ESCHER_ShpInst_Moon				184
286 #define ESCHER_ShpInst_BracketPair		185
287 #define ESCHER_ShpInst_BracePair		186
288 #define ESCHER_ShpInst_Seal4			187
289 #define ESCHER_ShpInst_DoubleWave		188
290 #define ESCHER_ShpInst_ActionButtonBlank	189
291 #define ESCHER_ShpInst_ActionButtonHome		190
292 #define ESCHER_ShpInst_ActionButtonHelp		191
293 #define ESCHER_ShpInst_ActionButtonInformation	192
294 #define ESCHER_ShpInst_ActionButtonForwardNext	193
295 #define ESCHER_ShpInst_ActionButtonBackPrevious	194
296 #define ESCHER_ShpInst_ActionButtonEnd		195
297 #define ESCHER_ShpInst_ActionButtonBeginning	196
298 #define ESCHER_ShpInst_ActionButtonReturn	197
299 #define ESCHER_ShpInst_ActionButtonDocument	198
300 #define ESCHER_ShpInst_ActionButtonSound	199
301 #define ESCHER_ShpInst_ActionButtonMovie	200
302 #define ESCHER_ShpInst_HostControl			201
303 #define ESCHER_ShpInst_TextBox				202
304 
305 #define ESCHER_ShpInst_COUNT                203
306 #define ESCHER_ShpInst_Max					0x0FFF
307 #define ESCHER_ShpInst_Nil					ESCHER_ShpInst_Max
308 
309 enum ESCHER_BlibType
310 {							// GEL provided types...
311    ERROR = 0,				// An error occurred during loading
312    UNKNOWN,					// An unknown blip type
313    EMF,						// Windows Enhanced Metafile
314    WMF,						// Windows Metafile
315    PICT,					// Macintosh PICT
316    PEG,						// JFIF
317    PNG,						// PNG
318    DIB,						// Windows DIB
319    FirstClient = 32,		// First client defined blip type
320    LastClient  = 255		// Last client defined blip type
321 };
322 
323 enum ESCHER_FillStyle
324 {
325 	ESCHER_FillSolid,		// Fill with a solid color
326 	ESCHER_FillPattern,     // Fill with a pattern (bitmap)
327 	ESCHER_FillTexture,     // A texture (pattern with its own color map)
328 	ESCHER_FillPicture,     // Center a picture in the shape
329 	ESCHER_FillShade,       // Shade from start to end points
330 	ESCHER_FillShadeCenter, // Shade from bounding rectangle to end point
331 	ESCHER_FillShadeShape,  // Shade from shape outline to end point
332 	ESCHER_FillShadeScale,
333 	ESCHER_FillShadeTitle,
334 	ESCHER_FillBackground
335 };
336 
337 enum ESCHER_wMode
338 {
339 	ESCHER_wColor,          // only used for predefined shades
340 	ESCHER_wAutomatic,      // depends on object type
341 	ESCHER_wGrayScale,      // shades of gray only
342 	ESCHER_wLightGrayScale, // shades of light gray only
343 	ESCHER_wInverseGray,    // dark gray mapped to light gray, etc.
344 	ESCHER_wGrayOutline,    // pure gray and white
345 	ESCHER_wBlackTextLine,  // black text and lines, all else grayscale
346 	ESCHER_wHighContrast,   // pure black and white mode (no grays)
347 	ESCHER_wBlack,          // solid black   msobwWhite,          // solid white
348 	ESCHER_wDontShow,       // object not drawn
349 	ESCHER_wNumModes        // number of Black and white modes
350 };
351 
352 
353 //
354 enum ESCHER_ShapePath
355 {
356 	ESCHER_ShapeLines,        // A line of straight segments
357 	ESCHER_ShapeLinesClosed,  // A closed polygonal object
358 	ESCHER_ShapeCurves,       // A line of Bezier curve segments
359 	ESCHER_ShapeCurvesClosed, // A closed shape with curved edges
360 	ESCHER_ShapeComplex      // pSegmentInfo must be non-empty
361 };
362 
363 
364 enum ESCHER_WrapMode
365 {
366 	ESCHER_WrapSquare,
367 	ESCHER_WrapByPoints,
368 	ESCHER_WrapNone,
369 	ESCHER_WrapTopBottom,
370 	ESCHER_WrapThrough
371 };
372 
373 //
374 enum ESCHER_bwMode
375 {
376 	ESCHER_bwColor,          // only used for predefined shades
377 	ESCHER_bwAutomatic,      // depends on object type
378 	ESCHER_bwGrayScale,      // shades of gray only
379 	ESCHER_bwLightGrayScale, // shades of light gray only
380 	ESCHER_bwInverseGray,    // dark gray mapped to light gray, etc.
381 	ESCHER_bwGrayOutline,    // pure gray and white
382 	ESCHER_bwBlackTextLine,  // black text and lines, all else grayscale
383 	ESCHER_bwHighContrast,   // pure black and white mode (no grays)
384 	ESCHER_bwBlack,          // solid black
385 	ESCHER_bwWhite,          // solid white
386 	ESCHER_bwDontShow,       // object not drawn
387 	ESCHER_bwNumModes        // number of Black and white modes
388 };
389 
390 
391 enum ESCHER_AnchorText
392 {
393 	ESCHER_AnchorTop,
394 	ESCHER_AnchorMiddle,
395 	ESCHER_AnchorBottom,
396 	ESCHER_AnchorTopCentered,
397 	ESCHER_AnchorMiddleCentered,
398 	ESCHER_AnchorBottomCentered,
399 	ESCHER_AnchorTopBaseline,
400 	ESCHER_AnchorBottomBaseline,
401 	ESCHER_AnchorTopCenteredBaseline,
402 	ESCHER_AnchorBottomCenteredBaseline
403 };
404 
405 enum ESCHER_cDir
406 {
407 	ESCHER_cDir0,       // Right
408 	ESCHER_cDir90,      // Down
409 	ESCHER_cDir180,     // Left
410 	ESCHER_cDir270      // Up
411 };
412 
413 //  connector style
414 enum ESCHER_cxSTYLE
415 {
416 	ESCHER_cxstyleStraight = 0,
417 	ESCHER_cxstyleBent,
418 	ESCHER_cxstyleCurved,
419 	ESCHER_cxstyleNone
420 };
421 
422 //  text flow
423 enum ESCHER_txfl
424 {
425 	ESCHER_txflHorzN,           // Horizontal non-@
426 	ESCHER_txflTtoBA,           // Top to Bottom @-font
427 	ESCHER_txflBtoT,            // Bottom to Top non-@
428 	ESCHER_txflTtoBN,           // Top to Bottom non-@
429 	ESCHER_txflHorzA,           // Horizontal @-font
430 	ESCHER_txflVertN			// Vertical, non-@
431 };
432 
433 //  text direction (needed for Bi-Di support)
434 enum ESCHER_txDir
435 {
436 	ESCHER_txdirLTR,			// left-to-right text direction
437 	ESCHER_txdirRTL,			// right-to-left text direction
438 	ESCHER_txdirContext			// context text direction
439 };
440 
441 // Callout Type
442 enum ESCHER_spcot
443 {
444 	ESCHER_spcotRightAngle = 1,
445 	ESCHER_spcotOneSegment = 2,
446 	ESCHER_spcotTwoSegment = 3,
447 	ESCHER_spcotThreeSegment = 4
448 };
449 
450 // Callout Angle
451 enum ESCHER_spcoa
452 {
453 	ESCHER_spcoaAny,
454 	ESCHER_spcoa30,
455 	ESCHER_spcoa45,
456 	ESCHER_spcoa60,
457 	ESCHER_spcoa90,
458 	ESCHER_spcoa0
459 };
460 
461 //  Callout Drop
462 enum ESCHER_spcod
463 {
464 	ESCHER_spcodTop,
465 	ESCHER_spcodCenter,
466 	ESCHER_spcodBottom,
467 	ESCHER_spcodSpecified
468 };
469 
470 // FontWork alignment
471 enum ESCHER_GeoTextAlign
472 {
473 	ESCHER_AlignTextStretch,      /* Stretch each line of text to fit width. */
474 	ESCHER_AlignTextCenter,       /* Center text on width. */
475 	ESCHER_AlignTextLeft,         /* Left justify. */
476 	ESCHER_AlignTextRight,        /* Right justify. */
477 	ESCHER_AlignTextLetterJust,   /* Spread letters out to fit width. */
478 	ESCHER_AlignTextWordJust,     /* Spread words out to fit width. */
479 	ESCHER_AlignTextInvalid       /* Invalid */
480 };
481 
482 //  flags for pictures
483 enum ESCHER_BlipFlags
484 {
485 	ESCHER_BlipFlagDefault = 0,
486 	ESCHER_BlipFlagComment = 0,   // Blip name is a comment
487 	ESCHER_BlipFlagFile,          // Blip name is a file name
488 	ESCHER_BlipFlagURL,           // Blip name is a full URL
489 	ESCHER_BlipFlagType = 3,      // Mask to extract type
490    /* Or the following flags with any of the above. */
491 	ESCHER_BlipFlagDontSave = 4,  // A "dont" is the depression in the metal
492 							 // body work of an automobile caused when a
493 							 // cyclist violently thrusts his or her nose
494 							 // at it, thus a DontSave is another name for
495 							 // a cycle lane.
496 	ESCHER_BlipFlagDoNotSave = 4, // For those who prefer English
497 	ESCHER_BlipFlagLinkToFile = 8
498 };
499 
500 //
501 enum ESCHER_3DRenderMode
502 {
503 	ESCHER_FullRender,      // Generate a full rendering
504 	ESCHER_Wireframe,       // Generate a wireframe
505 	ESCHER_BoundingCube		// Generate a bounding cube
506 };
507 
508 //
509 enum ESCHER_xFormType
510 {
511 	ESCHER_xFormAbsolute,   // Apply transform in absolute space centered on shape
512 	ESCHER_xFormShape,      // Apply transform to shape geometry
513 	ESCHER_xFormDrawing     // Apply transform in drawing space
514 };
515 
516 //
517 enum ESCHER_ShadowType
518 {
519 	ESCHER_ShadowOffset,    // N pixel offset shadow
520 	ESCHER_ShadowDouble,    // Use second offset too
521 	ESCHER_ShadowRich,      // Rich perspective shadow (cast relative to shape)
522 	ESCHER_ShadowShape,     // Rich perspective shadow (cast in shape space)
523 	ESCHER_ShadowDrawing,   // Perspective shadow cast in drawing space
524 	ESCHER_ShadowEmbossOrEngrave
525 };
526 
527 //  - the type of a (length) measurement
528 enum ESCHER_dzType
529    {
530    ESCHER_dzTypeMin          = 0,
531    ESCHER_dzTypeDefault      = 0,  // Default size, ignore the values
532    ESCHER_dzTypeA            = 1,  // Values are in EMUs
533    ESCHER_dzTypeV            = 2,  // Values are in pixels
534    ESCHER_dzTypeShape        = 3,  // Values are 16.16 fractions of shape size
535    ESCHER_dzTypeFixedAspect  = 4,  // Aspect ratio is fixed
536    ESCHER_dzTypeAFixed       = 5,  // EMUs, fixed aspect ratio
537    ESCHER_dzTypeVFixed       = 6,  // Pixels, fixed aspect ratio
538    ESCHER_dzTypeShapeFixed   = 7,  // Proportion of shape, fixed aspect ratio
539    ESCHER_dzTypeFixedAspectEnlarge= 8,  // Aspect ratio is fixed, favor larger size
540    ESCHER_dzTypeAFixedBig    = 9,  // EMUs, fixed aspect ratio
541    ESCHER_dzTypeVFixedBig    = 10, // Pixels, fixed aspect ratio
542    ESCHER_dzTypeShapeFixedBig= 11, // Proportion of shape, fixed aspect ratio
543    ESCHER_dzTypeMax         = 11
544 };
545 
546 // how to interpret the colors in a shaded fill.
547 enum ESCHER_ShadeType
548 {
549 	ESCHER_ShadeNone  = 0,        // Interpolate without correction between RGBs
550 	ESCHER_ShadeGamma = 1,        // Apply gamma correction to colors
551 	ESCHER_ShadeSigma = 2,        // Apply a sigma transfer function to position
552 	ESCHER_ShadeBand  = 4,        // Add a flat band at the start of the shade
553 	ESCHER_ShadeOneColor = 8,     // This is a one color shade
554 
555    /* A parameter for the band or sigma function can be stored in the top
556 	  16 bits of the value - this is a proportion of *each* band of the
557 	  shade to make flat (or the approximate equal value for a sigma
558 	  function).  NOTE: the parameter is not used for the sigma function,
559 	  instead a built in value is used.  This value should not be changed
560 	  from the default! */
561 	ESCHER_ShadeParameterShift = 16,
562 	ESCHER_ShadeParameterMask  = 0xffff0000,
563 
564 	ESCHER_ShadeDefault = (ESCHER_ShadeGamma|ESCHER_ShadeSigma|
565 					 (16384<<ESCHER_ShadeParameterShift))
566 };
567 
568 // compound line style
569 enum ESCHER_LineStyle
570 {
571 	ESCHER_LineSimple,            // Single line (of width lineWidth)
572 	ESCHER_LineDouble,            // Double lines of equal width
573 	ESCHER_LineThickThin,         // Double lines, one thick, one thin
574 	ESCHER_LineThinThick,         // Double lines, reverse order
575 	ESCHER_LineTriple             // Three lines, thin, thick, thin
576 };
577 
578 //  how to "fill" the line contour
579 enum ESCHER_LineType
580 {
581    ESCHER_lineSolidType,         // Fill with a solid color
582    ESCHER_linePattern,           // Fill with a pattern (bitmap)
583    ESCHER_lineTexture,           // A texture (pattern with its own color map)
584    ESCHER_linePicture            // Center a picture in the shape
585 };
586 
587 // dashed line style
588 enum ESCHER_LineDashing
589 {
590 	ESCHER_LineSolid,              // Solid (continuous) pen
591 	ESCHER_LineDashSys,            // PS_DASH system   dash style
592 	ESCHER_LineDotSys,             // PS_DOT system   dash style
593 	ESCHER_LineDashDotSys,         // PS_DASHDOT system dash style
594 	ESCHER_LineDashDotDotSys,      // PS_DASHDOTDOT system dash style
595 	ESCHER_LineDotGEL,             // square dot style
596 	ESCHER_LineDashGEL,            // dash style
597 	ESCHER_LineLongDashGEL,        // long dash style
598 	ESCHER_LineDashDotGEL,         // dash short dash
599 	ESCHER_LineLongDashDotGEL,     // long dash short dash
600 	ESCHER_LineLongDashDotDotGEL   // long dash short dash short dash
601 };
602 
603 // line end effect
604 enum ESCHER_LineEnd
605 {
606 	ESCHER_LineNoEnd,
607 	ESCHER_LineArrowEnd,
608 	ESCHER_LineArrowStealthEnd,
609 	ESCHER_LineArrowDiamondEnd,
610 	ESCHER_LineArrowOvalEnd,
611 	ESCHER_LineArrowOpenEnd
612 };
613 
614 // size of arrowhead
615 enum ESCHER_LineWidth
616 {
617 	ESCHER_LineNarrowArrow,
618 	ESCHER_LineMediumWidthArrow,
619 	ESCHER_LineWideArrow
620 };
621 
622 // size of arrowhead
623 enum ESCHER_LineEndLenght
624 {
625 	ESCHER_LineShortArrow,
626 	ESCHER_LineMediumLenArrow,
627 	ESCHER_LineLongArrow
628 };
629 
630 // line join style.
631 enum ESCHER_LineJoin
632 {
633 	ESCHER_LineJoinBevel,     // Join edges by a straight line
634 	ESCHER_LineJoinMiter,     // Extend edges until they join
635 	ESCHER_LineJoinRound      // Draw an arc between the two edges
636 };
637 
638 // line cap style (applies to ends of dash segments too).
639 enum ESCHER_LineCap
640 {
641 	ESCHER_LineEndCapRound,   // Rounded ends - the default
642 	ESCHER_LineEndCapSquare,  // Square protrudes by half line width
643 	ESCHER_LineEndCapFlat     // Line ends at end point
644 };
645 // Shape Properties
646 // 1pt = 12700 EMU (English Metric Units)
647 // 1pt = 20 Twip = 20/1440" = 1/72"
648 // 1twip=635 EMU
649 // 1" = 12700*72 = 914400 EMU
650 // 1" = 25.4mm
651 // 1mm = 36000 EMU
652 // Transform
653 #define ESCHER_Prop_Rotation                      4  /*  Fixed Point 16.16 degrees                  */
654 // Protection
655 #define ESCHER_Prop_LockRotation                119  /*  sal_Bool              No rotation                         */
656 #define ESCHER_Prop_LockAspectRatio             120  /*  sal_Bool              Don't allow changes in aspect ratio */
657 #define ESCHER_Prop_LockPosition                121  /*  sal_Bool              Don't allow the shape to be moved   */
658 #define ESCHER_Prop_LockAgainstSelect           122  /*  sal_Bool              Shape may not be selected           */
659 #define ESCHER_Prop_LockCropping                123  /*  sal_Bool              No cropping this shape              */
660 #define ESCHER_Prop_LockVertices                124  /*  sal_Bool              Edit Points not allowed             */
661 #define ESCHER_Prop_LockText                    125  /*  sal_Bool              Do not edit text                    */
662 #define ESCHER_Prop_LockAdjustHandles           126  /*  sal_Bool              Do not adjust                       */
663 #define ESCHER_Prop_LockAgainstGrouping         127  /*  sal_Bool              Do not group this shape             */
664 // Text
665 #define ESCHER_Prop_lTxid                       128  /*  LONG              id for the text, value determined by the host            */
666 #define ESCHER_Prop_dxTextLeft                  129  /*  LONG              margins relative to shape's inscribed                    */
667 #define ESCHER_Prop_dyTextTop                   130  /*  LONG                text rectangle (in EMUs)                               */
668 #define ESCHER_Prop_dxTextRight                 131  /*  LONG                                                                       */
669 #define ESCHER_Prop_dyTextBottom                132  /*  LONG                                                                       */
670 #define ESCHER_Prop_WrapText                    133  /*  MSOWRAPMODE       Wrap text at shape margins                               */
671 #define ESCHER_Prop_scaleText                   134  /*  LONG              Text zoom/scale (used if fFitTextToShape)                */
672 #define ESCHER_Prop_AnchorText                  135  /*  ESCHER_AnchorText How to anchor the text                                   */
673 #define ESCHER_Prop_txflTextFlow                136  /*  MSOTXFL           Text flow                                                */
674 #define ESCHER_Prop_cdirFont                    137  /*  MSOCDIR           Font rotation                                            */
675 #define ESCHER_Prop_hspNext                     138  /*  MSOHSP            ID of the next shape (used by Word for linked textboxes) */
676 #define ESCHER_Prop_txdir                       139  /*  MSOTXDIR          Bi-Di Text direction                                     */
677 #define ESCHER_Prop_SelectText                  187  /*  sal_Bool              sal_True if single click selects text, sal_False if two clicks   */
678 #define ESCHER_Prop_AutoTextMargin              188  /*  sal_Bool              use host's margin calculations                           */
679 #define ESCHER_Prop_RotateText                  189  /*  sal_Bool              Rotate text with shape                                   */
680 #define ESCHER_Prop_FitShapeToText              190  /*  sal_Bool              Size shape to fit text size                              */
681 #define ESCHER_Prop_FitTextToShape              191  /*  sal_Bool              Size text to fit shape size                              */
682 // GeoText
683 #define ESCHER_Prop_gtextUNICODE                192  /*  WCHAR*            UNICODE text string       */
684 #define ESCHER_Prop_gtextRTF                    193  /*  char*             RTF text string           */
685 #define ESCHER_Prop_gtextAlign                  194  /*  MSOGEOTEXTALIGN   alignment on curve        */
686 #define ESCHER_Prop_gtextSize                   195  /*  LONG              default point size        */
687 #define ESCHER_Prop_gtextSpacing                196  /*  LONG              fixed point 16.16         */
688 #define ESCHER_Prop_gtextFont                   197  /*  WCHAR*            font family name          */
689 #define ESCHER_Prop_gtextFReverseRows           240  /*  sal_Bool              Reverse row order         */
690 #define ESCHER_Prop_fGtext                      241  /*  sal_Bool              Has text effect           */
691 #define ESCHER_Prop_gtextFVertical              242  /*  sal_Bool              Rotate characters         */
692 #define ESCHER_Prop_gtextFKern                  243  /*  sal_Bool              Kern characters           */
693 #define ESCHER_Prop_gtextFTight                 244  /*  sal_Bool              Tightening or tracking    */
694 #define ESCHER_Prop_gtextFStretch               245  /*  sal_Bool              Stretch to fit shape      */
695 #define ESCHER_Prop_gtextFShrinkFit             246  /*  sal_Bool              Char bounding box         */
696 #define ESCHER_Prop_gtextFBestFit               247  /*  sal_Bool              Scale text-on-path        */
697 #define ESCHER_Prop_gtextFNormalize             248  /*  sal_Bool              Stretch char height       */
698 #define ESCHER_Prop_gtextFDxMeasure             249  /*  sal_Bool              Do not measure along path */
699 #define ESCHER_Prop_gtextFBold                  250  /*  sal_Bool              Bold font                 */
700 #define ESCHER_Prop_gtextFItalic                251  /*  sal_Bool              Italic font               */
701 #define ESCHER_Prop_gtextFUnderline             252  /*  sal_Bool              Underline font            */
702 #define ESCHER_Prop_gtextFShadow                253  /*  sal_Bool              Shadow font               */
703 #define ESCHER_Prop_gtextFSmallcaps             254  /*  sal_Bool              Small caps font           */
704 #define ESCHER_Prop_gtextFStrikethrough         255  /*  sal_Bool              Strike through font       */
705 // Blip
706 #define ESCHER_Prop_cropFromTop                 256  /*  LONG              16.16 fraction times total                          */
707 #define ESCHER_Prop_cropFromBottom				257  /*  LONG                image width or height,                            */
708 #define ESCHER_Prop_cropFromLeft                258  /*  LONG                as appropriate.                                   */
709 #define ESCHER_Prop_cropFromRight               259  /*  LONG                                                                  */
710 #define ESCHER_Prop_pib                         260  /*  IMsoBlip*         Blip to display                                     */
711 #define ESCHER_Prop_pibName                     261  /*  WCHAR*            Blip file name                                      */
712 #define ESCHER_Prop_pibFlags                    262  /*  MSOBLIPFLAGS      Blip flags                                          */
713 #define ESCHER_Prop_pictureTransparent          263  /*  LONG              transparent color (none if ~0UL)                    */
714 #define ESCHER_Prop_pictureContrast             264  /*  LONG              contrast setting                                    */
715 #define ESCHER_Prop_pictureBrightness           265  /*  LONG              brightness setting                                  */
716 #define ESCHER_Prop_pictureGamma                266  /*  LONG              16.16 gamma                                         */
717 #define ESCHER_Prop_pictureId                   267  /*  LONG              Host-defined ID for OLE objects (usually a pointer) */
718 #define ESCHER_Prop_pictureDblCrMod             268  /*  MSOCLR            Modification used if shape has double shadow        */
719 #define ESCHER_Prop_pictureFillCrMod            269  /*  MSOCLR                                                                */
720 #define ESCHER_Prop_pictureLineCrMod            270  /*  MSOCLR                                                                */
721 #define ESCHER_Prop_pibPrint                    271  /*  IMsoBlip*         Blip to display when printing                       */
722 #define ESCHER_Prop_pibPrintName                272  /*  WCHAR*            Blip file name                                      */
723 #define ESCHER_Prop_pibPrintFlags               273  /*  MSOBLIPFLAGS      Blip flags                                          */
724 #define ESCHER_Prop_fNoHitTestPicture           316  /*  sal_Bool              Do not hit test the picture                         */
725 #define ESCHER_Prop_pictureGray                 317  /*  sal_Bool              grayscale display                                   */
726 #define ESCHER_Prop_pictureBiLevel              318  /*  sal_Bool              bi-level display                                    */
727 #define ESCHER_Prop_pictureActive               319  /*  sal_Bool              Server is active (OLE objects only)                 */
728 // Geometry
729 #define ESCHER_Prop_geoLeft                     320  /*  LONG              Defines the G (geometry) coordinate space.  */
730 #define ESCHER_Prop_geoTop                      321  /*  LONG                                                          */
731 #define ESCHER_Prop_geoRight                    322  /*  LONG                                                          */
732 #define ESCHER_Prop_geoBottom                   323  /*  LONG                                                          */
733 #define ESCHER_Prop_shapePath                   324  /*  MSOSHAPEPATH                                                  */
734 #define ESCHER_Prop_pVertices                   325  /*  IMsoArray         An array of points, in G units.             */
735 #define ESCHER_Prop_pSegmentInfo                326  /*  IMsoArray                                                     */
736 #define ESCHER_Prop_adjustValue                 327  /*  LONG              Adjustment values corresponding to          */
737 #define ESCHER_Prop_adjust2Value                328  /*  LONG                the positions of the adjust handles       */
738 #define ESCHER_Prop_adjust3Value                329  /*  LONG                of the shape. The number of values        */
739 #define ESCHER_Prop_adjust4Value                330  /*  LONG                used and their allowable ranges vary      */
740 #define ESCHER_Prop_adjust5Value                331  /*  LONG                from shape type to shape type.            */
741 #define ESCHER_Prop_adjust6Value                332  /*  LONG                                                          */
742 #define ESCHER_Prop_adjust7Value                333  /*  LONG                                                          */
743 #define ESCHER_Prop_adjust8Value                334  /*  LONG                                                          */
744 #define ESCHER_Prop_adjust9Value                335  /*  LONG                                                          */
745 #define ESCHER_Prop_adjust10Value               336  /*  LONG                                                          */
746 #define ESCHER_Prop_fShadowOK                   378  /*  sal_Bool              Shadow may be set                           */
747 #define ESCHER_Prop_f3DOK                       379  /*  sal_Bool              3D may be set                               */
748 #define ESCHER_Prop_fLineOK                     380  /*  sal_Bool              Line style may be set                       */
749 #define ESCHER_Prop_fGtextOK                    381  /*  sal_Bool              Text effect (FontWork) supported             */
750 #define ESCHER_Prop_fFillShadeShapeOK           382  /*  sal_Bool                                                          */
751 #define ESCHER_Prop_fFillOK                     383  /*  sal_Bool              OK to fill the shape through the UI or VBA? */
752 // FillStyle
753 #define ESCHER_Prop_fillType                    384  /*  ESCHER_FillStyle  Type of fill                                  */
754 #define ESCHER_Prop_fillColor                   385  /*  MSOCLR            Foreground color                              */
755 #define ESCHER_Prop_fillOpacity                 386  /*  LONG              Fixed 16.16                                   */
756 #define ESCHER_Prop_fillBackColor               387  /*  MSOCLR            Background color                              */
757 #define ESCHER_Prop_fillBackOpacity             388  /*  LONG              Shades only                                   */
758 #define ESCHER_Prop_fillCrMod                   389  /*  MSOCLR            Modification for BW views                     */
759 #define ESCHER_Prop_fillBlip                    390  /*  IMsoBlip*         Pattern/texture                               */
760 #define ESCHER_Prop_fillBlipName                391  /*  WCHAR*            Blip file name                                */
761 #define ESCHER_Prop_fillBlipFlags               392  /*  MSOBLIPFLAGS      Blip flags                                    */
762 #define ESCHER_Prop_fillWidth                   393  /*  LONG              How big (A units) to make a metafile texture. */
763 #define ESCHER_Prop_fillHeight                  394  /*  LONG                                                            */
764 #define ESCHER_Prop_fillAngle                   395  /*  LONG              Fade angle - degrees in 16.16                 */
765 #define ESCHER_Prop_fillFocus                   396  /*  LONG              Linear shaded fill focus percent              */
766 #define ESCHER_Prop_fillToLeft                  397  /*  LONG              Fraction 16.16                                */
767 #define ESCHER_Prop_fillToTop                   398  /*  LONG              Fraction 16.16                                */
768 #define ESCHER_Prop_fillToRight                 399  /*  LONG              Fraction 16.16                                */
769 #define ESCHER_Prop_fillToBottom                400  /*  LONG              Fraction 16.16                                */
770 #define ESCHER_Prop_fillRectLeft                401  /*  LONG              For shaded fills, use the specified rectangle */
771 #define ESCHER_Prop_fillRectTop                 402  /*  LONG                instead of the shape's bounding rect to     */
772 #define ESCHER_Prop_fillRectRight               403  /*  LONG                define how large the fade is going to be.   */
773 #define ESCHER_Prop_fillRectBottom              404  /*  LONG                                                            */
774 #define ESCHER_Prop_fillDztype                  405  /*  MSODZTYPE                                                       */
775 #define ESCHER_Prop_fillShadePreset             406  /*  LONG              Special shades                                */
776 #define ESCHER_Prop_fillShadeColors             407  /*  IMsoArray         a preset array of colors                      */
777 #define ESCHER_Prop_fillOriginX                 408  /*  LONG                                                            */
778 #define ESCHER_Prop_fillOriginY                 409  /*  LONG                                                            */
779 #define ESCHER_Prop_fillShapeOriginX            410  /*  LONG                                                            */
780 #define ESCHER_Prop_fillShapeOriginY            411  /*  LONG                                                            */
781 #define ESCHER_Prop_fillShadeType               412  /*  MSOSHADETYPE      Type of shading, if a shaded (gradient) fill. */
782 #define ESCHER_Prop_fFilled                     443  /*  sal_Bool              Is shape filled?                              */
783 #define ESCHER_Prop_fHitTestFill                444  /*  sal_Bool              Should we hit test fill?                      */
784 #define ESCHER_Prop_fillShape                   445  /*  sal_Bool              Register pattern on shape                     */
785 #define ESCHER_Prop_fillUseRect                 446  /*  sal_Bool              Use the large rect?                           */
786 #define ESCHER_Prop_fNoFillHitTest              447  /*  sal_Bool              Hit test a shape as though filled             */
787 // LineStyle
788 #define ESCHER_Prop_lineColor                   448  /*  MSOCLR            Color of line                              */
789 #define ESCHER_Prop_lineOpacity                 449  /*  LONG              Not implemented                            */
790 #define ESCHER_Prop_lineBackColor               450  /*  MSOCLR            Background color                           */
791 #define ESCHER_Prop_lineCrMod                   451  /*  MSOCLR            Modification for BW views                  */
792 #define ESCHER_Prop_lineType                    452  /*  MSOLINETYPE       Type of line                               */
793 #define ESCHER_Prop_lineFillBlip                453  /*  IMsoBlip*         Pattern/texture                            */
794 #define ESCHER_Prop_lineFillBlipName            454  /*  WCHAR*            Blip file name                             */
795 #define ESCHER_Prop_lineFillBlipFlags           455  /*  MSOBLIPFLAGS      Blip flags                                 */
796 #define ESCHER_Prop_lineFillWidth               456  /*  LONG              How big (A units) to make                  */
797 #define ESCHER_Prop_lineFillHeight              457  /*  LONG                a metafile texture.                      */
798 #define ESCHER_Prop_lineFillDztype              458  /*  MSODZTYPE         How to interpret fillWidth/Height numbers. */
799 #define ESCHER_Prop_lineWidth                   459  /*  LONG              A units; 1pt == 12700 EMUs                 */
800 #define ESCHER_Prop_lineMiterLimit              460  /*  LONG              ratio (16.16) of width                     */
801 #define ESCHER_Prop_lineStyle                   461  /*  MSOLINESTYLE      Draw parallel lines?                       */
802 #define ESCHER_Prop_lineDashing                 462  /*  MSOLINEDASHING    Can be overridden by:                      */
803 #define ESCHER_Prop_lineDashStyle               463  /*  IMsoArray         As Win32 ExtCreatePen                      */
804 #define ESCHER_Prop_lineStartArrowhead          464  /*  MSOLINEEND        Arrow at start                             */
805 #define ESCHER_Prop_lineEndArrowhead            465  /*  MSOLINEEND        Arrow at end                               */
806 #define ESCHER_Prop_lineStartArrowWidth         466  /*  MSOLINEENDWIDTH   Arrow at start                             */
807 #define ESCHER_Prop_lineStartArrowLength        467  /*  MSOLINEENDLENGTH  Arrow at end                               */
808 #define ESCHER_Prop_lineEndArrowWidth           468  /*  MSOLINEENDWIDTH   Arrow at start                             */
809 #define ESCHER_Prop_lineEndArrowLength          469  /*  MSOLINEENDLENGTH  Arrow at end                               */
810 #define ESCHER_Prop_lineJoinStyle               470  /*  MSOLINEJOIN       How to join lines                          */
811 #define ESCHER_Prop_lineEndCapStyle             471  /*  MSOLINECAP        How to end lines                           */
812 #define ESCHER_Prop_fArrowheadsOK               507  /*  sal_Bool              Allow arrowheads if prop. is set           */
813 #define ESCHER_Prop_fLine                       508  /*  sal_Bool              Any line?                                  */
814 #define ESCHER_Prop_fHitTestLine                509  /*  sal_Bool              Should we hit test lines?                  */
815 #define ESCHER_Prop_lineFillShape               510  /*  sal_Bool              Register pattern on shape                  */
816 #define ESCHER_Prop_fNoLineDrawDash             511  /*  sal_Bool              Draw a dashed line if no line              */
817 // ShadowStyle
818 #define ESCHER_Prop_shadowType                  512  /*  MSOSHADOWTYPE     Type of effect            */
819 #define ESCHER_Prop_shadowColor                 513  /*  MSOCLR            Foreground color          */
820 #define ESCHER_Prop_shadowHighlight             514  /*  MSOCLR            Embossed color            */
821 #define ESCHER_Prop_shadowCrMod                 515  /*  MSOCLR            Modification for BW views */
822 #define ESCHER_Prop_shadowOpacity               516  /*  LONG              Fixed 16.16               */
823 #define ESCHER_Prop_shadowOffsetX               517  /*  LONG              Offset shadow             */
824 #define ESCHER_Prop_shadowOffsetY               518  /*  LONG              Offset shadow             */
825 #define ESCHER_Prop_shadowSecondOffsetX         519  /*  LONG              Double offset shadow      */
826 #define ESCHER_Prop_shadowSecondOffsetY         520  /*  LONG              Double offset shadow      */
827 #define ESCHER_Prop_shadowScaleXToX             521  /*  LONG              16.16                     */
828 #define ESCHER_Prop_shadowScaleYToX             522  /*  LONG              16.16                     */
829 #define ESCHER_Prop_shadowScaleXToY             523  /*  LONG              16.16                     */
830 #define ESCHER_Prop_shadowScaleYToY             524  /*  LONG              16.16                     */
831 #define ESCHER_Prop_shadowPerspectiveX          525  /*  LONG              16.16 / weight            */
832 #define ESCHER_Prop_shadowPerspectiveY          526  /*  LONG              16.16 / weight            */
833 #define ESCHER_Prop_shadowWeight                527  /*  LONG              scaling factor            */
834 #define ESCHER_Prop_shadowOriginX               528  /*  LONG                                        */
835 #define ESCHER_Prop_shadowOriginY               529  /*  LONG                                        */
836 #define ESCHER_Prop_fShadow                     574  /*  sal_Bool              Any shadow?               */
837 #define ESCHER_Prop_fshadowObscured             575  /*  sal_Bool              Excel5-style shadow       */
838 // PerspectiveStyle
839 #define ESCHER_Prop_perspectiveType             576  /*  MSOXFORMTYPE      Where transform applies        */
840 #define ESCHER_Prop_perspectiveOffsetX          577  /*  LONG              The LONG values define a       */
841 #define ESCHER_Prop_perspectiveOffsetY          578  /*  LONG                transformation matrix,       */
842 #define ESCHER_Prop_perspectiveScaleXToX        579  /*  LONG                effectively, each value      */
843 #define ESCHER_Prop_perspectiveScaleYToX        580  /*  LONG                is scaled by the             */
844 #define ESCHER_Prop_perspectiveScaleXToY        581  /*  LONG                perspectiveWeight parameter. */
845 #define ESCHER_Prop_perspectiveScaleYToY        582  /*  LONG                                             */
846 #define ESCHER_Prop_perspectivePerspectiveX     583  /*  LONG                                             */
847 #define ESCHER_Prop_perspectivePerspectiveY     584  /*  LONG                                             */
848 #define ESCHER_Prop_perspectiveWeight           585  /*  LONG              Scaling factor                 */
849 #define ESCHER_Prop_perspectiveOriginX          586  /*  LONG                                             */
850 #define ESCHER_Prop_perspectiveOriginY          587  /*  LONG                                             */
851 #define ESCHER_Prop_fPerspective                639  /*  sal_Bool              On/off                         */
852 // 3D Object
853 #define ESCHER_Prop_c3DSpecularAmt              640  /*  LONG         Fixed-point 16.16                                                                                                   */
854 #define ESCHER_Prop_c3DDiffuseAmt               641  /*  LONG         Fixed-point 16.16                                                                                                   */
855 #define ESCHER_Prop_c3DShininess                642  /*  LONG         Default gives OK results                                                                                            */
856 #define ESCHER_Prop_c3DEdgeThickness            643  /*  LONG         Specular edge thickness                                                                                             */
857 #define ESCHER_Prop_c3DExtrudeForward           644  /*  LONG         Distance of extrusion in EMUs                                                                                       */
858 #define ESCHER_Prop_c3DExtrudeBackward          645  /*  LONG                                                                                                                             */
859 #define ESCHER_Prop_c3DExtrudePlane             646  /*  LONG         Extrusion direction                                                                                                 */
860 #define ESCHER_Prop_c3DExtrusionColor           647  /*  MSOCLR       Basic color of extruded part of shape; the lighting model used will determine the exact shades used when rendering. */
861 #define ESCHER_Prop_c3DCrMod                    648  /*  MSOCLR       Modification for BW views                                                                                           */
862 #define ESCHER_Prop_f3D                         700  /*  sal_Bool         Does this shape have a 3D effect?                                                                                   */
863 #define ESCHER_Prop_fc3DMetallic                701  /*  sal_Bool         Use metallic specularity?                                                                                           */
864 #define ESCHER_Prop_fc3DUseExtrusionColor       702  /*  sal_Bool                                                                                                                             */
865 #define ESCHER_Prop_fc3DLightFace               703  /*  sal_Bool                                                                                                                             */
866 // 3D Style
867 #define ESCHER_Prop_c3DYRotationAngle           704  /*  LONG            degrees (16.16) about y axis         */
868 #define ESCHER_Prop_c3DXRotationAngle           705  /*  LONG            degrees (16.16) about x axis         */
869 #define ESCHER_Prop_c3DRotationAxisX            706  /*  LONG            These specify the rotation axis;     */
870 #define ESCHER_Prop_c3DRotationAxisY            707  /*  LONG              only their relative magnitudes     */
871 #define ESCHER_Prop_c3DRotationAxisZ            708  /*  LONG              matter.                            */
872 #define ESCHER_Prop_c3DRotationAngle            709  /*  LONG            degrees (16.16) about axis           */
873 #define ESCHER_Prop_c3DRotationCenterX          710  /*  LONG            rotation center x (16.16 or g-units) */
874 #define ESCHER_Prop_c3DRotationCenterY          711  /*  LONG            rotation center y (16.16 or g-units) */
875 #define ESCHER_Prop_c3DRotationCenterZ          712  /*  LONG            rotation center z (absolute (emus))  */
876 #define ESCHER_Prop_c3DRenderMode               713  /*  MSO3DRENDERMODE Full,wireframe, or bcube             */
877 #define ESCHER_Prop_c3DTolerance                714  /*  LONG            pixels (16.16)                       */
878 #define ESCHER_Prop_c3DXViewpoint               715  /*  LONG            X view point (emus)                  */
879 #define ESCHER_Prop_c3DYViewpoint               716  /*  LONG            Y view point (emus)                  */
880 #define ESCHER_Prop_c3DZViewpoint               717  /*  LONG            Z view distance (emus)               */
881 #define ESCHER_Prop_c3DOriginX                  718  /*  LONG                                                 */
882 #define ESCHER_Prop_c3DOriginY                  719  /*  LONG                                                 */
883 #define ESCHER_Prop_c3DSkewAngle                720  /*  LONG            degree (16.16) skew angle            */
884 #define ESCHER_Prop_c3DSkewAmount               721  /*  LONG            Percentage skew amount               */
885 #define ESCHER_Prop_c3DAmbientIntensity         722  /*  LONG            Fixed point intensity                */
886 #define ESCHER_Prop_c3DKeyX                     723  /*  LONG            Key light source direc-              */
887 #define ESCHER_Prop_c3DKeyY                     724  /*  LONG            tion; only their relative            */
888 #define ESCHER_Prop_c3DKeyZ                     725  /*  LONG            magnitudes matter                    */
889 #define ESCHER_Prop_c3DKeyIntensity             726  /*  LONG            Fixed point intensity                */
890 #define ESCHER_Prop_c3DFillX                    727  /*  LONG            Fill light source direc-             */
891 #define ESCHER_Prop_c3DFillY                    728  /*  LONG            tion; only their relative            */
892 #define ESCHER_Prop_c3DFillZ                    729  /*  LONG            magnitudes matter                    */
893 #define ESCHER_Prop_c3DFillIntensity            730  /*  LONG            Fixed point intensity                */
894 #define ESCHER_Prop_fc3DConstrainRotation       763  /*  sal_Bool                                                 */
895 #define ESCHER_Prop_fc3DRotationCenterAuto      764  /*  sal_Bool                                                 */
896 #define ESCHER_Prop_fc3DParallel                765  /*  sal_Bool            Parallel projection?                 */
897 #define ESCHER_Prop_fc3DKeyHarsh                766  /*  sal_Bool            Is key lighting harsh?               */
898 #define ESCHER_Prop_fc3DFillHarsh               767  /*  sal_Bool            Is fill lighting harsh?              */
899 // Shape
900 #define ESCHER_Prop_hspMaster                   769  /*  MSOHSP          master shape                                        */
901 #define ESCHER_Prop_cxstyle                     771  /*  MSOCXSTYLE      Type of connector                                   */
902 #define ESCHER_Prop_bWMode                      772  /*  ESCHERwMode     Settings for modifications to                       */
903 #define ESCHER_Prop_bWModePureBW                773  /*  ESCHERwMode	 be made when in different                         */
904 #define ESCHER_Prop_bWModeBW                    774  /*  ESCHERwMode	 forms of black-and-white mode.                    */
905 #define ESCHER_Prop_fOleIcon                    826  /*  sal_Bool            For OLE objects, whether the object is in icon form */
906 #define ESCHER_Prop_fPreferRelativeResize       827  /*  sal_Bool            For UI only. Prefer relative resizing.              */
907 #define ESCHER_Prop_fLockShapeType              828  /*  sal_Bool            Lock the shape type (don't allow Change Shape)      */
908 #define ESCHER_Prop_fDeleteAttachedObject       830  /*  sal_Bool                                                                */
909 #define ESCHER_Prop_fBackground                 831  /*  sal_Bool            If sal_True, this is the background shape.              */
910 // Callout
911 #define ESCHER_Prop_spcot                       832  /*  MSOSPCOT        Callout type                                           */
912 #define ESCHER_Prop_dxyCalloutGap               833  /*  LONG            Distance from box to first point.(EMUs)                */
913 #define ESCHER_Prop_spcoa                       834  /*  MSOSPCOA        Callout angle                                          */
914 #define ESCHER_Prop_spcod                       835  /*  MSOSPCOD        Callout drop type                                      */
915 #define ESCHER_Prop_dxyCalloutDropSpecified     836  /*  LONG            if msospcodSpecified, the actual drop distance         */
916 #define ESCHER_Prop_dxyCalloutLengthSpecified   837  /*  LONG            if fCalloutLengthSpecified, the actual distance        */
917 #define ESCHER_Prop_fCallout                    889  /*  sal_Bool            Is the shape a callout?                                */
918 #define ESCHER_Prop_fCalloutAccentBar           890  /*  sal_Bool            does callout have accent bar                           */
919 #define ESCHER_Prop_fCalloutTextBorder          891  /*  sal_Bool            does callout have a text border                        */
920 #define ESCHER_Prop_fCalloutMinusX              892  /*  sal_Bool                                                                   */
921 #define ESCHER_Prop_fCalloutMinusY              893  /*  sal_Bool                                                                   */
922 #define ESCHER_Prop_fCalloutDropAuto            894  /*  sal_Bool            If true, then we occasionally invert the drop distance */
923 #define ESCHER_Prop_fCalloutLengthSpecified     895  /*  sal_Bool            if true, we look at dxyCalloutLengthSpecified          */
924 // GroupShape
925 #define ESCHER_Prop_wzName                      896  /*  WCHAR*          Shape Name (present only if explicitly set)                                                            */
926 #define ESCHER_Prop_wzDescription               897  /*  WCHAR*          alternate text                                                                                         */
927 #define ESCHER_Prop_pihlShape                   898  /*  IHlink*         The hyperlink in the shape.                                                                            */
928 #define ESCHER_Prop_pWrapPolygonVertices        899  /*  IMsoArray       The polygon that text will be wrapped around (Word)                                                    */
929 #define ESCHER_Prop_dxWrapDistLeft              900  /*  LONG            Left wrapping distance from text (Word)                                                                */
930 #define ESCHER_Prop_dyWrapDistTop               901  /*  LONG            Top wrapping distance from text (Word)                                                                 */
931 #define ESCHER_Prop_dxWrapDistRight             902  /*  LONG            Right wrapping distance from text (Word)                                                               */
932 #define ESCHER_Prop_dyWrapDistBottom            903  /*  LONG            Bottom wrapping distance from text (Word)                                                              */
933 #define ESCHER_Prop_lidRegroup                  904  /*  LONG            Regroup ID                                                                                             */
934 #define ESCHER_Prop_tableProperties				927
935 #define ESCHER_Prop_tableRowProperties			928
936 #define ESCHER_Prop_fEditedWrap                 953  /*  sal_Bool            Has the wrap polygon been edited?                                                                      */
937 #define ESCHER_Prop_fBehindDocument             954  /*  sal_Bool            Word-only (shape is behind text)                                                                       */
938 #define ESCHER_Prop_fOnDblClickNotify           955  /*  sal_Bool            Notify client on a double click                                                                        */
939 #define ESCHER_Prop_fIsButton                   956  /*  sal_Bool            A button shape (i.e., clicking performs an action). Set for shapes with attached hyperlinks or macros. */
940 #define ESCHER_Prop_fOneD                       957  /*  sal_Bool            1D adjustment                                                                                          */
941 #define ESCHER_Prop_fHidden                     958  /*  sal_Bool            Do not display                                                                                         */
942 #define ESCHER_Prop_fPrint                      959  /*  sal_Bool            Print this shape                                                                                       */
943 
944 #define ESCHER_PERSISTENTRY_PREALLOCATE		64
945 
946 #define ESCHER_Persist_PrivateEntry			0x80000000
947 #define ESCHER_Persist_Dgg					0x00010000
948 #define ESCHER_Persist_Dg					0x00020000
949 #define ESCHER_Persist_CurrentPosition		0x00040000
950 #define ESCHER_Persist_Grouping_Snap		0x00050000
951 #define ESCHER_Persist_Grouping_Logic		0x00060000
952 
953 const sal_uInt32 DFF_DGG_CLUSTER_SIZE       = 0x00000400;   /// Shape IDs per cluster in DGG atom.
954 
955 // ---------------------------------------------------------------------------------------------
956 
957 namespace com { namespace sun { namespace star {
958 	namespace awt {
959 		struct Gradient;
960 	}
961 	namespace drawing {
962 		struct EnhancedCustomShapeAdjustmentValue;
963 		class XShape;
964         class XShapes;
965 	}
966 }}}
967 
968 struct MSFILTER_DLLPUBLIC EscherConnectorListEntry
969 {
970 	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape	>	mXConnector;
971 	::com::sun::star::awt::Point			maPointA;
972 	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape	>	mXConnectToA;
973 	::com::sun::star::awt::Point			maPointB;
974 	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape	>	mXConnectToB;
975 
976 	sal_uInt32		GetConnectorRule( sal_Bool bFirst );
977 
EscherConnectorListEntryEscherConnectorListEntry978 					EscherConnectorListEntry( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rC,
979 										const ::com::sun::star::awt::Point& rPA,
980 										::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rSA ,
981 										const ::com::sun::star::awt::Point& rPB,
982 										::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rSB ) :
983 											mXConnector	( rC ),
984 											maPointA	( rPA ),
985 											mXConnectToA( rSA ),
986 											maPointB	( rPB ),
987 											mXConnectToB( rSB ) {}
988 
989 	sal_uInt32		GetClosestPoint( const Polygon& rPoly, const ::com::sun::star::awt::Point& rP );
990 };
991 
992 struct MSFILTER_DLLPUBLIC EscherExContainer
993 {
994 	sal_uInt32	nContPos;
995 	SvStream&	rStrm;
996 
997 	EscherExContainer( SvStream& rSt, const sal_uInt16 nRecType, const sal_uInt16 nInstance = 0 );
998 	~EscherExContainer();
999 };
1000 struct MSFILTER_DLLPUBLIC EscherExAtom
1001 {
1002 	sal_uInt32	nContPos;
1003 	SvStream&	rStrm;
1004 
1005 	EscherExAtom( SvStream& rSt, const sal_uInt16 nRecType, const sal_uInt16 nInstance = 0, const sal_uInt8 nVersion = 0 );
1006 	~EscherExAtom();
1007 };
1008 
1009 struct EscherPropertyValueHelper
1010 {
1011 		static sal_Bool GetPropertyValue(
1012 				::com::sun::star::uno::Any& rAny,
1013 					const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > &,
1014 						const String& rPropertyName,
1015 							sal_Bool bTestPropertyAvailability = sal_False );
1016 
1017 		static ::com::sun::star::beans::PropertyState GetPropertyState(
1018 					const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > &,
1019 						const String& rPropertyName );
1020 };
1021 
1022 // ---------------------------------------------------------------------------------------------
1023 
1024 struct EscherPersistEntry
1025 {
1026 	sal_uInt32	mnID;
1027 	sal_uInt32	mnOffset;
EscherPersistEntryEscherPersistEntry1028 			EscherPersistEntry( sal_uInt32 nId, sal_uInt32 nOffset ) { mnID = nId; mnOffset = nOffset; };
1029 
1030 };
1031 
1032 // ---------------------------------------------------------------------------------------------
1033 
1034 class EscherBlibEntry
1035 {
1036 
1037 		friend class EscherGraphicProvider;
1038 		friend class EscherEx;
1039 
1040 	protected:
1041 
1042 		sal_uInt32			mnIdentifier[ 4 ];
1043 		sal_uInt32			mnPictureOffset;		// offset auf die grafik im PictureStreams
1044 		sal_uInt32			mnSize;					// size of real graphic
1045 
1046 		sal_uInt32			mnRefCount;				// !! reference count
1047 		sal_uInt32			mnSizeExtra;			// !! size of preceding header
1048 
1049 		ESCHER_BlibType	meBlibType;
1050 
1051 		Size			maPrefSize;
1052 		MapMode			maPrefMapMode;
1053 
1054 		sal_Bool		mbIsEmpty;
1055 		sal_Bool		mbIsNativeGraphicPossible;
1056 
1057 	public:
1058 
1059 						EscherBlibEntry( sal_uInt32 nPictureOffset, const GraphicObject& rObj,
1060 												const ByteString& rId, const GraphicAttr* pAttr = NULL );
1061 
1062 						~EscherBlibEntry();
1063 
1064 		void			WriteBlibEntry( SvStream& rSt, sal_Bool bWritePictureOffset, sal_uInt32 nResize = 0 );
IsEmpty() const1065 		sal_Bool		IsEmpty() const { return mbIsEmpty; };
1066 
1067 		sal_Bool			operator==( const EscherBlibEntry& ) const;
1068 };
1069 
1070 // ---------------------------------------------------------------------------------------------
1071 
1072 #define _E_GRAPH_PROV_USE_INSTANCES				1
1073 #define _E_GRAPH_PROV_DO_NOT_ROTATE_METAFILES	2
1074 
1075 class MSFILTER_DLLPUBLIC EscherGraphicProvider
1076 {
1077 		sal_uInt32				mnFlags;
1078 
1079 		EscherBlibEntry**		mpBlibEntrys;
1080 		sal_uInt32				mnBlibBufSize;
1081 		sal_uInt32				mnBlibEntrys;
1082 
1083 		rtl::OUString			maBaseURI;
1084 
1085 	protected :
1086 
1087 		sal_uInt32					ImplInsertBlib( EscherBlibEntry* p_EscherBlibEntry );
1088 
1089 	public :
1090 
1091 		sal_uInt32	GetBlibStoreContainerSize( SvStream* pMergePicStreamBSE = NULL ) const;
1092 		void		WriteBlibStoreContainer( SvStream& rStrm, SvStream* pMergePicStreamBSE = NULL  );
1093 		sal_Bool WriteBlibStoreEntry(SvStream& rStrm, sal_uInt32 nBlipId,
1094             sal_Bool bWritePictureOffset, sal_uInt32 nResize = 0);
1095 		sal_uInt32	GetBlibID( SvStream& rPicOutStream, const ByteString& rGraphicId, const Rectangle& rBoundRect,
1096 					const com::sun::star::awt::Rectangle* pVisArea = NULL, const GraphicAttr* pGrafikAttr = NULL );
HasGraphics() const1097 		sal_Bool	HasGraphics() const { return mnBlibEntrys != 0; };
1098 
1099 		void		SetNewBlipStreamOffset( sal_Int32 nOffset );
1100 
1101 		sal_Bool	GetPrefSize( const sal_uInt32 nBlibId, Size& rSize, MapMode& rMapMode );
1102 
SetBaseURI(const rtl::OUString & rBaseURI)1103 		void		SetBaseURI( const rtl::OUString& rBaseURI ) { maBaseURI = rBaseURI; };
GetBaseURI()1104 		const rtl::OUString& GetBaseURI(){ return maBaseURI; };
1105 
1106 		EscherGraphicProvider( sal_uInt32 nFlags = _E_GRAPH_PROV_DO_NOT_ROTATE_METAFILES );
1107 		~EscherGraphicProvider();
1108 
1109 };
1110 
1111 class MSFILTER_DLLPUBLIC EscherSolverContainer
1112 {
1113 	List				maShapeList;
1114 	List				maConnectorList;
1115 
1116 public:
1117 
1118 	sal_uInt32			GetShapeId( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rShape ) const;
1119 
1120 	void				AddShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > &, sal_uInt32 nId );
1121 	void				AddConnector( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > &,
1122 										const ::com::sun::star::awt::Point& rA,
1123 									::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > &,
1124 										const ::com::sun::star::awt::Point& rB,
1125 									::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rConB );
1126 
1127 	void				WriteSolver( SvStream& );
1128 
EscherSolverContainer()1129 						EscherSolverContainer(){};
1130 						~EscherSolverContainer();
1131 };
1132 
1133 // ---------------------------------------------------------------------------------------------
1134 
1135 #define ESCHER_CREATEPOLYGON_LINE			1
1136 #define ESCHER_CREATEPOLYGON_POLYLINE		2
1137 #define ESCHER_CREATEPOLYGON_POLYPOLYGON	4
1138 
1139 class GraphicAttr;
1140 class SdrObjCustomShape;
1141 
1142 struct EscherPropSortStruct
1143 {
1144 	sal_uInt8*	pBuf;
1145 	sal_uInt32	nPropSize;
1146 	sal_uInt32	nPropValue;
1147 	sal_uInt16	nPropId;
1148 };
1149 
1150 typedef std::vector< EscherPropSortStruct > EscherProperties;
1151 
1152 class MSFILTER_DLLPUBLIC EscherPropertyContainer
1153 {
1154 		EscherGraphicProvider*	pGraphicProvider;
1155 		SvStream*				pPicOutStrm;
1156 		Rectangle*				pShapeBoundRect;
1157 
1158 		EscherPropSortStruct*	pSortStruct;
1159 
1160 		sal_uInt32				nSortCount;
1161 		sal_uInt32				nSortBufSize;
1162 		sal_uInt32				nCountCount;
1163 		sal_uInt32				nCountSize;
1164 
1165 		sal_Bool				bHasComplexData;
1166 
1167 		sal_uInt32	ImplGetColor( const sal_uInt32 rColor, sal_Bool bSwap = sal_True );
1168 		void		ImplCreateGraphicAttributes( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
1169 													sal_uInt32 nBlibId, sal_Bool bCreateCroppingAttributes );
1170         sal_Bool    ImplCreateEmbeddedBmp( const ByteString& rUniqueId );
1171 		void		ImplInit();
1172 
1173 	public :
1174 
1175 		EscherPropertyContainer();
1176 		EscherPropertyContainer(
1177 			EscherGraphicProvider& rGraphicProvider,	// the PropertyContainer needs to know
1178 					SvStream* pPicOutStrm,				// the GraphicProvider to be able to write
1179 						Rectangle& rShapeBoundRect );	// FillBitmaps or GraphicObjects.
1180 														// under some cirumstances the ShapeBoundRect is adjusted
1181 														// this will happen when rotated GraphicObjects
1182 														// are saved to PowerPoint
1183 		~EscherPropertyContainer();
1184 
1185 		void		AddOpt( sal_uInt16 nPropertyID, const rtl::OUString& rString );
1186 
1187 		void		AddOpt( sal_uInt16 nPropertyID, sal_uInt32 nPropValue,
1188 							sal_Bool bBlib = sal_False );
1189 
1190 		void		AddOpt( sal_uInt16 nPropertyID, sal_Bool bBlib, sal_uInt32 nPropValue,
1191 							sal_uInt8* pProp, sal_uInt32 nPropSize );
1192 
1193 		sal_Bool	GetOpt( sal_uInt16 nPropertyID, sal_uInt32& rPropValue ) const;
1194 
1195 		sal_Bool	GetOpt( sal_uInt16 nPropertyID, EscherPropSortStruct& rPropValue ) const;
1196 
1197 		EscherProperties GetOpts() const;
1198 
1199 		void		Commit( SvStream& rSt, sal_uInt16 nVersion = 3, sal_uInt16 nRecType = ESCHER_OPT );
1200 
1201 		sal_Bool	CreateShapeProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape );
1202         sal_Bool    CreateOLEGraphicProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXOleObject );
1203 
1204 		sal_Bool	CreateGraphicProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape,
1205 			const GraphicObject& rGraphicObj );
1206 		sal_Bool	CreateMediaGraphicProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXMediaObject );
1207         /** Creates a complex ESCHER_Prop_fillBlip containing the BLIP directly (for Excel charts). */
1208         sal_Bool    CreateEmbeddedBitmapProperties( const ::rtl::OUString& rBitmapUrl,
1209                         ::com::sun::star::drawing::BitmapMode eBitmapMode );
1210         /** Creates a complex ESCHER_Prop_fillBlip containing a hatch style (for Excel charts). */
1211         sal_Bool    CreateEmbeddedHatchProperties( const ::com::sun::star::drawing::Hatch& rHatch,
1212                         const Color& rBackColor, bool bFillBackground );
1213 
1214 					// the GraphicProperties will only be created if a GraphicProvider and PicOutStrm is known
1215                     // DR: #99897# if no GraphicProvider is present, a complex ESCHER_Prop_fillBlip
1216                     //             will be created, containing the BLIP directly (e.g. for Excel charts).
1217 		sal_Bool	CreateGraphicProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
1218 						const String& rSource, const sal_Bool bCreateFillBitmap, const sal_Bool bCreateCroppingAttributes = sal_False,
1219 							const sal_Bool bFillBitmapModeAllowed = sal_True );
1220 		sal_Bool   CreateBlipPropertiesforOLEControl( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape);
1221 		sal_Bool	CreatePolygonProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
1222 						sal_uInt32 nFlags, sal_Bool bBezier, ::com::sun::star::awt::Rectangle& rGeoRect, Polygon* pPolygon = NULL );
1223 
1224 		static sal_uInt32 GetGradientColor( const ::com::sun::star::awt::Gradient* pGradient, sal_uInt32 nStartColor );
1225 
1226         void        CreateGradientProperties( const ::com::sun::star::awt::Gradient & rGradient );
1227 		void		CreateGradientProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & , sal_Bool bTransparentGradient = sal_False );
1228 		void		CreateLineProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > &, sal_Bool bEdge );
1229 		void		CreateFillProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > &, sal_Bool bEdge , sal_Bool bTransparentGradient = sal_False );
1230 		void		CreateFillProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > &, sal_Bool bEdge ,  const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape );
1231 		void		CreateTextProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > &, sal_uInt32 nText,
1232 						const sal_Bool bIsCustomShape = sal_False, const sal_Bool bIsTextFrame = sal_True );
1233 
1234 		sal_Bool	CreateConnectorProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape,
1235 												EscherSolverContainer& rSolver, ::com::sun::star::awt::Rectangle& rGeoRect,
1236 													sal_uInt16& rShapeType, sal_uInt16& rShapeFlags );
1237 
1238 					// Because shadow properties depends to the line and fillstyle, the CreateShadowProperties method should be called at last.
1239 					// It activ only when at least a FillStyle or LineStyle is set.
1240 		sal_Bool	CreateShadowProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & );
1241 
1242 		sal_Int32	GetValueForEnhancedCustomShapeParameter( const ::com::sun::star::drawing::EnhancedCustomShapeParameter& rParameter,
1243 							const std::vector< sal_Int32 >& rEquationOrder, sal_Bool bAdjustTrans = sal_False );
1244 		// creates all necessary CustomShape properties, this includes also Text-, Shadow-, Fill-, and LineProperties
1245 		void		CreateCustomShapeProperties( const MSO_SPT eShapeType, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & );
1246 		sal_Bool	IsFontWork() const;
1247 
1248         // helper functions which are also used by the escher import
1249         static PolyPolygon GetPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape );
1250 		static PolyPolygon GetPolyPolygon( const ::com::sun::star::uno::Any& rSource );
1251         static MSO_SPT GetCustomShapeType( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape, sal_uInt32& nMirrorFlags );
1252 		static MSO_SPT GetCustomShapeType( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape, sal_uInt32& nMirrorFlags, rtl::OUString& rShapeType );
1253 
1254 	// helper functions which are also used in ooxml export
1255 	static sal_Bool GetLineArrow( const sal_Bool bLineStart,
1256 				      const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
1257 				      ESCHER_LineEnd& reLineEnd, sal_Int32& rnArrowLength, sal_Int32& rnArrowWidth );
1258 	static sal_Bool IsDefaultObject( SdrObjCustomShape* pCustoShape, const MSO_SPT eShapeType );
1259 	static void LookForPolarHandles( const MSO_SPT eShapeType, sal_Int32& nAdjustmentsWhichNeedsToBeConverted );
1260 	static sal_Bool GetAdjustmentValue( const com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue & rkProp, sal_Int32 nIndex, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, sal_Int32& nValue );
1261 };
1262 
1263 // ---------------------------------------------------------------------------------------------
1264 
1265 class MSFILTER_DLLPUBLIC EscherPersistTable
1266 {
1267 
1268 	public:
1269 		List	maPersistTable;
1270 
1271 		sal_Bool	PtIsID( sal_uInt32 nID );
1272 		void	PtInsert( sal_uInt32 nID, sal_uInt32 nOfs );
1273 		sal_uInt32	PtDelete( sal_uInt32 nID );
1274 		sal_uInt32	PtGetOffsetByID( sal_uInt32 nID );
1275 		sal_uInt32	PtReplace( sal_uInt32 nID, sal_uInt32 nOfs );
1276 		sal_uInt32	PtReplaceOrInsert( sal_uInt32 nID, sal_uInt32 nOfs );
PtGetCount() const1277 		sal_uInt32	PtGetCount() const { return maPersistTable.Count(); };
1278 
1279 				EscherPersistTable();
1280 		virtual	~EscherPersistTable();
1281 };
1282 
1283 // ---------------------------------------------------------------------------------------------
1284 
1285 class EscherEx;
1286 
1287 /// abstract base class for ESCHER_ClientTextbox, ESCHER_ClientData
1288 class MSFILTER_DLLPUBLIC EscherExClientRecord_Base
1289 {
1290 public:
EscherExClientRecord_Base()1291 								EscherExClientRecord_Base() {}
1292 	virtual						~EscherExClientRecord_Base();
1293 
1294 								/// Application writes the record header
1295 								/// using rEx.AddAtom(...) followed by
1296 								/// record data written to rEx.GetStream()
1297 	virtual	void				WriteData( EscherEx& rEx ) const = 0;
1298 };
1299 
1300 
1301 /// abstract base class for ESCHER_ClientAnchor
1302 class MSFILTER_DLLPUBLIC EscherExClientAnchor_Base
1303 {
1304 public:
EscherExClientAnchor_Base()1305 								EscherExClientAnchor_Base() {}
1306 	virtual						~EscherExClientAnchor_Base();
1307 
1308 								/// Application writes the record header
1309 								/// using rEx.AddAtom(...) followed by
1310 								/// record data written to rEx.GetStream()
1311 	virtual	void				WriteData( EscherEx& rEx,
1312 									const Rectangle& rRect ) = 0;
1313 };
1314 
1315 
1316 class EscherExHostAppData
1317 {
1318 private:
1319 		EscherExClientAnchor_Base*	pClientAnchor;
1320 		EscherExClientRecord_Base*	pClientData;
1321 		EscherExClientRecord_Base*	pClientTextbox;
1322 		// ignore single shape if entire pages are written
1323 		sal_Bool						bDontWriteShape;
1324 
1325 public:
EscherExHostAppData()1326 		EscherExHostAppData() : pClientAnchor(0), pClientData(0),
1327 								pClientTextbox(0), bDontWriteShape(sal_False)
1328 		{}
1329 
SetClientAnchor(EscherExClientAnchor_Base * p)1330 		void SetClientAnchor( EscherExClientAnchor_Base* p )
1331 			{ pClientAnchor = p; }
SetClientData(EscherExClientRecord_Base * p)1332 		void SetClientData( EscherExClientRecord_Base* p )
1333 			{ pClientData = p; }
SetClientTextbox(EscherExClientRecord_Base * p)1334 		void SetClientTextbox( EscherExClientRecord_Base* p )
1335 			{ pClientTextbox = p; }
SetDontWriteShape(sal_Bool b)1336 		void SetDontWriteShape( sal_Bool b )
1337 			{ bDontWriteShape = b; }
GetClientAnchor() const1338 		EscherExClientAnchor_Base* GetClientAnchor() const
1339 			{ return pClientAnchor; }
GetClientData() const1340 		EscherExClientRecord_Base* GetClientData() const
1341 			{ return pClientData; }
GetClientTextbox() const1342 		EscherExClientRecord_Base* GetClientTextbox() const
1343 			{ return pClientTextbox; }
1344 
WriteClientAnchor(EscherEx & rEx,const Rectangle & rRect)1345 		void WriteClientAnchor( EscherEx& rEx, const Rectangle& rRect )
1346 			{ if( pClientAnchor ) 	pClientAnchor->WriteData( rEx, rRect ); }
WriteClientData(EscherEx & rEx)1347 		void WriteClientData( EscherEx& rEx )
1348 			{ if( pClientData ) 	pClientData->WriteData( rEx ); }
WriteClientTextbox(EscherEx & rEx)1349 		void WriteClientTextbox( EscherEx& rEx )
1350 			{ if( pClientTextbox ) 	pClientTextbox->WriteData( rEx ); }
1351 
DontWriteShape() const1352 		sal_Bool DontWriteShape() const { return bDontWriteShape; }
1353 };
1354 
1355 
1356 // ============================================================================
1357 
1358 /** Instance for global DFF data, shared through various instances of EscherEx. */
1359 class MSFILTER_DLLPUBLIC EscherExGlobal : public EscherGraphicProvider
1360 {
1361 public:
1362     explicit            EscherExGlobal( sal_uInt32 nGraphicProvFlags = _E_GRAPH_PROV_DO_NOT_ROTATE_METAFILES );
1363     virtual             ~EscherExGlobal();
1364 
1365     /** Returns a new drawing ID for a new drawing container (DGCONTAINER). */
1366     sal_uInt32          GenerateDrawingId();
1367     /** Creates and returns a new shape identifier, updates the internal shape
1368         counters and registers the identifier in the DGG cluster table.
1369         @param nDrawingId  Drawing identifier has to be passed to be able to
1370             generate shape identifiers for multiple drawings simultaniously. */
1371     sal_uInt32          GenerateShapeId( sal_uInt32 nDrawingId, bool bIsInSpgr );
1372     /** Returns the number of shapes in the current drawing, based on number of
1373         calls to the GenerateShapeId() function. */
1374     sal_uInt32          GetDrawingShapeCount( sal_uInt32 nDrawingId ) const;
1375     /** Returns the last shape identifier generated by the GenerateShapeId()
1376         function. */
1377     sal_uInt32          GetLastShapeId( sal_uInt32 nDrawingId ) const;
1378 
1379     /** Sets the flag indicating that the DGGCONTAINER exists. */
SetDggContainer()1380     inline void         SetDggContainer() { mbHasDggCont = true; }
1381     /** Sets the flag indicating that the DGGCONTAINER exists. */
HasDggContainer() const1382     inline bool         HasDggContainer() const { return mbHasDggCont; }
1383     /** Returns the total size of the DGG atom (including header). */
1384     sal_uInt32          GetDggAtomSize() const;
1385     /** Writes the complete DGG atom to the passed stream (overwrites existing data!). */
1386     void                WriteDggAtom( SvStream& rStrm ) const;
1387 
1388     /** Called if a picture shall be written and no picture stream is set at
1389         class ImplEscherExSdr.
1390 
1391         On first invokation, this function calls the virtual member function
1392         ImplQueryPictureStream(). The return value will be cached internally
1393         for subsequent calls and for the GetPictureStream() function.
1394      */
1395     SvStream*           QueryPictureStream();
1396 
1397     /** Returns the picture stream if existing (queried), otherwise null. */
GetPictureStream()1398     inline SvStream*    GetPictureStream() { return mpPicStrm; }
1399 
1400 private:
1401     /** Derived classes may implement to create a new stream used to store the
1402         picture data.
1403 
1404         The implementation has to take care about lifetime of the returned
1405         stream (it will not be destructed automatically). This function is
1406         called exactly once. The return value will be cached internally for
1407         repeated calls of the public QueryPictureStream() function.
1408      */
1409     virtual SvStream*   ImplQueryPictureStream();
1410 
1411 private:
1412     struct ClusterEntry
1413     {
1414         sal_uInt32          mnDrawingId;        /// Identifier of drawing this cluster belongs to (one-based index into maDrawingInfos).
1415         sal_uInt32          mnNextShapeId;      /// Next free shape identifier in this cluster.
ClusterEntryEscherExGlobal::ClusterEntry1416         inline explicit     ClusterEntry( sal_uInt32 nDrawingId ) : mnDrawingId( nDrawingId ), mnNextShapeId( 0 ) {}
1417     };
1418     typedef ::std::vector< ClusterEntry > ClusterTable;
1419 
1420     struct DrawingInfo
1421     {
1422         sal_uInt32          mnClusterId;        /// Currently used cluster (one-based index into maClusterTable).
1423         sal_uInt32          mnShapeCount;       /// Current number of shapes in this drawing.
1424         sal_uInt32          mnLastShapeId;      /// Last shape identifier generated for this drawing.
DrawingInfoEscherExGlobal::DrawingInfo1425         inline explicit     DrawingInfo( sal_uInt32 nClusterId ) : mnClusterId( nClusterId ), mnShapeCount( 0 ), mnLastShapeId( 0 ) {}
1426     };
1427     typedef ::std::vector< DrawingInfo > DrawingInfoVector;
1428 
1429     ClusterTable        maClusterTable;     /// List with cluster IDs (used object IDs in drawings).
1430     DrawingInfoVector   maDrawingInfos;     /// Data about all used drawings.
1431     SvStream*           mpPicStrm;          /// Cached result of ImplQueryPictureStream().
1432     bool                mbHasDggCont;       /// True = the DGGCONTAINER has been initialized.
1433     bool                mbPicStrmQueried;   /// True = ImplQueryPictureStream() has been called.
1434 };
1435 
1436 typedef ::boost::shared_ptr< EscherExGlobal > EscherExGlobalRef;
1437 
1438 // ---------------------------------------------------------------------------------------------
1439 
1440 class SdrObject;
1441 class SdrPage;
1442 class ImplEscherExSdr;
1443 
1444 class MSFILTER_DLLPUBLIC EscherEx : public EscherPersistTable
1445 {
1446     protected:
1447         typedef ::std::auto_ptr< ImplEscherExSdr > ImplEscherExSdrPtr;
1448 
1449         EscherExGlobalRef			mxGlobal;
1450         ImplEscherExSdrPtr			mpImplEscherExSdr;
1451 		SvStream*					mpOutStrm;
1452 		sal_uInt32					mnStrmStartOfs;
1453 		std::vector< sal_uInt32 >	mOffsets;
1454 		std::vector< sal_uInt16 >	mRecTypes;
1455 
1456 		sal_uInt32					mnCurrentDg;
1457 		sal_uInt32					mnCountOfs;
1458 
1459 		sal_uInt32					mnGroupLevel;
1460 		sal_uInt16					mnHellLayerId;
1461 
1462 		sal_Bool					mbEscherSpgr;
1463 		sal_Bool					mbEscherDg;
1464 		sal_Bool					mbOleEmf;					// OLE is EMF instead of WMF
1465 
1466 
1467 		virtual sal_Bool DoSeek( sal_uInt32 nKey );
1468 
1469 public:
1470     explicit            EscherEx( const EscherExGlobalRef& rxGlobal, SvStream& rOutStrm );
1471     virtual             ~EscherEx();
1472 
1473     /** Creates and returns a new shape identifier, updates the internal shape
1474         counters and registers the identifier in the DGG cluster table. */
GenerateShapeId()1475     inline sal_uInt32   GenerateShapeId() { return mxGlobal->GenerateShapeId( mnCurrentDg, mbEscherSpgr ); }
1476 
1477     /** Returns the graphic provider from the global object that has been
1478         passed to the constructor.
1479      */
1480     inline EscherGraphicProvider&
GetGraphicProvider()1481                         GetGraphicProvider() { return *mxGlobal; }
1482 
1483     /** Called if a picture shall be written and no picture stream is set at
1484         class ImplEscherExSdr.
1485      */
QueryPictureStream()1486     inline SvStream*    QueryPictureStream() { return mxGlobal->QueryPictureStream(); }
1487 
1488 				/// Fuegt in den EscherStream interne Daten ein, dieser Vorgang
1489 				/// darf und muss nur einmal ausgefuehrt werden.
1490 				/// Wenn pPicStreamMergeBSE angegeben ist, werden die BLIPs
1491 				/// aus diesem Stream in die MsofbtBSE Records des EscherStream
1492 				/// gemerged, wie es fuer Excel (und Word?) benoetigt wird.
1493 		virtual void Flush( SvStream* pPicStreamMergeBSE = NULL );
1494 
1495     /** Inserts the passed number of bytes at the current position of the
1496         output stream.
1497 
1498         Inserts dummy bytes and moves all following stream data, and updates
1499         all internal stream offsets stored in the PersistTable and the affected
1500         container sizes, which makes this operation very expensive. (!)
1501 
1502         @param nBytes  The number of bytes to be inserted into the stream.
1503 
1504         @param bExpandEndOfAtom  If set to true, an atom that currently ends
1505             exactly at the current stream position will be expanded to include
1506             the inserted data. If set to false, an atom that currently ends
1507             exactly at the current stream position will not be expanded to
1508             include the inserted data (used to insert e.g. a new atom after an
1509             existing atom). Note that containers that end exactly at the
1510             current stream position are always expanded to include the inserted
1511             data.
1512      */
1513     void                InsertAtCurrentPos( sal_uInt32 nBytes, bool bExpandEndOfAtom );
1514 
1515 		void	InsertPersistOffset( sal_uInt32 nKey, sal_uInt32 nOffset );	// Es wird nicht geprueft, ob sich jener schluessel schon in der PersistantTable befindet
1516         void    ReplacePersistOffset( sal_uInt32 nKey, sal_uInt32 nOffset );
1517         sal_uInt32  GetPersistOffset( sal_uInt32 nKey );
1518 		sal_Bool	SeekToPersistOffset( sal_uInt32 nKey );
1519 		virtual sal_Bool InsertAtPersistOffset( sal_uInt32 nKey, sal_uInt32 nValue );// nValue wird im Stream an entrsprechender Stelle eingefuegt(overwrite modus), ohne dass sich die
1520 																	// aktuelle StreamPosition aendert
1521 
GetStream() const1522 		SvStream&	GetStream() const	{ return *mpOutStrm; }
GetStreamPos() const1523 		sal_uLong	GetStreamPos() const	{ return mpOutStrm->Tell(); }
1524 
1525 		virtual sal_Bool SeekBehindRecHeader( sal_uInt16 nRecType );				// der stream muss vor einem gueltigen Record Header oder Atom stehen
1526 
1527 				// features beim erzeugen folgender Container:
1528 				//
1529 				//		ESCHER_DggContainer:	ein EscherDgg Atom wird automatisch erzeugt und verwaltet
1530 				//		ESCHER_DgContainer:		ein EscherDg Atom wird automatisch erzeugt und verwaltet
1531 				//		ESCHER_SpgrContainer:
1532 				//		ESCHER_SpContainer:
1533 
1534 		virtual void OpenContainer( sal_uInt16 nEscherContainer, int nRecInstance = 0 );
1535 		virtual void CloseContainer();
1536 
1537 		virtual void BeginAtom();
1538 		virtual void EndAtom( sal_uInt16 nRecType, int nRecVersion = 0, int nRecInstance = 0 );
1539 		virtual void AddAtom( sal_uInt32 nAtomSitze, sal_uInt16 nRecType, int nRecVersion = 0, int nRecInstance = 0 );
1540 		virtual void AddChildAnchor( const Rectangle& rRectangle );
1541 		virtual void AddClientAnchor( const Rectangle& rRectangle );
1542 
1543 		virtual sal_uInt32 EnterGroup( const String& rShapeName, const Rectangle* pBoundRect = 0 );
1544 		sal_uInt32	EnterGroup( const Rectangle* pBoundRect = NULL );
GetGroupLevel() const1545 		sal_uInt32	GetGroupLevel() const { return mnGroupLevel; };
1546 		virtual sal_Bool SetGroupSnapRect( sal_uInt32 nGroupLevel, const Rectangle& rRect );
1547 		virtual sal_Bool SetGroupLogicRect( sal_uInt32 nGroupLevel, const Rectangle& rRect );
1548 		virtual void LeaveGroup();
1549 
1550 				// ein ESCHER_Sp wird geschrieben ( Ein ESCHER_DgContainer muss dazu geoeffnet sein !!)
1551 		virtual void AddShape( sal_uInt32 nShpInstance, sal_uInt32 nFlagIds, sal_uInt32 nShapeID = 0 );
1552 
1553 		virtual void Commit( EscherPropertyContainer& rProps, const Rectangle& rRect );
1554 
1555 		sal_uInt32	GetColor( const sal_uInt32 nColor, sal_Bool bSwap = sal_True );
1556 		sal_uInt32	GetColor( const Color& rColor, sal_Bool bSwap = sal_True );
1557 
1558 				// ...Sdr... implemented in eschesdo.cxx
1559 
1560 		void	AddSdrPage( const SdrPage& rPage );
1561         void    AddUnoShapes( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes );
1562 
1563 				/// returns the ShapeID
1564 		sal_uInt32	AddSdrObject( const SdrObject& rObj );
1565 
1566 				/// If objects are written through AddSdrObject the
1567 				/// SolverContainer has to be written, and maybe some
1568 				/// maintenance to be done.
1569 		void	EndSdrObjectPage();
1570 
1571 				/// Called before a shape is written, application supplies
1572 				/// ClientRecords. May set AppData::bDontWriteShape so the
1573 				/// shape is ignored.
1574     virtual EscherExHostAppData* StartShape(
1575                             const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rShape,
1576                             const Rectangle* pChildAnchor );
1577 
1578 				/// Called after a shape is written to inform the application
1579 				/// of the resulted shape type and ID.
1580 	virtual	void	EndShape( sal_uInt16 nShapeType, sal_uInt32 nShapeID );
1581 
1582 				/// Called before an AdditionalText EnterGroup occurs.
1583 				/// The current shape will be written in three parts:
1584 				/// a group shape, the shape itself, and an extra textbox shape.
1585 				/// The complete flow is:
1586 				/// StartShape sets HostData1.
1587 				/// EnterAdditionalTextGroup sets HostData2, App may modify
1588 				///   HostData1 and keep track of the change.
1589 				/// The group shape is written with HostData2.
1590 				/// Another StartShape with the same (!) object sets HostData3.
1591 				/// The current shape is written with HostData3.
1592 				/// EndShape is called for the current shape.
1593 				/// Another StartShape with the same (!) object sets HostData4.
1594 				/// The textbox shape is written with HostData4.
1595 				/// EndShape is called for the textbox shape.
1596 				/// EndShape is called for the group shape, this provides
1597 				///   the same functionality as an ordinary recursive group.
1598 	virtual	EscherExHostAppData*	EnterAdditionalTextGroup();
1599 
1600 				/// Called if an ESCHER_Prop_lTxid shall be written
1601 	virtual	sal_uInt32	QueryTextID( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >&, sal_uInt32 nShapeId );
1602 			// add an dummy rectangle shape into the escher stream
1603         sal_uInt32  AddDummyShape();
1604 
1605 	static const SdrObject* GetSdrObject( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rXShape );
1606 
SetHellLayerId(sal_uInt16 nId)1607 	void SetHellLayerId( sal_uInt16 nId )		{ mnHellLayerId = nId; }
GetHellLayerId() const1608 	sal_uInt16 GetHellLayerId() const			{ return mnHellLayerId; }
1609 
1610 private:
1611                         EscherEx( const EscherEx& );
1612     EscherEx&           operator=( const EscherEx& );
1613 
1614     // prevent C-style cast to former base class EscherGraphicProvider
1615     operator EscherGraphicProvider&();
1616     operator EscherGraphicProvider const&();
1617 };
1618 
1619 
1620 #endif
1621