void FormatSettingsPopup::buildPropertyCheckBox(int index, TPropertyGroup *props)
{
	TBoolProperty *prop = (TBoolProperty *)(props->getProperty(index));
	assert(prop);

	PropertyCheckBox *v = new PropertyCheckBox(tr(prop->getName().c_str()), this, prop);
	m_widgets[prop->getName()] = v;

	m_mainLayout->addWidget(v, m_mainLayout->rowCount(), 1);

	v->setChecked(prop->getValue());
}
예제 #2
0
void PngWriter::open(FILE *file, const TImageInfo &info)
{
	m_info = info;
	m_png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
										(png_voidp)0, //user_error_ptr,
										0,			  //user_error_fn,
										0);			  //user_warning_fn);
	if (!m_png_ptr)
		return;
	m_info_ptr = png_create_info_struct(m_png_ptr);
	if (!m_info_ptr) {
		png_destroy_write_struct(&m_png_ptr, (png_infopp)0);
		return;
	}

	m_chan = file;
	png_init_io(m_png_ptr, m_chan);

	if (!m_properties)
		m_properties = new Tiio::PngWriterProperties();

	TBoolProperty *alphaProp = (TBoolProperty *)(m_properties->getProperty("Alpha Channel"));
	TPointerProperty *colormap = (TPointerProperty *)(m_properties->getProperty("Colormap"));
	m_matte = (alphaProp && alphaProp->getValue()) ? true : false;
	if (colormap)
		m_colormap = (vector<TPixel> *)colormap->getValue();

	TUINT32 x_pixels_per_meter = tround(m_info.m_dpix / 0.0254);
	TUINT32 y_pixels_per_meter = tround(m_info.m_dpiy / 0.0254);

	if (!m_colormap)
		png_set_IHDR(m_png_ptr, m_info_ptr,
					 m_info.m_lx, m_info.m_ly,
					 info.m_bitsPerSample, m_matte ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB,
					 PNG_INTERLACE_NONE,
					 PNG_COMPRESSION_TYPE_DEFAULT,
					 PNG_FILTER_TYPE_DEFAULT);
	else {
		png_set_IHDR(m_png_ptr, m_info_ptr,
					 m_info.m_lx, m_info.m_ly,
					 8, PNG_COLOR_TYPE_PALETTE,
					 PNG_INTERLACE_NONE,
					 PNG_COMPRESSION_TYPE_DEFAULT,
					 PNG_FILTER_TYPE_DEFAULT);
		for (unsigned int i = 0; i < m_colormap->size(); i++) {
			/*unsigned char red = (i>>5)&0x7;
			unsigned char green = (i>>2)&0x7;
			unsigned char blue = i&0x3;
			palette[i].red = (red>>1) | (red<<2) | (red<<5);
			palette[i].green = (green>>1) | (green<<2) | (green<<5);
			palette[i].blue = blue | (blue<<2) | (blue<<4) | (blue<<6);
			if (red==0 && green==0) alpha[i] = 0; else if (blue==0 && green==0) alpha[i] = 128; else alpha[i] = 255;*/
			palette[i].red = (*m_colormap)[i].r;
			palette[i].green = (*m_colormap)[i].g;
			palette[i].blue = (*m_colormap)[i].b;
		}

		png_set_PLTE(m_png_ptr, m_info_ptr, palette, m_colormap->size());
	}

//png_set_dither(m_png_ptr, palette, 256, 256, 0, 1);

#if defined(TNZ_MACHINE_CHANNEL_ORDER_MBGR)
	png_set_bgr(m_png_ptr);
	png_set_swap_alpha(m_png_ptr);
#elif defined(TNZ_MACHINE_CHANNEL_ORDER_BGRM)
	png_set_bgr(m_png_ptr);
#elif defined(TNZ_MACHINE_CHANNEL_ORDER_MRGB)
	png_set_swap_alpha(m_png_ptr);
#elif !defined(TNZ_MACHINE_CHANNEL_ORDER_RGBM)
#error	"unknownchannel order"
#endif

	png_write_info(m_png_ptr, m_info_ptr);
	png_set_pHYs(m_png_ptr, m_info_ptr, x_pixels_per_meter, y_pixels_per_meter, 1);

	if (m_colormap && m_matte) {
		alpha[0] = 0;
		//png_set_tRNS(m_png_ptr, m_info_ptr, alpha, 1, PNG_COLOR_TYPE_PALETTE);
		png_color_16 bgcolor;
		bgcolor.index = 0;
		png_set_tRNS(m_png_ptr, m_info_ptr, alpha, 1, &bgcolor);
	}
}