Revision: 6715
http://playerstage.svn.sourceforge.net/playerstage/?rev=6715&view=rev
Author: rtv
Date: 2008-06-30 12:25:25 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
cleaned up screenshot code
Modified Paths:
--------------
code/stage/trunk/libstage/canvas.cc
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-06-30 08:22:54 UTC (rev 6714)
+++ code/stage/trunk/libstage/canvas.cc 2008-06-30 19:25:25 UTC (rev 6715)
@@ -411,7 +411,7 @@
stg_bounds3d_t bounds = world->GetExtent();
char str[16];
- PushColor( 0,0,0,0.15 );
+ PushColor( 0.15, 0.15, 0.15, 1.0 ); // pale gray
for( double i = floor(bounds.x.min); i < bounds.x.max; i++)
{
snprintf( str, 16, "%d", (int)i );
@@ -619,33 +619,23 @@
void StgCanvas::Screenshot()
{
- int viewport[4];
- glGetIntegerv(GL_VIEWPORT, viewport);
- int width = viewport[2];//w();
- int height = viewport[3];//;;h();
+ int width = w();
+ int height = h();
int depth = 4; // RGBA
- // printf( "VP: %d %d %d %d WIN %d %d\n",
-// viewport[0],
-// viewport[1],
-// viewport[2],
-// viewport[3],
-// w(),
-// h() );
+ // we use RGBA throughout, though we only need RGB, as the 4-byte
+ // pixels avoid a nasty word-alignment problem when indexing into
+ // the pixel array.
- uint8_t* pixels = new uint8_t[ width * height * depth ];
-
+ // might save a bit of time as the image size rarely changes
+ static uint8_t* pixels = NULL;
+ pixels = g_renew( uint8_t, pixels, width * height * depth );
+
glFlush(); // make sure the drawing is done
// read the pixels from the screen
- //glReadPixels( viewport[0], viewport[1], width, height, GL_RGB,
GL_UNSIGNED_BYTE, pixels );
glReadPixels( 0,0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
- // force the alpha channel to be maximum
- for( int i=0; i<height; i++ )
- for( int j=0; j<width; j++ )
- pixels[ ((i * width + j) * depth)+3] = 0xFF;
-
static uint32_t count = 0;
char filename[64];
snprintf( filename, 63, "stage-%d.png", count++ );
@@ -664,6 +654,7 @@
png_init_io(pp, fp);
+ // need to invert the image as GL and PNG disagree on the row order
png_bytep rowpointers[height];
for( int i=0; i<height; i++ )
rowpointers[i] = &pixels[ (height-1-i) * width * depth ];
@@ -686,8 +677,6 @@
fclose(fp);
printf( "Saved %s\n", filename );
-
- delete [] pixels;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit