summaryrefslogtreecommitdiff
path: root/doc/html/Image_8cpp-source.htm
diff options
context:
space:
mode:
Diffstat (limited to 'doc/html/Image_8cpp-source.htm')
-rwxr-xr-xdoc/html/Image_8cpp-source.htm724
1 files changed, 724 insertions, 0 deletions
diff --git a/doc/html/Image_8cpp-source.htm b/doc/html/Image_8cpp-source.htm
new file mode 100755
index 0000000..6b9c16f
--- /dev/null
+++ b/doc/html/Image_8cpp-source.htm
@@ -0,0 +1,724 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>SFML - Simple and Fast Multimedia Library</title>
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
+ <link href="doxygen.css" rel="stylesheet" type="text/css" />
+ <link href="tabs.css" rel="stylesheet" type="text/css" />
+ </head>
+ <body>
+ <div id="logo">
+ <img src="./logo.jpg" width="770" height="200" title="SFML home" alt="SFML logo" />
+ </div>
+<!-- Generated by Doxygen 1.5.8 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.htm"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.htm"><span>Namespaces</span></a></li>
+ <li><a href="annotated.htm"><span>Classes</span></a></li>
+ <li class="current"><a href="files.htm"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="files.htm"><span>File&nbsp;List</span></a></li>
+ </ul>
+ </div>
+<h1>Image.cpp</h1><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">// SFML - Simple and Fast Multimedia Library</span>
+<a name="l00004"></a>00004 <span class="comment">// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)</span>
+<a name="l00005"></a>00005 <span class="comment">//</span>
+<a name="l00006"></a>00006 <span class="comment">// This software is provided 'as-is', without any express or implied warranty.</span>
+<a name="l00007"></a>00007 <span class="comment">// In no event will the authors be held liable for any damages arising from the use of this software.</span>
+<a name="l00008"></a>00008 <span class="comment">//</span>
+<a name="l00009"></a>00009 <span class="comment">// Permission is granted to anyone to use this software for any purpose,</span>
+<a name="l00010"></a>00010 <span class="comment">// including commercial applications, and to alter it and redistribute it freely,</span>
+<a name="l00011"></a>00011 <span class="comment">// subject to the following restrictions:</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">// 1. The origin of this software must not be misrepresented;</span>
+<a name="l00014"></a>00014 <span class="comment">// you must not claim that you wrote the original software.</span>
+<a name="l00015"></a>00015 <span class="comment">// If you use this software in a product, an acknowledgment</span>
+<a name="l00016"></a>00016 <span class="comment">// in the product documentation would be appreciated but is not required.</span>
+<a name="l00017"></a>00017 <span class="comment">//</span>
+<a name="l00018"></a>00018 <span class="comment">// 2. Altered source versions must be plainly marked as such,</span>
+<a name="l00019"></a>00019 <span class="comment">// and must not be misrepresented as being the original software.</span>
+<a name="l00020"></a>00020 <span class="comment">//</span>
+<a name="l00021"></a>00021 <span class="comment">// 3. This notice may not be removed or altered from any source distribution.</span>
+<a name="l00022"></a>00022 <span class="comment">//</span>
+<a name="l00024"></a>00024 <span class="comment"></span>
+<a name="l00026"></a>00026 <span class="comment">// Headers</span>
+<a name="l00028"></a>00028 <span class="comment"></span><span class="preprocessor">#include &lt;SFML/Graphics/Image.hpp&gt;</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;SFML/Graphics/ImageLoader.hpp&gt;</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;SFML/Graphics/RenderWindow.hpp&gt;</span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;SFML/Graphics/GraphicsContext.hpp&gt;</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;algorithm&gt;</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;iostream&gt;</span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;vector&gt;</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00036"></a>00036
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038 <span class="keyword">namespace </span>sf
+<a name="l00039"></a>00039 {
+<a name="l00043"></a><a class="code" href="classsf_1_1Image.htm#bb4caf3cb167b613345ebe36fc883f12">00043</a> <a class="code" href="classsf_1_1Image.htm#bb4caf3cb167b613345ebe36fc883f12" title="Default constructor.">Image::Image</a>() :
+<a name="l00044"></a>00044 myWidth (0),
+<a name="l00045"></a>00045 myHeight (0),
+<a name="l00046"></a>00046 myTextureWidth (0),
+<a name="l00047"></a>00047 myTextureHeight (0),
+<a name="l00048"></a>00048 myTexture (0),
+<a name="l00049"></a>00049 myIsSmooth (true),
+<a name="l00050"></a>00050 myNeedTextureUpdate(false),
+<a name="l00051"></a>00051 myNeedArrayUpdate (false)
+<a name="l00052"></a>00052 {
+<a name="l00053"></a>00053
+<a name="l00054"></a>00054 }
+<a name="l00055"></a>00055
+<a name="l00056"></a>00056
+<a name="l00060"></a><a class="code" href="classsf_1_1Image.htm#a38cae7c1c704aa0175b9e73645cb210">00060</a> <a class="code" href="classsf_1_1Image.htm#bb4caf3cb167b613345ebe36fc883f12" title="Default constructor.">Image::Image</a>(<span class="keyword">const</span> <a class="code" href="classsf_1_1Image.htm" title="Image is the low-level class for loading and manipulating images.">Image</a>&amp; Copy) :
+<a name="l00061"></a>00061 <a class="code" href="classsf_1_1Resource.htm" title="Base class for every resource that needs to notify dependent classes about its destruction...">Resource</a>&lt;<a class="code" href="classsf_1_1Image.htm" title="Image is the low-level class for loading and manipulating images.">Image</a>&gt; (Copy),
+<a name="l00062"></a>00062 myWidth (Copy.myWidth),
+<a name="l00063"></a>00063 myHeight (Copy.myHeight),
+<a name="l00064"></a>00064 myTextureWidth (Copy.myTextureWidth),
+<a name="l00065"></a>00065 myTextureHeight (Copy.myTextureHeight),
+<a name="l00066"></a>00066 myTexture (0),
+<a name="l00067"></a>00067 myIsSmooth (Copy.myIsSmooth),
+<a name="l00068"></a>00068 myPixels (Copy.myPixels),
+<a name="l00069"></a>00069 myNeedTextureUpdate(false),
+<a name="l00070"></a>00070 myNeedArrayUpdate (false)
+<a name="l00071"></a>00071 {
+<a name="l00072"></a>00072 CreateTexture();
+<a name="l00073"></a>00073 }
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075
+<a name="l00079"></a><a class="code" href="classsf_1_1Image.htm#2a4c0ec448863784f83e9931d25dada2">00079</a> <a class="code" href="classsf_1_1Image.htm#bb4caf3cb167b613345ebe36fc883f12" title="Default constructor.">Image::Image</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Width, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Height, <span class="keyword">const</span> <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a>&amp; Col) :
+<a name="l00080"></a>00080 myWidth (0),
+<a name="l00081"></a>00081 myHeight (0),
+<a name="l00082"></a>00082 myTextureWidth (0),
+<a name="l00083"></a>00083 myTextureHeight (0),
+<a name="l00084"></a>00084 myTexture (0),
+<a name="l00085"></a>00085 myIsSmooth (true),
+<a name="l00086"></a>00086 myNeedTextureUpdate(false),
+<a name="l00087"></a>00087 myNeedArrayUpdate (false)
+<a name="l00088"></a>00088 {
+<a name="l00089"></a>00089 <a class="code" href="classsf_1_1Image.htm#4e2ce8821e8de36462604bbf99f39cde" title="Create an empty image.">Create</a>(Width, Height, Col);
+<a name="l00090"></a>00090 }
+<a name="l00091"></a>00091
+<a name="l00092"></a>00092
+<a name="l00096"></a><a class="code" href="classsf_1_1Image.htm#7092ba80cc19c053bf356e98a4743acb">00096</a> <a class="code" href="classsf_1_1Image.htm#bb4caf3cb167b613345ebe36fc883f12" title="Default constructor.">Image::Image</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Width, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Height, <span class="keyword">const</span> Uint8* Data) :
+<a name="l00097"></a>00097 myWidth (0),
+<a name="l00098"></a>00098 myHeight (0),
+<a name="l00099"></a>00099 myTextureWidth (0),
+<a name="l00100"></a>00100 myTextureHeight (0),
+<a name="l00101"></a>00101 myTexture (0),
+<a name="l00102"></a>00102 myIsSmooth (true),
+<a name="l00103"></a>00103 myNeedTextureUpdate(false),
+<a name="l00104"></a>00104 myNeedArrayUpdate (false)
+<a name="l00105"></a>00105 {
+<a name="l00106"></a>00106 <a class="code" href="classsf_1_1Image.htm#67d65c552c9bcba989a061e9c5b5d10c" title="Load the image directly from an array of pixels.">LoadFromPixels</a>(Width, Height, Data);
+<a name="l00107"></a>00107 }
+<a name="l00108"></a>00108
+<a name="l00109"></a>00109
+<a name="l00113"></a><a class="code" href="classsf_1_1Image.htm#0ba22a38e6c96e3b37dd88198046de83">00113</a> <a class="code" href="classsf_1_1Image.htm#0ba22a38e6c96e3b37dd88198046de83" title="Destructor.">Image::~Image</a>()
+<a name="l00114"></a>00114 {
+<a name="l00115"></a>00115 <span class="comment">// Destroy the OpenGL texture</span>
+<a name="l00116"></a>00116 DestroyTexture();
+<a name="l00117"></a>00117 }
+<a name="l00118"></a>00118
+<a name="l00119"></a>00119
+<a name="l00123"></a><a class="code" href="classsf_1_1Image.htm#7cf6316aa5d022e0bdd95f1e79c9f50b">00123</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#7cf6316aa5d022e0bdd95f1e79c9f50b" title="Load the image from a file.">Image::LoadFromFile</a>(<span class="keyword">const</span> std::string&amp; Filename)
+<a name="l00124"></a>00124 {
+<a name="l00125"></a>00125 <span class="comment">// Let the image loader load the image into our pixel array</span>
+<a name="l00126"></a>00126 <span class="keywordtype">bool</span> Success = priv::ImageLoader::GetInstance().LoadImageFromFile(Filename, myPixels, myWidth, myHeight);
+<a name="l00127"></a>00127
+<a name="l00128"></a>00128 <span class="keywordflow">if</span> (Success)
+<a name="l00129"></a>00129 {
+<a name="l00130"></a>00130 <span class="comment">// Loading succeeded : we can create the texture</span>
+<a name="l00131"></a>00131 <span class="keywordflow">if</span> (CreateTexture())
+<a name="l00132"></a>00132 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00133"></a>00133 }
+<a name="l00134"></a>00134
+<a name="l00135"></a>00135 <span class="comment">// Oops... something failed</span>
+<a name="l00136"></a>00136 Reset();
+<a name="l00137"></a>00137
+<a name="l00138"></a>00138 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00139"></a>00139 }
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141
+<a name="l00145"></a><a class="code" href="classsf_1_1Image.htm#72565ffabe12dfb2602e209c2e6f0486">00145</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#72565ffabe12dfb2602e209c2e6f0486" title="Load the image from a file in memory.">Image::LoadFromMemory</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* Data, std::size_t SizeInBytes)
+<a name="l00146"></a>00146 {
+<a name="l00147"></a>00147 <span class="comment">// Check parameters</span>
+<a name="l00148"></a>00148 <span class="keywordflow">if</span> (!Data || (SizeInBytes == 0))
+<a name="l00149"></a>00149 {
+<a name="l00150"></a>00150 std::cerr &lt;&lt; <span class="stringliteral">"Failed to image font from memory, no data provided"</span> &lt;&lt; std::endl;
+<a name="l00151"></a>00151 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00152"></a>00152 }
+<a name="l00153"></a>00153
+<a name="l00154"></a>00154 <span class="comment">// Let the image loader load the image into our pixel array</span>
+<a name="l00155"></a>00155 <span class="keywordtype">bool</span> Success = priv::ImageLoader::GetInstance().LoadImageFromMemory(Data, SizeInBytes, myPixels, myWidth, myHeight);
+<a name="l00156"></a>00156
+<a name="l00157"></a>00157 <span class="keywordflow">if</span> (Success)
+<a name="l00158"></a>00158 {
+<a name="l00159"></a>00159 <span class="comment">// Loading succeeded : we can create the texture</span>
+<a name="l00160"></a>00160 <span class="keywordflow">if</span> (CreateTexture())
+<a name="l00161"></a>00161 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00162"></a>00162 }
+<a name="l00163"></a>00163
+<a name="l00164"></a>00164 <span class="comment">// Oops... something failed</span>
+<a name="l00165"></a>00165 Reset();
+<a name="l00166"></a>00166
+<a name="l00167"></a>00167 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00168"></a>00168 }
+<a name="l00169"></a>00169
+<a name="l00170"></a>00170
+<a name="l00174"></a><a class="code" href="classsf_1_1Image.htm#67d65c552c9bcba989a061e9c5b5d10c">00174</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#67d65c552c9bcba989a061e9c5b5d10c" title="Load the image directly from an array of pixels.">Image::LoadFromPixels</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Width, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Height, <span class="keyword">const</span> Uint8* Data)
+<a name="l00175"></a>00175 {
+<a name="l00176"></a>00176 <span class="keywordflow">if</span> (Data)
+<a name="l00177"></a>00177 {
+<a name="l00178"></a>00178 <span class="comment">// Store the texture dimensions</span>
+<a name="l00179"></a>00179 myWidth = Width;
+<a name="l00180"></a>00180 myHeight = Height;
+<a name="l00181"></a>00181
+<a name="l00182"></a>00182 <span class="comment">// Fill the pixel buffer with the specified raw data</span>
+<a name="l00183"></a>00183 <span class="keyword">const</span> <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a>* Ptr = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a>*<span class="keyword">&gt;</span>(Data);
+<a name="l00184"></a>00184 myPixels.assign(Ptr, Ptr + Width * Height);
+<a name="l00185"></a>00185
+<a name="l00186"></a>00186 <span class="comment">// We can create the texture</span>
+<a name="l00187"></a>00187 <span class="keywordflow">if</span> (CreateTexture())
+<a name="l00188"></a>00188 {
+<a name="l00189"></a>00189 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00190"></a>00190 }
+<a name="l00191"></a>00191 <span class="keywordflow">else</span>
+<a name="l00192"></a>00192 {
+<a name="l00193"></a>00193 <span class="comment">// Oops... something failed</span>
+<a name="l00194"></a>00194 Reset();
+<a name="l00195"></a>00195 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00196"></a>00196 }
+<a name="l00197"></a>00197 }
+<a name="l00198"></a>00198 <span class="keywordflow">else</span>
+<a name="l00199"></a>00199 {
+<a name="l00200"></a>00200 <span class="comment">// No data provided : create a white image</span>
+<a name="l00201"></a>00201 <span class="keywordflow">return</span> <a class="code" href="classsf_1_1Image.htm#4e2ce8821e8de36462604bbf99f39cde" title="Create an empty image.">Create</a>(Width, Height, <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a>(255, 255, 255, 255));
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203 }
+<a name="l00204"></a>00204
+<a name="l00205"></a>00205
+<a name="l00209"></a><a class="code" href="classsf_1_1Image.htm#50eed54ef8e9f3aeef5bb7f19144aa08">00209</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#50eed54ef8e9f3aeef5bb7f19144aa08" title="Save the content of the image to a file.">Image::SaveToFile</a>(<span class="keyword">const</span> std::string&amp; Filename)<span class="keyword"> const</span>
+<a name="l00210"></a>00210 <span class="keyword"></span>{
+<a name="l00211"></a>00211 <span class="comment">// Check if the array of pixels needs to be updated</span>
+<a name="l00212"></a>00212 EnsureArrayUpdate();
+<a name="l00213"></a>00213
+<a name="l00214"></a>00214 <span class="comment">// Let the image loader save our pixel array into the image</span>
+<a name="l00215"></a>00215 <span class="keywordflow">return</span> priv::ImageLoader::GetInstance().SaveImageToFile(Filename, myPixels, myWidth, myHeight);
+<a name="l00216"></a>00216 }
+<a name="l00217"></a>00217
+<a name="l00218"></a>00218
+<a name="l00222"></a><a class="code" href="classsf_1_1Image.htm#4e2ce8821e8de36462604bbf99f39cde">00222</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#4e2ce8821e8de36462604bbf99f39cde" title="Create an empty image.">Image::Create</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Width, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Height, <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a> Col)
+<a name="l00223"></a>00223 {
+<a name="l00224"></a>00224 <span class="comment">// Store the texture dimensions</span>
+<a name="l00225"></a>00225 myWidth = Width;
+<a name="l00226"></a>00226 myHeight = Height;
+<a name="l00227"></a>00227
+<a name="l00228"></a>00228 <span class="comment">// Recreate the pixel buffer and fill it with the specified color</span>
+<a name="l00229"></a>00229 myPixels.clear();
+<a name="l00230"></a>00230 myPixels.resize(Width * Height, Col);
+<a name="l00231"></a>00231
+<a name="l00232"></a>00232 <span class="comment">// We can create the texture</span>
+<a name="l00233"></a>00233 <span class="keywordflow">if</span> (CreateTexture())
+<a name="l00234"></a>00234 {
+<a name="l00235"></a>00235 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00236"></a>00236 }
+<a name="l00237"></a>00237 <span class="keywordflow">else</span>
+<a name="l00238"></a>00238 {
+<a name="l00239"></a>00239 <span class="comment">// Oops... something failed</span>
+<a name="l00240"></a>00240 Reset();
+<a name="l00241"></a>00241 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243 }
+<a name="l00244"></a>00244
+<a name="l00245"></a>00245
+<a name="l00249"></a><a class="code" href="classsf_1_1Image.htm#e9a15fe9a4750295845b5ae081c2ec50">00249</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1Image.htm#e9a15fe9a4750295845b5ae081c2ec50" title="Create transparency mask from a specified colorkey.">Image::CreateMaskFromColor</a>(<a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a> ColorKey, Uint8 Alpha)
+<a name="l00250"></a>00250 {
+<a name="l00251"></a>00251 <span class="comment">// Check if the array of pixels needs to be updated</span>
+<a name="l00252"></a>00252 EnsureArrayUpdate();
+<a name="l00253"></a>00253
+<a name="l00254"></a>00254 <span class="comment">// Calculate the new color (old color with no alpha)</span>
+<a name="l00255"></a>00255 <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a> NewColor(ColorKey.<a class="code" href="classsf_1_1Color.htm#6a5256ca24a4f9f0e0808f6fc23e01e1" title="Red component.">r</a>, ColorKey.<a class="code" href="classsf_1_1Color.htm#591daf9c3c55dea830c76c962d6ba1a5" title="Green component.">g</a>, ColorKey.<a class="code" href="classsf_1_1Color.htm#6707aedd0609c8920e12df5d7abc53cb" title="Blue component.">b</a>, Alpha);
+<a name="l00256"></a>00256
+<a name="l00257"></a>00257 <span class="comment">// Replace the old color by the new one</span>
+<a name="l00258"></a>00258 std::replace(myPixels.begin(), myPixels.end(), ColorKey, NewColor);
+<a name="l00259"></a>00259
+<a name="l00260"></a>00260 <span class="comment">// The texture will need to be updated</span>
+<a name="l00261"></a>00261 myNeedTextureUpdate = <span class="keyword">true</span>;
+<a name="l00262"></a>00262 }
+<a name="l00263"></a>00263
+<a name="l00264"></a>00264
+<a name="l00270"></a><a class="code" href="classsf_1_1Image.htm#408c40c8675363adfa96a8b9a9576bc2">00270</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1Image.htm#408c40c8675363adfa96a8b9a9576bc2" title="Copy pixels from another image onto this one.">Image::Copy</a>(<span class="keyword">const</span> <a class="code" href="classsf_1_1Image.htm" title="Image is the low-level class for loading and manipulating images.">Image</a>&amp; Source, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DestX, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DestY, <span class="keyword">const</span> <a class="code" href="classsf_1_1Rect.htm">IntRect</a>&amp; SourceRect, <span class="keywordtype">bool</span> ApplyAlpha)
+<a name="l00271"></a>00271 {
+<a name="l00272"></a>00272 <span class="comment">// Make sure both images are valid</span>
+<a name="l00273"></a>00273 <span class="keywordflow">if</span> ((Source.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a> == 0) || (Source.<a class="code" href="classsf_1_1Image.htm#ceef290985323875724673f5fdc2f6d0" title="Image Height.">myHeight</a> == 0) || (myWidth == 0) || (myHeight == 0))
+<a name="l00274"></a>00274 <span class="keywordflow">return</span>;
+<a name="l00275"></a>00275
+<a name="l00276"></a>00276 <span class="comment">// Make sure both images have up-to-date arrays</span>
+<a name="l00277"></a>00277 EnsureArrayUpdate();
+<a name="l00278"></a>00278 Source.<a class="code" href="classsf_1_1Image.htm#9e4a9bfca94b75367192b960b0d87a9d" title="Make sure the array of pixels is updated with the texture in video memory.">EnsureArrayUpdate</a>();
+<a name="l00279"></a>00279
+<a name="l00280"></a>00280 <span class="comment">// Adjust the source rectangle</span>
+<a name="l00281"></a>00281 <a class="code" href="classsf_1_1Rect.htm">IntRect</a> SrcRect = SourceRect;
+<a name="l00282"></a>00282 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#6a8c09ef44123228aa44aff8f0b09087" title="Get the width of the rectangle.">GetWidth</a>() == 0 || (SrcRect.<a class="code" href="classsf_1_1Rect.htm#a3c1ca9c959dae33d2eec290b2e48d75" title="Get the height of the rectangle.">GetHeight</a>() == 0))
+<a name="l00283"></a>00283 {
+<a name="l00284"></a>00284 SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> = 0;
+<a name="l00285"></a>00285 SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> = 0;
+<a name="l00286"></a>00286 SrcRect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> = Source.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a>;
+<a name="l00287"></a>00287 SrcRect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> = Source.<a class="code" href="classsf_1_1Image.htm#ceef290985323875724673f5fdc2f6d0" title="Image Height.">myHeight</a>;
+<a name="l00288"></a>00288 }
+<a name="l00289"></a>00289 <span class="keywordflow">else</span>
+<a name="l00290"></a>00290 {
+<a name="l00291"></a>00291 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> &lt; 0) SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> = 0;
+<a name="l00292"></a>00292 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> &lt; 0) SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> = 0;
+<a name="l00293"></a>00293 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> &gt; static_cast&lt;int&gt;(Source.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a>)) SrcRect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> = Source.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a>;
+<a name="l00294"></a>00294 if (SrcRect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> &gt; static_cast&lt;int&gt;(Source.<a class="code" href="classsf_1_1Image.htm#ceef290985323875724673f5fdc2f6d0" title="Image Height.">myHeight</a>)) SrcRect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> = Source.<a class="code" href="classsf_1_1Image.htm#ceef290985323875724673f5fdc2f6d0" title="Image Height.">myHeight</a>;
+<a name="l00295"></a>00295 }
+<a name="l00296"></a>00296
+<a name="l00297"></a>00297 <span class="comment">// Then find the valid bounds of the destination rectangle</span>
+<a name="l00298"></a>00298 <span class="keywordtype">int</span> Width = SrcRect.<a class="code" href="classsf_1_1Rect.htm#6a8c09ef44123228aa44aff8f0b09087" title="Get the width of the rectangle.">GetWidth</a>();
+<a name="l00299"></a>00299 <span class="keywordtype">int</span> Height = SrcRect.<a class="code" href="classsf_1_1Rect.htm#a3c1ca9c959dae33d2eec290b2e48d75" title="Get the height of the rectangle.">GetHeight</a>();
+<a name="l00300"></a>00300 <span class="keywordflow">if</span> (DestX + Width &gt; myWidth) Width = myWidth - DestX;
+<a name="l00301"></a>00301 <span class="keywordflow">if</span> (DestY + Height &gt; myHeight) Height = myHeight - DestY;
+<a name="l00302"></a>00302
+<a name="l00303"></a>00303 <span class="comment">// Make sure the destination area is valid</span>
+<a name="l00304"></a>00304 <span class="keywordflow">if</span> ((Width &lt;= 0) || (Height &lt;= 0))
+<a name="l00305"></a>00305 <span class="keywordflow">return</span>;
+<a name="l00306"></a>00306
+<a name="l00307"></a>00307 <span class="comment">// Precompute as much as possible</span>
+<a name="l00308"></a>00308 <span class="keywordtype">int</span> Pitch = Width * 4;
+<a name="l00309"></a>00309 <span class="keywordtype">int</span> Rows = Height;
+<a name="l00310"></a>00310 <span class="keywordtype">int</span> SrcStride = Source.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a> * 4;
+<a name="l00311"></a>00311 <span class="keywordtype">int</span> DstStride = myWidth * 4;
+<a name="l00312"></a>00312 <span class="keyword">const</span> Uint8* SrcPixels = Source.<a class="code" href="classsf_1_1Image.htm#85355b09f946aa4b985f9d2a1d620022" title="Get a read-only pointer to the array of pixels (RGBA 8 bits integers components)...">GetPixelsPtr</a>() + (SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> + SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> * Source.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a>) * 4;
+<a name="l00313"></a>00313 Uint8* DstPixels = <span class="keyword">reinterpret_cast&lt;</span>Uint8*<span class="keyword">&gt;</span>(&amp;myPixels[0]) + (DestX + DestY * myWidth) * 4;
+<a name="l00314"></a>00314
+<a name="l00315"></a>00315 <span class="comment">// Copy the pixels</span>
+<a name="l00316"></a>00316 <span class="keywordflow">if</span> (ApplyAlpha)
+<a name="l00317"></a>00317 {
+<a name="l00318"></a>00318 <span class="comment">// Interpolation using alpha values, pixel by pixel (slower)</span>
+<a name="l00319"></a>00319 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Rows; ++i)
+<a name="l00320"></a>00320 {
+<a name="l00321"></a>00321 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; Width; ++j)
+<a name="l00322"></a>00322 {
+<a name="l00323"></a>00323 <span class="comment">// Get a direct pointer to the components of the current pixel</span>
+<a name="l00324"></a>00324 <span class="keyword">const</span> Uint8* Src = SrcPixels + j * 4;
+<a name="l00325"></a>00325 Uint8* Dst = DstPixels + j * 4;
+<a name="l00326"></a>00326
+<a name="l00327"></a>00327 <span class="comment">// Interpolate RGB components using the alpha value of the source pixel</span>
+<a name="l00328"></a>00328 Uint8 Alpha = Src[3];
+<a name="l00329"></a>00329 Dst[0] = (Src[0] * Alpha + Dst[0] * (255 - Alpha)) / 255;
+<a name="l00330"></a>00330 Dst[1] = (Src[1] * Alpha + Dst[1] * (255 - Alpha)) / 255;
+<a name="l00331"></a>00331 Dst[2] = (Src[2] * Alpha + Dst[2] * (255 - Alpha)) / 255;
+<a name="l00332"></a>00332 }
+<a name="l00333"></a>00333
+<a name="l00334"></a>00334 SrcPixels += SrcStride;
+<a name="l00335"></a>00335 DstPixels += DstStride;
+<a name="l00336"></a>00336 }
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338 <span class="keywordflow">else</span>
+<a name="l00339"></a>00339 {
+<a name="l00340"></a>00340 <span class="comment">// Optimized copy ignoring alpha values, row by row (faster)</span>
+<a name="l00341"></a>00341 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Rows; ++i)
+<a name="l00342"></a>00342 {
+<a name="l00343"></a>00343 memcpy(DstPixels, SrcPixels, Pitch);
+<a name="l00344"></a>00344 SrcPixels += SrcStride;
+<a name="l00345"></a>00345 DstPixels += DstStride;
+<a name="l00346"></a>00346 }
+<a name="l00347"></a>00347 }
+<a name="l00348"></a>00348
+<a name="l00349"></a>00349 <span class="comment">// The texture will need an update</span>
+<a name="l00350"></a>00350 myNeedTextureUpdate = <span class="keyword">true</span>;
+<a name="l00351"></a>00351 }
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353
+<a name="l00358"></a><a class="code" href="classsf_1_1Image.htm#96597746f70ce1925ec82d2df8ae6974">00358</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#96597746f70ce1925ec82d2df8ae6974" title="Create the image from the current contents of the given window.">Image::CopyScreen</a>(<a class="code" href="classsf_1_1RenderWindow.htm" title="Simple wrapper for sf::Window that allows easy 2D rendering.">RenderWindow</a>&amp; <a class="code" href="classsf_1_1Window.htm" title="Window is a rendering window ; it can create a new window or connect to an existing...">Window</a>, <span class="keyword">const</span> <a class="code" href="classsf_1_1Rect.htm">IntRect</a>&amp; SourceRect)
+<a name="l00359"></a>00359 {
+<a name="l00360"></a>00360 <span class="comment">// Adjust the source rectangle</span>
+<a name="l00361"></a>00361 <a class="code" href="classsf_1_1Rect.htm">IntRect</a> SrcRect = SourceRect;
+<a name="l00362"></a>00362 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#6a8c09ef44123228aa44aff8f0b09087" title="Get the width of the rectangle.">GetWidth</a>() == 0 || (SrcRect.<a class="code" href="classsf_1_1Rect.htm#a3c1ca9c959dae33d2eec290b2e48d75" title="Get the height of the rectangle.">GetHeight</a>() == 0))
+<a name="l00363"></a>00363 {
+<a name="l00364"></a>00364 SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> = 0;
+<a name="l00365"></a>00365 SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> = 0;
+<a name="l00366"></a>00366 SrcRect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> = Window.<a class="code" href="classsf_1_1RenderWindow.htm#e2b04f655a655b7c4bfac22958266e0c" title="Get the width of the rendering region of the window.">GetWidth</a>();
+<a name="l00367"></a>00367 SrcRect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> = Window.<a class="code" href="classsf_1_1RenderWindow.htm#efa842a47f9c2415d1f8e93543ed2447" title="Get the height of the rendering region of the window.">GetHeight</a>();
+<a name="l00368"></a>00368 }
+<a name="l00369"></a>00369 <span class="keywordflow">else</span>
+<a name="l00370"></a>00370 {
+<a name="l00371"></a>00371 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> &lt; 0) SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> = 0;
+<a name="l00372"></a>00372 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> &lt; 0) SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> = 0;
+<a name="l00373"></a>00373 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> &gt; static_cast&lt;int&gt;(Window.<a class="code" href="classsf_1_1RenderWindow.htm#e2b04f655a655b7c4bfac22958266e0c" title="Get the width of the rendering region of the window.">GetWidth</a>())) SrcRect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> = Window.<a class="code" href="classsf_1_1RenderWindow.htm#e2b04f655a655b7c4bfac22958266e0c" title="Get the width of the rendering region of the window.">GetWidth</a>();
+<a name="l00374"></a>00374 <span class="keywordflow">if</span> (SrcRect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> &gt; static_cast&lt;int&gt;(Window.<a class="code" href="classsf_1_1RenderWindow.htm#efa842a47f9c2415d1f8e93543ed2447" title="Get the height of the rendering region of the window.">GetHeight</a>())) SrcRect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> = Window.<a class="code" href="classsf_1_1RenderWindow.htm#efa842a47f9c2415d1f8e93543ed2447" title="Get the height of the rendering region of the window.">GetHeight</a>();
+<a name="l00375"></a>00375 }
+<a name="l00376"></a>00376
+<a name="l00377"></a>00377 <span class="comment">// Store the texture dimensions</span>
+<a name="l00378"></a>00378 myWidth = SrcRect.<a class="code" href="classsf_1_1Rect.htm#6a8c09ef44123228aa44aff8f0b09087" title="Get the width of the rectangle.">GetWidth</a>();
+<a name="l00379"></a>00379 myHeight = SrcRect.<a class="code" href="classsf_1_1Rect.htm#a3c1ca9c959dae33d2eec290b2e48d75" title="Get the height of the rectangle.">GetHeight</a>();
+<a name="l00380"></a>00380
+<a name="l00381"></a>00381 <span class="comment">// We can then create the texture</span>
+<a name="l00382"></a>00382 <span class="keywordflow">if</span> (Window.<a class="code" href="classsf_1_1Window.htm#9fc1e745594d5cf6a30225ec9ea36675" title="Activate of deactivate the window as the current target for rendering.">SetActive</a>() &amp;&amp; CreateTexture())
+<a name="l00383"></a>00383 {
+<a name="l00384"></a>00384 GLint PreviousTexture;
+<a name="l00385"></a>00385 GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &amp;PreviousTexture));
+<a name="l00386"></a>00386
+<a name="l00387"></a>00387 GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture));
+<a name="l00388"></a>00388 GLCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, SrcRect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a>, SrcRect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a>, myWidth, myHeight));
+<a name="l00389"></a>00389
+<a name="l00390"></a>00390 GLCheck(glBindTexture(GL_TEXTURE_2D, PreviousTexture));
+<a name="l00391"></a>00391
+<a name="l00392"></a>00392 myNeedTextureUpdate = <span class="keyword">false</span>;
+<a name="l00393"></a>00393 myNeedArrayUpdate = <span class="keyword">true</span>;
+<a name="l00394"></a>00394
+<a name="l00395"></a>00395 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00396"></a>00396 }
+<a name="l00397"></a>00397 <span class="keywordflow">else</span>
+<a name="l00398"></a>00398 {
+<a name="l00399"></a>00399 Reset();
+<a name="l00400"></a>00400 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00401"></a>00401 }
+<a name="l00402"></a>00402 }
+<a name="l00403"></a>00403
+<a name="l00404"></a>00404
+<a name="l00408"></a><a class="code" href="classsf_1_1Image.htm#623f2379b30307b4ee4eb08d517d9584">00408</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1Image.htm#623f2379b30307b4ee4eb08d517d9584" title="Change the color of a pixel.">Image::SetPixel</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> X, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Y, <span class="keyword">const</span> <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a>&amp; Col)
+<a name="l00409"></a>00409 {
+<a name="l00410"></a>00410 <span class="comment">// First check if the array of pixels needs to be updated</span>
+<a name="l00411"></a>00411 EnsureArrayUpdate();
+<a name="l00412"></a>00412
+<a name="l00413"></a>00413 <span class="comment">// Check if pixel is whithin the image bounds</span>
+<a name="l00414"></a>00414 <span class="keywordflow">if</span> ((X &gt;= myWidth) || (Y &gt;= myHeight))
+<a name="l00415"></a>00415 {
+<a name="l00416"></a>00416 std::cerr &lt;&lt; <span class="stringliteral">"Cannot set pixel ("</span> &lt;&lt; X &lt;&lt; <span class="stringliteral">","</span> &lt;&lt; Y &lt;&lt; <span class="stringliteral">") for image "</span>
+<a name="l00417"></a>00417 &lt;&lt; <span class="stringliteral">"(width = "</span> &lt;&lt; myWidth &lt;&lt; <span class="stringliteral">", height = "</span> &lt;&lt; myHeight &lt;&lt; <span class="stringliteral">")"</span> &lt;&lt; std::endl;
+<a name="l00418"></a>00418 <span class="keywordflow">return</span>;
+<a name="l00419"></a>00419 }
+<a name="l00420"></a>00420
+<a name="l00421"></a>00421 myPixels[X + Y * myWidth] = Col;
+<a name="l00422"></a>00422
+<a name="l00423"></a>00423 <span class="comment">// The texture will need to be updated</span>
+<a name="l00424"></a>00424 myNeedTextureUpdate = <span class="keyword">true</span>;
+<a name="l00425"></a>00425 }
+<a name="l00426"></a>00426
+<a name="l00427"></a>00427
+<a name="l00431"></a><a class="code" href="classsf_1_1Image.htm#b7590e372a153ace848cf8a6081c8bc4">00431</a> <span class="keyword">const</span> <a class="code" href="classsf_1_1Color.htm" title="Color is an utility class for manipulating 32-bits RGBA colors.">Color</a>&amp; <a class="code" href="classsf_1_1Image.htm#b7590e372a153ace848cf8a6081c8bc4" title="Get a pixel from the image.">Image::GetPixel</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> X, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Y)<span class="keyword"> const</span>
+<a name="l00432"></a>00432 <span class="keyword"></span>{
+<a name="l00433"></a>00433 <span class="comment">// First check if the array of pixels needs to be updated</span>
+<a name="l00434"></a>00434 EnsureArrayUpdate();
+<a name="l00435"></a>00435
+<a name="l00436"></a>00436 <span class="comment">// Check if pixel is whithin the image bounds</span>
+<a name="l00437"></a>00437 <span class="keywordflow">if</span> ((X &gt;= myWidth) || (Y &gt;= myHeight))
+<a name="l00438"></a>00438 {
+<a name="l00439"></a>00439 std::cerr &lt;&lt; <span class="stringliteral">"Cannot get pixel ("</span> &lt;&lt; X &lt;&lt; <span class="stringliteral">","</span> &lt;&lt; Y &lt;&lt; <span class="stringliteral">") for image "</span>
+<a name="l00440"></a>00440 &lt;&lt; <span class="stringliteral">"(width = "</span> &lt;&lt; myWidth &lt;&lt; <span class="stringliteral">", height = "</span> &lt;&lt; myHeight &lt;&lt; <span class="stringliteral">")"</span> &lt;&lt; std::endl;
+<a name="l00441"></a>00441 <span class="keywordflow">return</span> <a class="code" href="classsf_1_1Color.htm#77c688197b981338f0b19dc58bd2facd" title="Black predefined color.">Color::Black</a>;
+<a name="l00442"></a>00442 }
+<a name="l00443"></a>00443
+<a name="l00444"></a>00444 <span class="keywordflow">return</span> myPixels[X + Y * myWidth];
+<a name="l00445"></a>00445 }
+<a name="l00446"></a>00446
+<a name="l00447"></a>00447
+<a name="l00453"></a><a class="code" href="classsf_1_1Image.htm#85355b09f946aa4b985f9d2a1d620022">00453</a> <span class="keyword">const</span> Uint8* <a class="code" href="classsf_1_1Image.htm#85355b09f946aa4b985f9d2a1d620022" title="Get a read-only pointer to the array of pixels (RGBA 8 bits integers components)...">Image::GetPixelsPtr</a>()<span class="keyword"> const</span>
+<a name="l00454"></a>00454 <span class="keyword"></span>{
+<a name="l00455"></a>00455 <span class="comment">// First check if the array of pixels needs to be updated</span>
+<a name="l00456"></a>00456 EnsureArrayUpdate();
+<a name="l00457"></a>00457
+<a name="l00458"></a>00458 <span class="keywordflow">if</span> (!myPixels.empty())
+<a name="l00459"></a>00459 {
+<a name="l00460"></a>00460 <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Uint8*<span class="keyword">&gt;</span>(&amp;myPixels[0]);
+<a name="l00461"></a>00461 }
+<a name="l00462"></a>00462 <span class="keywordflow">else</span>
+<a name="l00463"></a>00463 {
+<a name="l00464"></a>00464 std::cerr &lt;&lt; <span class="stringliteral">"Trying to access the pixels of an empty image"</span> &lt;&lt; std::endl;
+<a name="l00465"></a>00465 <span class="keywordflow">return</span> NULL;
+<a name="l00466"></a>00466 }
+<a name="l00467"></a>00467 }
+<a name="l00468"></a>00468
+<a name="l00469"></a>00469
+<a name="l00473"></a><a class="code" href="classsf_1_1Image.htm#74bda6dc927849ff25f8fce5143918e7">00473</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1Image.htm#74bda6dc927849ff25f8fce5143918e7" title="Bind the image for rendering.">Image::Bind</a>()<span class="keyword"> const</span>
+<a name="l00474"></a>00474 <span class="keyword"></span>{
+<a name="l00475"></a>00475 <span class="comment">// First check if the texture needs to be updated</span>
+<a name="l00476"></a>00476 EnsureTextureUpdate();
+<a name="l00477"></a>00477
+<a name="l00478"></a>00478 <span class="comment">// Bind it</span>
+<a name="l00479"></a>00479 <span class="keywordflow">if</span> (myTexture)
+<a name="l00480"></a>00480 {
+<a name="l00481"></a>00481 GLCheck(glEnable(GL_TEXTURE_2D));
+<a name="l00482"></a>00482 GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture));
+<a name="l00483"></a>00483 }
+<a name="l00484"></a>00484 }
+<a name="l00485"></a>00485
+<a name="l00486"></a>00486
+<a name="l00490"></a><a class="code" href="classsf_1_1Image.htm#d167422fd331cd069674391fb16e8452">00490</a> <span class="keywordtype">void</span> <a class="code" href="classsf_1_1Image.htm#d167422fd331cd069674391fb16e8452" title="Enable or disable image smooth filter.">Image::SetSmooth</a>(<span class="keywordtype">bool</span> Smooth)
+<a name="l00491"></a>00491 {
+<a name="l00492"></a>00492 <span class="keywordflow">if</span> (Smooth != myIsSmooth)
+<a name="l00493"></a>00493 {
+<a name="l00494"></a>00494 myIsSmooth = Smooth;
+<a name="l00495"></a>00495
+<a name="l00496"></a>00496 <span class="keywordflow">if</span> (myTexture)
+<a name="l00497"></a>00497 {
+<a name="l00498"></a>00498 <span class="comment">// Make sure we have a valid context</span>
+<a name="l00499"></a>00499 priv::GraphicsContext Ctx;
+<a name="l00500"></a>00500
+<a name="l00501"></a>00501 GLint PreviousTexture;
+<a name="l00502"></a>00502 GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &amp;PreviousTexture));
+<a name="l00503"></a>00503
+<a name="l00504"></a>00504 GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture));
+<a name="l00505"></a>00505 GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST));
+<a name="l00506"></a>00506 GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST));
+<a name="l00507"></a>00507
+<a name="l00508"></a>00508 GLCheck(glBindTexture(GL_TEXTURE_2D, PreviousTexture));
+<a name="l00509"></a>00509 }
+<a name="l00510"></a>00510 }
+<a name="l00511"></a>00511 }
+<a name="l00512"></a>00512
+<a name="l00513"></a>00513
+<a name="l00517"></a><a class="code" href="classsf_1_1Image.htm#896f09a4eb769b5b866b6dde9c1a25e7">00517</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classsf_1_1Image.htm#896f09a4eb769b5b866b6dde9c1a25e7" title="Return the width of the image.">Image::GetWidth</a>()<span class="keyword"> const</span>
+<a name="l00518"></a>00518 <span class="keyword"></span>{
+<a name="l00519"></a>00519 <span class="keywordflow">return</span> myWidth;
+<a name="l00520"></a>00520 }
+<a name="l00521"></a>00521
+<a name="l00522"></a>00522
+<a name="l00526"></a><a class="code" href="classsf_1_1Image.htm#f2131512b6290fd96fd10c539723fe89">00526</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classsf_1_1Image.htm#f2131512b6290fd96fd10c539723fe89" title="Return the height of the image.">Image::GetHeight</a>()<span class="keyword"> const</span>
+<a name="l00527"></a>00527 <span class="keyword"></span>{
+<a name="l00528"></a>00528 <span class="keywordflow">return</span> myHeight;
+<a name="l00529"></a>00529 }
+<a name="l00530"></a>00530
+<a name="l00531"></a>00531
+<a name="l00535"></a><a class="code" href="classsf_1_1Image.htm#d175b4c9110549c5df324ba61c580ce3">00535</a> <span class="keywordtype">bool</span> <a class="code" href="classsf_1_1Image.htm#d175b4c9110549c5df324ba61c580ce3" title="Tells whether the smooth filtering is enabled or not.">Image::IsSmooth</a>()<span class="keyword"> const</span>
+<a name="l00536"></a>00536 <span class="keyword"></span>{
+<a name="l00537"></a>00537 <span class="keywordflow">return</span> myIsSmooth;
+<a name="l00538"></a>00538 }
+<a name="l00539"></a>00539
+<a name="l00540"></a>00540
+<a name="l00545"></a><a class="code" href="classsf_1_1Image.htm#0477b06f784afcc1662f69ad5bce5c3b">00545</a> <a class="code" href="classsf_1_1Rect.htm">FloatRect</a> <a class="code" href="classsf_1_1Image.htm#0477b06f784afcc1662f69ad5bce5c3b" title="Convert a subrect expressed in pixels, into float texture coordinates.">Image::GetTexCoords</a>(<span class="keyword">const</span> <a class="code" href="classsf_1_1Rect.htm">IntRect</a>&amp; <a class="code" href="classsf_1_1Rect.htm" title="Rect is an utility class for manipulating rectangles.">Rect</a>, <span class="keywordtype">bool</span> Adjust)<span class="keyword"> const</span>
+<a name="l00546"></a>00546 <span class="keyword"></span>{
+<a name="l00547"></a>00547 <span class="keywordtype">float</span> Width = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span>(myTextureWidth);
+<a name="l00548"></a>00548 <span class="keywordtype">float</span> Height = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span>(myTextureHeight);
+<a name="l00549"></a>00549
+<a name="l00550"></a>00550 <span class="keywordflow">if</span> (Adjust &amp;&amp; myIsSmooth)
+<a name="l00551"></a>00551 {
+<a name="l00552"></a>00552 <span class="keywordflow">return</span> <a class="code" href="classsf_1_1Rect.htm">FloatRect</a>((Rect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> + 0.5f) / Width,
+<a name="l00553"></a>00553 (Rect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> + 0.5f) / Height,
+<a name="l00554"></a>00554 (Rect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> - 0.5f) / Width,
+<a name="l00555"></a>00555 (Rect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> - 0.5f) / Height);
+<a name="l00556"></a>00556 }
+<a name="l00557"></a>00557 <span class="keywordflow">else</span>
+<a name="l00558"></a>00558 {
+<a name="l00559"></a>00559 <span class="keywordflow">return</span> <a class="code" href="classsf_1_1Rect.htm">FloatRect</a>(Rect.<a class="code" href="classsf_1_1Rect.htm#9619c6b9741163c86eea6a0b84b2f9b3" title="Left coordinate of the rectangle.">Left</a> / Width,
+<a name="l00560"></a>00560 Rect.<a class="code" href="classsf_1_1Rect.htm#4addcc0bf656fb5f2f80d406cf90c047" title="Top coordinate of the rectangle.">Top</a> / Height,
+<a name="l00561"></a>00561 Rect.<a class="code" href="classsf_1_1Rect.htm#6ce87895496327187a20a46dc2479383" title="Right coordinate of the rectangle.">Right</a> / Width,
+<a name="l00562"></a>00562 Rect.<a class="code" href="classsf_1_1Rect.htm#b234b311011892cfd8a3e831dec341a8" title="Bottom coordinate of the rectangle.">Bottom</a> / Height);
+<a name="l00563"></a>00563 }
+<a name="l00564"></a>00564 }
+<a name="l00565"></a>00565
+<a name="l00566"></a>00566
+<a name="l00570"></a><a class="code" href="classsf_1_1Image.htm#b41056600a1a4848833cc8b5239a9488">00570</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classsf_1_1Image.htm#b41056600a1a4848833cc8b5239a9488" title="Get a valid texture size according to hardware support.">Image::GetValidTextureSize</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Size)
+<a name="l00571"></a>00571 {
+<a name="l00572"></a>00572 <span class="comment">// Make sure we have a valid context</span>
+<a name="l00573"></a>00573 priv::GraphicsContext Ctx;
+<a name="l00574"></a>00574
+<a name="l00575"></a>00575 <span class="keywordflow">if</span> (glewIsSupported(<span class="stringliteral">"GL_ARB_texture_non_power_of_two"</span>) != 0)
+<a name="l00576"></a>00576 {
+<a name="l00577"></a>00577 <span class="comment">// If hardware supports NPOT textures, then just return the unmodified size</span>
+<a name="l00578"></a>00578 <span class="keywordflow">return</span> Size;
+<a name="l00579"></a>00579 }
+<a name="l00580"></a>00580 <span class="keywordflow">else</span>
+<a name="l00581"></a>00581 {
+<a name="l00582"></a>00582 <span class="comment">// If hardware doesn't support NPOT textures, we calculate the nearest power of two</span>
+<a name="l00583"></a>00583 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PowerOfTwo = 1;
+<a name="l00584"></a>00584 <span class="keywordflow">while</span> (PowerOfTwo &lt; Size)
+<a name="l00585"></a>00585 PowerOfTwo *= 2;
+<a name="l00586"></a>00586
+<a name="l00587"></a>00587 <span class="keywordflow">return</span> PowerOfTwo;
+<a name="l00588"></a>00588 }
+<a name="l00589"></a>00589 }
+<a name="l00590"></a>00590
+<a name="l00591"></a>00591
+<a name="l00595"></a><a class="code" href="classsf_1_1Image.htm#5f9927e407bbe34172553ecfff2f54f3">00595</a> <a class="code" href="classsf_1_1Image.htm" title="Image is the low-level class for loading and manipulating images.">Image</a>&amp; <a class="code" href="classsf_1_1Image.htm#5f9927e407bbe34172553ecfff2f54f3" title="Assignment operator.">Image::operator =</a>(<span class="keyword">const</span> <a class="code" href="classsf_1_1Image.htm" title="Image is the low-level class for loading and manipulating images.">Image</a>&amp; Other)
+<a name="l00596"></a>00596 {
+<a name="l00597"></a>00597 <a class="code" href="classsf_1_1Image.htm" title="Image is the low-level class for loading and manipulating images.">Image</a> Temp(Other);
+<a name="l00598"></a>00598
+<a name="l00599"></a>00599 std::swap(myWidth, Temp.<a class="code" href="classsf_1_1Image.htm#924ed57a1565f1248a4411e2be7e23e2" title="Image width.">myWidth</a>);
+<a name="l00600"></a>00600 std::swap(myHeight, Temp.<a class="code" href="classsf_1_1Image.htm#ceef290985323875724673f5fdc2f6d0" title="Image Height.">myHeight</a>);
+<a name="l00601"></a>00601 std::swap(myTextureWidth, Temp.<a class="code" href="classsf_1_1Image.htm#57135fd6e5145ba79934aa4864f6bcf1" title="Actual texture width (can be greater than image width because of padding).">myTextureWidth</a>);
+<a name="l00602"></a>00602 std::swap(myTextureHeight, Temp.<a class="code" href="classsf_1_1Image.htm#5dbacc7c4665b2af3c52d8edf806ae59" title="Actual texture height (can be greater than image height because of padding).">myTextureHeight</a>);
+<a name="l00603"></a>00603 std::swap(myTexture, Temp.<a class="code" href="classsf_1_1Image.htm#dc2b7c22a8d938976c71a071fb93f0ba" title="Internal texture identifier.">myTexture</a>);
+<a name="l00604"></a>00604 std::swap(myIsSmooth, Temp.<a class="code" href="classsf_1_1Image.htm#fb002131ec00234570991c91da29c36c" title="Status of the smooth filter.">myIsSmooth</a>);
+<a name="l00605"></a>00605 std::swap(myNeedArrayUpdate, Temp.<a class="code" href="classsf_1_1Image.htm#27bac2a5b153422015f55c68a884d902" title="Status of synchronization between pixels in central memory and the internal texture...">myNeedArrayUpdate</a>);
+<a name="l00606"></a>00606 std::swap(myNeedTextureUpdate, Temp.<a class="code" href="classsf_1_1Image.htm#76172467f76c81f3e5a79c9babe82189" title="Status of synchronization between pixels in central memory and the internal texture...">myNeedTextureUpdate</a>);
+<a name="l00607"></a>00607 myPixels.swap(Temp.<a class="code" href="classsf_1_1Image.htm#635da47010c1cf996389974e3618452f" title="Pixels of the image.">myPixels</a>);
+<a name="l00608"></a>00608
+<a name="l00609"></a>00609 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00610"></a>00610 }
+<a name="l00611"></a>00611
+<a name="l00612"></a>00612
+<a name="l00616"></a>00616 <span class="keywordtype">bool</span> Image::CreateTexture()
+<a name="l00617"></a>00617 {
+<a name="l00618"></a>00618 <span class="comment">// Check if texture parameters are valid before creating it</span>
+<a name="l00619"></a>00619 <span class="keywordflow">if</span> (!myWidth || !myHeight)
+<a name="l00620"></a>00620 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00621"></a>00621
+<a name="l00622"></a>00622 <span class="comment">// Make sure we have a valid context</span>
+<a name="l00623"></a>00623 priv::GraphicsContext Ctx;
+<a name="l00624"></a>00624
+<a name="l00625"></a>00625 <span class="comment">// Adjust internal texture dimensions depending on NPOT textures support</span>
+<a name="l00626"></a>00626 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> TextureWidth = <a class="code" href="classsf_1_1Image.htm#b41056600a1a4848833cc8b5239a9488" title="Get a valid texture size according to hardware support.">GetValidTextureSize</a>(myWidth);
+<a name="l00627"></a>00627 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> TextureHeight = <a class="code" href="classsf_1_1Image.htm#b41056600a1a4848833cc8b5239a9488" title="Get a valid texture size according to hardware support.">GetValidTextureSize</a>(myHeight);
+<a name="l00628"></a>00628
+<a name="l00629"></a>00629 <span class="comment">// Check the maximum texture size</span>
+<a name="l00630"></a>00630 GLint MaxSize;
+<a name="l00631"></a>00631 GLCheck(glGetIntegerv(GL_MAX_TEXTURE_SIZE, &amp;MaxSize));
+<a name="l00632"></a>00632 <span class="keywordflow">if</span> ((TextureWidth &gt; static_cast&lt;unsigned int&gt;(MaxSize)) || (TextureHeight &gt; static_cast&lt;unsigned int&gt;(MaxSize)))
+<a name="l00633"></a>00633 {
+<a name="l00634"></a>00634 std::cerr &lt;&lt; <span class="stringliteral">"Failed to create image, its internal size is too high ("</span> &lt;&lt; TextureWidth &lt;&lt; <span class="stringliteral">"x"</span> &lt;&lt; TextureHeight &lt;&lt; <span class="stringliteral">")"</span> &lt;&lt; std::endl;
+<a name="l00635"></a>00635 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00636"></a>00636 }
+<a name="l00637"></a>00637
+<a name="l00638"></a>00638 <span class="comment">// Destroy the previous OpenGL texture if it already exists with another size</span>
+<a name="l00639"></a>00639 <span class="keywordflow">if</span> ((TextureWidth != myTextureWidth) || (TextureHeight != myTextureHeight))
+<a name="l00640"></a>00640 {
+<a name="l00641"></a>00641 DestroyTexture();
+<a name="l00642"></a>00642 myTextureWidth = TextureWidth;
+<a name="l00643"></a>00643 myTextureHeight = TextureHeight;
+<a name="l00644"></a>00644 }
+<a name="l00645"></a>00645
+<a name="l00646"></a>00646 <span class="comment">// Create the OpenGL texture</span>
+<a name="l00647"></a>00647 <span class="keywordflow">if</span> (!myTexture)
+<a name="l00648"></a>00648 {
+<a name="l00649"></a>00649 GLint PreviousTexture;
+<a name="l00650"></a>00650 GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &amp;PreviousTexture));
+<a name="l00651"></a>00651
+<a name="l00652"></a>00652 GLuint Texture = 0;
+<a name="l00653"></a>00653 GLCheck(glGenTextures(1, &amp;Texture));
+<a name="l00654"></a>00654 GLCheck(glBindTexture(GL_TEXTURE_2D, Texture));
+<a name="l00655"></a>00655 GLCheck(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, myTextureWidth, myTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL));
+<a name="l00656"></a>00656 GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP));
+<a name="l00657"></a>00657 GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP));
+<a name="l00658"></a>00658 GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST));
+<a name="l00659"></a>00659 GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST));
+<a name="l00660"></a>00660 myTexture = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(Texture);
+<a name="l00661"></a>00661
+<a name="l00662"></a>00662 GLCheck(glBindTexture(GL_TEXTURE_2D, PreviousTexture));
+<a name="l00663"></a>00663 }
+<a name="l00664"></a>00664
+<a name="l00665"></a>00665 myNeedTextureUpdate = <span class="keyword">true</span>;
+<a name="l00666"></a>00666
+<a name="l00667"></a>00667 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00668"></a>00668 }
+<a name="l00669"></a>00669
+<a name="l00670"></a>00670
+<a name="l00675"></a>00675 <span class="keywordtype">void</span> Image::EnsureTextureUpdate()<span class="keyword"> const</span>
+<a name="l00676"></a>00676 <span class="keyword"></span>{
+<a name="l00677"></a>00677 <span class="keywordflow">if</span> (myNeedTextureUpdate)
+<a name="l00678"></a>00678 {
+<a name="l00679"></a>00679 <span class="comment">// Copy the pixels</span>
+<a name="l00680"></a>00680 <span class="keywordflow">if</span> (myTexture &amp;&amp; !myPixels.empty())
+<a name="l00681"></a>00681 {
+<a name="l00682"></a>00682 GLint PreviousTexture;
+<a name="l00683"></a>00683 GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &amp;PreviousTexture));
+<a name="l00684"></a>00684
+<a name="l00685"></a>00685 <span class="comment">// Update the texture with the pixels array in RAM</span>
+<a name="l00686"></a>00686 GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture));
+<a name="l00687"></a>00687 GLCheck(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, myWidth, myHeight, GL_RGBA, GL_UNSIGNED_BYTE, &amp;myPixels[0]));
+<a name="l00688"></a>00688
+<a name="l00689"></a>00689 GLCheck(glBindTexture(GL_TEXTURE_2D, PreviousTexture));
+<a name="l00690"></a>00690 }
+<a name="l00691"></a>00691
+<a name="l00692"></a>00692 myNeedTextureUpdate = <span class="keyword">false</span>;
+<a name="l00693"></a>00693 }
+<a name="l00694"></a>00694 }
+<a name="l00695"></a>00695
+<a name="l00696"></a>00696
+<a name="l00701"></a>00701 <span class="keywordtype">void</span> Image::EnsureArrayUpdate()<span class="keyword"> const</span>
+<a name="l00702"></a>00702 <span class="keyword"></span>{
+<a name="l00703"></a>00703 <span class="keywordflow">if</span> (myNeedArrayUpdate)
+<a name="l00704"></a>00704 {
+<a name="l00705"></a>00705 <span class="comment">// Save the previous texture</span>
+<a name="l00706"></a>00706 GLint PreviousTexture;
+<a name="l00707"></a>00707 GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &amp;PreviousTexture));
+<a name="l00708"></a>00708
+<a name="l00709"></a>00709 <span class="comment">// Resize the destination array of pixels</span>
+<a name="l00710"></a>00710 myPixels.resize(myWidth * myHeight);
+<a name="l00711"></a>00711
+<a name="l00712"></a>00712 <span class="keywordflow">if</span> ((myWidth == myTextureWidth) &amp;&amp; (myHeight == myTextureHeight))
+<a name="l00713"></a>00713 {
+<a name="l00714"></a>00714 <span class="comment">// Texture and array have the same size, we can use a direct copy</span>
+<a name="l00715"></a>00715
+<a name="l00716"></a>00716 <span class="comment">// Copy pixels from texture to array</span>
+<a name="l00717"></a>00717 GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture));
+<a name="l00718"></a>00718 GLCheck(glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &amp;myPixels[0]));
+<a name="l00719"></a>00719 }
+<a name="l00720"></a>00720 <span class="keywordflow">else</span>
+<a name="l00721"></a>00721 {
+<a name="l00722"></a>00722 <span class="comment">// Texture and array don't have the same size, we have to use a slower algorithm</span>
+<a name="l00723"></a>00723
+<a name="l00724"></a>00724 <span class="comment">// All the pixels will first be copied to a temporary array</span>
+<a name="l00725"></a>00725 std::vector&lt;Color&gt; AllPixels(myTextureWidth * myTextureHeight);
+<a name="l00726"></a>00726 GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture));
+<a name="l00727"></a>00727 GLCheck(glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &amp;AllPixels[0]));
+<a name="l00728"></a>00728
+<a name="l00729"></a>00729 <span class="comment">// The we copy the useful pixels from the temporary array to the final one</span>
+<a name="l00730"></a>00730 <span class="keyword">const</span> Color* Src = &amp;AllPixels[0];
+<a name="l00731"></a>00731 Color* Dst = &amp;myPixels[0];
+<a name="l00732"></a>00732 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; myHeight; ++i)
+<a name="l00733"></a>00733 {
+<a name="l00734"></a>00734 std::copy(Src, Src + myWidth, Dst);
+<a name="l00735"></a>00735 Src += myTextureWidth;
+<a name="l00736"></a>00736 Dst += myWidth;
+<a name="l00737"></a>00737 }
+<a name="l00738"></a>00738 }
+<a name="l00739"></a>00739
+<a name="l00740"></a>00740 <span class="comment">// Restore the previous texture</span>
+<a name="l00741"></a>00741 GLCheck(glBindTexture(GL_TEXTURE_2D, PreviousTexture));
+<a name="l00742"></a>00742
+<a name="l00743"></a>00743 myNeedArrayUpdate = <span class="keyword">false</span>;
+<a name="l00744"></a>00744 }
+<a name="l00745"></a>00745 }
+<a name="l00746"></a>00746
+<a name="l00747"></a>00747
+<a name="l00751"></a>00751 <span class="keywordtype">void</span> Image::Reset()
+<a name="l00752"></a>00752 {
+<a name="l00753"></a>00753 DestroyTexture();
+<a name="l00754"></a>00754
+<a name="l00755"></a>00755 myWidth = 0;
+<a name="l00756"></a>00756 myHeight = 0;
+<a name="l00757"></a>00757 myTextureWidth = 0;
+<a name="l00758"></a>00758 myTextureHeight = 0;
+<a name="l00759"></a>00759 myTexture = 0;
+<a name="l00760"></a>00760 myIsSmooth = <span class="keyword">true</span>;
+<a name="l00761"></a>00761 myNeedTextureUpdate = <span class="keyword">false</span>;
+<a name="l00762"></a>00762 myNeedArrayUpdate = <span class="keyword">false</span>;
+<a name="l00763"></a>00763 myPixels.clear();
+<a name="l00764"></a>00764 }
+<a name="l00765"></a>00765
+<a name="l00766"></a>00766
+<a name="l00770"></a>00770 <span class="keywordtype">void</span> Image::DestroyTexture()
+<a name="l00771"></a>00771 {
+<a name="l00772"></a>00772 <span class="comment">// Destroy the internal texture</span>
+<a name="l00773"></a>00773 <span class="keywordflow">if</span> (myTexture)
+<a name="l00774"></a>00774 {
+<a name="l00775"></a>00775 <span class="comment">// Make sure we have a valid context</span>
+<a name="l00776"></a>00776 priv::GraphicsContext Ctx;
+<a name="l00777"></a>00777
+<a name="l00778"></a>00778 GLuint Texture = <span class="keyword">static_cast&lt;</span>GLuint<span class="keyword">&gt;</span>(myTexture);
+<a name="l00779"></a>00779 GLCheck(glDeleteTextures(1, &amp;Texture));
+<a name="l00780"></a>00780 myTexture = 0;
+<a name="l00781"></a>00781 myNeedTextureUpdate = <span class="keyword">false</span>;
+<a name="l00782"></a>00782 myNeedArrayUpdate = <span class="keyword">false</span>;
+<a name="l00783"></a>00783 }
+<a name="l00784"></a>00784 }
+<a name="l00785"></a>00785
+<a name="l00786"></a>00786 } <span class="comment">// namespace sf</span>
+</pre></div></div>
+
+ <p id="footer">
+ &nbsp;::&nbsp; Copyright &copy; 2007-2008 Laurent Gomila, all rights reserved &nbsp;::&nbsp;
+ Documentation generated by <a href="http://www.doxygen.org/" title="doxygen website">doxygen 1.5.2</a> &nbsp;::&nbsp;
+ </p>
+
+ </body>
+</html>