static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 pixel_format, void * pixels, int pitch) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; Uint32 temp_format = SDL_PIXELFORMAT_ARGB8888; void *temp_pixels; int temp_pitch; GLint internalFormat; GLenum format, type; Uint8 *src, *dst, *tmp; int w, h, length, rows; int status; GL_ActivateRenderer(renderer); temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format); temp_pixels = SDL_malloc(rect->h * temp_pitch); if (!temp_pixels) { SDL_OutOfMemory(); return -1; } convert_format(data, temp_format, &internalFormat, &format, &type); SDL_GetWindowSize(window, &w, &h); data->glPixelStorei(GL_PACK_ALIGNMENT, 1); data->glPixelStorei(GL_PACK_ROW_LENGTH, (temp_pitch / SDL_BYTESPERPIXEL(temp_format))); data->glReadPixels(rect->x, (h-rect->y)-rect->h, rect->w, rect->h, format, type, temp_pixels); /* Flip the rows to be top-down */ length = rect->w * SDL_BYTESPERPIXEL(temp_format); src = (Uint8*)temp_pixels + (rect->h-1)*temp_pitch; dst = (Uint8*)temp_pixels; tmp = SDL_stack_alloc(Uint8, length); rows = rect->h / 2; while (rows--) { SDL_memcpy(tmp, dst, length); SDL_memcpy(dst, src, length); SDL_memcpy(src, tmp, length); dst += temp_pitch; src -= temp_pitch; } SDL_stack_free(tmp); status = SDL_ConvertPixels(rect->w, rect->h, temp_format, temp_pixels, temp_pitch, pixel_format, pixels, pitch); SDL_free(temp_pixels); return status; }
static int GLES_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 pixel_format, void * pixels, int pitch) { GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; Uint32 temp_format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_ABGR8888; void *temp_pixels; int temp_pitch; Uint8 *src, *dst, *tmp; int w, h, length, rows; int status; GLES_ActivateRenderer(renderer); temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format); temp_pixels = SDL_malloc(rect->h * temp_pitch); if (!temp_pixels) { return SDL_OutOfMemory(); } SDL_GetRendererOutputSize(renderer, &w, &h); data->glPixelStorei(GL_PACK_ALIGNMENT, 1); data->glReadPixels(rect->x, renderer->target ? rect->y : (h-rect->y)-rect->h, rect->w, rect->h, GL_RGBA, GL_UNSIGNED_BYTE, temp_pixels); /* Flip the rows to be top-down if necessary */ if (!renderer->target) { length = rect->w * SDL_BYTESPERPIXEL(temp_format); src = (Uint8*)temp_pixels + (rect->h-1)*temp_pitch; dst = (Uint8*)temp_pixels; tmp = SDL_stack_alloc(Uint8, length); rows = rect->h / 2; while (rows--) { SDL_memcpy(tmp, dst, length); SDL_memcpy(dst, src, length); SDL_memcpy(src, tmp, length); dst += temp_pitch; src -= temp_pitch; } SDL_stack_free(tmp); } status = SDL_ConvertPixels(rect->w, rect->h, temp_format, temp_pixels, temp_pitch, pixel_format, pixels, pitch); SDL_free(temp_pixels); return status; }
static int NDS_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) { NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; int Bpp = SDL_BYTESPERPIXEL(texture->format); if (txdat->type == NDSTX_BG) { txdat->scroll.x = dstrect->x; txdat->scroll.y = dstrect->y; } else { /* sprites not fully implemented yet */ printf("NDS_RenderCopy: used sprite!\n"); // SpriteEntry *spr = &(data->oam_copy.spriteBuffer[txdat->hw_index]); // spr->posX = dstrect->x; // spr->posY = dstrect->y; // if (txdat->hw_index < MATRIX_COUNT && spr->isRotoscale) { // } } return 0; }
static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata; GL_TextureData *data = (GL_TextureData *) texture->driverdata; GLenum result; GL_ActivateRenderer(renderer); renderdata->glGetError(); renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / SDL_BYTESPERPIXEL(texture->format))); renderdata->glEnable(data->type); renderdata->glBindTexture(data->type, data->texture); renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w, rect->h, data->format, data->formattype, pixels); if (data->yuv) { const void *top; renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / 2)); /* Skip to the top of the next texture */ top = (const void*)((const Uint8*)pixels + (texture->h-rect->y) * pitch - rect->x); /* Skip to the correct offset into the next texture */ pixels = (const void*)((const Uint8*)top + (rect->y / 2) * pitch + rect->x / 2); if (texture->format == SDL_PIXELFORMAT_YV12) { renderdata->glBindTexture(data->type, data->vtexture); } else { renderdata->glBindTexture(data->type, data->utexture); } renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2, rect->w/2, rect->h/2, data->format, data->formattype, pixels); /* Skip to the top of the next texture */ top = (const void*)((const Uint8*)top + (texture->h * pitch)/4); /* Skip to the correct offset into the next texture */ pixels = (const void*)((const Uint8*)top + (rect->y / 2) * pitch + rect->x / 2); if (texture->format == SDL_PIXELFORMAT_YV12) { renderdata->glBindTexture(data->type, data->utexture); } else { renderdata->glBindTexture(data->type, data->vtexture); } renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2, rect->w/2, rect->h/2, data->format, data->formattype, pixels); } renderdata->glDisable(data->type); result = renderdata->glGetError(); if (result != GL_NO_ERROR) { GL_SetError("glTexSubImage2D()", result); return -1; } return 0; }
static int DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 format, void * pixels, int pitch) { Uint32 sdl_format; unsigned char* laypixels; int laypitch; DFBSurfacePixelFormat dfb_format; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; IDirectFBSurface *winsurf = data->target; DirectFB_ActivateRenderer(renderer); winsurf->GetPixelFormat(winsurf, &dfb_format); sdl_format = DirectFB_DFBToSDLPixelFormat(dfb_format); winsurf->Lock(winsurf, DSLF_READ, (void **) &laypixels, &laypitch); laypixels += (rect->y * laypitch + rect->x * SDL_BYTESPERPIXEL(sdl_format) ); SDL_ConvertPixels(rect->w, rect->h, sdl_format, laypixels, laypitch, format, pixels, pitch); winsurf->Unlock(winsurf); return 0; }
static int DirectFB_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch) { DirectFB_TextureData *texturedata = (DirectFB_TextureData *) texture->driverdata; DFBResult ret; if (markDirty) { SDL_AddDirtyRect(&texturedata->dirty, rect); } if (texturedata->display) { void *fdata; int fpitch; SDL_DFB_CHECKERR(texturedata->surface->Lock(texturedata->surface, DSLF_WRITE | DSLF_READ, &fdata, &fpitch)); *pitch = fpitch; *pixels = fdata; } else { *pixels = (void *) ((Uint8 *) texturedata->pixels + rect->y * texturedata->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); *pitch = texturedata->pitch; } return 0; error: return -1; }
static int DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 format, const void * pixels, int pitch) { SDL_Window *window = renderer->window; SDL_DFB_WINDOWDATA(window); Uint32 sdl_format; unsigned char* laypixels; int laypitch; DFBSurfacePixelFormat dfb_format; SDL_DFB_CHECK(windata->surface->GetPixelFormat(windata->surface, &dfb_format)); sdl_format = DirectFB_DFBToSDLPixelFormat(dfb_format); SDL_DFB_CHECK(windata->surface->Lock(windata->surface, DSLF_WRITE, (void **) &laypixels, &laypitch)); laypixels += (rect->y * laypitch + rect->x * SDL_BYTESPERPIXEL(sdl_format) ); SDL_ConvertPixels(rect->w, rect->h, format, pixels, pitch, sdl_format, laypixels, laypitch); SDL_DFB_CHECK(windata->surface->Unlock(windata->surface)); return 0; }
void Case::GetFieldScreenshot(void **ppPngMemory, size_t *pPngSize) { gIsSavingScreenshot = true; gScreenshotWidth = 246; gScreenshotHeight = 138; #if SDL_BYTEORDER == SDL_LIL_ENDIAN Uint32 targetPixelFormat = SDL_PIXELFORMAT_ABGR8888; #else Uint32 targetPixelFormat = SDL_PIXELFORMAT_RGBA8888; #endif SDL_SetRenderDrawColor(gpRenderer, 0, 0, 0, 255); SDL_RenderClear(gpRenderer); DrawForScreenshot(); Uint8 targetBytesPerPixel = SDL_BYTESPERPIXEL(targetPixelFormat); int targetPitch = gScreenshotWidth * targetBytesPerPixel; Uint8 *pPixels = new Uint8[gScreenshotHeight * targetPitch]; SDL_Rect rect = { 0, 0, gScreenshotWidth, gScreenshotHeight }; SDL_RenderReadPixels(gpRenderer, &rect, targetPixelFormat, pPixels, targetPitch); *ppPngMemory = tdefl_write_image_to_png_file_in_memory(pPixels, gScreenshotWidth, gScreenshotHeight, targetBytesPerPixel, pPngSize); delete [] pPixels; gIsSavingScreenshot = false; }
int MIR_CreateWindowFramebuffer(_THIS, SDL_Window* window, Uint32* format, void** pixels, int* pitch) { MIR_Data* mir_data = _this->driverdata; MIR_Window* mir_window; MirSurfaceParameters surfaceparm; if (MIR_CreateWindow(_this, window) < 0) return SDL_SetError("Failed to created a mir window."); mir_window = window->driverdata; MIR_mir_surface_get_parameters(mir_window->surface, &surfaceparm); *format = MIR_GetSDLPixelFormat(surfaceparm.pixel_format); if (*format == SDL_PIXELFORMAT_UNKNOWN) return SDL_SetError("Unknown pixel format"); *pitch = (((window->w * SDL_BYTESPERPIXEL(*format)) + 3) & ~3); *pixels = SDL_malloc(window->h*(*pitch)); if (*pixels == NULL) return SDL_OutOfMemory(); mir_window->surface = MIR_mir_connection_create_surface_sync(mir_data->connection, &surfaceparm); if (!MIR_mir_surface_is_valid(mir_window->surface)) { const char* error = MIR_mir_surface_get_error_message(mir_window->surface); return SDL_SetError("Failed to created a mir surface: %s", error); } return 0; }
static int GDI_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch) { GDI_TextureData *data = (GDI_TextureData *) texture->driverdata; if (data->yuv) { return SDL_SW_LockYUVTexture(data->yuv, rect, markDirty, pixels, pitch); } else if (data->pixels) { #ifndef _WIN32_WCE /* WinCE has no GdiFlush */ GdiFlush(); #endif *pixels = (void *) ((Uint8 *) data->pixels + rect->y * data->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); *pitch = data->pitch; return 0; } else { SDL_SetError("No pixels available"); return -1; } }
static int GLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata; GLES_TextureData *data = (GLES_TextureData *) texture->driverdata; Uint8 *blob = NULL; Uint8 *src; int srcPitch; int y; GLES_ActivateRenderer(renderer); /* Bail out if we're supposed to update an empty rectangle */ if (rect->w <= 0 || rect->h <= 0) return 0; /* Reformat the texture data into a tightly packed array */ srcPitch = rect->w * SDL_BYTESPERPIXEL(texture->format); src = (Uint8 *)pixels; if (pitch != srcPitch) { blob = (Uint8 *)SDL_malloc(srcPitch * rect->h); if (!blob) { return SDL_OutOfMemory(); } src = blob; for (y = 0; y < rect->h; ++y) { SDL_memcpy(src, pixels, srcPitch); src += srcPitch; pixels = (Uint8 *)pixels + pitch; } src = blob; } /* Create a texture subimage with the supplied data */ renderdata->glGetError(); renderdata->glEnable(data->type); renderdata->glBindTexture(data->type, data->texture); renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w, rect->h, data->format, data->formattype, src); if (blob) { SDL_free(blob); } if (renderdata->glGetError() != GL_NO_ERROR) { return SDL_SetError("Failed to update texture"); } return 0; }
static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 pixel_format, void * pixels, int pitch) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; GLint internalFormat; GLenum format, type; Uint8 *src, *dst, *tmp; int w, h, length, rows; GL_ActivateRenderer(renderer); if (!convert_format(data, pixel_format, &internalFormat, &format, &type)) { /* FIXME: Do a temp copy to a format that is supported */ SDL_SetError("Unsupported pixel format"); return -1; } SDL_GetWindowSize(window, &w, &h); data->glPixelStorei(GL_PACK_ALIGNMENT, 1); data->glPixelStorei(GL_PACK_ROW_LENGTH, (pitch / SDL_BYTESPERPIXEL(pixel_format))); data->glReadPixels(rect->x, (h-rect->y)-rect->h, rect->w, rect->h, format, type, pixels); /* Flip the rows to be top-down */ length = rect->w * SDL_BYTESPERPIXEL(pixel_format); src = (Uint8*)pixels + (rect->h-1)*pitch; dst = (Uint8*)pixels; tmp = SDL_stack_alloc(Uint8, length); rows = rect->h / 2; while (rows--) { SDL_memcpy(tmp, dst, length); SDL_memcpy(dst, src, length); SDL_memcpy(src, tmp, length); dst += pitch; src -= pitch; } SDL_stack_free(tmp); return 0; }
void loop() { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_WINDOWEVENT: if (event.window.event == SDL_WINDOWEVENT_RESIZED) { SDL_RenderSetViewport(renderer, NULL); displayrect.w = window_w = event.window.data1; displayrect.h = window_h = event.window.data2; } break; case SDL_MOUSEBUTTONDOWN: displayrect.x = event.button.x - window_w / 2; displayrect.y = event.button.y - window_h / 2; break; case SDL_MOUSEMOTION: if (event.motion.state) { displayrect.x = event.motion.x - window_w / 2; displayrect.y = event.motion.y - window_h / 2; } break; case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_SPACE) { paused = !paused; break; } if (event.key.keysym.sym != SDLK_ESCAPE) { break; } case SDL_QUIT: done = SDL_TRUE; break; } } #ifndef __EMSCRIPTEN__ SDL_Delay(fpsdelay); #endif if (!paused) { i = (i + 1) % MOOSEFRAMES_COUNT; SDL_UpdateTexture(MooseTexture, NULL, MooseFrame[i], MOOSEPIC_W*SDL_BYTESPERPIXEL(pixel_format)); } SDL_RenderClear(renderer); SDL_RenderCopy(renderer, MooseTexture, NULL, &displayrect); SDL_RenderPresent(renderer); #ifdef __EMSCRIPTEN__ if (done) { emscripten_cancel_main_loop(); } #endif }
/* * Copy a block of pixels of one format to another format */ int SDL_ConvertPixels(int width, int height, Uint32 src_format, const void * src, int src_pitch, Uint32 dst_format, void * dst, int dst_pitch) { SDL_Surface src_surface, dst_surface; SDL_PixelFormat src_fmt, dst_fmt; SDL_BlitMap src_blitmap, dst_blitmap; SDL_Rect rect; void *nonconst_src = (void *) src; /* Check to make sure we are blitting somewhere, so we don't crash */ if (!dst) { return SDL_InvalidParamError("dst"); } if (!dst_pitch) { return SDL_InvalidParamError("dst_pitch"); } if (SDL_ISPIXELFORMAT_FOURCC(src_format) && SDL_ISPIXELFORMAT_FOURCC(dst_format)) { return SDL_ConvertPixels_YUV_to_YUV(width, height, src_format, src, src_pitch, dst_format, dst, dst_pitch); } else if (SDL_ISPIXELFORMAT_FOURCC(src_format)) { return SDL_ConvertPixels_YUV_to_RGB(width, height, src_format, src, src_pitch, dst_format, dst, dst_pitch); } else if (SDL_ISPIXELFORMAT_FOURCC(dst_format)) { return SDL_ConvertPixels_RGB_to_YUV(width, height, src_format, src, src_pitch, dst_format, dst, dst_pitch); } /* Fast path for same format copy */ if (src_format == dst_format) { int i; const int bpp = SDL_BYTESPERPIXEL(src_format); width *= bpp; for (i = height; i--;) { SDL_memcpy(dst, src, width); src = (const Uint8*)src + src_pitch; dst = (Uint8*)dst + dst_pitch; } return 0; } if (!SDL_CreateSurfaceOnStack(width, height, src_format, nonconst_src, src_pitch, &src_surface, &src_fmt, &src_blitmap)) { return -1; } if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch, &dst_surface, &dst_fmt, &dst_blitmap)) { return -1; } /* Set up the rect and go! */ rect.x = 0; rect.y = 0; rect.w = width; rect.h = height; return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect); }
/* * Copy a block of pixels of one format to another format */ int SDL_ConvertPixels(int width, int height, Uint32 src_format, const void * src, int src_pitch, Uint32 dst_format, void * dst, int dst_pitch) { SDL_Surface src_surface, dst_surface; SDL_PixelFormat src_fmt, dst_fmt; SDL_BlitMap src_blitmap, dst_blitmap; SDL_Rect rect; /* Fast path for same format copy */ if (src_format == dst_format) { int bpp; if (SDL_ISPIXELFORMAT_FOURCC(src_format)) { switch (src_format) { case SDL_PIXELFORMAT_YV12: case SDL_PIXELFORMAT_IYUV: case SDL_PIXELFORMAT_YUY2: case SDL_PIXELFORMAT_UYVY: case SDL_PIXELFORMAT_YVYU: bpp = 2; default: SDL_SetError("Unknown FOURCC pixel format"); return -1; } } else { bpp = SDL_BYTESPERPIXEL(src_format); } width *= bpp; while (height-- > 0) { SDL_memcpy(dst, src, width); src = (Uint8*)src + src_pitch; dst = (Uint8*)dst + dst_pitch; } return 0; } if (!SDL_CreateSurfaceOnStack(width, height, src_format, (void*)src, src_pitch, &src_surface, &src_fmt, &src_blitmap)) { return -1; } if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch, &dst_surface, &dst_fmt, &dst_blitmap)) { return -1; } /* Set up the rect and go! */ rect.x = 0; rect.y = 0; rect.w = width; rect.h = height; return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect); }
static int X11_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 format, const void * pixels, int pitch) { X11_RenderData *data = (X11_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; Uint32 screen_format = display->current_mode.format; XImage *image; void *image_pixels; int image_pitch; image_pitch = rect->w * SDL_BYTESPERPIXEL(screen_format); image_pixels = SDL_malloc(rect->h * image_pitch); if (!image_pixels) { SDL_OutOfMemory(); return -1; } image = XCreateImage(data->display, data->visual, data->depth, ZPixmap, 0, image_pixels, rect->w, rect->h, SDL_BYTESPERPIXEL(screen_format) * 8, image_pitch); if (!image) { SDL_SetError("XCreateImage() failed"); return -1; } SDL_ConvertPixels(rect->w, rect->h, format, pixels, pitch, screen_format, image->data, image->bytes_per_line); XPutImage(data->display, data->drawable, data->gc, image, 0, 0, rect->x, rect->y, rect->w, rect->h); image->data = NULL; XDestroyImage(image); SDL_free(image_pixels); return 0; }
static int SDL_LockTextureNative(SDL_Texture * texture, const SDL_Rect * rect, void **pixels, int *pitch) { texture->locked_rect = *rect; *pixels = (void *) ((Uint8 *) texture->pixels + rect->y * texture->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); *pitch = texture->pitch; return 0; }
static int X11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { X11_TextureData *data = (X11_TextureData *) texture->driverdata; if (data->yuv) { if (SDL_SW_UpdateYUVTexture(data->yuv, rect, pixels, pitch) < 0) { return -1; } UpdateYUVTextureData(texture); return 0; } else { X11_RenderData *renderdata = (X11_RenderData *) renderer->driverdata; if (data->pixels) { Uint8 *src, *dst; int row; size_t length; src = (Uint8 *) pixels; dst = (Uint8 *) data->pixels + rect->y * data->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format); length = rect->w * SDL_BYTESPERPIXEL(texture->format); for (row = 0; row < rect->h; ++row) { SDL_memcpy(dst, src, length); src += pitch; dst += data->pitch; } } else { data->image->width = rect->w; data->image->height = rect->h; data->image->data = (char *) pixels; data->image->bytes_per_line = pitch; XPutImage(renderdata->display, data->pixmap, renderdata->gc, data->image, 0, 0, rect->x, rect->y, rect->w, rect->h); } return 0; } }
static int GLES_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, void **pixels, int *pitch) { GLES_TextureData *data = (GLES_TextureData *) texture->driverdata; *pixels = (void *) ((Uint8 *) data->pixels + rect->y * data->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); *pitch = data->pitch; return 0; }
static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) { GL_TextureData *data = (GL_TextureData *) texture->driverdata; const SDL_Rect *rect; void *pixels; rect = &data->locked_rect; pixels = (void *) ((Uint8 *) data->pixels + rect->y * data->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch); }
static int GLES2_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch) { GLES2_TextureData *tdata = (GLES2_TextureData *)texture->driverdata; /* Retrieve the buffer/pitch for the specified region */ *pixels = (Uint8 *)tdata->pixel_data + (tdata->pitch * rect->y) + (rect->x * SDL_BYTESPERPIXEL(texture->format)); *pitch = tdata->pitch; return 0; }
static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { D3D_TextureData *data = (D3D_TextureData *) texture->driverdata; D3D_RenderData *renderdata = (D3D_RenderData *) renderer->driverdata; RECT d3drect; D3DLOCKED_RECT locked; const Uint8 *src; Uint8 *dst; int row, length; HRESULT result; #ifdef USE_DYNAMIC_TEXTURE if (texture->access == SDL_TEXTUREACCESS_STREAMING && rect->x == 0 && rect->y == 0 && rect->w == texture->w && rect->h == texture->h) { result = IDirect3DTexture9_LockRect(data->texture, 0, &locked, NULL, D3DLOCK_DISCARD); } else #endif { d3drect.left = rect->x; d3drect.right = rect->x + rect->w; d3drect.top = rect->y; d3drect.bottom = rect->y + rect->h; result = IDirect3DTexture9_LockRect(data->texture, 0, &locked, &d3drect, 0); } if (FAILED(result)) { D3D_SetError("LockRect()", result); return -1; } src = pixels; dst = locked.pBits; length = rect->w * SDL_BYTESPERPIXEL(texture->format); if (length == pitch && length == locked.Pitch) { SDL_memcpy(dst, src, length*rect->h); } else { for (row = 0; row < rect->h; ++row) { SDL_memcpy(dst, src, length); src += pitch; dst += locked.Pitch; } } IDirect3DTexture9_UnlockRect(data->texture, 0); return 0; }
/*static*/ void Display::EnumerateDisplayModes( Array<SDisplayMode>& DisplayModes ) { DisplayModes.Clear(); #if BUILD_WINDOWS_NO_SDL DEVMODE DevMode; uint ModeIndex = 0; BOOL Valid = TRUE; for( ; Valid; ++ModeIndex ) { Valid = EnumDisplaySettings( NULL, ModeIndex, &DevMode ); // Some users have problems if their refresh rate is set to 59 Hz. Maybe I should reconsider this? if( DevMode.dmBitsPerPel == 32 ) { SDisplayMode Mode; Mode.Width = DevMode.dmPelsWidth; Mode.Height = DevMode.dmPelsHeight; DisplayModes.PushBackUnique( Mode ); } } #endif #if BUILD_SDL PRINTF( "Enumerating SDL display modes...\n" ); const int NumDisplays = SDL_GetNumVideoDisplays(); for( int DisplayIndex = 0; DisplayIndex < NumDisplays; ++DisplayIndex ) { const int NumModes = SDL_GetNumDisplayModes( DisplayIndex ); for( int ModeIndex = 0; ModeIndex < NumModes; ++ModeIndex ) { SDL_DisplayMode DisplayMode; SDL_GetDisplayMode( DisplayIndex, ModeIndex, &DisplayMode ); if( SDL_BYTESPERPIXEL( DisplayMode.format ) == 4 ) { SDisplayMode Mode; Mode.Width = DisplayMode.w; Mode.Height = DisplayMode.h; DisplayModes.PushBackUnique( Mode ); PRINTF( "Enumerated mode %dx%d\n", Mode.Width, Mode.Height ); } } } #endif ASSERT( DisplayModes.Size() ); }
static int SDL_UpdateTextureYUV(SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { SDL_Texture *native = texture->native; SDL_Rect full_rect; if (SDL_SW_UpdateYUVTexture(texture->yuv, rect, pixels, pitch) < 0) { return -1; } full_rect.x = 0; full_rect.y = 0; full_rect.w = texture->w; full_rect.h = texture->h; rect = &full_rect; if (texture->access == SDL_TEXTUREACCESS_STREAMING) { /* We can lock the texture and copy to it */ void *native_pixels; int native_pitch; if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) { return -1; } SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format, rect->w, rect->h, native_pixels, native_pitch); SDL_UnlockTexture(native); } else { /* Use a temporary buffer for updating */ void *temp_pixels; int temp_pitch; temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3); temp_pixels = SDL_malloc(rect->h * temp_pitch); if (!temp_pixels) { SDL_OutOfMemory(); return -1; } SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format, rect->w, rect->h, temp_pixels, temp_pitch); SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch); SDL_free(temp_pixels); } return 0; }
static int GLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata; GLES_TextureData *data = (GLES_TextureData *) texture->driverdata; GLenum result; int bpp = SDL_BYTESPERPIXEL(texture->format); void * temp_buffer; void * temp_ptr; int i; renderdata->glGetError(); renderdata->glEnable(data->type); SetupTextureUpdate(renderdata, texture, pitch); if( rect->w * bpp == pitch ) { temp_buffer = (void *)pixels; /* No need to reformat */ } else { /* Reformatting of mem area required */ temp_buffer = SDL_malloc(rect->w * rect->h * bpp); temp_ptr = temp_buffer; for (i = 0; i < rect->h; i++) { SDL_memcpy(temp_ptr, pixels, rect->w * bpp); temp_ptr += rect->w * bpp; pixels += pitch; } } renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w, rect->h, data->format, data->formattype, temp_buffer); if( temp_buffer != pixels ) { SDL_free(temp_buffer); } renderdata->glDisable(data->type); result = renderdata->glGetError(); if (result != GL_NO_ERROR) { GLES_SetError("glTexSubImage2D()", result); return -1; } return 0; }
static int GDI_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) { GDI_RenderData *renderdata = (GDI_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; GDI_TextureData *data; data = (GDI_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { SDL_OutOfMemory(); return -1; } texture->driverdata = data; if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { data->yuv = SDL_SW_CreateYUVTexture(texture->format, texture->w, texture->h); if (!data->yuv) { return -1; } data->format = display->current_mode.format; } else { data->format = texture->format; } data->pitch = (texture->w * SDL_BYTESPERPIXEL(data->format)); if (data->yuv || texture->access == SDL_TEXTUREACCESS_STREAMING || texture->format != display->current_mode.format) { data->hbm = GDI_CreateDIBSection(renderdata->memory_hdc, texture->w, texture->h, data->pitch, data->format, &data->hpal, &data->pixels); } else { data->hbm = CreateCompatibleBitmap(renderdata->window_hdc, texture->w, texture->h); } if (!data->hbm) { WIN_SetError("Couldn't create bitmap"); return -1; } return 0; }
static void SDL_UnlockTextureNative(SDL_Texture * texture) { SDL_Texture *native = texture->native; void *native_pixels; int native_pitch; const SDL_Rect *rect = &texture->locked_rect; const void* pixels = (void *) ((Uint8 *) texture->pixels + rect->y * texture->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); int pitch = texture->pitch; if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) { return; } SDL_ConvertPixels(rect->w, rect->h, texture->format, pixels, pitch, native->format, native_pixels, native_pitch); SDL_UnlockTexture(native); }
/* * Calculate the pad-aligned scanline width of a surface */ int SDL_CalculatePitch(Uint32 format, int width) { int pitch; /* Surface should be 4-byte aligned for speed */ pitch = width * SDL_BYTESPERPIXEL(format); switch (SDL_BITSPERPIXEL(format)) { case 1: pitch = (pitch + 7) / 8; break; case 4: pitch = (pitch + 1) / 2; break; default: break; } pitch = (pitch + 3) & ~3; /* 4-byte aligning */ return pitch; }
static int X11_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch) { X11_TextureData *data = (X11_TextureData *) texture->driverdata; if (data->yuv) { return SDL_SW_LockYUVTexture(data->yuv, rect, markDirty, pixels, pitch); } else if (data->pixels) { *pixels = (void *) ((Uint8 *) data->pixels + rect->y * data->pitch + rect->x * SDL_BYTESPERPIXEL(texture->format)); *pitch = data->pitch; return 0; } else { SDL_SetError("No pixels available"); return -1; } }
static int GDI_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 format, void * pixels, int pitch) { GDI_RenderData *renderdata = (GDI_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; struct { HBITMAP hbm; void *pixels; int pitch; Uint32 format; } data; data.format = display->current_mode.format; data.pitch = (rect->w * SDL_BYTESPERPIXEL(data.format)); data.hbm = GDI_CreateDIBSection(renderdata->memory_hdc, rect->w, rect->h, data.pitch, data.format, NULL, &data.pixels); if (!data.hbm) { WIN_SetError("Couldn't create bitmap"); return -1; } SelectObject(renderdata->memory_hdc, data.hbm); if (!BitBlt(renderdata->memory_hdc, 0, 0, rect->w, rect->h, renderdata->current_hdc, rect->x, rect->y, SRCCOPY)) { WIN_SetError("BitBlt()"); DeleteObject(data.hbm); return -1; } SDL_ConvertPixels(rect->w, rect->h, data.format, data.pixels, data.pitch, format, pixels, pitch); DeleteObject(data.hbm); return 0; }