00001
00030 #ifndef INC_RVC_STYLEPATTERNHATCH_H
00031 #define INC_RVC_STYLEPATTERNHATCH_H
00032
00033 #ifndef INC_RVC_STYLEPATTERNBASE_H
00034 #include <rvc/stylepatternbase.h>
00035 #endif
00036
00037 #ifndef INC_MI32_POINT_H
00038 #include <mi32/point.h>
00039 #endif
00040
00041
00042 namespace RVC {
00043
00044 #ifndef GENERATING_DOXYGEN_OUTPUT
00045 class STYLEPATTERN_LINE;
00046 #endif // GENERATING_DOXYGEN_OUTPUT
00047
00049 class STYLEPATTERN_HATCH : public STYLEPATTERN_BASE {
00050 public:
00051
00052 enum ELEMENT_TYPE {
00053 ELEMENT_TYPE_Simple = 0,
00054 ELEMENT_TYPE_LinePattern = 1,
00055 ELEMENT_TYPE_SolidFill = 2,
00056 ELEMENT_TYPE_COUNT = 3
00057 };
00058
00059 class ITERATOR;
00060 class ELEMENT;
00061
00064 class ELEMENT_SHARED {
00065 public:
00066
00069 ELEMENT_TYPE GetType (
00070 ) const { return (static_cast<ELEMENT_TYPE>(m_pData->type)); }
00071
00074 UINT8 GetColorIndex (
00075 ) const { return (m_pData->colornum); }
00076
00078 void GetLinePattern (
00079 STYLEPATTERN_LINE& pattern
00080 ) const;
00081
00083 UINT32 GetFlags (
00084 ) const { return (0); };
00085
00087 void GetOriginOffset (
00088 DPOINT2D& offset
00089 ) const { offset.x = m_pData->xoffset; offset.y = m_pData->yoffset; return; }
00090
00093 double GetSpacing (
00094 ) const { return (m_pData->spacing); }
00095
00098 double GetAngle (
00099 ) const { return (m_pData->angle); }
00100
00103 double GetThickness (
00104 ) const { return (m_pData->thickness); }
00105
00108 bool IsVisible (
00109 ) const { return (m_pData->isvisible != 0); }
00110
00111 protected:
00112
00114 struct HATCHPATTELEM {
00115 enum TYPE {
00116 TYPE_Simple = 0,
00117 TYPE_LinePattern = 1,
00118 TYPE_SolidFill = 2,
00119 TYPE_Last = 2
00120 };
00121
00122 UINT8 type;
00123 UINT8 colornum;
00124 UINT8 isvisible;
00125 UINT8 space;
00126 UINT32 linedatasize;
00127 UINT32 flags;
00128 UINT8 spare[4];
00129 DOUBLE xoffset;
00130 DOUBLE yoffset;
00131 DOUBLE spacing;
00132 DOUBLE angle;
00133 DOUBLE thickness;
00134 };
00135
00136 private:
00137 #ifndef GENERATING_DOXYGEN_OUTPUT
00138
00139 const HATCHPATTELEM *m_pData;
00140 void *m_pExtra;
00141
00143 ELEMENT_SHARED (
00144 ): m_pData(0), m_pExtra(0) { }
00145
00146 explicit ELEMENT_SHARED (const void *pElemData)
00147 : m_pData(static_cast<const HATCHPATTELEM*>(pElemData)), m_pExtra(static_cast<UINT8*>(const_cast<void*>(pElemData)) + sizeof(HATCHPATTELEM))
00148 { }
00149
00151 ~ELEMENT_SHARED (
00152 ) { }
00153
00154 friend class STYLEPATTERN_HATCH;
00155 friend class ELEMENT;
00156 friend class ITERATOR;
00157 #endif // GENERATING_DOXYGEN_OUTPUT
00158 };
00159
00161 class ELEMENT : public ELEMENT_SHARED {
00162 public:
00163
00165 ELEMENT (
00166 ) { memset(&m_MyData,0,sizeof(m_MyData)); m_pData = &m_MyData; }
00167
00169 ELEMENT (
00170 const ELEMENT& rhs
00171 );
00172
00174 ELEMENT (
00175 const ELEMENT_SHARED& rhs
00176 );
00177
00179 explicit ELEMENT (
00180 ELEMENT_TYPE type
00181 );
00182
00184 ~ELEMENT (
00185 ) { if (m_pExtra != 0) free(m_pExtra); }
00186
00188 ELEMENT& operator= (
00189 const ELEMENT& rhs
00190 );
00191
00193 ELEMENT& operator= (
00194 const ELEMENT_SHARED& rhs
00195 );
00196
00198 void SetColorIndex (
00199 UINT8 ColorNum
00200 ) { m_MyData.colornum = ColorNum; }
00201
00203 void SetLinePattern (
00204 const STYLEPATTERN_LINE& pattern
00205 );
00206
00208 void SetOriginOffset (
00209 const DPOINT2D& offset
00210 ) { m_MyData.xoffset = offset.x; m_MyData.yoffset = offset.y; }
00211
00213 void SetSpacing (
00214 double spacing
00215 ) { m_MyData.spacing = spacing; }
00216
00218 void SetAngle (
00219 double angle
00220 ) { m_MyData.angle = angle; }
00221
00223 void SetThickness (
00224 double thickness
00225 ) { m_MyData.thickness = thickness; }
00226
00227 void SetVisible (
00228 bool visible
00229 ) { m_MyData.isvisible = visible; }
00230
00231 private:
00232 #ifndef GENERATING_DOXYGEN_OUTPUT
00233 ELEMENT_SHARED::HATCHPATTELEM m_MyData;
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_HATCH;
00281 #endif // GENERATING_DOXYGEN_OUTPUT
00282 };
00283
00284 STYLEPATTERN_HATCH (
00285 ) : STYLEPATTERN_BASE(PATTERNTYPE_Hatch, sizeof(PATTERNHEADER_HATCH)) {}
00286
00288 STYLEPATTERN_HATCH (
00289 const void* buf,
00290 INT32 NumBytes
00291 ) : STYLEPATTERN_BASE(PATTERNTYPE_Hatch, sizeof(PATTERNHEADER_HATCH)) {
00292 SetPattern(buf, NumBytes, sizeof(PATTERNHEADER_HATCH));
00293 }
00294
00296 STYLEPATTERN_HATCH (
00297 const STYLEPATTERN_HATCH& rhs
00298 ) : STYLEPATTERN_BASE(rhs) {}
00299
00301 virtual ~STYLEPATTERN_HATCH (
00302 ) { }
00303
00305 STYLEPATTERN_HATCH& operator= (
00306 const STYLEPATTERN_HATCH& rhs
00307 ) { if (this != &rhs) { STYLEPATTERN_BASE::operator=(rhs); } return (*this); }
00308
00310 ITERATOR Begin (
00311 ) const { return (ITERATOR(GetFirstElemPtr(),GetPattBuffer()+GetSize())); }
00312
00315 ERRVALUE DeleteElement (
00316 unsigned idx
00317 );
00318
00320 ITERATOR End (
00321 #ifdef WIN32
00322 ) const { return (ITERATOR()); }
00323 #else
00324 ) const { ITERATOR it; return (it); }
00325 #endif
00326
00329 ELEMENT GetElement (
00330 unsigned idx
00331 ) const;
00332
00334 void LowerElement (
00335 UINT32 Element
00336 );
00337
00340 ERRVALUE InsertElement (
00341 unsigned idx,
00342 const ELEMENT& element
00343 );
00344
00346 void RaiseElement (
00347 UINT32 Element
00348 );
00349
00352 ERRVALUE SetElement (
00353 unsigned idx,
00354 const ELEMENT& element
00355 );
00356
00357 private:
00358 #ifndef GENERATING_DOXYGEN_OUTPUT
00360 struct PATTERNHEADER_HATCH : public STYLEPATTERN_BASE::PATTERNHEADER {
00361 UINT8 spare[4];
00362 };
00363
00364 ERRVALUE BuildOffsetIndex () const;
00365 INT32 GetOffset (unsigned idx) const;
00366 #endif // GENERATING_DOXYGEN_OUTPUT
00367 };
00368
00369
00370 }
00371
00372 #endif