Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/screensave.c
3196 views
1
/*
2
* Routine to save elmerpost graphics window to disk in ppm(P6) format.
3
*
4
* Compile commands
5
*
6
* DEC: cc -shared -o grab grab.c -I$ELMER_HOME/include
7
* SGI: cc -shared -o grab grab.c -I$ELMER_HOME/include -n32
8
* WINDOWS:
9
* cl -c -I%ELMER_HOME%\include -DWIN32 grab.c
10
* link /dll /libpath:%ELMER_HOME%\lib grab.obj tcl81.lib opengl32.lib
11
*
12
* in elmerpost:
13
*
14
* load screensave screensave
15
*
16
* and then you have the command:
17
*
18
* screensave filename.ppm
19
*/
20
21
#if defined(WIN32) || defined(win32)
22
#include <windows.h>
23
#endif
24
25
#include <stdio.h>
26
#include <math.h>
27
#include <stdlib.h>
28
#include <strings.h>
29
30
31
#include <GL/gl.h>
32
#include <GL/glu.h>
33
34
35
#include "tcl.h"
36
37
#if !(defined(WIN32) || defined(win32))
38
#include <errno.h>
39
extern int errno;
40
#endif
41
42
static int ScreenSave( ClientData cl,Tcl_Interp *interp,int argc,char **argv )
43
{
44
unsigned char *buffer;
45
FILE *fp;
46
char fname[256];
47
int i,nx,ny,ox,oy,viewp[4];
48
49
if ( argc < 2 ) {
50
strcpy( fname, "elmerpost.ppm" );
51
} else {
52
strncpy( fname,argv[1], 256 );
53
}
54
if ( !(fp = fopen( fname, "wb" ) ) ) {
55
#if defined(WIN32) || defined(win32)
56
sprintf( interp->result,
57
"screensave: can't open [%s] for writing!\n", argv[1] );
58
#else
59
sprintf( interp->result,
60
"screensave: can't open [%s] for writing:\n%s\n",
61
argv[1], strerror(errno) );
62
#endif
63
return TCL_ERROR;
64
}
65
66
glGetIntegerv( GL_VIEWPORT, viewp );
67
ox = viewp[0];
68
oy = viewp[1];
69
nx = viewp[2]+1;
70
ny = viewp[3]+1;
71
72
if ( !(buffer = (unsigned char *)malloc( nx*ny*3 ) ) )
73
{
74
fclose( fp );
75
#if defined(WIN32) || defined(win32)
76
sprintf( interp->result,
77
"screensave: can't allocate enough memory!\n" );
78
#else
79
sprintf( interp->result,
80
"screensave: can't allocate enough memory:\n%s\n",
81
strerror(errno) );
82
#endif
83
return TCL_ERROR;
84
}
85
86
fprintf( stderr, "screensave: reading pixels..." );
87
88
glReadBuffer( GL_FRONT );
89
glReadPixels( ox,oy,nx,ny, GL_RGB, GL_UNSIGNED_BYTE, buffer );
90
91
fprintf( stderr, "writing file [%s]...", fname );
92
93
fprintf( fp, "P6\n%d %d\n255\n", nx, ny );
94
95
for( i=ny-1; i>=0; i-- )
96
if ( fwrite( &buffer[i*nx*3], 1, 3*nx, fp ) != 3*nx ) {
97
fclose( fp );
98
free( buffer );
99
#if defined(WIN32) || defined(win32)
100
sprintf( interp->result,
101
"screensave: error writing to [%s]!\n", argv[1] );
102
#else
103
sprintf( interp->result,
104
"screensave: error writing to [%s]:\n%s\n",
105
argv[1], strerror(errno) );
106
#endif
107
return TCL_ERROR;
108
}
109
110
fclose( fp );
111
free( buffer );
112
113
fprintf( stderr, "done...[ok]\n" );
114
115
return TCL_OK;
116
}
117
118
#if defined(WIN32) || defined(win32)
119
__declspec(dllexport)
120
#endif
121
int Screensave_Init( Tcl_Interp *interp )
122
{
123
Tcl_CreateCommand( interp, "screensave", ScreenSave,
124
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL );
125
126
return TCL_OK;
127
}
128
129