void rgba::read(stream* in, int tag_type) { if (tag_type <= 22) { read_rgb(in); } else { read_rgba(in); } }
void read( string fn, tImgLinear& rimg ) { std::vector<uint8_t> buf; bin_read::t_bin_read reader; reader( fn, buf ); FILEHEADER const* fileheader = referenceToFILEHEADER( buf ); uint16_t sig = fileheader->signature; if( sig != BMP_signature ) { return ; } if( buf.size() == fileheader->size ) { try { INFO const* bitmapinfoheader = referenceToINFO( buf ); uint32_t w = info_width( bitmapinfoheader ); uint32_t h = info_height( bitmapinfoheader ); // copy data to tImgLinear rimg.size() = tSize( w, h ); uint8_t const* pbuf = &buf[0]; uint8_t const* dataptr = pbuf + fileheader->offset_bits; // 8 bit if( bitmapinfoheader->bit_count == 8 ) { // LUT is not supported, convert to rgb, if lut is not an gray ramp lut tBGRA const* lut = referenceToLUT( buf ); if( is_ramp( lut ) ) { rimg.set_mono8(); rimg.alloc_data_buffer(); read_8bit( dataptr, rimg.size(), rimg.rows() ); return; } if( is_zero( lut ) ) { rimg.set_mono8(); rimg.alloc_data_buffer(); read_8bit( dataptr, rimg.size(), rimg.rows() ); return; } rimg.set_rgb(); rimg.alloc_data_buffer(); read_8bit_as_rgb( lut, dataptr, rimg.size(), rimg.rows() ); return; } // 24 bit if( bitmapinfoheader->bit_count == 24 ) { rimg.set_rgb(); rimg.alloc_data_buffer(); read_rgb( dataptr, rimg.size(), rimg.rows() ); } if( bitmapinfoheader->bit_count == 32 ) { // read an rgba image, write an rgb image, alpha is lost rimg.set_rgba(); rimg.alloc_data_buffer(); read_rgba( dataptr, rimg.size(), rimg.rows() ); } } catch( tImgAllocEx& ex ) { throw tImgReadEx( ex.what() ); } } }
mapnik::raster_ptr pgraster_wkb_reader::get_raster() { /* Read endianness */ endian_ = *ptr_; ptr_ += 1; /* Read version of protocol */ uint16_t version = read_uint16(&ptr_, endian_); if (version != 0) { MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: WKB version " << version << " unsupported"; return mapnik::raster_ptr(); } numBands_ = read_uint16(&ptr_, endian_); double scaleX = read_float64(&ptr_, endian_); double scaleY = read_float64(&ptr_, endian_); double ipX = read_float64(&ptr_, endian_); double ipY = read_float64(&ptr_, endian_); double skewX = read_float64(&ptr_, endian_); double skewY = read_float64(&ptr_, endian_); int32_t srid = read_int32(&ptr_, endian_); width_ = read_uint16(&ptr_, endian_); height_ = read_uint16(&ptr_, endian_); MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: numBands=" << numBands_; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: scaleX=" << scaleX; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: scaleY=" << scaleY; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: ipX=" << ipX; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: ipY=" << ipY; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: skewX=" << skewX; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: skewY=" << skewY; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: srid=" << srid; MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: size=" << width_ << "x" << height_; // this is for color interpretation MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: bandno=" << bandno_; if ( skewX || skewY ) { MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: raster rotation is not supported"; return mapnik::raster_ptr(); } mapnik::box2d<double> ext(ipX,ipY,ipX+(width_*scaleX),ipY+(height_*scaleY)); MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: Raster extent=" << ext; if ( bandno_ ) { if ( bandno_ != 1 ) { MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: " "reading bands other than 1st as indexed is unsupported"; return mapnik::raster_ptr(); } MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: requested band " << bandno_; return read_indexed(ext, width_, height_); } else { switch (numBands_) { case 1: return read_grayscale(ext, width_, height_); break; case 3: case 4: return read_rgba(ext, width_, height_); break; default: std::ostringstream err; err << "pgraster_wkb_reader: raster with " << numBands_ << " bands is not supported, specify a band number"; //MAPNIK_LOG_WARN(pgraster) << err.str(); throw mapnik::datasource_exception(err.str()); return mapnik::raster_ptr(); } } return mapnik::raster_ptr(); }