bool SunRasterDecoder::readHeader() { bool result = false; if( !m_strm.open( m_filename )) return false; try { m_strm.skip( 4 ); m_width = m_strm.getDWord(); m_height = m_strm.getDWord(); m_bpp = m_strm.getDWord(); int palSize = 3*(1 << m_bpp); m_strm.skip( 4 ); m_encoding = (SunRasType)m_strm.getDWord(); m_maptype = (SunRasMapType)m_strm.getDWord(); m_maplength = m_strm.getDWord(); if( m_width > 0 && m_height > 0 && (m_bpp == 1 || m_bpp == 8 || m_bpp == 24 || m_bpp == 32) && (m_type == RAS_OLD || m_type == RAS_STANDARD || (m_type == RAS_BYTE_ENCODED && m_bpp == 8) || m_type == RAS_FORMAT_RGB) && ((m_maptype == RMT_NONE && m_maplength == 0) || (m_maptype == RMT_EQUAL_RGB && m_maplength <= palSize && m_bpp <= 8))) { memset( m_palette, 0, sizeof(m_palette)); if( m_maplength != 0 ) { uchar buffer[256*3]; if( m_strm.getBytes( buffer, m_maplength ) == m_maplength ) { int i; palSize = m_maplength/3; for( i = 0; i < palSize; i++ ) { m_palette[i].b = buffer[i + 2*palSize]; m_palette[i].g = buffer[i + palSize]; m_palette[i].r = buffer[i]; m_palette[i].a = 0; } m_type = IsColorPalette( m_palette, m_bpp ) ? CV_8UC3 : CV_8UC1; m_offset = m_strm.getPos(); assert( m_offset == 32 + m_maplength ); result = true; } } else { m_type = m_bpp > 8 ? CV_8UC3 : CV_8UC1; if( CV_MAT_CN(m_type) == 1 ) FillGrayPalette( m_palette, m_bpp ); m_offset = m_strm.getPos(); assert( m_offset == 32 + m_maplength ); result = true; } } } catch(...) { } if( !result ) { m_offset = -1; m_width = m_height = -1; m_strm.close(); } return result; }
bool GrFmtSunRasterReader::ReadHeader() { bool result = false; assert( strlen(m_filename) != 0 ); if( !m_strm.Open( m_filename )) return false; if( setjmp( m_strm.JmpBuf()) == 0 ) { m_strm.Skip( 4 ); m_width = m_strm.GetDWord(); m_height = m_strm.GetDWord(); m_bpp = m_strm.GetDWord(); int palSize = 3*(1 << m_bpp); m_strm.Skip( 4 ); m_type = (SunRasType)m_strm.GetDWord(); m_maptype = (SunRasMapType)m_strm.GetDWord(); m_maplength = m_strm.GetDWord(); if( m_width > 0 && m_height > 0 && (m_bpp == 1 || m_bpp == 8 || m_bpp == 24 || m_bpp == 32) && (m_type == RAS_OLD || m_type == RAS_STANDARD || (m_type == RAS_BYTE_ENCODED && m_bpp == 8) || m_type == RAS_FORMAT_RGB) && (m_maptype == RMT_NONE && m_maplength == 0 || m_maptype == RMT_EQUAL_RGB && m_maplength <= palSize && m_bpp <= 8)) { memset( m_palette, 0, sizeof(m_palette)); if( m_maplength != 0 ) { int readed; uchar buffer[256*3]; m_strm.GetBytes( buffer, m_maplength, &readed ); if( readed == m_maplength ) { int i; palSize = m_maplength/3; for( i = 0; i < palSize; i++ ) { m_palette[i].b = buffer[i + 2*palSize]; m_palette[i].g = buffer[i + palSize]; m_palette[i].r = buffer[i]; m_palette[i].a = 0; } m_iscolor = IsColorPalette( m_palette, m_bpp ); m_offset = m_strm.GetPos(); assert( m_offset == 32 + m_maplength ); result = true; } } else { m_iscolor = m_bpp > 8; if( !m_iscolor ) FillGrayPalette( m_palette, m_bpp ); m_offset = m_strm.GetPos(); assert( m_offset == 32 + m_maplength ); result = true; } } } if( !result ) { m_offset = -1; m_width = m_height = -1; m_strm.Close(); } return result; }