www.xbdev.net xbdev - software development
Friday December 14, 2018
home | about | contact | Donations

     
 

OpenXDK

The Free, Legal, Open Source XBox Development Kit...

 

ScreenCapture - Save the screen to a tga file

 

Sometimes its useful to grab the screen and save it to file.  For a number of reasons, it allows us to really sit down and look at the image, it also allow us to create screenshots so we can show off our demo's...hehehe.

 

 

code: screencapture.c

/*********************************************************************************/

/*                                                                               */

/*  XBOX OpenXDK ScreenCatpure                                                   */

/*                                                                               */

/*  File:   screencapture.c                                                      */

/*                                                                               */

/*  Author: wishi@xfactordev.net                                                 */

/*  Date:   23-02-04                                                             */

/*  URL:    www.xfactordev.net                                                   */

/*                                                                               */

/*********************************************************************************/

/*                                                                               */

/*  Platform: XBOX - OpenXDK                                                     */

/*                                                                               */

/*********************************************************************************/

 

// tga header structure.

#pragma pack(1)

typedef struct _tgaheader

{

      uint08 idlength;              // Misc header

      uint08 colourmap;

      uint08 imagetype;

      uint16 colourmap_origin;      // Colour map spec

      uint16 colourmap_length;

      uint08 colourmap_type;

      uint16 xorigin;                     // Image spec

      uint16 yorigin;

      uint16 width;

      uint16 height;

      uint08 pixelsize;

      uint08 descriptor;

} TGAHeader, *PTGAHeader;

#pragma pack()

 

 

 

void ScreenCapture(char *path)

{

      TGAHeader Header = {0,0,2, 0,0,32, 0,480,640,480,32,0x00000008};

 

      HANDLE TGAoutput = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);

      WriteFile(TGAoutput, &Header, sizeof(Header), 0, 0);

 

      ScreenInfo ScrStruct = vga_get_screen_info();

      uint32* pScr = (uint32*)ScrStruct.ScreenAddress;

      uint32 *FileBuffer = (uint32*)malloc(640*480*4);

 

      uint32 i, j;

      for (i=0; i<480; i++)

      {

            for (j=0; j<640; j++)

            {

                  FileBuffer[j+((479-i)*640)] = *pScr;

                  pScr++;

            }// End inner loop

      }// End outer loop

 

      WriteFile(TGAoutput, FileBuffer, 640*480*4, 0, 0);

      CloseHandle(TGAoutput);

 

      free(FileBuffer);

}// End ScreenCapture(..)

 

 

/*********************************************************************************/

/*                                                                               */

/*                          Program Entry Point                                  */

/*                                                                               */

/*********************************************************************************/

/*                                                                               */

/*  Few lines of code to test our code, launch different apps etc.               */

/*                                                                               */

/*********************************************************************************/

 

void main()

{

      Bitmap         *screen;

      unsigned int   *p;

      int                x, y, xx=0;

 

      //let's init the screen

      vga_init_mode(MODE_320x240x32);

 

      vga_vsync();                              // Wait for Vertical Blank

    vga_flip();                                 // Flip

      vga_clear();                    // Clear Screen

 

      // So where's the screen? who knows if we're page flipping?

      screen = get_screen_bitmap();

 

      // Nice pattern on the screen

      p = screen->data;

      for (y=0; y<screen->h; y++)

      {

            for (x=0; x<screen->w; x++)

            {

                        *p++ = ((x+xx)^y)&0xFF; //yay a XOR pattern!!! :D

            }

      }

      xx++;

 

      // Save our data that we've rendered to the screen, before

      // we try and save it to file

      vga_vsync();                              // Wait for Vertical Blank

    vga_flip();                                 // Flip

 

 

      ScreenCapture("D:\\screengrab.tga");

 

}// End main

 

 
 Visitor: 9534626  { 209.237.238.175 } Copyright (c) 2002-2017 xbdev.net - All rights reserved.
Designated tutorial and software are the property of their respective owners.