zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
/////////////////////////////////////////////////////////////////////////////// 
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). 
// All rights reserved. 
// 
// This software and its documentation and related materials are owned by 
// the Alliance. The software may only be incorporated into application 
// programs owned by members of the Alliance, subject to a signed 
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable  
// trade secrets of the Alliance and its suppliers. The software is also 
// protected by copyright law and international treaty provisions. Application  
// programs incorporating this software must include the following statement 
// with their copyright notices:
//   
//   This application incorporates Teigha(R) software pursuant to a license 
//   agreement with Open Design Alliance.
//   Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. 
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you 
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
 
#ifndef __ODGIPALETTE_H__
#define __ODGIPALETTE_H__
 
#include "TD_PackPush.h"
 
#include "GiExport.h"
#include "OdArray.h"
#include "SharedPtr.h"
 
/** \details
    This class represents RGB color components as set of 32bit integers.
    Library: TD_Gi
    <group OdGi_Classes>
*/
struct OdGiIntRGB
{
  OdInt32 r, g, b;
 
  OdGiIntRGB(OdInt32 _r, OdInt32 _g, OdInt32 _b)
    : r(_r), g(_g), b(_b)
  { }
  OdGiIntRGB() { }
  OdGiIntRGB(ODCOLORREF cref)
  {
    setColor(cref);
  }
 
  /** \details
      Returns red color component.
  */
  OdInt32 red() const { return r; }
  /** \details
      Returns green color component.
  */
  OdInt32 green() const { return g; }
  /** \details
      Returns blue color component.
  */
  OdInt32 blue() const { return b; }
 
  /** \details
      Resets red color component.
      \param _r [in]  New value for red color component.
  */
  void setRed(OdInt32 _r) { r = _r; }
  /** \details
      Resets green color component.
      \param _g [in]  New value for green color component.
  */
  void setGreen(OdInt32 _g) { g = _g; }
  /** \details
      Resets blue color component.
      \param _b [in]  New value for blue color component.
  */
  void setBlue(OdInt32 _b) { b = _b; }
  /** \details
      Resets red, green and blue color components together.
      \param _r [in]  New value for red color component.
      \param _g [in]  New value for green color component.
      \param _b [in]  New value for blue color component.
  */
  void setRGB(OdInt32 _r, OdInt32 _g, OdInt32 _b) { r = _r; g = _g; b = _b; }
 
  /** \details
      Resets all color components from ODCOLORREF.
      \param cref [in]  Input color.
  */
  void setColor(ODCOLORREF cref)
  {
    setRGB((OdInt32)ODGETRED(cref), (OdInt32)ODGETGREEN(cref), (OdInt32)ODGETBLUE(cref));
  }
  /** \details
      Returns color as ODCOLORREF.
  */
  ODCOLORREF color() const
  {
    return ODRGB(r, g, b);
  }
};
 
/** \details
    This class represents RGB color cube.
    Library: TD_Gi
    <group OdGi_Classes>
*/
class ODGI_EXPORT OdGiColorCube
{
  protected:
    OdInt32    m_nBaseOffset;
    OdGiIntRGB m_nGridDivs;
    float      m_fIntensity;
    OdInt32    m_nGridSize;
    OdGiIntRGB m_nOffsets;
    OdGiIntRGB m_nDims;
  public:
    OdGiColorCube(OdGiIntRGB nGridDivs = OdGiIntRGB(2, 2, 2), float fIntensity = 1.0f, OdInt32 nBaseOffset = 0)
      : m_nBaseOffset(nBaseOffset)
      , m_nGridDivs(nGridDivs)
      , m_fIntensity(fIntensity)
    {
      validate();
    }
 
    /** \details
        Returns base offset for color entries.
    */
    OdInt32 baseOffset() const { return m_nBaseOffset; }
    /** \details
        Returns color cube grid divisions count.
    */
    const OdGiIntRGB &gridDivisions() const { return m_nGridDivs; }
    /** \details
        Returns color cube intensity.
    */
    float intensity() const { return m_fIntensity; }
    /** \details
        Returns total number of color cube grid knots.
    */
    OdInt32 gridSize() const { return m_nGridSize; }
    /** \details
        Returns offsets of color components.
    */
    const OdGiIntRGB &offsets() const { return m_nOffsets; }
    /** \details
        Returns dimensions of color cube components.
    */
    const OdGiIntRGB &dimensions() const { return m_nDims; }
 
    /** \details
        Returns color for specified color cube knot.
        \param nColor [in]  Index of color cube knot.
    */
    ODCOLORREF color(OdInt32 nColor) const;
 
    /** \details
        Compute closest color cube knot index.
        \param cref [in]  Input color.
    */
    OdInt32 closestMatch(ODCOLORREF cref) const;
 
    struct DtMatchResult
    {
      OdInt32 m_fitColors[4];
      OdInt32 m_pattern[4];
    };
 
    /** \details
        Compute set of closest color cube knot indexes.
        \param cref [in]  Input color.
        \param results [out]  Set of output colors and pattern offsets.
        \remarks
        Returns number of fit colors.
    */
    OdInt32 ditheredMatch(ODCOLORREF cref, DtMatchResult &results) const;
  protected:
    void validate();
};
 
/** \details
    This class represents shades of gray ramp.
    Library: TD_Gi
    <group OdGi_Classes>
*/
class ODGI_EXPORT OdGiGrayRamp
{
  protected:
    OdInt32 m_nBaseOffset;
    OdInt32 m_nGridDivs;
    float m_fIntensity;
    OdInt32 m_nDim;
  public:
    OdGiGrayRamp(OdInt32 nGridDivs = 2, float fIntensity = 1.0f, OdInt32 nBaseOffset = 0)
      : m_nBaseOffset(nBaseOffset)
      , m_nGridDivs(nGridDivs)
      , m_fIntensity(fIntensity)
    {
      validate();
    }
 
    /** \details
        Returns base offset for color entries.
    */
    OdInt32 baseOffset() const { return m_nBaseOffset; }
    /** \details
        Returns gray ramp divisions count.
    */
    OdInt32 gridDivisions() const { return m_nGridDivs; }
    /** \details
        Returns gray ramp intensity.
    */
    float intensity() const { return m_fIntensity; }
    /** \details
        Returns total number of gray ramp subdivisions.
    */
    OdInt32 dimension() const { return m_nDim; }
 
    /** \details
        Returns color for specified gray ramp subdivision.
        \param nColor [in]  Index of gray ramp subdivision.
    */
    ODCOLORREF color(OdInt32 nColor) const;
 
    /** \details
        Compute closest gray ramp subdivision index.
        \param cref [in]  Input color.
    */
    OdInt32 closestMatch(ODCOLORREF cref) const;
  protected:
    void validate();
};
 
/** \details
    This class represents 256 colors palette.
    Library: TD_Gi
    <group OdGi_Classes>
*/
class ODGI_EXPORT OdGiPalette
{
  protected:
    struct PalEntry
    {
      ODCOLORREF m_color;
      OdInt32 m_entryHelper;
    };
    typedef OdArray<PalEntry, OdMemoryAllocator<PalEntry> > PalEntryArray;
  protected:
    PalEntryArray m_palette;
    OdSharedPtr<OdGiColorCube> m_pColorCube;
    OdSharedPtr<OdGiGrayRamp> m_pGrayRamp;
  public:
    OdGiPalette()
      : m_palette(256, 1)
    {
      initPalette();
    }
 
    /** \details
        Returns palette color.
        \param nColor [in]  Color index.
    */
    ODCOLORREF color(OdUInt32 nColor) const
    {
      return m_palette[nColor].m_color;
    }
    /** \details
        Returns palette entry helper.
        \param nColor [in]  Color index.
    */
    OdInt32 entryHelper(OdUInt32 nColor) const
    {
      return m_palette[nColor].m_entryHelper;
    }
 
    /** \details
        Sets palette color.
        \param nColor [in]  Color index.
        \param color [in]  Input color.
    */
    void setColor(OdUInt32 nColor, ODCOLORREF color)
    {
      m_palette[nColor].m_color = color;
    }
    /** \details
        Sets palette entry helper.
        \param nColor [in]  Color index.
        \param entryHelper [in]  New palette entry helper value.
    */
    void setEntryHelper(OdUInt32 nColor, OdInt32 entryHelper)
    {
      m_palette[nColor].m_entryHelper = entryHelper;
    }
 
    /** \details
        Returns color cube linked with this palette.
    */
    const OdGiColorCube *colorCube() const
    {
      return m_pColorCube.get();
    }
    /** \details
        Link color cube with this palette.
    */
    void setColorCube(const OdGiColorCube &colorCube)
    {
      resetColorCube(new OdGiColorCube(colorCube));
    }
    /** \details
        Reset linkage of color cube with this palette.
    */
    void resetColorCube()
    {
      resetColorCube(NULL);
    }
 
    /** \details
        Returns gray ramp linked with this palette.
    */
    const OdGiGrayRamp *grayRamp() const
    {
      return m_pGrayRamp.get();
    }
    /** \details
        Link gray ramp with this palette.
    */
    void setGrayRamp(const OdGiGrayRamp &grayRamp)
    {
      resetGrayRamp(new OdGiGrayRamp(grayRamp));
    }
    /** \details
        Reset linkage of gray ramp with this palette.
    */
    void resetGrayRamp()
    {
      resetGrayRamp(NULL);
    }
 
    /** \details
        Setup palette for specified color cube.
        \param cb [in]  Input color cube.
    */
    bool install(const OdGiColorCube &cb);
    /** \details
        Setup palette for specified gray ramp.
        \param gr [in]  Input gray ramp.
    */
    bool install(const OdGiGrayRamp &gr);
    /** \details
        Setup palette as a clone of another palette.
        \param pal2 [in]  Input palette.
    */
    bool install(const OdGiPalette &pal2);
 
    /** \details
        Compute closest palette color index.
        \param cref [in]  Input color.
        \param bThroughPal [in]  Skip usage of linked color cube and gray ramp in calculations.
    */
    OdInt32 closestMatch(ODCOLORREF cref, bool bThroughPal = false) const;
 
    /** \details
        Find start index of first available free block in palette.
        \param blockSize [in]  Size of free block for search.
    */
    OdInt32 firstAvailableBlock(OdInt32 blockSize) const;
 
    /** \details
        Check does this palette is equal with another one.
        \param pal2 [in]  Palette for check.
    */
    bool isEqualTo(const OdGiPalette &pal2) const;
    /** \details
        Remove equal sub-palette from current palette.
        \param pal2 [in]  Palette for remove.
    */
    bool remove(const OdGiPalette &pal2);
 
    /** \details
        Clear palette.
    */
    void clear();
  protected:
    void initPalette();
 
    void resetColorCube(OdGiColorCube *pColorCube);
    void resetGrayRamp(OdGiGrayRamp *pGrayRamp);
 
    void setColor(OdInt32 nColor, ODCOLORREF color);
};
 
#include "TD_PackPop.h"
 
#endif //#ifndef __ODGIPALETTE_H__