00001
00027 #ifndef INC_RVC_STYLEPATTERNSYMBOL_H
00028 #define INC_RVC_STYLEPATTERNSYMBOL_H
00029
00030 #ifndef INC_RVC_STYLEPATTERNBASE_H
00031 #include <rvc/stylepatternbase.h>
00032 #endif
00033
00034 #ifndef INC_MI32_MG2ENUMS_H
00035 #include <mi32/mg2enums.h>
00036 #endif
00037
00038 #ifndef GENERATING_DOXYGEN_OUTPUT
00039 class MISTRING;
00040 class PLANECONIC;
00041 class POLYLINE;
00042 class POLYLINELIST;
00043 class SUBREGION2D;
00044 struct TEXTSTYLE;
00045 #endif // GENERATING_DOXYGEN_OUTPUT
00046
00047 namespace RVC {
00048
00050 class STYLEPATTERN_SYMBOL : public STYLEPATTERN_BASE {
00051 public:
00052
00053 enum ELEMENT_TYPE {
00054 ELEMENT_TYPE_Null = 0,
00055 ELEMENT_TYPE_Circle = 1,
00056 ELEMENT_TYPE_Arc = 2,
00057 ELEMENT_TYPE_ArcWedge = 3,
00058 ELEMENT_TYPE_ArcChord = 4,
00059 ELEMENT_TYPE_Ellipse = 5,
00060 ELEMENT_TYPE_EArc = 6,
00061 ELEMENT_TYPE_EArcWedge = 7,
00062 ELEMENT_TYPE_EArcChord = 8,
00063 ELEMENT_TYPE_Line = 9,
00064 ELEMENT_TYPE_Polygon = 10,
00065 ELEMENT_TYPE_Point = 11,
00066 ELEMENT_TYPE_Text = 12,
00067 ELEMENT_TYPE_Segment = 13,
00068 ELEMENT_TYPE_Rectangle = 14,
00069 ELEMENT_TYPE_Polygons = 15,
00070 ELEMENT_TYPE_Splines = 16,
00071 ELEMENT_TYPE_COUNT
00072 };
00073
00074 class ITERATOR;
00075 class ELEMENT;
00076
00079 class ELEMENT_SHARED {
00080 public:
00081
00084 MGD::LINECAP GetCapStyle (
00085 ) const;
00086
00089 UINT8 GetColorIndex (
00090 ) const { return (m_pData->colornum); }
00091
00092 MGD::LINEJOIN GetJoinStyle (
00093 ) const;
00094
00097 INT16 GetThickness (
00098 ) const { return (m_pData->thickness); }
00099
00102 ELEMENT_TYPE GetType (
00103 ) const { return (static_cast<ELEMENT_TYPE>(m_pData->type)); }
00104
00107 bool IsFilled (
00108 ) const { return ((m_pData->flags & SYMBOLELEM::FLAG_Filled) != 0); }
00109
00112 bool GetPoint (
00113 DPOINT2D& point
00114 ) const;
00115
00118 bool GetPoint (
00119 FPOINT2D& point
00120 ) const;
00121
00124 bool GetPoint (
00125 WPOINT2D& point
00126 ) const;
00127
00130 bool GetPoints (
00131 POLYLINE& points
00132 ) const;
00133
00136 bool GetLines (
00137 POLYLINELIST& lines
00138 ) const;
00139
00142 bool GetLine (
00143 POLYLINE& polyline
00144 ) const;
00145
00148 bool GetPlaneConic (
00149 PLANECONIC& planeconic
00150 ) const;
00151
00154 bool GetPolygon (
00155 POLYLINE& polygon
00156 ) const;
00157
00160 bool GetSubRegion (
00161 SUBREGION2D& subregion
00162 ) const;
00163
00166 bool GetText (
00167 MISTRING& string
00168 ) const;
00169
00172 const MIUNICODE* const GetText (
00173 ) const;
00174
00177 bool GetTextStyle (
00178 TEXTSTYLE& style
00179 ) const;
00180
00181 private:
00182 #ifndef GENERATING_DOXYGEN_OUTPUT
00183 union SYMBOLDATA {
00184 struct { INT16 x, y, radius; } circle;
00185 struct { INT16 x, y, radius, sangle, eangle; } arc;
00186 struct { INT16 x, y, xsize, ysize, rotate; } ellipse;
00187 struct { INT16 x, y, xsize, ysize, sangle, eangle, rotate; } earc;
00188 struct { INT16 x, y; } point;
00189 struct { INT16 x1, y1, x2, y2; UINT16 capstyle; } segment;
00190 struct { INT16 x, y, xsize, ysize, rotate, shear; UINT16 joinstyle; } rectangle;
00191 struct { UINT16 numpoints, joinstyle, capstyle; } line;
00192 struct { UINT16 numpoints, joinstyle; } polygon;
00193 struct { UINT16 numchars, fontnum, fontstyle, flags;
00194 INT16 x, y, height, rotate, shear, textrot, xscale; } text;
00195 struct { UINT16 numpoints, joinstyle, capstyle; } spline;
00196 struct { UINT16 numpoints, joinstyle, capstyle; } ttfsymbol;
00197 struct { UINT16 numpoints, joinstyle, numpolys; } polygons;
00198 INT16 spare[12];
00199 };
00200
00202 struct SYMBOLELEM {
00203 enum FLAGS {
00204 FLAG_None = 0x0000,
00205 FLAG_Filled = 0x0001
00206 };
00207
00208 SYMBOLDATA data;
00209 UINT32 numbytes;
00210 INT16 thickness;
00211 UINT16 flags;
00212 UINT8 type;
00213 UINT8 colornum;
00214 UINT8 spare[2];
00215 };
00216
00217 const SYMBOLELEM *m_pData;
00218 void *m_pExtra;
00219
00221 ELEMENT_SHARED (
00222 ): m_pData(0), m_pExtra(0) { }
00223
00224 explicit ELEMENT_SHARED (const void *pElemData)
00225 : m_pData(static_cast<const SYMBOLELEM*>(pElemData)), m_pExtra(static_cast<UINT8*>(const_cast<void*>(pElemData)) + sizeof(SYMBOLELEM))
00226 { }
00227
00229 ~ELEMENT_SHARED (
00230 ) { }
00231
00232 friend class STYLEPATTERN_SYMBOL;
00233 friend class ITERATOR;
00234 #endif // GENERATING_DOXYGEN_OUTPUT
00235 };
00236
00238 class ITERATOR {
00239 public:
00240
00242 ITERATOR (
00243 ): m_pEnd(0) { }
00244
00246 ~ITERATOR (
00247 ) { }
00248
00250 const ELEMENT_SHARED& operator* (
00251 ) const { return (m_element); }
00252
00254 const ELEMENT_SHARED* operator-> (
00255 ) const { return (&m_element); }
00256
00258 ITERATOR& operator++ ();
00259
00261 bool operator== (
00262 const ITERATOR& rhs
00263 ) const { return ((m_pEnd == 0 && rhs.m_pEnd == 0) || m_element.m_pData == rhs.m_element.m_pData); }
00264
00266 bool operator!= (
00267 const ITERATOR& rhs
00268 ) const { return (!(*this == rhs)); }
00269
00270 private:
00271 #ifndef GENERATING_DOXYGEN_OUTPUT
00272
00273 ELEMENT_SHARED m_element;
00274 const void *m_pEnd;
00275
00276 ITERATOR (const void *pData, const void *pEnd)
00277 : m_element(pData), m_pEnd(pEnd)
00278 { }
00279
00280 friend class STYLEPATTERN_SYMBOL;
00281 #endif // GENERATING_DOXYGEN_OUTPUT
00282 };
00283
00284 STYLEPATTERN_SYMBOL (
00285 ) : STYLEPATTERN_BASE(PATTERNTYPE_Symbol, sizeof(PATTERNHEADER_SYMBOL)) {}
00286
00288 STYLEPATTERN_SYMBOL (
00289 const STYLEPATTERN_SYMBOL& rhs
00290 ) : STYLEPATTERN_BASE(rhs) {}
00291
00293 STYLEPATTERN_SYMBOL (
00294 const void* buf,
00295 INT32 NumBytes
00296 ) : STYLEPATTERN_BASE(PATTERNTYPE_Symbol, sizeof(PATTERNHEADER_SYMBOL)) {
00297 SetPattern(buf, NumBytes, sizeof(PATTERNHEADER_SYMBOL));
00298 }
00299
00301 virtual ~STYLEPATTERN_SYMBOL (
00302 ) { }
00303
00305 STYLEPATTERN_SYMBOL& operator= (
00306 const STYLEPATTERN_SYMBOL& rhs
00307 ) { if (this != &rhs) { STYLEPATTERN_BASE::operator=(rhs); } return (*this); }
00308
00310 ITERATOR Begin (
00311 ) const { return (ITERATOR(GetFirstElemPtr(),GetPattBuffer()+GetSize())); }
00312
00314 ITERATOR End (
00315 #ifdef WIN32
00316 ) const { return (ITERATOR()); }
00317 #else
00318 ) const { ITERATOR it; return (it); }
00319 #endif
00320
00321 INT16 GetHotSpotX (
00322 ) const { return (reinterpret_cast<const PATTERNHEADER_SYMBOL*>(m_PattBuff)->xhot); }
00323
00324 INT16 GetHotSpotY (
00325 ) const { return (reinterpret_cast<const PATTERNHEADER_SYMBOL*>(m_PattBuff)->yhot); }
00326
00327 INT16 GetSizeX (
00328 ) const { return (reinterpret_cast<const PATTERNHEADER_SYMBOL*>(m_PattBuff)->xsize); }
00329
00330 INT16 GetSizeY (
00331 ) const { return (reinterpret_cast<const PATTERNHEADER_SYMBOL*>(m_PattBuff)->ysize); }
00332
00333 bool ComputeSize (
00334 INT32& xsize,
00335 INT32& ysize
00336 ) const;
00337
00338 private:
00339 #ifndef GENERATING_DOXYGEN_OUTPUT
00341 struct PATTERNHEADER_SYMBOL : public STYLEPATTERN_BASE::PATTERNHEADER {
00342 enum FLAGS {
00343 FLAG_None = 0x0000,
00344 FLAG_OldSymbol = 0x8000
00345 };
00346
00347 INT16 xsize;
00348 INT16 ysize;
00349 INT16 xhot;
00350 INT16 yhot;
00351 UINT16 flags;
00352 UINT8 spare[2];
00353 };
00354 #endif // GENERATING_DOXYGEN_OUTPUT
00355
00356 };
00357
00358 }
00359
00360 #endif