X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pages%2Fblog-0009.html-inc;h=2e202e79e222745e30148733ba74569908ecbd32;hb=a05e5d4499fb58198e463162d0385e8a156e1f03;hp=7f9c593d829b4b3118fe033c07d9644cbe13239e;hpb=ca0a3441dd72000cbbbb4be484b18d0d305fdb29;p=sdlgit%2FSDL-Site.git diff --git a/pages/blog-0009.html-inc b/pages/blog-0009.html-inc index 7f9c593..2e202e7 100644 --- a/pages/blog-0009.html-inc +++ b/pages/blog-0009.html-inc @@ -1,25 +1,81 @@

-Eye Candy +Providing direct memory access to SDL_Surface's pixels

-
-clang
-With each imperfect hit
-a legendary blade forms
-

+

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:



-
-In prep for the TPM meeting we have been working hard to release a new version of SDL Perl and Alien::SDL. After a lot of feed back from testers (Mike Stok, Stuart Watt, and Chas Owens), we where able to get a working version on 64bit and Mac. The releases will be out tomorrow but here
-is some eye candy to tide you guys over.
-
-
-This is shooter.pl finally working in MacOSX and 64 bit.
-
-

-
-k23z_ mentioned I should get some more SDL_perl videos out to attract some devs. So here goes.
-
-Walking Guy from SDLPerl on Vimeo. -


-

\ No newline at end of file +
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