6 static const char ADD_ALPHA_CHANNEL_KW[] =
"add_alpha_channel";
8 static void user_read_data (png_structp png_ptr, png_bytep data, png_size_t length)
12 memcpy (data, *input_pointer,
sizeof (
ossim_uint8) * length);
13 (*input_pointer) += length;
16 static void PngWriteCallback(png_structp png_ptr, png_bytep data, png_size_t length)
18 std::vector<ossim_uint8> *p = (std::vector<ossim_uint8>*)png_get_io_ptr(png_ptr);
19 p->insert(p->end(), data, data + length);
29 :m_addAlphaChannel(addAlpha),
47 std::vector<ossim_uint8>& out )
const 52 if(!in->
getBuf())
return false;
57 colorType = PNG_COLOR_TYPE_GRAY_ALPHA;
61 colorType = PNG_COLOR_TYPE_GRAY;
68 colorType = PNG_COLOR_TYPE_RGB_ALPHA;
72 colorType = PNG_COLOR_TYPE_RGB;
75 if(colorType < 0)
return false;
95 if(bitDepth == 0)
return false;
99 png_structp p = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
101 png_infop info_ptr = png_create_info_struct(p);
102 setjmp(png_jmpbuf(p));
104 png_set_IHDR(p, info_ptr, w, h, bitDepth,
107 PNG_COMPRESSION_TYPE_DEFAULT,
108 PNG_FILTER_TYPE_DEFAULT);
109 png_set_compression_level(p, 1);
113 case PNG_COLOR_TYPE_GRAY:
118 std::vector<ossim_uint8*> rows(h);
123 png_set_rows(p, info_ptr, &rows[0]);
124 png_set_write_fn(p, &out, PngWriteCallback, NULL);
125 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
127 else if(bitDepth == 16)
130 std::vector<ossim_uint8*> rows(h);
131 for(
int y=0;
y<h;++
y)
135 png_set_rows(p, info_ptr, &rows[0]);
136 png_set_write_fn(p, &out, PngWriteCallback, NULL);
137 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
141 case PNG_COLOR_TYPE_GRAY_ALPHA:
145 std::vector<ossim_uint8> buf(w*h*2);
146 std::vector<ossim_uint8*> rows(h);
149 for(
int y=0;
y<h;++
y)
153 png_set_rows(p, info_ptr, &rows[0]);
154 png_set_write_fn(p, &out, PngWriteCallback, NULL);
155 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
160 std::vector<ossim_uint16> buf(w*h*2);
161 std::vector<ossim_uint8*> rows(h);
168 png_set_rows(p, info_ptr, &rows[0]);
169 png_set_write_fn(p, &out, PngWriteCallback, NULL);
170 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
175 case PNG_COLOR_TYPE_RGB:
179 std::vector<ossim_uint8> buf(w*h*3);
180 std::vector<ossim_uint8*> rows(h);
187 png_set_rows(p, info_ptr, &rows[0]);
188 png_set_write_fn(p, &out, PngWriteCallback, NULL);
189 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
193 std::vector<ossim_uint16> buf(w*h*3);
194 std::vector<ossim_uint8*> rows(h);
201 png_set_rows(p, info_ptr, &rows[0]);
202 png_set_write_fn(p, &out, PngWriteCallback, NULL);
203 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
207 case PNG_COLOR_TYPE_RGB_ALPHA:
211 std::vector<ossim_uint8> buf(w*h*4);
212 std::vector<ossim_uint8*> rows(h);
215 for(
int y=0;
y<h;++
y)
219 png_set_rows(p, info_ptr, &rows[0]);
220 png_set_write_fn(p, &out, PngWriteCallback, NULL);
221 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
225 std::vector<ossim_uint16> buf(w*h*4);
226 std::vector<ossim_uint8*> rows(h);
233 png_set_rows(p, info_ptr, &rows[0]);
234 png_set_write_fn(p, &out, PngWriteCallback, NULL);
235 png_write_png(p, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
249 png_structp pngPtr = 0;
250 png_infop infoPtr = 0;
251 png_uint_32 pngWidth = 0;
252 png_uint_32 pngHeight = 0;
253 ossim_int32 pngBitDepth=0, pngByteDepth = 0, pngColorType=0, pngInterlaceType=0;
262 pngPtr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
266 infoPtr = png_create_info_struct (pngPtr);
269 setjmp (png_jmpbuf(pngPtr));
272 png_set_read_fn (pngPtr, reinterpret_cast<void*> (&inputPointer), user_read_data);
274 png_read_info (pngPtr, infoPtr);
276 png_get_IHDR (pngPtr, infoPtr, &pngWidth, &pngHeight, &pngBitDepth,
277 &pngColorType, &pngInterlaceType, NULL, NULL);
285 switch (pngColorType)
287 case PNG_COLOR_TYPE_GRAY:
292 case PNG_COLOR_TYPE_GRAY_ALPHA:
297 case PNG_COLOR_TYPE_RGB:
302 case PNG_COLOR_TYPE_RGB_ALPHA:
313 pngByteDepth = pngBitDepth>>3;
317 ossim_uint32 bytes = pngHeight*pngWidth*pngChannels*pngByteDepth;
319 std::vector<ossim_uint8> data(bytes);
320 std::vector<ossim_uint8*> rowPointers(pngHeight);
322 for (
y = 0;
y < pngHeight;
y++)
324 rowPointers[
y] =
reinterpret_cast<ossim_uint8*
> (dataPtr + (
y*(pngWidth*pngByteDepth*pngChannels)));
327 png_read_image (pngPtr, &rowPointers.front());
332 if((bands == 2) ||(bands==4))
339 out =
new ossimImageData(0, scalarType, bands, pngWidth, pngHeight);
352 memcpy(out->
getBuf(0), dataPtr, bytes);
357 else if(pngChannels == 2)
367 for(idx = 0; idx <
size;++idx)
369 *buf = tempDataPtr[0];
371 tempDataPtr+=2;++buf;
380 for(idx = 0; idx <
size;++idx)
384 tempDataPtr+=2;++buf;
393 else if(pngChannels == 4)
405 for(idx = 0; idx <
size;++idx)
407 *buf1 = tempDataPtr[0];
408 *buf2 = tempDataPtr[1];
409 *buf3 = tempDataPtr[2];
411 tempDataPtr+=4;++buf1;++buf2;++buf3;
422 for(idx = 0; idx <
size;++idx)
424 *buf1 = tempDataPtr[0];
425 *buf2 = tempDataPtr[1];
426 *buf3 = tempDataPtr[2];
428 tempDataPtr+=4;++buf1;++buf2;++buf3;
444 png_free_data (pngPtr, infoPtr, PNG_FREE_ALL, -1);
448 png_destroy_read_struct (&pngPtr, 0, 0);
456 if(property->
getName() == ADD_ALPHA_CHANNEL_KW)
470 if(name == ADD_ALPHA_CHANNEL_KW)
484 propertyNames.push_back(ADD_ALPHA_CHANNEL_KW);
491 if(!addAlphaChannel.
empty())
virtual const std::string & getExtension() const
virtual ossim_uint32 getWidth() const
virtual ossim_uint32 getNumberOfBands() const
virtual void setProperty(ossimRefPtr< ossimProperty > property)
Ineterface to allow for specific properties to be set.
Represents serializable keyword/value map.
const char * find(const char *key) const
ossimPngCodec(bool addAlpha=false)
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
virtual ossim_uint32 getHeight() const
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
Interface to get the value of a specific property.
virtual bool decode(const std::vector< ossim_uint8 > &in, ossimRefPtr< ossimImageData > &out) const
Decode png method.
virtual ossimString getCodecType() const
Will return the identifier used to identify the codec type.
unsigned short ossim_uint16
virtual void initialize()
Initialize the data buffer.
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Save the state of the codec to the keywordlist.
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
virtual void loadTile(const void *src, const ossimIrect &src_rect, ossimInterleaveType il_type)
virtual void setNumberOfDataComponents(ossim_uint32 n)
How many components make up this data object.
TPngDestructor(png_struct *p)
virtual ossimDataObjectStatus validate() const
virtual void setImageRectangleAndBands(const ossimIrect &rect, ossim_uint32 numberOfBands)
bool toBool() const
String to numeric methods.
unsigned int ossim_uint32
virtual ossimIrect getImageRectangle() const
virtual void unloadTileToBipAlpha(void *dest, const ossimIrect &dest_rect, const ossimIrect &clip_rect) const
virtual void unloadTile(void *dest, const ossimIrect &dest_rect, ossimInterleaveType il_type) const
virtual void getPropertyNames(std::vector< ossimString > &propertyNames) const
Get a list of all supported property names.
virtual ossimScalarType getScalarType() const
16 bit unsigned integer (11 bits used)
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Allocate the state of the object thorugh a factory load/keywordlist.
virtual const void * getBuf() const
virtual void setProperty(const ossimString &name, const ossimString &value)
unsigned char ossim_uint8
virtual bool encode(const ossimRefPtr< ossimImageData > &in, std::vector< ossim_uint8 > &out) const
Encode png method.
const ossimString & getName() const