16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_highgui.h" 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "grfmt_sunras.h" 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const char* fmtSignSunRas = "\x59\xA6\x6A\x95"; 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Sun Raster filter factory 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtSunRaster::GrFmtSunRaster() 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_sign_len = 4; 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_signature = fmtSignSunRas; 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_description = "Sun raster files (*.sr;*.ras)"; 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtSunRaster::~GrFmtSunRaster() 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtReader* GrFmtSunRaster::NewReader( const char* filename ) 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return new GrFmtSunRasterReader( filename ); 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtWriter* GrFmtSunRaster::NewWriter( const char* filename ) 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return new GrFmtSunRasterWriter( filename ); 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************************ Sun Raster reader *****************************/ 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtSunRasterReader::GrFmtSunRasterReader( const char* filename ) : GrFmtReader( filename ) 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_offset = -1; 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtSunRasterReader::~GrFmtSunRasterReader() 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtSunRasterReader::Close() 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.Close(); 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtSunRasterReader::ReadHeader() 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( strlen(m_filename) != 0 ); 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_strm.Open( m_filename )) return false; 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( setjmp( m_strm.JmpBuf()) == 0 ) 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.Skip( 4 ); 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_width = m_strm.GetDWord(); 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_height = m_strm.GetDWord(); 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_bpp = m_strm.GetDWord(); 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int palSize = 3*(1 << m_bpp); 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.Skip( 4 ); 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_type = (SunRasType)m_strm.GetDWord(); 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_maptype = (SunRasMapType)m_strm.GetDWord(); 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_maplength = m_strm.GetDWord(); 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_width > 0 && m_height > 0 && 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (m_bpp == 1 || m_bpp == 8 || m_bpp == 24 || m_bpp == 32) && 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (m_type == RAS_OLD || m_type == RAS_STANDARD || 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (m_type == RAS_BYTE_ENCODED && m_bpp == 8) || m_type == RAS_FORMAT_RGB) && 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (m_maptype == RMT_NONE && m_maplength == 0 || 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_maptype == RMT_EQUAL_RGB && m_maplength <= palSize && m_bpp <= 8)) 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memset( m_palette, 0, sizeof(m_palette)); 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_maplength != 0 ) 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int readed; 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar buffer[256*3]; 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.GetBytes( buffer, m_maplength, &readed ); 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( readed == m_maplength ) 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn palSize = m_maplength/3; 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < palSize; i++ ) 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_palette[i].b = buffer[i + 2*palSize]; 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_palette[i].g = buffer[i + palSize]; 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_palette[i].r = buffer[i]; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_palette[i].a = 0; 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_iscolor = IsColorPalette( m_palette, m_bpp ); 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_offset = m_strm.GetPos(); 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( m_offset == 32 + m_maplength ); 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_iscolor = m_bpp > 8; 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_iscolor ) 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillGrayPalette( m_palette, m_bpp ); 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_offset = m_strm.GetPos(); 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( m_offset == 32 + m_maplength ); 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !result ) 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_offset = -1; 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_width = m_height = -1; 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.Close(); 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtSunRasterReader::ReadData( uchar* data, int step, int color ) 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const int buffer_size = 1 << 12; 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar buffer[buffer_size]; 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar bgr_buffer[buffer_size]; 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar gray_palette[256]; 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* src = buffer; 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* bgr = bgr_buffer; 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int src_pitch = ((m_width*m_bpp + 7)/8 + 1) & -2; 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int nch = color ? 3 : 1; 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int width3 = m_width*nch; 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int y; 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_offset < 0 || !m_strm.IsOpened()) 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( src_pitch+32 > buffer_size ) 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn src = new uchar[src_pitch+32]; 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_width*3 + 32 > buffer_size ) 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bgr = new uchar[m_width*3 + 32]; 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !color && m_maptype == RMT_EQUAL_RGB ) 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvtPaletteToGray( m_palette, gray_palette, 1 << m_bpp ); 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( setjmp( m_strm.JmpBuf()) == 0 ) 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.SetPos( m_offset ); 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch( m_bpp ) 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /************************* 1 BPP ************************/ 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case 1: 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_type != RAS_BYTE_ENCODED ) 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < m_height; y++, data += step ) 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.GetBytes( src, src_pitch ); 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillColorRow1( data, src, m_width, m_palette ); 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillGrayRow1( data, src, m_width, gray_palette ); 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* line_end = src + (m_width*m_bpp + 7)/8; 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* tsrc = src; 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y = 0; 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(;;) 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int max_count = (int)(line_end - tsrc); 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int code = 0, len = 0, len1 = 0; 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn code = m_strm.GetByte(); 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( code == 0x80 ) 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn len = m_strm.GetByte(); 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len != 0 ) break; 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tsrc[len1] = (uchar)code; 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( ++len1 < max_count ); 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tsrc += len1; 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len > 0 ) // encoded mode 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ++len; 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn code = m_strm.GetByte(); 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len > line_end - tsrc ) 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn goto bad_decoding_1bpp; 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn memset( tsrc, code, len ); 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tsrc += len; 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( tsrc >= line_end ) 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn tsrc = src; 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillColorRow1( data, src, m_width, m_palette ); 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillGrayRow1( data, src, m_width, gray_palette ); 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data += step; 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( ++y >= m_height ) break; 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbad_decoding_1bpp: 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ; 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /************************* 8 BPP ************************/ 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case 8: 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_type != RAS_BYTE_ENCODED ) 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < m_height; y++, data += step ) 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.GetBytes( src, src_pitch ); 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillColorRow8( data, src, m_width, m_palette ); 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillGrayRow8( data, src, m_width, gray_palette ); 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else // RLE-encoded 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* line_end = data + width3; 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y = 0; 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(;;) 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int max_count = (int)(line_end - data); 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int code = 0, len = 0, len1; 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* tsrc = src; 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn do 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn code = m_strm.GetByte(); 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( code == 0x80 ) 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn len = m_strm.GetByte(); 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len != 0 ) break; 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *tsrc++ = (uchar)code; 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn while( (max_count -= nch) > 0 ); 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn len1 = (int)(tsrc - src); 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len1 > 0 ) 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillColorRow8( data, src, len1, m_palette ); 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FillGrayRow8( data, src, len1, gray_palette ); 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data += len1*nch; 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( len > 0 ) // encoded mode 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn len = (len + 1)*nch; 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn code = m_strm.GetByte(); 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data = FillUniColor( data, line_end, step, width3, 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y, m_height, len, 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_palette[code] ); 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data = FillUniGray( data, line_end, step, width3, 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y, m_height, len, 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn gray_palette[code] ); 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( y >= m_height ) 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( data == line_end ) 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_strm.GetByte() != 0 ) 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn goto bad_decoding_end; 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn line_end += step; 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data = line_end - width3; 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( ++y >= m_height ) break; 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbad_decoding_end: 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ; 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /************************* 24 BPP ************************/ 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case 24: 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < m_height; y++, data += step ) 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.GetBytes( color ? data : bgr, src_pitch ); 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_type == RAS_FORMAT_RGB ) 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCvt_RGB2BGR_8u_C3R( data, 0, data, 0, cvSize(m_width,1) ); 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCvt_BGR2Gray_8u_C3C1R( bgr, 0, data, 0, cvSize(m_width,1), 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_type == RAS_FORMAT_RGB ? 2 : 0 ); 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /************************* 32 BPP ************************/ 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case 32: 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < m_height; y++, data += step ) 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn /* hack: a0 b0 g0 r0 a1 b1 g1 r1 ... are written to src + 3, 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn so when we look at src + 4, we see b0 g0 r0 x b1 g1 g1 x ... */ 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.GetBytes( src + 3, src_pitch ); 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCvt_BGRA2BGR_8u_C4C3R( src + 4, 0, data, 0, cvSize(m_width,1), 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_type == RAS_FORMAT_RGB ? 2 : 0 ); 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCvt_BGRA2Gray_8u_C4C1R( src + 4, 0, data, 0, cvSize(m_width,1), 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_type == RAS_FORMAT_RGB ? 2 : 0 ); 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( src != buffer ) delete[] src; 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( bgr != bgr_buffer ) delete[] bgr; 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn////////////////////////////////////////////////////////////////////////////////////////// 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtSunRasterWriter::GrFmtSunRasterWriter( const char* filename ) : GrFmtWriter( filename ) 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtSunRasterWriter::~GrFmtSunRasterWriter() 4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtSunRasterWriter::WriteImage( const uchar* data, int step, 4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int width, int height, int /*depth*/, int channels ) 4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int fileStep = (width*channels + 1) & -2; 4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int y; 4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( data && width > 0 && height > 0 && step >= fileStep); 4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_strm.Open( m_filename ) ) 4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutBytes( fmtSignSunRas, (int)strlen(fmtSignSunRas) ); 4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( width ); 4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( height ); 4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( channels*8 ); 4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( fileStep*height ); 4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( RAS_STANDARD ); 4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( RMT_NONE ); 4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutDWord( 0 ); 4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < height; y++, data += step ) 4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.PutBytes( data, fileStep ); 4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_strm.Close(); 4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 443