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 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef HAVE_ILMIMF 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <OpenEXR/ImfHeader.h> 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <OpenEXR/ImfInputFile.h> 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <OpenEXR/ImfOutputFile.h> 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <OpenEXR/ImfChannelList.h> 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <OpenEXR/ImfStandardAttributes.h> 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <OpenEXR/half.h> 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "grfmt_exr.h" 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined _MSC_VER && _MSC_VER >= 1200 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma comment(lib, "Half.lib") 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma comment(lib, "Iex.lib") 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma comment(lib, "IlmImf.lib") 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma comment(lib, "IlmThread.lib") 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#pragma comment(lib, "Imath.lib") 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef UINT 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define UINT ((Imf::PixelType)0) 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef HALF 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define HALF ((Imf::PixelType)1) 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef FLOAT 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define FLOAT ((Imf::PixelType)2) 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef uint 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define uint unsigned 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Exr Filter Factory 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtExr::GrFmtExr() 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_sign_len = 4; 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_signature = "\x76\x2f\x31\x01"; 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_description = "OpenEXR Image files (*.exr)"; 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtExr::~GrFmtExr() 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtReader* GrFmtExr::NewReader( const char* filename ) 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return new GrFmtExrReader( filename ); 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtWriter* GrFmtExr::NewWriter( const char* filename ) 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return new GrFmtExrWriter( filename ); 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////// GrFmtExrReader /////////////////// 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtExrReader::GrFmtExrReader( const char* filename ) : GrFmtReader( filename ) 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_file = new InputFile( filename ); 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_red = m_green = m_blue = 0; 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtExrReader::~GrFmtExrReader() 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Close(); 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtExrReader::Close() 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_file ) 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delete m_file; 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_file = 0; 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn GrFmtReader::Close(); 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtExrReader::ReadHeader() 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_file ) // probably paranoid 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_datawindow = m_file->header().dataWindow(); 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_width = m_datawindow.max.x - m_datawindow.min.x + 1; 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_height = m_datawindow.max.y - m_datawindow.min.y + 1; 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // the type HALF is converted to 32 bit float 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // and the other types supported by OpenEXR are 32 bit anyway 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_bit_depth = 32; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( hasChromaticities( m_file->header() )) 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_chroma = chromaticities( m_file->header() ); 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const ChannelList &channels = m_file->header().channels(); 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_red = channels.findChannel( "R" ); 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_green = channels.findChannel( "G" ); 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_blue = channels.findChannel( "B" ); 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_red || m_green || m_blue ) 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_iscolor = true; 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_ischroma = false; 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_green = channels.findChannel( "Y" ); 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_green ) 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_ischroma = true; 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_red = channels.findChannel( "RY" ); 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_blue = channels.findChannel( "BY" ); 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_iscolor = (m_blue || m_red); 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = false; 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( result ) 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int uintcnt = 0; 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int chcnt = 0; 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_red ) 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn chcnt++; 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uintcnt += ( m_red->type == UINT ); 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_green ) 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn chcnt++; 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uintcnt += ( m_green->type == UINT ); 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_blue ) 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn chcnt++; 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uintcnt += ( m_blue->type == UINT ); 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_type = (chcnt == uintcnt) ? UINT : FLOAT; 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_isfloat = (m_type == FLOAT); 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !result ) 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Close(); 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtExrReader::ReadData( uchar* data, int step, int color ) 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool justcopy = m_native_depth; 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool chromatorgb = false; 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool rgbtogray = false; 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = true; 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FrameBuffer frame; 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xsample[3] = {1, 1, 1}; 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char *buffer; 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xstep; 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ystep; 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xstep = m_native_depth ? 4 : 1; 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_native_depth || (!color && m_iscolor )) 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer = (char *)new float[ m_width * 3 ]; 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ystep = 0; 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer = (char *)data; 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ystep = step; 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_ischroma ) 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_iscolor ) 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_blue ) 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "BY", Slice( m_type, 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep, 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_blue->xSampling, m_blue->ySampling, 0.0 )); 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[0] = m_blue->ySampling; 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_green ) 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "Y", Slice( m_type, 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep + 4, 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_green->xSampling, m_green->ySampling, 0.0 )); 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[1] = m_green->ySampling; 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_red ) 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "RY", Slice( m_type, 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep + 8, 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_red->xSampling, m_red->ySampling, 0.0 )); 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[2] = m_red->ySampling; 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn chromatorgb = true; 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "Y", Slice( m_type, 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep, 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_green->xSampling, m_green->ySampling, 0.0 )); 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "Y", Slice( m_type, 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep + 4, 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_green->xSampling, m_green->ySampling, 0.0 )); 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "Y", Slice( m_type, 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep + 8, 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_green->xSampling, m_green->ySampling, 0.0 )); 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[0] = m_green->ySampling; 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[1] = m_green->ySampling; 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[2] = m_green->ySampling; 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "Y", Slice( m_type, 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 4 - m_datawindow.min.y * ystep, 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4, ystep, m_green->xSampling, m_green->ySampling, 0.0 )); 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[0] = m_green->ySampling; 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_blue ) 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "B", Slice( m_type, 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep, 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_blue->xSampling, m_blue->ySampling, 0.0 )); 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[0] = m_blue->ySampling; 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_green ) 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "G", Slice( m_type, 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep + 4, 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_green->xSampling, m_green->ySampling, 0.0 )); 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[1] = m_green->ySampling; 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_red ) 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "R", Slice( m_type, 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer - m_datawindow.min.x * 12 - m_datawindow.min.y * ystep + 8, 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 12, ystep, m_red->xSampling, m_red->ySampling, 0.0 )); 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn xsample[2] = m_red->ySampling; 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(color == 0) 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn rgbtogray = true; 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn justcopy = false; 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_file->setFrameBuffer( frame ); 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( justcopy ) 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_file->readPixels( m_datawindow.min.y, m_datawindow.max.y ); 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_blue && (m_blue->xSampling != 1 || m_blue->ySampling != 1) ) 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSample( data, 3, step / xstep, xsample[0], m_blue->ySampling ); 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_green && (m_green->xSampling != 1 || m_green->ySampling != 1) ) 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSample( data + xstep, 3, step / xstep, xsample[1], m_green->ySampling ); 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_red && (m_red->xSampling != 1 || m_red->ySampling != 1) ) 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSample( data + 2 * xstep, 3, step / xstep, xsample[2], m_red->ySampling ); 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( m_green && (m_green->xSampling != 1 || m_green->ySampling != 1) ) 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSample( data, 1, step / xstep, xsample[0], m_green->ySampling ); 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *out = data; 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int x, y; 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = m_datawindow.min.y; y <= m_datawindow.max.y; y++ ) 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_file->readPixels( y, y ); 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( rgbtogray ) 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xsample[0] != 1 ) 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleX( (float *)buffer, 3, xsample[0] ); 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xsample[1] != 1 ) 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleX( (float *)buffer + 4, 3, xsample[1] ); 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xsample[2] != 1 ) 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleX( (float *)buffer + 8, 3, xsample[2] ); 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn RGBToGray( (float *)buffer, (float *)out ); 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xsample[0] != 1 ) 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleX( (float *)buffer, 3, xsample[0] ); 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xsample[1] != 1 ) 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleX( (float *)(buffer + 4), 3, xsample[1] ); 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xsample[2] != 1 ) 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleX( (float *)(buffer + 8), 3, xsample[2] ); 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( chromatorgb ) 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ChromaToBGR( (float *)buffer, 1, step ); 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_type == FLOAT ) 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float *fi = (float *)buffer; 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < m_width * 3; x++) 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound(fi[x]*5); 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn out[x] = CV_CAST_8U(t); 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uint *ui = (uint *)buffer; 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < m_width * 3; x++) 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uint t = ui[x]; 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn out[x] = CV_CAST_8U(t); 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn out += step; 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_blue && (m_blue->xSampling != 1 || m_blue->ySampling != 1) ) 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleY( data, 3, step / xstep, m_blue->ySampling ); 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_green && (m_green->xSampling != 1 || m_green->ySampling != 1) ) 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleY( data + xstep, 3, step / xstep, m_green->ySampling ); 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_red && (m_red->xSampling != 1 || m_red->ySampling != 1) ) 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleY( data + 2 * xstep, 3, step / xstep, m_red->ySampling ); 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( m_green && (m_green->xSampling != 1 || m_green->ySampling != 1) ) 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn UpSampleY( data, 1, step / xstep, m_green->ySampling ); 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( chromatorgb ) 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ChromaToBGR( (float *)data, m_height, step / xstep ); 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Close(); 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/** 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// on entry pixel values are stored packed in the upper left corner of the image 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this functions expands them by duplication to cover the whole image 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */ 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtExrReader::UpSample( uchar *data, int xstep, int ystep, int xsample, int ysample ) 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int y = (m_height - 1) / ysample, yre = m_height - ysample; y >= 0; y--, yre -= ysample ) 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int x = (m_width - 1) / xsample, xre = m_width - xsample; x >= 0; x--, xre -= xsample ) 4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < ysample; i++ ) 4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int n = 0; n < xsample; n++ ) 4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_native_depth ) 4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data[(yre + i) * ystep + (xre + n) * xstep] = data[y * ystep + x * xstep]; 4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( m_type == FLOAT ) 4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((float *)data)[(yre + i) * ystep + (xre + n) * xstep] = ((float *)data)[y * ystep + x * xstep]; 4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uint *)data)[(yre + i) * ystep + (xre + n) * xstep] = ((uint *)data)[y * ystep + x * xstep]; 4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/** 4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// on entry pixel values are stored packed in the upper left corner of the image 4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this functions expands them by duplication to cover the whole image 4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */ 4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtExrReader::UpSampleX( float *data, int xstep, int xsample ) 4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int x = (m_width - 1) / xsample, xre = m_width - xsample; x >= 0; x--, xre -= xsample ) 4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int n = 0; n < xsample; n++ ) 4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_type == FLOAT ) 4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((float *)data)[(xre + n) * xstep] = ((float *)data)[x * xstep]; 4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uint *)data)[(xre + n) * xstep] = ((uint *)data)[x * xstep]; 4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/** 4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// on entry pixel values are stored packed in the upper left corner of the image 4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this functions expands them by duplication to cover the whole image 4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */ 4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtExrReader::UpSampleY( uchar *data, int xstep, int ystep, int ysample ) 4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int y = m_height - ysample, yre = m_height - ysample; y >= 0; y -= ysample, yre -= ysample ) 4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int x = 0; x < m_width; x++ ) 4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 1; i < ysample; i++ ) 4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_native_depth ) 4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data[(yre + i) * ystep + x * xstep] = data[y * ystep + x * xstep]; 4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( m_type == FLOAT ) 4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((float *)data)[(yre + i) * ystep + x * xstep] = ((float *)data)[y * ystep + x * xstep]; 4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uint *)data)[(yre + i) * ystep + x * xstep] = ((uint *)data)[y * ystep + x * xstep]; 4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/** 4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// algorithm from ImfRgbaYca.cpp 4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */ 4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtExrReader::ChromaToBGR( float *data, int numlines, int step ) 4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int x, y, t; 4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < numlines; y++ ) 4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < m_width; x++ ) 4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double b, Y, r; 4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_native_depth ) 4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn b = ((uchar *)data)[y * step + x * 3]; 4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Y = ((uchar *)data)[y * step + x * 3 + 1]; 4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn r = ((uchar *)data)[y * step + x * 3 + 2]; 4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( m_type == FLOAT ) 4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn b = data[y * step + x * 3]; 4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Y = data[y * step + x * 3 + 1]; 4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn r = data[y * step + x * 3 + 2]; 4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn b = ((uint *)data)[y * step + x * 3]; 4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Y = ((uint *)data)[y * step + x * 3 + 1]; 4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn r = ((uint *)data)[y * step + x * 3 + 2]; 4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn r = (r + 1) * Y; 4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn b = (b + 1) * Y; 4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Y = (Y - b * m_chroma.blue[1] - r * m_chroma.red[1]) / m_chroma.green[1]; 4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !m_native_depth ) 4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound(b); 5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uchar *)data)[y * step + x * 3] = CV_CAST_8U(t); 5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = cvRound(Y); 5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uchar *)data)[y * step + x * 3 + 1] = CV_CAST_8U(t); 5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = cvRound(r); 5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uchar *)data)[y * step + x * 3 + 2] = CV_CAST_8U(t); 5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( m_type == FLOAT ) 5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data[y * step + x * 3] = (float)b; 5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data[y * step + x * 3 + 1] = (float)Y; 5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data[y * step + x * 3 + 2] = (float)r; 5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int t = cvRound(b); 5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uint *)data)[y * step + x * 3] = (uint)MAX(t,0); 5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = cvRound(Y); 5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uint *)data)[y * step + x * 3 + 1] = (uint)MAX(t,0); 5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t = cvRound(r); 5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uint *)data)[y * step + x * 3 + 2] = (uint)MAX(t,0); 5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/** 5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// convert one row to gray 5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/ 5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtExrReader::RGBToGray( float *in, float *out ) 5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_type == FLOAT ) 5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_native_depth ) 5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0, n = 0; i < m_width; i++, n += 3 ) 5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn out[i] = in[n] * m_chroma.blue[0] + in[n + 1] * m_chroma.green[0] + in[n + 2] * m_chroma.red[0]; 5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *o = (uchar *)out; 5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0, n = 0; i < m_width; i++, n += 3 ) 5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn o[i] = (uchar) (in[n] * m_chroma.blue[0] + in[n + 1] * m_chroma.green[0] + in[n + 2] * m_chroma.red[0]); 5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else // UINT 5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_native_depth ) 5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uint *ui = (uint *)in; 5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < m_width * 3; i++ ) 5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ui[i] -= 0x80000000; 5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *si = (int *)in; 5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0, n = 0; i < m_width; i++, n += 3 ) 5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((int *)out)[i] = int(si[n] * m_chroma.blue[0] + si[n + 1] * m_chroma.green[0] + si[n + 2] * m_chroma.red[0]); 5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else // how to best convert float to uchar? 5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uint *ui = (uint *)in; 5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0, n = 0; i < m_width; i++, n += 3 ) 5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ((uchar *)out)[i] = uchar((ui[n] * m_chroma.blue[0] + ui[n + 1] * m_chroma.green[0] + ui[n + 2] * m_chroma.red[0]) * (256.0 / 4294967296.0)); 5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////// GrFmtExrWriter /////////////////// 5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtExrWriter::GrFmtExrWriter( const char* filename ) : GrFmtWriter( filename ) 5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtExrWriter::~GrFmtExrWriter() 5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtExrWriter::IsFormatSupported( int depth ) 5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return depth == IPL_DEPTH_8U || depth == IPL_DEPTH_8S || 5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn depth == IPL_DEPTH_16U || depth == IPL_DEPTH_16S || 5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn depth == IPL_DEPTH_32S || depth == IPL_DEPTH_32F; 5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // TODO: do (or should) we support 64f? 5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// TODO scale appropriately 5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtExrWriter::WriteImage( const uchar* data, int step, 5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int width, int height, int depth, int channels ) 5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Header header( width, height ); 5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn PixelType type; 5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool issigned = depth < 0; 5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool isfloat = depth == IPL_DEPTH_32F || depth == IPL_DEPTH_64F; 5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(depth == IPL_DEPTH_8U || depth == IPL_DEPTH_8S) 6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = HALF; 6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if(isfloat) 6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = FLOAT; 6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn type = UINT; 6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn depth &= 255; 6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( channels == 3 ) 6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn header.channels().insert( "R", Channel( type )); 6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn header.channels().insert( "G", Channel( type )); 6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn header.channels().insert( "B", Channel( type )); 6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //printf("bunt\n"); 6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn header.channels().insert( "Y", Channel( type )); 6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //printf("gray\n"); 6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn OutputFile file( m_filename, header ); 6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FrameBuffer frame; 6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn char *buffer; 6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int bufferstep; 6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int size; 6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( type == FLOAT && depth == 32 ) 6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer = (char *)const_cast<uchar *>(data); 6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bufferstep = step; 6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = 4; 6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth > 16 || type == UINT ) 6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer = (char *)new uint[width * channels]; 6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bufferstep = 0; 6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = 4; 6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer = (char *)new half[width * channels]; 6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bufferstep = 0; 6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = 2; 6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //printf("depth %d %s\n", depth, types[type]); 6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( channels == 3 ) 6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "B", Slice( type, buffer, size * 3, bufferstep )); 6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "G", Slice( type, buffer + size, size * 3, bufferstep )); 6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "R", Slice( type, buffer + size * 2, size * 3, bufferstep )); 6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn frame.insert( "Y", Slice( type, buffer, size, bufferstep )); 6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn file.setFrameBuffer( frame ); 6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int offset = issigned ? 1 << (depth - 1) : 0; 6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( type == FLOAT && depth == 32 ) 6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn try 6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn file.writePixels( height ); 6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn catch(...) 6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = false; 6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // int scale = 1 << (32 - depth); 6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // printf("scale %d\n", scale); 6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(int line = 0; line < height; line++) 6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(type == UINT) 6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uint *buf = (uint *)buffer; // FIXME 64-bit problems 6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth <= 8 ) 6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(int i = 0; i < width * channels; i++) 6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[i] = data[i] + offset; 6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth <= 16 ) 6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn unsigned short *sd = (unsigned short *)data; 6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(int i = 0; i < width * channels; i++) 6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[i] = sd[i] + offset; 6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *sd = (int *)data; // FIXME 64-bit problems 6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(int i = 0; i < width * channels; i++) 6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[i] = (uint) sd[i] + offset; 7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn half *buf = (half *)buffer; 7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth <= 8 ) 7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(int i = 0; i < width * channels; i++) 7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[i] = data[i]; 7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth <= 16 ) 7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn unsigned short *sd = (unsigned short *)data; 7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for(int i = 0; i < width * channels; i++) 7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[i] = sd[i]; 7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn try 7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn file.writePixels( 1 ); 7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn catch(...) 7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = false; 7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn data += step; 7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delete buffer; 7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 738