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