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
/////////////////////////////////////////////////////////////////////////////// 
// 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.
///////////////////////////////////////////////////////////////////////////////
 
 
// RasterModule.h - interface of module, performing different operations on raster images
 
#ifndef __OD_RASTER_MODULE__
#define __OD_RASTER_MODULE__
 
#include "RxModule.h"
#include "DbRootExport.h"
#include "UInt32Array.h"
#include "TDVersion.h"
 
class OdGiRasterImage;
typedef OdSmartPtr<OdGiRasterImage> OdGiRasterImagePtr;
 
#include "TD_PackPush.h"
 
#ifndef OD_FOURCC
#ifndef ODA_BIGENDIAN
#define OD_FOURCC(a, b, c, d) (((OdUInt32)(d) << 24) | ((OdUInt32)(c) << 16) | ((OdUInt32)(b) << 8) | ((OdUInt32)(a)))
#else
#define OD_FOURCC(a, b, c, d) (((OdUInt32)(a) << 24) | ((OdUInt32)(b) << 16) | ((OdUInt32)(c) << 8) | ((OdUInt32)(d)))
#endif
#endif // OD_FOURCC
 
/** \details
    This class is the base class for classes that provide platform-dependent loading and saving
    of Raster Image files for Teigha.
    Library: TD_Db
    <group OdRx_Classes> 
*/
class ODRX_ABSTRACT FIRSTDLL_EXPORT OdRxRasterServices : public OdRxModule
{
public:
  // Predefined image types
  enum ImageType
  {
    kUnknown  = -1,
    kBMP      = OD_FOURCC('B', 'M', 'P', ' '),
    kICO      = OD_FOURCC('I', 'C', 'O', ' '),
    kJPEG     = OD_FOURCC('J', 'P', 'E', 'G'),
    kJNG      = OD_FOURCC('J', 'N', 'G', ' '),
    kKOALA    = OD_FOURCC('K', 'O', 'A', 'L'),
    kLBM      = OD_FOURCC('L', 'B', 'M', ' '),
    kIFF      = kLBM,
    kMNG      = OD_FOURCC('M', 'N', 'G', ' '),
    kPBM      = OD_FOURCC('P', 'B', 'M', ' '),
    kPBMRAW   = OD_FOURCC('P', 'B', 'M', 'R'),
    kPCD      = OD_FOURCC('P', 'C', 'D', ' '),
    kPCX      = OD_FOURCC('P', 'C', 'X', ' '),
    kPGM      = OD_FOURCC('P', 'G', 'M', ' '),
    kPGMRAW   = OD_FOURCC('P', 'G', 'M', 'R'),
    kPNG      = OD_FOURCC('P', 'N', 'G', ' '),
    kPPM      = OD_FOURCC('P', 'P', 'M', ' '),
    kPPMRAW   = OD_FOURCC('P', 'P', 'M', 'R'),
    kRAS      = OD_FOURCC('R', 'A', 'S', ' '),
    kTARGA    = OD_FOURCC('T', 'G', 'A', ' '),
    kTIFF     = OD_FOURCC('T', 'I', 'F', 'F'),
    kWBMP     = OD_FOURCC('W', 'B', 'M', 'P'),
    kPSD      = OD_FOURCC('P', 'S', 'D', ' '),
    kCUT      = OD_FOURCC('C', 'U', 'T', ' '),
    kXBM      = OD_FOURCC('X', 'B', 'M', ' '),
    kXPM      = OD_FOURCC('X', 'P', 'M', ' '),
    kDDS      = OD_FOURCC('D', 'D', 'S', ' '),
    kGIF      = OD_FOURCC('G', 'I', 'F', ' '),
    kHDR      = OD_FOURCC('H', 'D', 'R', ' '),
    kFAXG3    = OD_FOURCC('F', 'X', 'G', '3'),
    kSGI      = OD_FOURCC('S', 'G', 'I', ' '),
    kEXR      = OD_FOURCC('E', 'X', 'R', ' '),
    kJ2K      = OD_FOURCC('J', '2', 'K', ' '),
    kJP2      = OD_FOURCC('J', 'P', '2', ' '),
    kPFM      = OD_FOURCC('P', 'F', 'M', ' '),
    kPICT     = OD_FOURCC('P', 'I', 'C', 'T'),
    kRAW      = OD_FOURCC('R', 'A', 'W', ' ')
  }; 
 
  // Loading flags
  enum LoadFlags
  {
    // Specify loading format explicitly
    kLoadFmt        = OD_FOURCC('F', 'M', 'T', ' '),
    // Avoids post-reorientation of TIFF format images
    kNoTIFFRotation = OD_FOURCC('N', 'T', 'F', 'R')
  };
 
  // Saving flags
  enum SaveFlags
  {
    // Specify palette index of transparent color (-1 - by default)
    kTransparentColor = OD_FOURCC('T', 'C', 'L', 'R'),
 
    // Jpeg compression quality (default depends from implementation)
    kJpegQuality = OD_FOURCC('J', 'Q', 'T', 'Y'),
 
    // Tiff compression format (no compression by default)
    kTiffCompression = OD_FOURCC('T', 'C', 'M', 'P'),
    kTiffCompressionDeflate = OD_FOURCC('Z', 'I', 'P', ' '),
    kTiffCompressionLzw = OD_FOURCC('L', 'Z', 'W', ' '),
    kTiffCompressionJpeg = OD_FOURCC('J', 'P', 'E', 'G'),
    kTiffCompressionCCITTFax3 = OD_FOURCC('F', 'A', 'X', '3'),
    kTiffCompressionCCITTFax4 = OD_FOURCC('F', 'A', 'X', '4'),
    kTiffCompressionEmbedded = OD_FOURCC('E', 'M', 'B', 'D'), // ODA extension for IbEnabler, actually it is CCITFax4 compression
 
    //dithering flag
    kDithering = OD_FOURCC('D', 'I', 'T', 'H'),
    kDitheringFS = OD_FOURCC('D', 'T', 'F', 'S'), // Floyd & Steinberg error diffusion
    kDitheringBayer4x4 = OD_FOURCC('B', 'Y', 'R', '4'), // Bayer ordered dispersed dot dithering (order 2 dithering matrix)
    kDitheringBayer8x8 = OD_FOURCC('B', 'Y', 'R', '8'), // Bayer ordered dispersed dot dithering (order 3 dithering matrix)
    kDitheringBayer16x16 = OD_FOURCC('B', 'R', '1', '6'), // Bayer ordered dispersed dot dithering (order 4 dithering matrix)
    kDitheringCluster6x6 = OD_FOURCC('C', 'L', 'R', '6'), // Ordered clustered dot dithering (order 3 - 6x6 matrix)
    kDitheringCluster8x8 = OD_FOURCC('C', 'L', 'R', '8'), // Ordered clustered dot dithering (order 4 - 8x8 matrix)
    kDitheringCluster16x16 = OD_FOURCC('C', 'L', '1', '6'), // Ordered clustered dot dithering (order 8 - 16x16 matrix)
 
    //rescale flags
    kRescale = OD_FOURCC('R', 'S', 'C', 'L'),
    kRescaleBox = OD_FOURCC('B', 'O', 'X', ' '),             // Box, pulse, Fourier window, 1st order (constant) b-spline
    kRescaleBicubic = OD_FOURCC('B', 'C', 'B', 'C'),         // Mitchell & Netravali's two-param cubic filter
    kRescaleBilinear = OD_FOURCC('B', 'L', 'N', 'R'),        // Bilinear filter
    kRescaleBspline = OD_FOURCC('B', 'S', 'P', 'L'),         // 4th order (cubic) b-spline
    kRescaleCatmullrom = OD_FOURCC('C', 'T', 'M', 'L'),      // Catmull-Rom spline, Overhauser spline
    kRescaleLanczos3 = OD_FOURCC('L', 'N', 'C', 'Z'),        // Lanczos3 filter
    kRescaleWidth = OD_FOURCC('W', 'D', 'T', 'H'),
    kRescaleHeight = OD_FOURCC('H', 'G', 'H', 'T')
    //Note: rescaling converts bitional images to 8-bit images, so to keep the image bitional after rescale, the dithering flags must be in flag chain.
 
  };
 
  ODRX_DECLARE_MEMBERS(OdRxRasterServices);
 
  /** \details
      Loads the specified Raster Image file.
      \param filename [in]  Filename of the Raster Image file to be read.
      \param pStreamBuf [in]  Pointer to the StreamBuf object from which the data are to be read.
      \param pFlagsChain [in]  Optional zero-terminated loading flag pairs array.
 
      \remarks
      The returned pointer is expected to be passed to OdGiViewportGeometry::rasterImageDc().
  */
  virtual OdGiRasterImagePtr loadRasterImage(const OdString &filename, const OdUInt32 *pFlagsChain = NULL) = 0;
  virtual OdGiRasterImagePtr loadRasterImage(OdStreamBuf *pStreamBuf, const OdUInt32 *pFlagsChain = NULL) = 0;
 
  /** \details
      Create raster image using user-defined image implementation.
      \param pImp [in]  User-defined raster image implementation.
 
      \remarks
      For default implementation always return null.
  */
  virtual OdGiRasterImagePtr createRasterImage(void *pImp);
 
  /** \details
      Saves specified Raster Image to the specified file.
      \param rasterImage [in]  Raster image to be saved.
      \param filename [in]  Filename of the Raster Image file to be written.
      \param type [in]  Image format type to be written.
      \param pFlagsChain [in]  Optional zero-terminated saving flag pairs array.
  */
  virtual bool saveRasterImage(const OdGiRasterImage* rasterImage, const OdString& filename,
                               const OdUInt32 *pFlagsChain = NULL) = 0;
  virtual bool saveRasterImage(const OdGiRasterImage* rasterImage, const OdString& filename,
                               OdUInt32 type, const OdUInt32 *pFlagsChain = NULL) = 0;
 
  /** \details
      Try to convert raster image (RGB) to JPEG or other type.
      \param pRaster [in]  Raster image to be converted.
      \param type [in]  Image format type to be converted.
      \param pStreamBuf [in]  Pointer to the StreamBuf object to which the data are to be stored.
      \param pFlagsChain [in]  Optional zero-terminated saving flag pairs array.
  */
  virtual bool convertRasterImage(const OdGiRasterImage* pRaster, OdUInt32 type,
                                  OdStreamBuf* pStreamBuf, const OdUInt32 *pFlagsChain = NULL) = 0;
 
  /** \details
      Try to convert raster image to other type.
      \param pSrcStream [in]  Pointer to the StreamBuf object from which the data are to be converted.
      \param pDstStream [in]  Pointer to the StreamBuf object to which the data are to be converted.
      \param type [in]  Image format type to be converted.
      \param pFlagsChainSrc [in]  Optional zero-terminated loading flag pairs array.
      \param pFlagsChainDst [in]  Optional zero-terminated saving flag pairs array.
  */
  virtual bool convertRasterImage(OdStreamBuf* pSrcStream, OdStreamBuf* pDstStream, OdUInt32 type,
                                  const OdUInt32 *pFlagsChainSrc = NULL, const OdUInt32 *pFlagsChainDst = NULL) = 0;
 
  /** \details
      Returns array of supported image format types.
  */
  virtual OdUInt32Array getRasterImageTypes() const = 0;
 
  /** \details
      Checks does image format type is supported.
      \param type [in]  Image format type to be checked.
  */
  virtual bool isRasterImageTypeSupported(OdUInt32 type) const;
 
  /** \details
      Get file extension and filter name by type.
      \param type [in]  Image format type to be formatted.
      \param psFilterName [out]  Output filter name (can be Null).
  */
  virtual OdString mapTypeToExtension(OdUInt32 type, OdString* psFilterName) const = 0;
 
  /** \details
      Get image format type by file extension.
      \param extension [in]  File extension.
  */
  virtual OdUInt32 mapExtensionToType(const OdString& extension) const = 0;
 
  /** \details
      Try to detect image format type from input stream.
      \param filename [in]  Filename of the Raster Image file to be checked.
      \param pStreamBuf [in]  Pointer to the StreamBuf object from which the data are to be checked.
  */
  virtual OdUInt32 getImageFormat(const OdString &filename) const = 0;
  virtual OdUInt32 getImageFormat(OdStreamBuf* pStreamBuf) const = 0;
};
 
/** \details
  This template class is a specialization of the OdSmartPtr class for OdRxRasterServices object pointers.
*/
typedef OdSmartPtr<OdRxRasterServices> OdRxRasterServicesPtr;
 
#include "TD_PackPop.h"
 
#endif // __OD_RASTER_MODULE__