void emulatorEmitScreenshot() { int file; if (RUNNING_ON_EMULATOR) { sceIoDevctl("kemulator:", EMULATOR_DEVCTL__EMIT_SCREENSHOT, NULL, 0, NULL, 0); } else { uint topaddr; int bufferwidth; int pixelformat; sceDisplayGetFrameBuf((void **)&topaddr, &bufferwidth, &pixelformat, 0); if (topaddr & 0x80000000) { topaddr |= 0xA0000000; } else { topaddr |= 0x40000000; } if ((file = sceIoOpen("__screenshot.bmp", PSP_O_CREAT | PSP_O_WRONLY | PSP_O_TRUNC, 0777)) >= 0) { int y, x; uint c; uint* vram_row; uint* row_buf = (uint *)malloc(512 * 4); sceIoWrite(file, &bmpHeader, sizeof(bmpHeader)); for (y = 0; y < 272; y++) { vram_row = (uint *)(topaddr + 512 * 4 * (271 - y)); for (x = 0; x < 512; x++) { c = vram_row[x]; /* row_buf[x] = ( ((extractBits(c, 0, 8)) << 0) | ((extractBits(c, 8, 8)) << 8) | ((extractBits(c, 16, 8)) << 16) | (( 0x00 ) << 24) | 0); */ row_buf[x] = ( ((extractBits(c, 16, 8)) << 0) | ((extractBits(c, 8, 8)) << 8) | ((extractBits(c, 0, 8)) << 16) | (( 0x00 ) << 24) | 0); } sceIoWrite(file, row_buf, 512 * 4); } free(row_buf); //sceIoWrite(file, (void *)topaddr, bufferwidth * 272 * 4); //sceIoFlush(); sceIoClose(file); } } }
static bool psp_read_viewport(void *data, uint8_t *buffer) { (void)data; (void)buffer; psp1_video_t *psp = (psp1_video_t*)data; uint8_t* dst = buffer; void* src_buffer; int i, j, src_bufferwidth, src_pixelformat, src_x, src_y, src_x_max, src_y_max; sceDisplayGetFrameBuf(&src_buffer, &src_bufferwidth, &src_pixelformat, PSP_DISPLAY_SETBUF_NEXTFRAME); src_x = (psp->vp.x > 0)? psp->vp.x : 0; src_y = (psp->vp.y > 0)? psp->vp.y : 0; src_x_max = ((psp->vp.x + psp->vp.width) < src_bufferwidth)? (psp->vp.x + psp->vp.width): src_bufferwidth; src_y_max = ((psp->vp.y + psp->vp.height) < SCEGU_SCR_HEIGHT)? (psp->vp.y + psp->vp.height): SCEGU_SCR_HEIGHT; switch(src_pixelformat) { case PSP_DISPLAY_PIXEL_FORMAT_565: for (j = (src_y_max - 1); j >= src_y ; j--) { uint16_t* src = (uint16_t*)src_buffer + src_bufferwidth * j + src_x; for (i = src_x; i < src_x_max; i++) { *(dst++) = ((*src) >> 11) << 3; *(dst++) = (((*src) >> 5) << 2) &0xFF; *(dst++) = ((*src) & 0x1F) << 3; src++; } } return true; case PSP_DISPLAY_PIXEL_FORMAT_5551: for (j = (src_y_max - 1); j >= src_y ; j--) { uint16_t* src = (uint16_t*)src_buffer + src_bufferwidth * j + src_x; for (i = src_x; i < src_x_max; i++) { *(dst++) = (((*src) >> 10) << 3) &0xFF; *(dst++) = (((*src) >> 5) << 3) &0xFF; *(dst++) = ((*src) & 0x1F) << 3; src++; } } return true; case PSP_DISPLAY_PIXEL_FORMAT_4444: for (j = (src_y_max - 1); j >= src_y ; j--) { uint16_t* src = (uint16_t*)src_buffer + src_bufferwidth * j + src_x; for (i = src_x; i < src_x_max; i++) { *(dst++) = ((*src) >> 4) & 0xF0; *(dst++) = (*src) & 0xF0; *(dst++) = ((*src) << 4) & 0xF0; src++; } } return true; case PSP_DISPLAY_PIXEL_FORMAT_8888: for (j = (src_y_max - 1); j >= src_y ; j--) { uint32_t* src = (uint32_t*)src_buffer + src_bufferwidth * j + src_x; for (i = src_x; i < src_x_max; i++) { *(dst++) = ((*src) >> 16) & 0xFF; *(dst++) = ((*src) >> 8 ) & 0xFF; *(dst++) = (*src) & 0xFF; src++; } } return true; } return false; }
static DXPTEXTURE3* LoadScreen(void) { DXPTEXTURE3 *texptr = NULL; int y, bufferwidth, pixelformat, pixelsize; u8* vram = NULL; //display information sceDisplayGetFrameBuf((void**)&vram, &bufferwidth, &pixelformat, 0); switch ( pixelformat ) { case PSP_DISPLAY_PIXEL_FORMAT_8888: pixelsize = 4; break; case PSP_DISPLAY_PIXEL_FORMAT_565: case PSP_DISPLAY_PIXEL_FORMAT_5551: case PSP_DISPLAY_PIXEL_FORMAT_4444: pixelsize = 2; break; default: return NULL; } //image information int width = SCREEN_WIDTH; int height = SCREEN_HEIGHT; int pitch = ((width + 3) >> 2) << 2; int texwidth = AlignPow2(width); int texheight = AlignPow2(height); u8 *data = (u8*)malloc(pitch * texheight * pixelsize); if ( data == NULL ) { dxpGraphicsReleseTexture(texptr); return NULL; } for ( y = 0; y < SCREEN_HEIGHT; y++ ) memcpy(data + y * pitch * pixelsize, vram + y * bufferwidth * pixelsize, SCREEN_WIDTH * pixelsize); texptr = dxpGraphicsCreateTexture(); if ( !texptr ) { free(data); dxpGraphicsReleseTexture(texptr); return NULL; } texptr->texdata = data; texptr->alphabit = 0; texptr->colorkey = dxpGraphicsData.colorkey; texptr->width = texwidth; texptr->height = texheight; texptr->pitch = pitch; texptr->ppalette = NULL; texptr->psm = pixelformat; texptr->reloadflag = 1; texptr->size2_nflag = 0; texptr->swizzledflag = 0; texptr->texvram = 0; texptr->umax = width; texptr->vmax = height; return texptr; }