-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathexrio_8cpp-source.html
138 lines (138 loc) · 12.9 KB
/
exrio_8cpp-source.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>pbrt: exrio.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>exrio.cpp</h1><a href="exrio_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001
<a name="l00002"></a>00002 <span class="comment">/*</span>
<a name="l00003"></a>00003 <span class="comment"> pbrt source code Copyright(c) 1998-2007 Matt Pharr and Greg Humphreys.</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment"> This file is part of pbrt.</span>
<a name="l00006"></a>00006 <span class="comment"></span>
<a name="l00007"></a>00007 <span class="comment"> pbrt is free software; you can redistribute it and/or modify</span>
<a name="l00008"></a>00008 <span class="comment"> it under the terms of the GNU General Public License as published by</span>
<a name="l00009"></a>00009 <span class="comment"> the Free Software Foundation; either version 2 of the License, or</span>
<a name="l00010"></a>00010 <span class="comment"> (at your option) any later version. Note that the text contents of</span>
<a name="l00011"></a>00011 <span class="comment"> the book "Physically Based Rendering" are *not* licensed under the</span>
<a name="l00012"></a>00012 <span class="comment"> GNU GPL.</span>
<a name="l00013"></a>00013 <span class="comment"></span>
<a name="l00014"></a>00014 <span class="comment"> pbrt is distributed in the hope that it will be useful,</span>
<a name="l00015"></a>00015 <span class="comment"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00016"></a>00016 <span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<a name="l00017"></a>00017 <span class="comment"> GNU General Public License for more details.</span>
<a name="l00018"></a>00018 <span class="comment"></span>
<a name="l00019"></a>00019 <span class="comment"> You should have received a copy of the GNU General Public License</span>
<a name="l00020"></a>00020 <span class="comment"> along with this program. If not, see <http://www.gnu.org/licenses/>.</span>
<a name="l00021"></a>00021 <span class="comment"></span>
<a name="l00022"></a>00022 <span class="comment"> */</span>
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="comment">// exrio.cpp*</span>
<a name="l00025"></a>00025 <span class="preprocessor">#ifdef WIN32</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define hypotf hypot // For the OpenEXR headers</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#include <ImfInputFile.h></span>
<a name="l00030"></a>00030 <span class="preprocessor">#include <ImfOutputFile.h></span>
<a name="l00031"></a>00031 <span class="preprocessor">#include <ImfChannelList.h></span>
<a name="l00032"></a>00032 <span class="preprocessor">#include <ImfFrameBuffer.h></span>
<a name="l00033"></a>00033 <span class="preprocessor">#include <half.h></span>
<a name="l00034"></a>00034 <span class="preprocessor">#include "<a class="code" href="pbrt_8h.html">pbrt.h</a>"</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="color_8h.html">color.h</a>"</span>
<a name="l00036"></a>00036 <span class="keyword">using namespace </span>Imf;
<a name="l00037"></a>00037 <span class="keyword">using namespace </span>Imath;
<a name="l00038"></a>00038 <span class="comment">// EXR Function Definitions</span>
<a name="l00039"></a><a class="code" href="pbrt_8h.html#fbe8d9ad322efd76207f9d1ab78f04ca">00039</a> <a class="code" href="pbrt_8h.html#1ca894daa11d476d9e76947dceaf0255">COREDLL</a> <a class="code" href="classSpectrum.html">Spectrum</a> *<a class="code" href="exrio_8cpp.html#95815745d79c6bcbc71d3373c36f3c9e">ReadImage</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &name, <span class="keywordtype">int</span> *width, <span class="keywordtype">int</span> *height) {
<a name="l00040"></a>00040 <span class="keywordflow">try</span> {
<a name="l00041"></a>00041 InputFile file(name.c_str());
<a name="l00042"></a>00042 Box2i dw = file.header().dataWindow();
<a name="l00043"></a>00043 *width = dw.max.x - dw.min.x + 1;
<a name="l00044"></a>00044 *height = dw.max.<a class="code" href="classSpectrum.html#25d4cb8d137b7bb0f85e636ea41461a8">y</a> - dw.min.y + 1;
<a name="l00045"></a>00045
<a name="l00046"></a>00046 half *rgb = <span class="keyword">new</span> half[3 * *width * *height];
<a name="l00047"></a>00047
<a name="l00048"></a>00048 FrameBuffer frameBuffer;
<a name="l00049"></a>00049 frameBuffer.insert(<span class="stringliteral">"R"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)rgb,
<a name="l00050"></a>00050 3*<span class="keyword">sizeof</span>(half), *width * 3 * <span class="keyword">sizeof</span>(half), 1, 1, 0.0));
<a name="l00051"></a>00051 frameBuffer.insert(<span class="stringliteral">"G"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)rgb+<span class="keyword">sizeof</span>(half),
<a name="l00052"></a>00052 3*<span class="keyword">sizeof</span>(half), *width * 3 * <span class="keyword">sizeof</span>(half), 1, 1, 0.0));
<a name="l00053"></a>00053 frameBuffer.insert(<span class="stringliteral">"B"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)rgb+2*<span class="keyword">sizeof</span>(half),
<a name="l00054"></a>00054 3*<span class="keyword">sizeof</span>(half), *width * 3 * <span class="keyword">sizeof</span>(half), 1, 1, 0.0));
<a name="l00055"></a>00055
<a name="l00056"></a>00056 file.setFrameBuffer(frameBuffer);
<a name="l00057"></a>00057 file.readPixels(dw.min.y, dw.max.y);
<a name="l00058"></a>00058
<a name="l00059"></a>00059 <a class="code" href="classSpectrum.html">Spectrum</a> *ret = <span class="keyword">new</span> <a class="code" href="classSpectrum.html">Spectrum</a>[*width * *height];
<a name="l00060"></a>00060 <span class="comment">// XXX should do real RGB -> Spectrum conversion here</span>
<a name="l00061"></a>00061 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < *width * *height; ++i) {
<a name="l00062"></a>00062 <span class="keywordtype">float</span> c[3] = { rgb[3*i], rgb[3*i+1], rgb[3*i+2] };
<a name="l00063"></a>00063 ret[i] = <a class="code" href="classSpectrum.html">Spectrum</a>(c);
<a name="l00064"></a>00064 }
<a name="l00065"></a>00065 <span class="keyword">delete</span>[] rgb;
<a name="l00066"></a>00066 <span class="keywordflow">return</span> ret;
<a name="l00067"></a>00067 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &e) {
<a name="l00068"></a>00068 <a class="code" href="pbrt_8h.html#d1a16fc9ced4ddc376b9d3e6607be15e">Error</a>(<span class="stringliteral">"Unable to read image file \"%s\": %s"</span>, name.c_str(),
<a name="l00069"></a>00069 e.what());
<a name="l00070"></a>00070 <span class="keywordflow">return</span> NULL;
<a name="l00071"></a>00071 }
<a name="l00072"></a>00072 }
<a name="l00073"></a>00073
<a name="l00074"></a><a class="code" href="pbrt_8h.html#e2f9b18435b8d45cea7dad8ab89c749e">00074</a> <a class="code" href="pbrt_8h.html#1ca894daa11d476d9e76947dceaf0255">COREDLL</a> <span class="keywordtype">void</span> <a class="code" href="exrio_8cpp.html#adf7c9452dc5e5ece32ade3d2dde96ba">WriteRGBAImage</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &name, <span class="keywordtype">float</span> *pixels,
<a name="l00075"></a>00075 <span class="keywordtype">float</span> *alpha, <span class="keywordtype">int</span> xRes, <span class="keywordtype">int</span> yRes,
<a name="l00076"></a>00076 <span class="keywordtype">int</span> totalXRes, <span class="keywordtype">int</span> totalYRes,
<a name="l00077"></a>00077 <span class="keywordtype">int</span> xOffset, <span class="keywordtype">int</span> yOffset) {
<a name="l00078"></a>00078 Header header(totalXRes, totalYRes);
<a name="l00079"></a>00079 Box2i dataWindow(V2i(xOffset, yOffset), V2i(xOffset + xRes - 1, yOffset + yRes - 1));
<a name="l00080"></a>00080 header.dataWindow() = dataWindow;
<a name="l00081"></a>00081 header.channels().insert(<span class="stringliteral">"R"</span>, Channel (HALF));
<a name="l00082"></a>00082 header.channels().insert(<span class="stringliteral">"G"</span>, Channel (HALF));
<a name="l00083"></a>00083 header.channels().insert(<span class="stringliteral">"B"</span>, Channel (HALF));
<a name="l00084"></a>00084 header.channels().insert(<span class="stringliteral">"A"</span>, Channel (HALF));
<a name="l00085"></a>00085
<a name="l00086"></a>00086 half *hrgb = <span class="keyword">new</span> half[3 * xRes * yRes];
<a name="l00087"></a>00087 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < 3 * xRes * yRes; ++i)
<a name="l00088"></a>00088 hrgb[i] = pixels[i];
<a name="l00089"></a>00089 half *ha = <span class="keyword">new</span> half[xRes * yRes];
<a name="l00090"></a>00090 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < xRes * yRes; ++i)
<a name="l00091"></a>00091 ha[i] = alpha[i];
<a name="l00092"></a>00092
<a name="l00093"></a>00093 hrgb -= 3 * (xOffset + yOffset * xRes);
<a name="l00094"></a>00094 ha -= (xOffset + yOffset * xRes);
<a name="l00095"></a>00095
<a name="l00096"></a>00096 FrameBuffer fb;
<a name="l00097"></a>00097 fb.insert(<span class="stringliteral">"R"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)hrgb, 3*<span class="keyword">sizeof</span>(half),
<a name="l00098"></a>00098 3*xRes*<span class="keyword">sizeof</span>(half)));
<a name="l00099"></a>00099 fb.insert(<span class="stringliteral">"G"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)hrgb+<span class="keyword">sizeof</span>(half), 3*<span class="keyword">sizeof</span>(half),
<a name="l00100"></a>00100 3*xRes*<span class="keyword">sizeof</span>(half)));
<a name="l00101"></a>00101 fb.insert(<span class="stringliteral">"B"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)hrgb+2*<span class="keyword">sizeof</span>(half), 3*<span class="keyword">sizeof</span>(half),
<a name="l00102"></a>00102 3*xRes*<span class="keyword">sizeof</span>(half)));
<a name="l00103"></a>00103 fb.insert(<span class="stringliteral">"A"</span>, Slice(HALF, (<span class="keywordtype">char</span> *)ha, <span class="keyword">sizeof</span>(half), xRes*<span class="keyword">sizeof</span>(half)));
<a name="l00104"></a>00104
<a name="l00105"></a>00105 OutputFile file(name.c_str(), header);
<a name="l00106"></a>00106 file.setFrameBuffer(fb);
<a name="l00107"></a>00107 <span class="keywordflow">try</span> {
<a name="l00108"></a>00108 file.writePixels(yRes);
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110 <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &e) {
<a name="l00111"></a>00111 <a class="code" href="pbrt_8h.html#d1a16fc9ced4ddc376b9d3e6607be15e">Error</a>(<span class="stringliteral">"Unable to write image file \"%s\": %s"</span>, name.c_str(),
<a name="l00112"></a>00112 e.what());
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114
<a name="l00115"></a>00115 <span class="keyword">delete</span>[] (hrgb + 3 * (xOffset + yOffset * xRes));
<a name="l00116"></a>00116 <span class="keyword">delete</span>[] (ha + (xOffset + yOffset * xRes));
<a name="l00117"></a>00117 }
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Mon Jul 20 17:31:52 2009 for pbrt by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>