bool ImageWriterJPEG::beginWrite()

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;
}