in imagecore/formats/internal/png.cpp [440:470]
bool ImageWriterPNG::beginWrite(unsigned int width, unsigned int height, EImageColorModel colorModel)
{
if( setjmp(png_jmpbuf(m_PNGCompress)) ) {
return false;
}
if( !Image::colorModelIsRGBA(colorModel) && !Image::colorModelIsGrayscale(colorModel) ) {
return false;
}
unsigned int colorType = 0;
if( colorModel == kColorModel_RGBX && m_SourceReader != NULL && m_SourceReader->getNativeColorModel() == kColorModel_RGBA ) {
colorType = PNG_COLOR_TYPE_RGBA;
} else if( colorModel == kColorModel_RGBA && m_SourceReader != NULL && m_SourceReader->getNativeColorModel() == kColorModel_RGBX ) {
colorType = PNG_COLOR_TYPE_RGB;
} else if( colorModel == kColorModel_RGBA ) {
colorType = PNG_COLOR_TYPE_RGBA;
} else if( colorModel == kColorModel_RGBX ) {
colorType = PNG_COLOR_TYPE_RGB;
} else if( colorModel == kColorModel_Grayscale ) {
colorType = PNG_COLOR_TYPE_GRAY;
} else {
SECURE_ASSERT(0);
}
png_set_IHDR(m_PNGCompress, m_PNGInfo, width, height, 8, colorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_write_info(m_PNGCompress, m_PNGInfo);
applyCompressionSettings();
if( colorType == PNG_COLOR_TYPE_RGB ) {
png_set_filler(m_PNGCompress, 0, PNG_FILLER_AFTER);
}
return true;
}