Updated Articles
[sdlgit/SDL-Site.git] / pages / blog-0015.html-inc
index 2bd84fc..2e202e7 100644 (file)
@@ -1,40 +1,81 @@
 <div class="blog">
 <h1 id="NAME">
-Getting people to use SDL Perl: Docs, API, and Distribution
+Providing direct memory access to SDL_Surface's pixels
 </h1>
 <div class="CONTENT">
-<h4><i>The road so far</i></h4><br />
-Things have been busy but fruitful. Our two core modules are getting to be a bit more stable. <a href="http://matrix.cpantesters.org/?dist=Alien-SDL+1.403">Alien::SDL 1.405</a> is behaving well. This foundational stability will start to show results in <a href="http://matrix.cpantesters.org/?dist=SDL+2.405">SDL</a> too I believe. Most excitingly the main developer of frozen-bubble is reviewing our <a href="http://search.cpan.org/~kthakore/Games-FrozenBubble-2.202/lib/Games/FrozenBubble.pm">Games::FrozenBubble</a> port to CPAN. All good and well, but to keep this project going we need to improve.<br />
-<br />
-<h4><i>Getting people to use SDL Perl</i></h4><br />
-After a long chat with a new SDL user on #sdl today, I realize we still have some way to go. Currently it seems we are lacking in a few areas. We can definitely use some feedback and help in these areas. <br />
-<br />
-<ul><li>Tutorials/Documentation<br />
-</li>
+<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> 
 
-<ul><li>We have more docs now on http://sdl.perl.org but they suck</li>
-<li>What type of tutorials do you think will be good for beginners?</li>
+        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>
 
-<ul><li>A project start to finish?</li>
-<li>Individual tutorials for various topics?</li>
-<li>What needs to go in SDL::CookBook?</li>
-</ul></ul>
-<li>API sweetness</li>
+ <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>
 
-<ul><li>SDL Perl depends on distinct C libraries</li>
+<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>
 
-<ul><li>This makes naming conventions, data formats different the SDL:: namespaces</li>
-<li>How do people design this stuff?</li>
+<span style='color:#9999a9; '>#USING pack</span>
 
-<ul><li>We are hackers and we just go do stuff but I think this needs some prior thought</li>
-<li>Any takers?</li>
-</ul></ul></ul>
-<li>Distribution</li>
+<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>
 
-<ul><li>If SDL scripts can be packaged up simply for game developers to distribute their games it will be a big plus</li>
 
-<ul><li>One way is a Wx::Perl::Packer clone</li>
-<li>Another is a CPAN/Steam clone that game devs can upload games too and people can point and click download games?&nbsp;</li>
-</ul></ul></ul><div>If anyone wants to help in these areas please talk to us on sdl-devel@perl.org.&nbsp;</div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3102167581424744259-7164362190686365958?l=yapgh.blogspot.com' alt='' /></div>
-<p><a href="http://feedads.g.doubleclick.net/~a/9LDtns437JWMVWJoUGIR6gCE1W0/0/da"><img src="http://feedads.g.doubleclick.net/~a/9LDtns437JWMVWJoUGIR6gCE1W0/0/di" border="0" ismap="true"></img></a><br/>
-<a href="http://feedads.g.doubleclick.net/~a/9LDtns437JWMVWJoUGIR6gCE1W0/1/da"><img src="http://feedads.g.doubleclick.net/~a/9LDtns437JWMVWJoUGIR6gCE1W0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/YetAnotherPerlGameHackeryapgh/~4/EXlozhjfhdo" height="1" width="1"/></div></div>
\ No newline at end of file
+<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