00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 #ifndef INC_RVC_STYLE_H
00203 #define INC_RVC_STYLE_H
00204
00205 #ifndef INC_RVC_OBJECT_H
00206 #include <rvc/object.h>
00207 #endif
00208
00209 #ifndef INC_MI32_RVCSTYLE_H
00210 #include <mi32/rvcstyle.h>
00211 #endif
00212
00213 #ifndef INC_MI32_ELEMTYPE_H
00214 #include <mi32/elemtype.h>
00215 #endif
00216
00217 #ifndef INC_MI32_SIMPLEAR_H
00218 #include <mi32/simplear.h>
00219 #endif
00220
00221 #ifndef INC_MI32_ELEMSTYL_H
00222 #include <mi32/elemstyl.h>
00223 #endif
00224
00225 #ifndef INC_MI32_MGD2_H
00226 #include <mi32/mgd2.h>
00227 #endif
00228
00229 #ifndef INC_RVC_GETOBJF_H
00230 #include <rvc/getobjf.h>
00231 #endif
00232
00233 #ifndef INC_MI32_PLANECONIC_H
00234 #include <mi32/planeconic.h>
00235 #endif
00236
00237 namespace RVC {
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 class STYLE : public RVC::OBJECT {
00260 public:
00261
00262 #ifndef GENERATING_DOXYGEN_OUTPUT
00263 class BASEPATTERN;
00264 class BITMAPPATTERN;
00265 class HATCHPATTERN;
00266 class GETOBJFILTER_ISSELECTABLE;
00267 class GETOBJFILTER_HASPATTERNTYPE;
00268 class GETOBJFILTER_HASSTYLETYPE;
00269 class LINEPATTERN;
00270 class SYMBOLPATTERN;
00271 class UNIQUEPATTERNNAMEFILTER;
00272 class UNIQUESTYLENAMEFILTER;
00273 #endif // GENERATING_DOXYGEN_OUTPUT
00274
00275
00276 enum TYPE {
00277 TYPE_First = 0,
00278 TYPE_Point = 0,
00279 TYPE_Line = 1,
00280 TYPE_Polygon = 2,
00281 TYPE_Text = 3,
00282 TYPE_NumTypes = 4
00283 };
00284
00285
00286 enum PATTERN {
00287 PATTERN_Symbol = 0,
00288 PATTERN_Line,
00289 PATTERN_Bitmap,
00290 PATTERN_Hatch,
00291 PATTERN_NumTypes
00292 };
00293
00294
00295 STYLE (
00296 );
00297
00298
00299 STYLE (
00300 const RVC::STYLE& obj
00301 );
00302
00303
00304 virtual ~STYLE (
00305 );
00306
00307
00308 RVC::STYLE& operator= (
00309 const RVC::STYLE& rhs
00310 );
00311
00312
00313
00314 INT32 AddPattern (
00315 PATTERN PattType,
00316 void *Pattern
00317 );
00318
00319
00320
00321 INT32 AddPattern (
00322 PATTERN PattType,
00323 const BASEPATTERN& Pattern
00324 );
00325
00326
00327
00328 INT32 AddPattern (
00329 const BITMAPPATTERN& Pattern
00330 );
00331
00332
00333
00334 INT32 AddPattern (
00335 const HATCHPATTERN& Pattern
00336 );
00337
00338
00339
00340 INT32 AddPattern (
00341 const LINEPATTERN& Pattern
00342 );
00343
00344
00345
00346 INT32 AddPattern (
00347 const SYMBOLPATTERN& Pattern
00348 );
00349
00350
00351
00352 INT32 AddStyle (
00353 RVCPOINTSTYLE& style
00354 );
00355
00356
00357
00358 INT32 AddStyle (
00359 const RVC::OBJECTNAME& name,
00360 const POINTSTYLE& style
00361 );
00362
00363
00364
00365 INT32 AddStyle (
00366 RVCPOLYSTYLE& style
00367 );
00368
00369
00370
00371 INT32 AddStyle (
00372 const RVC::OBJECTNAME& name,
00373 const POLYSTYLE& style
00374 );
00375
00376
00377
00378 INT32 AddStyle (
00379 RVCLINESTYLE& style
00380 );
00381
00382
00383
00384 INT32 AddStyle (
00385 const RVC::OBJECTNAME& name,
00386 const LINESTYLE& style
00387 );
00388
00389
00390
00391 INT32 AddStyle (
00392 RVCTEXTSTYLE& style
00393 );
00394
00395
00396
00397 INT32 AddStyle (
00398 const RVC::OBJECTNAME& name,
00399 const TEXTSTYLE& style
00400 );
00401
00402
00403
00404 ERRVALUE Combine (
00405 const RVC::OBJECT& DestParentObj,
00406 RVC::STYLE& DestStyleObj,
00407 SIMPLE_ARRAY<INT32>& FontTrans,
00408 SIMPLE_ARRAY<INT32> PattTrans[PATTERN_NumTypes]
00409 );
00410
00411
00412
00413 ERRVALUE Combine (
00414 const RVC::OBJECT& DestParentObj,
00415 RVC::STYLE& DestStyleObj
00416 );
00417
00418
00419 void ConvertStyle (
00420 RVCLINESTYLE& rvcstyle,
00421 const LINESTYLE& linestyle
00422 ) const;
00423
00424
00425 void ConvertStyle (
00426 LINESTYLE& linestyle,
00427 const RVCLINESTYLE& rvcstyle
00428 ) const;
00429
00430
00431 void ConvertStyle (
00432 RVCPOINTSTYLE& rvcstyle,
00433 const POINTSTYLE& pointstyle
00434 ) const;
00435
00436
00437 void ConvertStyle (
00438 POINTSTYLE& pointstyle,
00439 const RVCPOINTSTYLE& rvcstyle
00440 ) const;
00441
00442
00443 void ConvertStyle (
00444 RVCPOLYSTYLE& rvcstyle,
00445 const POLYSTYLE& polystyle
00446 ) const;
00447
00448
00449 void ConvertStyle (
00450 POLYSTYLE& polystyle,
00451 const RVCPOLYSTYLE& rvcstyle
00452 ) const;
00453
00454
00455 void ConvertStyle (
00456 RVCTEXTSTYLE& rvcstyle,
00457 const TEXTSTYLE& textstyle
00458 );
00459
00460
00461 void ConvertStyle (
00462 TEXTSTYLE& textstyle,
00463 const RVCTEXTSTYLE& rvcstyle
00464 ) const;
00465
00466
00467
00468 INT32 DeletePattern (
00469 PATTERN PattType,
00470 INT32 PattNum
00471 );
00472
00473
00474
00475 INT32 DeleteStyle (
00476 TYPE StyleType,
00477 INT32 StyleNum
00478 );
00479
00480
00481 ERRVALUE DeleteStyleType (
00482 TYPE StyleType
00483 );
00484
00485
00486
00487 INT32 FindFontName (
00488 INT32 start,
00489 const MISTRING& name
00490 ) const;
00491
00492
00493
00494 INT32 FontTransAdd (
00495 const MISTRING& name
00496 );
00497
00498
00499
00500 INT32 FontTransIndexToHandle (
00501 INT32 FontNum
00502 );
00503
00504
00505
00506 ERRVALUE FontTransIndexToName (
00507 INT32 FontNum,
00508 MISTRING& name
00509 ) const;
00510
00511
00512
00513 INT32 FindPattern (
00514 PATTERN PattType,
00515 INT32 StartPattNum,
00516 const RVC::OBJECTNAME& name
00517 ) const;
00518
00519
00520
00521 INT32 FindStyle (
00522 TYPE StyleType,
00523 INT32 StartStyleNum,
00524 const RVC::OBJECTNAME& name
00525 ) const;
00526
00527
00528
00529 INT32 GetFontNameCount (
00530 ) const;
00531
00532
00533
00534 INT32 GetPatternCount (
00535 PATTERN PattType
00536 ) const;
00537
00538
00539
00540 INT32 GetPatternMaxSize (
00541 PATTERN PattType
00542 ) const;
00543
00544
00545
00546 INT32 GetPatternSize (
00547 PATTERN PattType,
00548 INT32 PattNum
00549 ) const;
00550
00551
00552
00553 INT32 GetStyleCount (
00554 TYPE StyleType
00555 ) const;
00556
00557
00558 ERRVALUE Make (
00559 const RVC::OBJECT& parent,
00560 const RVC::DESCRIPTOR& Descriptor
00561 );
00562
00563
00564
00565 DEPRECATED ERRVALUE Make (
00566 const RVC::OBJECT& parent,
00567 const RVC::OBJECTNAME& name,
00568 const RVC::OBJECTDESC& desc,
00569 const char* Source = 0
00570 );
00571
00572
00573 ERRVALUE Make (
00574 const RVC::OBJITEM& ObjItem,
00575 const char* Source = 0
00576 );
00577
00578
00579 ERRVALUE ReadPattern (
00580 PATTERN PattType,
00581 INT32 PatternNum,
00582 void *Pattern
00583 ) const;
00584
00585
00586 ERRVALUE ReadPattern (
00587 PATTERN PattType,
00588 INT32 PatternNum,
00589 BASEPATTERN& Pattern
00590 ) const;
00591
00592
00593 ERRVALUE ReadPattern (
00594 INT32 PatternNum,
00595 BITMAPPATTERN& Pattern
00596 ) const;
00597
00598
00599 ERRVALUE ReadPattern (
00600 INT32 PatternNum,
00601 HATCHPATTERN& Pattern
00602 ) const;
00603
00604
00605 ERRVALUE ReadPattern (
00606 INT32 PatternNum,
00607 LINEPATTERN& Pattern
00608 ) const;
00609
00610
00611 ERRVALUE ReadPattern (
00612 INT32 PatternNum,
00613 SYMBOLPATTERN& Pattern
00614 ) const;
00615
00616
00617 ERRVALUE ReadPatternHdr (
00618 PATTERN PattType,
00619 INT32 PatternNum,
00620 void *PattHdr
00621 ) const;
00622
00623
00624 ERRVALUE ReadPatternName (
00625 PATTERN PattType,
00626 INT32 PattNum,
00627 RVC::OBJECTNAME& name
00628 ) const;
00629
00630
00631 ERRVALUE ReadStyle (
00632 INT32 StyleNum,
00633 RVCPOINTSTYLE& style
00634 ) const;
00635
00636
00637 ERRVALUE ReadStyle (
00638 INT32 StyleNum,
00639 POINTSTYLE& style
00640 ) const;
00641
00642
00643 ERRVALUE ReadStyle (
00644 INT32 StyleNum,
00645 RVCPOLYSTYLE& style
00646 ) const;
00647
00648
00649 ERRVALUE ReadStyle (
00650 INT32 StyleNum,
00651 POLYSTYLE& style
00652 ) const;
00653
00654
00655 ERRVALUE ReadStyle (
00656 INT32 StyleNum,
00657 RVCLINESTYLE& style
00658 ) const;
00659
00660
00661 ERRVALUE ReadStyle (
00662 INT32 StyleNum,
00663 LINESTYLE& style
00664 ) const;
00665
00666
00667 ERRVALUE ReadStyle (
00668 INT32 StyleNum,
00669 RVCTEXTSTYLE& style
00670 ) const;
00671
00672
00673 ERRVALUE ReadStyle (
00674 INT32 StyleNum,
00675 TEXTSTYLE& style
00676 ) const;
00677
00678
00679 ERRVALUE ReadStyleName (
00680 TYPE StyleType,
00681 INT32 StyleNum,
00682 RVC::OBJECTNAME& name
00683 ) const;
00684
00685
00686 ERRVALUE WritePattern (
00687 PATTERN PattType,
00688 INT32 PatternNum,
00689 void *Pattern
00690 );
00691
00692
00693 ERRVALUE WritePattern (
00694 PATTERN PattType,
00695 INT32 PatternNum,
00696 const BASEPATTERN& Pattern
00697 );
00698
00699
00700 ERRVALUE WritePattern (
00701 INT32 PatternNum,
00702 const BITMAPPATTERN& Pattern
00703 );
00704
00705
00706 ERRVALUE WritePattern (
00707 INT32 PatternNum,
00708 const HATCHPATTERN& Pattern
00709 );
00710
00711
00712 ERRVALUE WritePattern (
00713 INT32 PatternNum,
00714 const LINEPATTERN& Pattern
00715 );
00716
00717
00718 ERRVALUE WritePattern (
00719 INT32 PatternNum,
00720 const SYMBOLPATTERN& Pattern
00721 );
00722
00723
00724 ERRVALUE WritePatternName (
00725 PATTERN PattType,
00726 INT32 PatternNum,
00727 const OBJECTNAME& name
00728 );
00729
00730
00731 ERRVALUE WriteStyle (
00732 INT32 StyleNum,
00733 RVCPOINTSTYLE& style
00734 );
00735
00736
00737 ERRVALUE WriteStyle (
00738 INT32 StyleNum,
00739 const RVC::OBJECTNAME& name,
00740 const POINTSTYLE& style
00741 );
00742
00743
00744 ERRVALUE WriteStyle (
00745 INT32 StyleNum,
00746 RVCPOLYSTYLE& style
00747 );
00748
00749
00750 ERRVALUE WriteStyle (
00751 INT32 StyleNum,
00752 const RVC::OBJECTNAME& name,
00753 const POLYSTYLE& style
00754 );
00755
00756
00757 ERRVALUE WriteStyle (
00758 INT32 StyleNum,
00759 RVCLINESTYLE& style
00760 );
00761
00762
00763 ERRVALUE WriteStyle (
00764 INT32 StyleNum,
00765 const RVC::OBJECTNAME& name,
00766 const LINESTYLE& style
00767 );
00768
00769
00770 ERRVALUE WriteStyle (
00771 INT32 StyleNum,
00772 RVCTEXTSTYLE& style
00773 );
00774
00775
00776 ERRVALUE WriteStyle (
00777 INT32 StyleNum,
00778 const RVC::OBJECTNAME& name,
00779 const TEXTSTYLE& style
00780 );
00781
00782
00783 ERRVALUE WriteStyleName (
00784 TYPE StyleType,
00785 INT32 StyleNum,
00786 const RVC::OBJECTNAME& name
00787 );
00788
00789 private:
00790 #ifndef GENERATING_DOXYGEN_OUTPUT
00791
00792
00793 virtual ERRVALUE v_CloseObject ();
00794 virtual OBJTYPE v_GetDftObjectType () const;
00795 virtual bool v_IsObjectOpen () const;
00796 virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent);
00797
00798 int m_StyleID;
00799 #endif
00800
00801 };
00802
00803
00804
00805 class STYLE::BASEPATTERN {
00806 public:
00807
00808
00809 BASEPATTERN (
00810 ) : m_PattBuff(0), m_PattHdrSize(sizeof(RVCPATTHDR)), m_PattBuffSize(sizeof(RVCPATTHDR)), m_BuffSizeAlloc(sizeof(RVCPATTHDR))
00811 { MmAllocCExc((void**)&m_PattBuff, m_PattBuffSize); }
00812
00813
00814 ~BASEPATTERN (
00815 ) { MmFree(m_PattBuff); }
00816
00817
00818
00819 ERRVALUE AppendColor (
00820 const COLOR& color
00821 );
00822
00823
00824 void Clear (
00825 ) { m_PattBuffSize = m_PattHdrSize; memset(m_PattBuff,0,m_PattHdrSize); }
00826
00827
00828 const RVC::OBJECTNAME& GetName (
00829 ) const { return (*reinterpret_cast<const RVC::OBJECTNAME*>(m_PattBuff)); }
00830
00831
00832 const COLOR& GetColor (
00833 UINT8 idx
00834 ) const { return (GetColors()[idx]); }
00835
00836
00837 const COLOR* GetColors (
00838 ) const { return (reinterpret_cast<COLOR*>(m_PattBuff + m_PattHdrSize)); }
00839
00840
00841 INT32 GetNumColors (
00842 ) const { return (reinterpret_cast<const RVCPATTHDR*>(m_PattBuff)->numcolors); }
00843
00844
00845 INT32 GetNumElements (
00846 ) const { return (reinterpret_cast<const RVCPATTHDR*>(m_PattBuff)->numelements); }
00847
00848
00849
00850 INT32 GetSize (
00851 ) const { return (m_PattBuffSize); }
00852
00853
00854 bool IsEqualDef (
00855 const BASEPATTERN& rhs
00856 ) const {
00857 if (m_PattBuffSize != rhs.m_PattBuffSize) return (false);
00858 return (memcmp(m_PattBuff+sizeof(RVC::OBJECTNAME),rhs.m_PattBuff+sizeof(RVC::OBJECTNAME),m_PattBuffSize-sizeof(RVC::OBJECTNAME))==0);
00859 }
00860
00861
00862 void SetColor (
00863 UINT8 idx,
00864 const COLOR& color
00865 ) { if (idx < GetNumColors()) reinterpret_cast<COLOR*>(m_PattBuff + m_PattHdrSize)[idx] = color; }
00866
00867
00868 void SetName (
00869 const OBJECTNAME& name
00870 ) { *reinterpret_cast<RVC::OBJECTNAME*>(m_PattBuff) = name; }
00871
00872
00873 ERRVALUE SetPattern (
00874 void* SrcPattBuff,
00875 INT32 PattBuffSize,
00876 INT32 PattHdrSize
00877 );
00878
00879
00880
00881 operator const void* (
00882 ) const { return (m_PattBuff); }
00883
00884
00885 protected:
00886
00887
00888 BASEPATTERN (
00889 int PattHdrSize
00890 ) : m_PattBuff(0), m_PattHdrSize(PattHdrSize), m_PattBuffSize(PattHdrSize), m_BuffSizeAlloc(PattHdrSize)
00891 { MmAllocCExc((void**)&m_PattBuff, m_PattBuffSize); }
00892
00893
00894 BASEPATTERN (const BASEPATTERN& rhs);
00895
00896
00897 BASEPATTERN& operator= (const BASEPATTERN& rhs);
00898
00899
00900 void DeleteColorSet (
00901 const UINT8 *set
00902 );
00903
00904
00905 void DeleteFromBuffer (
00906 INT32 offset,
00907 INT32 numbytes
00908 );
00909
00910
00911 const UINT8* GetPattBuffer (
00912 ) const { return (m_PattBuff); }
00913
00914
00915 UINT8* GetPattBuffer (
00916 ) { return (m_PattBuff); }
00917
00918
00919 const UINT8* GetFirstElemPtr (
00920 ) const { return (m_PattBuff+m_PattHdrSize+GetNumColors()*sizeof(COLOR)); }
00921
00922
00923 UINT8* GetFirstElemPtr (
00924 ) { return (m_PattBuff+m_PattHdrSize+GetNumColors()*sizeof(COLOR)); }
00925
00926
00927 ERRVALUE InsertIntoBuffer (
00928 INT32 offset,
00929 INT32 numbytes,
00930 const void *data = 0
00931 );
00932
00933 #ifndef GENERATING_DOXYGEN_OUTPUT
00934 UINT8* m_PattBuff;
00935 INT32 m_PattHdrSize;
00936 INT32 m_PattBuffSize;
00937 mutable SIMPLE_ARRAY<UINT32> m_OffsetArray;
00938 #endif // GENERATING_DOXYGEN_OUTPUT
00939
00940 private:
00941 #ifndef GENERATING_DOXYGEN_OUTPUT
00942
00943 INT32 m_BuffSizeAlloc;
00944
00945 friend class STYLE;
00946 #endif // GENERATING_DOXYGEN_OUTPUT
00947 };
00948
00949
00950
00951 class STYLE::BITMAPPATTERN : public STYLE::BASEPATTERN {
00952 public:
00953
00954
00955 BITMAPPATTERN (
00956 ) : BASEPATTERN(sizeof(BITMAPPATTHDR)) {}
00957
00958
00959 BITMAPPATTERN (
00960 const BITMAPPATTERN& rhs
00961 ) : BASEPATTERN(rhs) {}
00962
00963
00964 ~BITMAPPATTERN (
00965 ) { }
00966
00967
00968 BITMAPPATTERN& operator= (
00969 const BITMAPPATTERN& rhs
00970 ) { if (this != &rhs) { BASEPATTERN::operator=(rhs); } return (*this); }
00971
00972 ERRVALUE Create (
00973 INT16 xsize,
00974 INT16 ysize
00975 );
00976
00977 UINT8 GetCell (
00978 INT16 x,
00979 INT16 y
00980 ) const { return (GetFirstElemPtr()[y*GetSizeX()+x]); }
00981
00982 INT16 GetHotSpotX (
00983 ) const { return (reinterpret_cast<const BITMAPPATTHDR*>(m_PattBuff)->xhot); }
00984
00985 INT16 GetHotSpotY (
00986 ) const { return (reinterpret_cast<const BITMAPPATTHDR*>(m_PattBuff)->yhot); }
00987
00988 INT16 GetIntervalX (
00989 ) const { return (reinterpret_cast<const BITMAPPATTHDR*>(m_PattBuff)->xspace); }
00990
00991 INT16 GetIntervalY (
00992 ) const { return (reinterpret_cast<const BITMAPPATTHDR*>(m_PattBuff)->yspace); }
00993
00994 INT16 GetSizeX (
00995 ) const { return (reinterpret_cast<const BITMAPPATTHDR*>(m_PattBuff)->xsize); }
00996
00997 INT16 GetSizeY (
00998 ) const { return (reinterpret_cast<const BITMAPPATTHDR*>(m_PattBuff)->ysize); }
00999
01000 void SetCell (
01001 INT16 x,
01002 INT16 y,
01003 UINT8 value
01004 ) { GetFirstElemPtr()[y*GetSizeX()+x] = value; }
01005
01006 void SetHotSpotX (
01007 INT16 hotspotx
01008 ) { reinterpret_cast<BITMAPPATTHDR*>(m_PattBuff)->xhot = hotspotx; }
01009
01010 void SetHotSpotY (
01011 INT16 hotspoty
01012 ) { reinterpret_cast<BITMAPPATTHDR*>(m_PattBuff)->yhot = hotspoty; }
01013
01014 void SetIntervalX (
01015 INT16 intervalx
01016 ) { reinterpret_cast<BITMAPPATTHDR*>(m_PattBuff)->xspace = intervalx; }
01017
01018 void SetIntervalY (
01019 INT16 intervaly
01020 ) { reinterpret_cast<BITMAPPATTHDR*>(m_PattBuff)->yspace = intervaly; }
01021
01022 };
01023
01024
01025 class STYLE::LINEPATTERN : public STYLE::BASEPATTERN {
01026 public:
01027
01028 enum ELEMENT_TYPE {
01029 ELEMENT_TYPE_Line = 0,
01030 ELEMENT_TYPE_CrossLine = 1,
01031 ELEMENT_TYPE_Circle = 2,
01032 ELEMENT_TYPE_Polyline = 3,
01033 ELEMENT_TYPE_Polygon = 4,
01034 ELEMENT_TYPE_Text = 5,
01035 ELEMENT_TYPE_Symbol = 6,
01036 ELEMENT_TYPE_COUNT
01037 };
01038
01039 class ITERATOR;
01040 class ELEMENT;
01041
01042
01043
01044 class ELEMENT_SHARED {
01045 public:
01046
01047
01048
01049 MGD::LINECAP GetCapStyle (
01050 ) const { return ((m_pData->flags & LINEPATTFLAG_CapRound) ? MGD::LINECAP_Round : MGD::LINECAP_Butt); }
01051
01052
01053
01054 UINT8 GetColorIndex (
01055 ) const { return (m_pData->colornum); }
01056
01057
01058
01059 INT16 GetInterval (
01060 ) const { return (m_pData->xspacing); }
01061
01062 MGD::LINEJOIN GetJoinStyle (
01063 ) const { return ((m_pData->flags & LINEPATTFLAG_JoinMiter) ? MGD::LINEJOIN_Miter : (m_pData->flags & LINEPATTFLAG_JoinBevel) ? MGD::LINEJOIN_Bevel : MGD::LINEJOIN_Round); }
01064
01065
01066
01067 INT16 GetOffsetAlong (
01068 ) const { return (m_pData->xoffset); }
01069
01070
01071
01072 INT16 GetOffsetAside (
01073 ) const { return ((m_pData->type != ELEMENT_TYPE_Line) ? -m_pData->yoffset : m_pData->yoffset); }
01074
01075
01076
01077 INT16 GetSize (
01078 ) const { return (m_pData->xsize); }
01079
01080
01081
01082 INT16 GetThickness (
01083 ) const { return (m_pData->thickness); }
01084
01085
01086
01087 ELEMENT_TYPE GetType (
01088 ) const { return (static_cast<ELEMENT_TYPE>(m_pData->type)); }
01089
01090
01091
01092 bool IsFilled (
01093 ) const { return ((m_pData->flags & LINEPATTFLAG_Filled) != 0); }
01094
01095 private:
01096 #ifndef GENERATING_DOXYGEN_OUTPUT
01097
01098 const LINEPATTELEM *m_pData;
01099 void *m_pExtra;
01100
01101
01102 ELEMENT_SHARED (
01103 ): m_pData(0), m_pExtra(0) { }
01104
01105 explicit ELEMENT_SHARED (const void *pElemData)
01106 : m_pData(static_cast<const LINEPATTELEM*>(pElemData)), m_pExtra(static_cast<UINT8*>(const_cast<void*>(pElemData)) + sizeof(LINEPATTELEM))
01107 { }
01108
01109
01110 ~ELEMENT_SHARED (
01111 ) { }
01112
01113 friend class RVC::STYLE::LINEPATTERN;
01114 friend class ELEMENT;
01115 friend class ITERATOR;
01116 #endif // GENERATING_DOXYGEN_OUTPUT
01117 };
01118
01119
01120 class ELEMENT : public ELEMENT_SHARED {
01121 public:
01122
01123
01124 ELEMENT (
01125 ) { memset(&m_MyData,0,sizeof(m_MyData)); m_pData = &m_MyData; }
01126
01127
01128 ELEMENT (
01129 const ELEMENT& rhs
01130 );
01131
01132
01133 ELEMENT (
01134 const ELEMENT_SHARED& rhs
01135 );
01136
01137
01138 explicit ELEMENT (
01139 ELEMENT_TYPE type
01140 );
01141
01142
01143 ~ELEMENT (
01144 ) { if (m_pExtra != 0) free(m_pExtra); }
01145
01146
01147 ELEMENT& operator= (
01148 const ELEMENT& rhs
01149 );
01150
01151
01152 ELEMENT& operator= (
01153 const ELEMENT_SHARED& rhs
01154 );
01155
01156
01157 void SetCapStyle (
01158 MGD::LINECAP linecap
01159 ) { if (linecap == MGD::LINECAP_Round) m_MyData.flags |= LINEPATTFLAG_CapRound; else m_MyData.flags &= ~LINEPATTFLAG_CapRound; }
01160
01161
01162 void SetColorIndex (
01163 UINT8 idx
01164 ) { m_MyData.colornum = idx; }
01165
01166 void SetFilled (
01167 bool filled
01168 ) { if (filled) m_MyData.flags |= LINEPATTFLAG_Filled; else m_MyData.flags &= ~LINEPATTFLAG_Filled; }
01169
01170 void SetInterval (
01171 INT16 interval
01172 ) { m_MyData.xspacing = interval; }
01173
01174 void SetJoinStyle (
01175 MGD::LINEJOIN linejoin
01176 ) {
01177 m_MyData.flags &= ~(LINEPATTFLAG_JoinMiter|LINEPATTFLAG_JoinBevel);
01178 if (linejoin == MGD::LINEJOIN_Miter) m_MyData.flags |= LINEPATTFLAG_JoinMiter;
01179 else if (linejoin == MGD::LINEJOIN_Bevel) m_MyData.flags |= LINEPATTFLAG_JoinBevel;
01180 }
01181
01182 void SetOffsetAlong (
01183 INT16 offset
01184 ) { m_MyData.xoffset = offset; }
01185
01186 void SetOffsetAside (
01187 INT16 offset
01188 ) { m_MyData.yoffset = (m_MyData.type != ELEMENT_TYPE_Line) ? -offset : offset; }
01189
01190 void SetSize (
01191 INT16 size
01192 ) { m_MyData.xsize = size; }
01193
01194 void SetThickness (
01195 INT16 thickness
01196 ) { m_MyData.thickness = thickness; }
01197
01198 private:
01199 #ifndef GENERATING_DOXYGEN_OUTPUT
01200 LINEPATTELEM m_MyData;
01201 #endif // GENERATING_DOXYGEN_OUTPUT
01202 };
01203
01204
01205 class ITERATOR {
01206 public:
01207
01208
01209 ITERATOR (
01210 ): m_pEnd(0) { }
01211
01212
01213 ~ITERATOR (
01214 ) { }
01215
01216
01217 const ELEMENT_SHARED& operator* (
01218 ) const { return (m_element); }
01219
01220
01221 const ELEMENT_SHARED* operator-> (
01222 ) const { return (&m_element); }
01223
01224
01225 ITERATOR& operator++ ();
01226
01227
01228 bool operator== (
01229 const ITERATOR& rhs
01230 ) const { return ((m_pEnd == 0 && rhs.m_pEnd == 0) || m_element.m_pData == rhs.m_element.m_pData); }
01231
01232
01233 bool operator!= (
01234 const ITERATOR& rhs
01235 ) const { return (!(*this == rhs)); }
01236
01237 private:
01238 #ifndef GENERATING_DOXYGEN_OUTPUT
01239
01240 ELEMENT_SHARED m_element;
01241 const void *m_pEnd;
01242
01243 ITERATOR (const void *pData, const void *pEnd)
01244 : m_element(pData), m_pEnd(pEnd)
01245 { }
01246
01247 friend class RVC::STYLE::LINEPATTERN;
01248 #endif // GENERATING_DOXYGEN_OUTPUT
01249 };
01250
01251
01252 LINEPATTERN (
01253 ) : BASEPATTERN(sizeof(LINEPATTHDR)) {}
01254
01255
01256 LINEPATTERN (
01257 const LINEPATTERN& rhs
01258 ) : BASEPATTERN(rhs) {}
01259
01260
01261 ~LINEPATTERN (
01262 ) { }
01263
01264
01265 LINEPATTERN& operator= (
01266 const LINEPATTERN& rhs
01267 ) { if (this != &rhs) { BASEPATTERN::operator=(rhs); } return (*this); }
01268
01269
01270 ITERATOR Begin (
01271 ) const { return (ITERATOR(GetFirstElemPtr(),GetPattBuffer()+GetSize())); }
01272
01273
01274
01275 ERRVALUE DeleteElement (
01276 unsigned idx
01277 );
01278
01279
01280
01281 void DeleteUnusedColors (
01282 );
01283
01284
01285 ITERATOR End (
01286 #ifdef WIN32
01287 ) const { return (ITERATOR()); }
01288 #else
01289 ) const { ITERATOR it; return (it); }
01290 #endif
01291
01292
01293
01294 ELEMENT GetElement (
01295 unsigned idx
01296 ) const;
01297
01298
01299 INT16 GetExtentLeft (
01300 ) const { return (reinterpret_cast<LINEPATTHDR*>(m_PattBuff)->extentsa); }
01301
01302
01303 INT16 GetExtentRight (
01304 ) const { return (reinterpret_cast<LINEPATTHDR*>(m_PattBuff)->extentsb); }
01305
01306
01307
01308 ERRVALUE InsertElement (
01309 unsigned idx,
01310 const ELEMENT& element
01311 );
01312
01313
01314
01315 ERRVALUE SetElement (
01316 unsigned idx,
01317 const ELEMENT& element
01318 );
01319
01320
01321 INT32 GetWidth (
01322 ) const;
01323
01324 private:
01325 #ifndef GENERATING_DOXYGEN_OUTPUT
01326
01327 ERRVALUE BuildOffsetIndex () const;
01328 INT32 GetOffset (unsigned idx) const;
01329 #endif
01330 };
01331
01332
01333
01334 class STYLE::HATCHPATTERN : public STYLE::BASEPATTERN {
01335 public:
01336
01337 enum ELEMENT_TYPE {
01338 ELEMENT_TYPE_Simple = 0,
01339 ELEMENT_TYPE_LinePattern = 1,
01340 ELEMENT_TYPE_SolidFill = 2,
01341 ELEMENT_TYPE_COUNT = 3
01342 };
01343
01344 class ITERATOR;
01345 class ELEMENT;
01346
01347
01348
01349 class ELEMENT_SHARED {
01350 public:
01351
01352
01353
01354 ELEMENT_TYPE GetType (
01355 ) const { return (static_cast<ELEMENT_TYPE>(m_pData->type)); }
01356
01357
01358
01359 UINT8 GetColorIndex (
01360 ) const { return (m_pData->colornum); }
01361
01362
01363
01364 bool IsVisible (
01365 ) const { return (m_pData->isvisible != 0); }
01366
01367
01368 void GetLinePattern (
01369 STYLE::LINEPATTERN& pattern
01370 ) const;
01371
01372
01373 UINT32 GetFlags (
01374 ) const { return 0; };
01375
01376
01377 void GetOriginOffset (
01378 DPOINT2D& offset
01379 ) const { offset.x = m_pData->xoffset; offset.y = m_pData->yoffset; return; }
01380
01381
01382
01383 double GetSpacing (
01384 ) const { return (m_pData->spacing); }
01385
01386
01387
01388 double GetAn