in imagecore/formats/internal/jpeg.cpp [893:966]
bool ImageWriterJPEG::beginWrite(unsigned int width, unsigned int height, EImageColorModel colorModel)
{
if( setjmp(m_JPEGError.jmp) ) {
fprintf(stderr, "error during jpeg compress init: %s", s_JPEGLastError);
jpeg_destroy_compress(&m_JPEGCompress);
return false;
}
m_JPEGCompress.image_width = width;
m_JPEGCompress.image_height = height;
if( Image::colorModelIsRGBA(colorModel) ) {
m_JPEGCompress.input_components = HAVE_RGBX ? 4 : 3;
m_JPEGCompress.in_color_space = HAVE_RGBX ? JCS_EXT_RGBX : JCS_RGB;
} else if( Image::colorModelIsYUV(colorModel) ) {
m_JPEGCompress.input_components = 3;
m_JPEGCompress.in_color_space = JCS_YCbCr;
} else {
return false;
}
jpeg_set_defaults(&m_JPEGCompress);
jpeg_set_quality(&m_JPEGCompress, m_Quality, TRUE);
jpeg_set_colorspace(&m_JPEGCompress, JCS_YCbCr);
if( m_QuantTables != NULL ) {
jpeg_add_quant_table(&m_JPEGCompress, 0, m_QuantTables, 100, TRUE);
jpeg_add_quant_table(&m_JPEGCompress, 1, m_QuantTables + DCTSIZE2, 100, TRUE);
}
if( (m_WriteOptions & kWriteOption_QualityFast) == 0 ) {
// Compressing takes about 50% longer with this on, but produces files a few percent smaller.
m_JPEGCompress.optimize_coding = TRUE;
}
// This makes more of a difference than the documentation suggests, and it's not really slower (faster in some tests).
m_JPEGCompress.dct_method = JDCT_ISLOW;
if( (m_WriteOptions & kWriteOption_Progressive) != 0 ) {
jpeg_simple_progression(&m_JPEGCompress);
}
m_JPEGCompress.comp_info[1].h_samp_factor = 1;
m_JPEGCompress.comp_info[1].h_samp_factor = 1;
m_JPEGCompress.comp_info[2].v_samp_factor = 1;
m_JPEGCompress.comp_info[2].v_samp_factor = 1;
if( Image::colorModelIsRGBA(colorModel) ) {
if( m_Quality == 100 ) {
m_JPEGCompress.comp_info[0].h_samp_factor = 1;
m_JPEGCompress.comp_info[0].v_samp_factor = 1;
} else if( m_Quality > 95 ) {
m_JPEGCompress.comp_info[0].h_samp_factor = 2;
m_JPEGCompress.comp_info[0].v_samp_factor = 1;
} else {
m_JPEGCompress.comp_info[0].h_samp_factor = 2;
m_JPEGCompress.comp_info[0].v_samp_factor = 2;
}
} else if( colorModel == kColorModel_YUV_420 ) {
m_JPEGCompress.raw_data_in = TRUE;
m_JPEGCompress.comp_info[0].h_samp_factor = 2;
m_JPEGCompress.comp_info[0].v_samp_factor = 2;
} else {
SECURE_ASSERT(0);
}
jpeg_start_compress(&m_JPEGCompress, TRUE);
if( !writeMarkers() ) {
jpeg_destroy_compress(&m_JPEGCompress);
return false;
}
return true;
}