Beispiel #1
0
GRESULT gsys::LoadTIFF(gsys::gfile *file,bitmap & clarr,int Options,int* pOptionsQuery)
{
	TIFF* tif = TIFFClientOpen("","r",reinterpret_cast<thandle_t>(file),
		_tiff_read,
		_tiff_read,
		_tiff_seek,
		_tiff_close,
		_tiff_size,
		_tiff_map,
		_tiff_unmap);
	
	if(!tif) return GERR_INVALID_DATA;

	uint32 w, h;
	size_t npixels;
	uint32* raster;
	TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
	TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
	npixels = w * h;
	raster = (uint32*) _TIFFmalloc((tsize_t)(npixels * sizeof (uint32)));
	if (raster != NULL)
	{
	    if (TIFFReadRGBAImage(tif, w, h, raster, 0))
		{
			//gsys::array2d<gsys::dwcolor> clarr(w,h);
			clarr.init(w,h);
			for(uint i=0;i<npixels;i++)
			{
				dwcolor cl;
				uint32 ucl = raster[i];
				clarr(i) = dwcolor( (gbyte)TIFFGetR(ucl),
									(gbyte)TIFFGetG(ucl),
									(gbyte)TIFFGetB(ucl),
									(gbyte)TIFFGetA(ucl));
			}
	    }
	    _TIFFfree(raster);
	}
	TIFFClose(tif);

	GTransformImage(clarr,ImagePremultipliedAlpha,Options,pOptionsQuery);
	return G_OK;
}