Add screenshot capability.

This commit is contained in:
Fabien Sanglard 2014-09-27 03:59:04 -04:00
parent b5c951323e
commit fc82aa2e40
4 changed files with 68 additions and 39 deletions

57
crt.cpp
View File

@ -8,6 +8,14 @@
#include "crt.h" #include "crt.h"
// Win32
#ifdef _WIN32
#include "SDL.h"
#elif __linux__
#include "SDL/SDL.h"
#else
#include "SDL/SDL.h"
#endif
static int width; static int width;
static int height; static int height;
@ -66,6 +74,7 @@ void CRT_DAC(void){
*pixelPointer++ = curpal[paletteIndex].b; *pixelPointer++ = curpal[paletteIndex].b;
} }
//Upload texture //Upload texture
glBindTexture(GL_TEXTURE_2D, crtTexture); glBindTexture(GL_TEXTURE_2D, crtTexture);
glTexSubImage2D(GL_TEXTURE_2D, glTexSubImage2D(GL_TEXTURE_2D,
@ -89,4 +98,52 @@ void CRT_DAC(void){
//Flip buffer //Flip buffer
SDL_GL_SwapBuffers(); SDL_GL_SwapBuffers();
Uint8 *keystate = SDL_GetKeyState(NULL);
static int wasPressed = 0;
if ( keystate[SDLK_i] ){
if (!wasPressed){
wasPressed = 1;
CRT_Screenshot();
}
}
else
wasPressed = 0;
}
void CRT_Screenshot(void){
const char* filename = "screenshot.tga" ;
printf("Screenshot.\n");
//This prevents the images getting padded
// when the width multiplied by 3 is not a multiple of 4
glPixelStorei(GL_PACK_ALIGNMENT, 1);
int nSize = width*height*3;
// First let's create our buffer, 3 channels per Pixel
char* dataBuffer = (char*)malloc(nSize*sizeof(char));
if (!dataBuffer) return;
// Let's fetch them from the backbuffer
// We request the pixels in GL_BGR format
#define GL_BGR 0x80E0
glReadPixels((GLint)0, (GLint)0,(GLint)width, (GLint)height, GL_BGR, GL_UNSIGNED_BYTE, dataBuffer);
//Now the file creation
FILE *filePtr = fopen(filename, "wb");
if (!filePtr) return;
unsigned char TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};
unsigned char header[6] = { width%256,width/256,height%256,height/256,24,0};
// We write the headers
fwrite(TGAheader, sizeof(unsigned char), 12, filePtr);
fwrite(header, sizeof(unsigned char), 6, filePtr);
// And finally our image data
fwrite(dataBuffer, sizeof(GLubyte), nSize, filePtr);
fclose(filePtr);
} }

2
crt.h
View File

@ -34,5 +34,7 @@ void CRT_Init(int width);
*/ */
void CRT_DAC(void); void CRT_DAC(void);
void CRT_Screenshot(void);
#endif #endif

View File

@ -290,8 +290,13 @@ static void processEvent(SDL_Event *event)
if(sym < lengthof(ASCIINames) && ASCIINames[sym]) if(sym < lengthof(ASCIINames) && ASCIINames[sym])
LastASCII = ASCIINames[sym]; LastASCII = ASCIINames[sym];
} }
if(LastScan<SDLK_LAST)
if (LastScan<SDLK_i){
}
if(LastScan<SDLK_LAST){
Keyboard[LastScan] = 1; Keyboard[LastScan] = 1;
}
if(LastScan == SDLK_PAUSE) if(LastScan == SDLK_PAUSE)
Paused = true; Paused = true;
break; break;
@ -318,8 +323,9 @@ static void processEvent(SDL_Event *event)
} }
} }
if(key<SDLK_LAST) if(key<SDLK_LAST){
Keyboard[key] = 0; Keyboard[key] = 0;
}
break; break;
} }
@ -477,40 +483,6 @@ IN_ReadControl(int player,ControlInfo *info)
info->dir = DirTable[((my + 1) * 3) + (mx + 1)]; info->dir = DirTable[((my + 1) * 3) + (mx + 1)];
} }
///////////////////////////////////////////////////////////////////////////
//
// IN_WaitForKey() - Waits for a scan code, then clears LastScan and
// returns the scan code
//
///////////////////////////////////////////////////////////////////////////
ScanCode
IN_WaitForKey(void)
{
ScanCode result;
while ((result = LastScan)==0)
IN_WaitAndProcessEvents();
LastScan = 0;
return(result);
}
///////////////////////////////////////////////////////////////////////////
//
// IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and
// returns the ASCII value
//
///////////////////////////////////////////////////////////////////////////
char
IN_WaitForASCII(void)
{
char result;
while ((result = LastASCII)==0)
IN_WaitAndProcessEvents();
LastASCII = '\0';
return(result);
}
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// //
// IN_Ack() - waits for a button or key press. If a button is down, upon // IN_Ack() - waits for a button or key press. If a button is down, upon

View File

@ -136,7 +136,7 @@ typedef struct {
joyMultXH,joyMultYH; joyMultXH,joyMultYH;
} JoystickDef; } JoystickDef;
// Global variables // Global variables
extern volatile boolean Keyboard[]; extern volatile boolean Keyboard[];;
extern boolean MousePresent; extern boolean MousePresent;
extern volatile boolean Paused; extern volatile boolean Paused;
extern volatile char LastASCII; extern volatile char LastASCII;
@ -160,8 +160,6 @@ extern void IN_SetupJoy(word joy,word minx,word maxx,
extern void IN_StopDemo(void),IN_FreeDemoBuffer(void), extern void IN_StopDemo(void),IN_FreeDemoBuffer(void),
IN_Ack(void); IN_Ack(void);
extern boolean IN_UserInput(longword delay); extern boolean IN_UserInput(longword delay);
extern char IN_WaitForASCII(void);
extern ScanCode IN_WaitForKey(void);
extern word IN_GetJoyButtonsDB(word joy); extern word IN_GetJoyButtonsDB(word joy);
extern const char *IN_GetScanName(ScanCode); extern const char *IN_GetScanName(ScanCode);