X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pages%2Fblog-0003.html-inc;h=2e202e79e222745e30148733ba74569908ecbd32;hb=807ae0cdf3bf7e415bbb01449976c9ab91209cbb;hp=3b3edbfd256145b8fad9cac38ad9e53a8755fcba;hpb=6b8e717c0e647220ce022cd254e7a248f8c8bbc6;p=sdlgit%2FSDL-Site.git diff --git a/pages/blog-0003.html-inc b/pages/blog-0003.html-inc index 3b3edbf..2e202e7 100644 --- a/pages/blog-0003.html-inc +++ b/pages/blog-0003.html-inc @@ -1,6 +1,81 @@

-Development Update +Providing direct memory access to SDL_Surface's pixels

-

A stoic stone will sit idle,
but will some effort,
A rolling rock will run!


In the past week the SDL Perl team has been busy! This is what we have accomplished


Commitment to Testing!

In an effort to focus on continuing our focus on testing we have setup a Smolder site for the SDL redesign process. Currently we have two platforms (linux, windows32) regularly tested on here. If there are more people following the redesign process and would like to share their test results; contact us at sdl-devel@perl.org and we will provide access to you.

SDL::Video

For the core development most of the focus has been on redesigning around the Video category of the SDL perl API. As of now we are 50% done. 19 functions out of 38 functions have been implemented and tested.


Site Redesign + Migration

On the end of the spectrum, Froggs has been hard at work on the graphical design of the site. More over with mst's help we will soon be migrating to http://sdl.perl.org.



Documentation

Moreover this week we have seen an increase effort from magnet on the SDL docs. Kudos!


SWIG Experimentation

Finally Katrina has begun looking into SWIG as alternative for SDL in the future.
\ No newline at end of file +

In an attempt to make pixel access easier on SDL_Surface pixels. I have started work on SDLx::Surface. So far I have only start on the 32 bpp surfaces.


+

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:


+
SV * get_pixel32 (SDL_Surface *surface, int x, int y)
+{
+ //Convert the pixels to 32 bit 
+ Uint32 *pixels = (Uint32 *)surface->pixels; 
+
+ //Get the requested pixel  
+ Uint32* u_ptr =  pixels + ( y * surface->w ) + x ; 
+
+        SV* sv = newSVpv("a",1); //Make a temp SV* value on the go
+        SvCUR_set(sv, sizeof(Uint32)); //Specify the new CUR length
+ SvLEN_set(sv, sizeof(Uint32)); //Specify the LEN length
+        SvPV_set(sv,(char*)u_ptr); // set the actual pixel's pointer as the memory space to use
+
+ return sv; //make a modifiable reference using u_ptr's place as the memory :)
+
+}
+

+

Next I loop through all the pixels and put them in a 2D array format, shown below:

AV * construct_p_matrix ( SDL_Surface *surface )
+{
+    AV * matrix = newAV();
+     int i, j;
+     for(  i =0 ; i < surface->w; i++)
+      {
+        AV * matrix_row = newAV();
+        for( j =0 ; j < surface->h; j++)
+        {
+           av_push(matrix_row, get_pixel32(surface, i,j) );
+        }
+        av_push(matrix, newRV_noinc((SV*) matrix_row) );
+      }
+
+ return matrix;
+}
+

+

You can see the complete here.


+

In Perl I can do a get access on this pixel using:


+
+
my $surf32_matrix = SDLx::Surface::pixel_array($screen_surface);
+   print unpack 'b*', $surf32_matrix->[0][0]; # pixel value at x = 0 and y =0
+#OUTPUT:
+# 11111111000000000000000000000000
+

+

The structure of the PV is using Devel::Peek is :


+
print Dump $surf32_matrix->[0][0];
+#OUTPUT:
+#SV = PV(0xed0dbc) at 0xeb5344
+#  REFCNT = 1
+#  FLAGS = (POK,pPOK)
+#  PV = 0x9e04ac "\0\0\377\0"
+#  CUR = 4
+#  LEN = 4
+

+

The problem is in setting the value of this pointer value. I have tried the following things with no success:


+
if ( SDL::Video::MUSTLOCK($screen_surface) ) {
+    return if ( SDL::Video::lock_surface($screen_surface) < 0 ); #required for pixel operations
+}
+
+#USING pack
+
+my $green = pack 'b*', '11111111000000000000000000000000';
+substr( $surf32_matrix->[0][0], 0, 8 * 4, $green); #no change
+#substr( $surf32_matrix->[0][0], 0, 8 * 4, 0xFF000000); segfault
+substr( ${$surf32_matrix->[0][0]}, 0, 8 * 4, 0xFF000000); #no change
+#$surf32_matrix->[0][0] = $green; SEGFAULT's cannot write to memory
+${$surf32_matrix->[0][0]} = $green; #no change
+
+
+SDL::Video::unlock_surface($screen_surface)
+  if ( SDL::Video::MUSTLOCK($screen_surface) );
+

+

You can see an example here.


+

Any help will be greatly appreciated.

+


+

\ No newline at end of file