Updated
[sdlgit/SDL-Site.git] / pages / blog-0009.html-inc
index 7ce09e8..2e202e7 100644 (file)
@@ -1,6 +1,81 @@
 <div class="blog">
 <h1 id="NAME">
-Frozen Bubble coming to CPAN
+Providing direct memory access to SDL_Surface's pixels
 </h1>
 <div class="CONTENT">
-<div style="text-align: right;"><i>The frozen wind,</i></div><div style="text-align: right;"><i> made me shiver,</i></div><div style="text-align: right;"><i> with excitement</i>.</div><div style="text-align: right;"></div><br /><div style="text-align: left;">There has been some interest in making Frozen Bubble cross platform so I have forked Frozen Bubble v2.0 to my github<a href="http://github.com/kthakore/frozen-bubble/tree/master"> repo</a>. Any contributors are welcome! I will eventually be removing hacks that were needed to make Frozen Bubble work with the old SDL perl. The plan is to make Frozen Bubble cross platform by removing platform specific hacks and dependencies. One of the major switch will be from BSD sockets to SDL_net through SDL perl or XS. The main goal would be to be able to do&nbsp;</div><div style="text-align: left;"></div><blockquote><div style="text-align: left;">cpan install FrozenBubble</div></blockquote><div style="text-align: left;"></div><div style="text-align: left;">To do this the Makefile.PL will need to be rewritten a little bit. Moreover we will need to make test using code from Frozen Bubble so that it can be smoke tested on CPAN. &nbsp;If contributors need more information please contact me.</div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3102167581424744259-4948555691607200165?l=yapgh.blogspot.com'/></div></div>
\ No newline at end of file
+<p>In an attempt to make pixel access easier on SDL_Surface pixels. I have started work on <a href="http://github.com/kthakore/SDL_perl/commit/7ee1a1a7f162080a6fa5274e95b80961486e21e5">SDLx::Surface</a>. So far I have only start on the 32 bpp surfaces.</p><br />
+<p>The general idea is to make Pointer Values (PV) of each pixel in the surface and place them into a 2D matrix. First I make pointer values like this: </p><br />
+<pre style='color:#d1d1d1;background:#000000;'>SV <span style='color:#d2cd86; '>*</span> get_pixel32 <span style='color:#d2cd86; '>(</span>SDL_Surface <span style='color:#d2cd86; '>*</span>surface<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>int</span> x<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>int</span> y<span style='color:#d2cd86; '>)</span>
+<span style='color:#b060b0; '>{</span>
+ <span style='color:#9999a9; '>//Convert the pixels to 32 bit </span>
+ Uint32 <span style='color:#d2cd86; '>*</span>pixels <span style='color:#d2cd86; '>=</span> <span style='color:#d2cd86; '>(</span>Uint32 <span style='color:#d2cd86; '>*</span><span style='color:#d2cd86; '>)</span>surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>pixels<span style='color:#b060b0; '>;</span> 
+
+ <span style='color:#9999a9; '>//Get the requested pixel  </span>
+ Uint32<span style='color:#d2cd86; '>*</span> u_ptr <span style='color:#d2cd86; '>=</span>  pixels <span style='color:#d2cd86; '>+</span> <span style='color:#d2cd86; '>(</span> y <span style='color:#d2cd86; '>*</span> surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>w <span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>+</span> x <span style='color:#b060b0; '>;</span> 
+
+        SV<span style='color:#d2cd86; '>*</span> sv <span style='color:#d2cd86; '>=</span> newSVpv<span style='color:#d2cd86; '>(</span><span style='color:#02d045; '>"</span><span style='color:#00c4c4; '>a</span><span style='color:#02d045; '>"</span><span style='color:#d2cd86; '>,</span><span style='color:#008c00; '>1</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//Make a temp SV* value on the go</span>
+        SvCUR_set<span style='color:#d2cd86; '>(</span>sv<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>sizeof</span><span style='color:#d2cd86; '>(</span>Uint32<span style='color:#d2cd86; '>)</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//Specify the new CUR length</span>
+ SvLEN_set<span style='color:#d2cd86; '>(</span>sv<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>sizeof</span><span style='color:#d2cd86; '>(</span>Uint32<span style='color:#d2cd86; '>)</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//Specify the LEN length</span>
+        SvPV_set<span style='color:#d2cd86; '>(</span>sv<span style='color:#d2cd86; '>,</span><span style='color:#d2cd86; '>(</span><span style='color:#e66170; font-weight:bold; '>char</span><span style='color:#d2cd86; '>*</span><span style='color:#d2cd86; '>)</span>u_ptr<span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>// set the actual pixel's pointer as the memory space to use</span>
+
+ <span style='color:#e66170; font-weight:bold; '>return</span> sv<span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//make a modifiable reference using u_ptr's place as the memory :)</span>
+
+<span style='color:#b060b0; '>}</span>
+</pre><br />
+<p>Next I loop through all the pixels and put them in a 2D array format, shown below: </p><pre style='color:#d1d1d1;background:#000000;'>AV <span style='color:#d2cd86; '>*</span> construct_p_matrix <span style='color:#d2cd86; '>(</span> SDL_Surface <span style='color:#d2cd86; '>*</span>surface <span style='color:#d2cd86; '>)</span>
+<span style='color:#b060b0; '>{</span>
+    AV <span style='color:#d2cd86; '>*</span> matrix <span style='color:#d2cd86; '>=</span> newAV<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
+     <span style='color:#e66170; font-weight:bold; '>int</span> i<span style='color:#d2cd86; '>,</span> j<span style='color:#b060b0; '>;</span>
+     <span style='color:#e66170; font-weight:bold; '>for</span><span style='color:#d2cd86; '>(</span>  i <span style='color:#d2cd86; '>=</span><span style='color:#008c00; '>0</span> <span style='color:#b060b0; '>;</span> i <span style='color:#d2cd86; '>&lt;</span> surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>w<span style='color:#b060b0; '>;</span> i<span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>)</span>
+      <span style='color:#b060b0; '>{</span>
+        AV <span style='color:#d2cd86; '>*</span> matrix_row <span style='color:#d2cd86; '>=</span> newAV<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
+        <span style='color:#e66170; font-weight:bold; '>for</span><span style='color:#d2cd86; '>(</span> j <span style='color:#d2cd86; '>=</span><span style='color:#008c00; '>0</span> <span style='color:#b060b0; '>;</span> j <span style='color:#d2cd86; '>&lt;</span> surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>h<span style='color:#b060b0; '>;</span> j<span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>)</span>
+        <span style='color:#b060b0; '>{</span>
+           av_push<span style='color:#d2cd86; '>(</span>matrix_row<span style='color:#d2cd86; '>,</span> get_pixel32<span style='color:#d2cd86; '>(</span>surface<span style='color:#d2cd86; '>,</span> i<span style='color:#d2cd86; '>,</span>j<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
+        <span style='color:#b060b0; '>}</span>
+        av_push<span style='color:#d2cd86; '>(</span>matrix<span style='color:#d2cd86; '>,</span> newRV_noinc<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>(</span>SV<span style='color:#d2cd86; '>*</span><span style='color:#d2cd86; '>)</span> matrix_row<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
+      <span style='color:#b060b0; '>}</span>
+
+ <span style='color:#e66170; font-weight:bold; '>return</span> matrix<span style='color:#b060b0; '>;</span>
+<span style='color:#b060b0; '>}</span>
+</pre><br />
+<p>You can see the complete <a href="http://github.com/kthakore/SDL_perl/blob/7ee1a1a7f162080a6fa5274e95b80961486e21e5/src/SDLx/Surface.xs">here</a>.</p><br />
+<p>In Perl I can do a get access on this pixel using: </p><br />
+<br />
+<pre style='color:#d1d1d1;background:#000000;'><span style='color:#e66170; font-weight:bold; '>my</span> $surf32_matrix <span style='color:#d2cd86; '>=</span> <span style='color:#904050; '>SDLx</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Surface</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>pixel_array<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
+   <span style='color:#e66170; font-weight:bold; '>print</span> <span style='color:#e66170; font-weight:bold; '>unpack</span> <span style='color:#00c4c4; '>'b*'</span><span style='color:#d2cd86; '>,</span> $surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '># pixel value at x = 0 and y =0</span>
+<span style='color:#9999a9; '>#OUTPUT:</span>
+<span style='color:#9999a9; '># 11111111000000000000000000000000</span>
+</pre><br />
+<p>The structure of the PV is using Devel::Peek is : </p><br />
+<pre style='color:#d1d1d1;background:#000000;'><span style='color:#e66170; font-weight:bold; '>print</span> Dump $surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#b060b0; '>;</span>
+<span style='color:#9999a9; '>#OUTPUT:</span>
+<span style='color:#9999a9; '>#SV = PV(0xed0dbc) at 0xeb5344</span>
+<span style='color:#9999a9; '>#  REFCNT = 1</span>
+<span style='color:#9999a9; '>#  FLAGS = (POK,pPOK)</span>
+<span style='color:#9999a9; '>#  PV = 0x9e04ac "\0\0\377\0"</span>
+<span style='color:#9999a9; '>#  CUR = 4</span>
+<span style='color:#9999a9; '>#  LEN = 4</span>
+</pre><br />
+<p>The problem is in setting the value of this pointer value. I have tried the following things with no success:</p><br />
+<pre style='color:#d1d1d1;background:#000000;'><span style='color:#e66170; font-weight:bold; '>if</span> <span style='color:#d2cd86; '>(</span> <span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>MUSTLOCK<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span> <span style='color:#b060b0; '>{</span>
+    <span style='color:#e66170; font-weight:bold; '>return</span> <span style='color:#e66170; font-weight:bold; '>if</span> <span style='color:#d2cd86; '>(</span> <span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>lock_surface<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>&lt;</span> <span style='color:#00a800; '>0</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#required for pixel operations</span>
+<span style='color:#b060b0; '>}</span>
+
+<span style='color:#9999a9; '>#USING pack</span>
+
+<span style='color:#e66170; font-weight:bold; '>my</span> $green <span style='color:#d2cd86; '>=</span> <span style='color:#e66170; font-weight:bold; '>pack</span> <span style='color:#00c4c4; '>'b*'</span><span style='color:#d2cd86; '>,</span> <span style='color:#00c4c4; '>'11111111000000000000000000000000'</span><span style='color:#b060b0; '>;</span>
+<span style='color:#e66170; font-weight:bold; '>substr</span><span style='color:#d2cd86; '>(</span> $surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>8</span> <span style='color:#d2cd86; '>*</span> <span style='color:#00a800; '>4</span><span style='color:#d2cd86; '>,</span> $green<span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#no change</span>
+<span style='color:#9999a9; '>#substr( $surf32_matrix->[0][0], 0, 8 * 4, 0xFF000000); segfault</span>
+<span style='color:#e66170; font-weight:bold; '>substr</span><span style='color:#d2cd86; '>(</span> ${$surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span>}<span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>8</span> <span style='color:#d2cd86; '>*</span> <span style='color:#00a800; '>4</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>0xFF000000</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#no change</span>
+<span style='color:#9999a9; '>#$surf32_matrix->[0][0] = $green; SEGFAULT's cannot write to memory</span>
+${$surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span>} <span style='color:#d2cd86; '>=</span> $green<span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#no change</span>
+
+
+<span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>unlock_surface<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span>
+  <span style='color:#e66170; font-weight:bold; '>if</span> <span style='color:#d2cd86; '>(</span> <span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>MUSTLOCK<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
+</pre><br />
+<p>You can see an example <a href="http://paste.scsys.co.uk/45111">here</a>.</p><br />
+<p>Any help will be greatly appreciated. </p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3102167581424744259-1929043568015240773?l=yapgh.blogspot.com' alt='' /></div>
+<p><a href="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/0/da"><img src="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/0/di" border="0" ismap="true"></img></a><br/>
+<a href="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/1/da"><img src="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/YetAnotherPerlGameHackeryapgh/~4/q5F5dgfg5Fg" height="1" width="1"/></div></div>
\ No newline at end of file