diff src/video/photon/SDL_photon_render.c @ 3459:feea0def118d

Support for RendererReadPixels and RendererWritePixels has been added to photon renderer.
author Mike Gorchak <lestat@i.com.ua>
date Thu, 19 Nov 2009 08:44:07 +0000
parents d15a4daa4a58
children 6265b67848e0
line wrap: on
line diff
--- a/src/video/photon/SDL_photon_render.c	Thu Nov 19 08:02:00 2009 +0000
+++ b/src/video/photon/SDL_photon_render.c	Thu Nov 19 08:44:07 2009 +0000
@@ -82,6 +82,10 @@
 static int photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture,
                              const SDL_Rect * srcrect,
                              const SDL_Rect * dstrect);
+static int photon_renderreadpixels(SDL_Renderer * renderer, const SDL_Rect * rect,
+                                   Uint32 format, void * pixels, int pitch);
+static int photon_renderwritepixels(SDL_Renderer * renderer, const SDL_Rect * rect,
+                                    Uint32 format, const void * pixels, int pitch);
 static void photon_renderpresent(SDL_Renderer * renderer);
 static void photon_destroytexture(SDL_Renderer * renderer,
                                   SDL_Texture * texture);
@@ -1571,4 +1575,77 @@
     }
 }
 
+static int
+photon_renderreadpixels(SDL_Renderer * renderer, const SDL_Rect * rect,
+                        Uint32 format, void * pixels, int pitch)
+{
+    SDL_RenderData *rdata = (SDL_RenderData *)renderer->driverdata;
+    Uint32 sformat=0;
+    uint8_t* spixels=NULL;
+    unsigned int spitch=0;
+
+    switch (rdata->surfaces_type)
+    {
+        case SDL_PHOTON_SURFTYPE_OFFSCREEN:
+             sformat=photon_image_to_sdl_pixelformat(rdata->osurfaces[rdata->surface_visible_idx]->format);
+             spixels=(uint8_t*)PdGetOffscreenContextPtr(rdata->osurfaces[rdata->surface_visible_idx]);
+             spitch=rdata->osurfaces[rdata->surface_visible_idx]->pitch;
+             break;
+        case SDL_PHOTON_SURFTYPE_PHIMAGE:
+             sformat=photon_image_to_sdl_pixelformat(rdata->psurfaces[rdata->surface_visible_idx]->type);
+             spixels=(uint8_t*)rdata->psurfaces[rdata->surface_visible_idx]->image;
+             spitch=rdata->psurfaces[rdata->surface_visible_idx]->bpl;
+             break;
+        case SDL_PHOTON_SURFTYPE_UNKNOWN:
+        default:
+             SDL_SetError("Photon: surfaces are not initialized");
+             return -1;
+    }
+
+    /* Adjust surface pixels pointer to the rectangle coordinates */
+    spixels+=rect->y*spitch + rect->x*SDL_BYTESPERPIXEL(sformat);
+
+    SDL_ConvertPixels(rect->w, rect->h,
+                      sformat, spixels, spitch,
+                      format, pixels, pitch);
+
+    return 0;
+}
+
+static int
+photon_renderwritepixels(SDL_Renderer * renderer, const SDL_Rect * rect,
+                         Uint32 format, const void * pixels, int pitch)
+{
+    SDL_RenderData *rdata = (SDL_RenderData *)renderer->driverdata;
+    Uint32 sformat=0;
+    uint8_t* spixels=NULL;
+    unsigned int spitch=0;
+
+    switch (rdata->surfaces_type)
+    {
+        case SDL_PHOTON_SURFTYPE_OFFSCREEN:
+             sformat=photon_image_to_sdl_pixelformat(rdata->osurfaces[rdata->surface_visible_idx]->format);
+             spixels=(uint8_t*)PdGetOffscreenContextPtr(rdata->osurfaces[rdata->surface_visible_idx]);
+             spitch=rdata->osurfaces[rdata->surface_visible_idx]->pitch;
+             break;
+        case SDL_PHOTON_SURFTYPE_PHIMAGE:
+             sformat=photon_image_to_sdl_pixelformat(rdata->psurfaces[rdata->surface_visible_idx]->type);
+             spixels=(uint8_t*)rdata->psurfaces[rdata->surface_visible_idx]->image;
+             spitch=rdata->psurfaces[rdata->surface_visible_idx]->bpl;
+             break;
+        case SDL_PHOTON_SURFTYPE_UNKNOWN:
+        default:
+             SDL_SetError("Photon: surfaces are not initialized");
+             return -1;
+    }
+
+    /* Adjust surface pixels pointer to the rectangle coordinates */
+    spixels+=rect->y*spitch + rect->x*SDL_BYTESPERPIXEL(sformat);
+
+    SDL_ConvertPixels(rect->w, rect->h, format, pixels, pitch,
+                      sformat, spixels, spitch);
+
+    return 0;
+}
+
 /* vi: set ts=4 sw=4 expandtab: */