/* Convert a SDL_Surface to an AG_Surface. */ AG_Surface * AG_SDL_ImportSurface(SDL_Surface *ss) { AG_PixelFormat *pf; AG_Surface *ds; Uint8 *pSrc, *pDst; int y; #if 0 Uint32 px; AG_Color C; int x; #endif if ((pf = AG_SDL_GetPixelFormat(ss)) == NULL) { return (NULL); } if (pf->palette != NULL) { AG_SetError("Indexed formats not supported"); AG_PixelFormatFree(pf); return (NULL); } if ((ds = AG_SurfaceNew(AG_SURFACE_PACKED, ss->w, ss->h, pf, 0)) == NULL) { goto out; } if (ss->flags & SDL_SRCCOLORKEY) { ds->flags |= AG_SRCCOLORKEY; } if (ss->flags & SDL_SRCALPHA) { ds->flags |= AG_SRCALPHA; } if (SDL_MUSTLOCK(ss)) { SDL_LockSurface(ss); } pSrc = (Uint8 *)ss->pixels; pDst = (Uint8 *)ds->pixels; for (y = 0; y < ss->h; y++) { memcpy(pDst, pSrc, ss->pitch); pSrc += ss->pitch; pDst += ds->pitch; } #if 0 for (y = 0; y < ss->h; y++) { for (x = 0; x < ss->w; x++) { AG_PACKEDPIXEL_GET(ss->format->BytesPerPixel, px, pSrc); C = AG_SDL_GetColorRGBA(px, ss->format); AG_PUT_PIXEL(ds,pDst, AG_MapColorRGBA(ds->format, C)); pSrc += ss->format->BytesPerPixel; pDst += ds->format->BytesPerPixel; } } #endif if (SDL_MUSTLOCK(ss)) SDL_UnlockSurface(ss); out: AG_PixelFormatFree(pf); return (ds); }
/* Callback routine for AG_FileDlg. */ static int LoadImage(AG_Event *event) { /* AG_FileDlg *fd = AG_SELF(); */ AG_Window *winParent = AG_PTR(1); char *file = AG_STRING(2); AG_FileType *ft = AG_PTR(3); AG_Surface *s; AG_Window *win; AG_Scrollview *sv; Uint8 *pSrc; Uint i; if (strcmp(ft->exts[0], "*.bmp") == 0) { s = AG_SurfaceFromBMP(file); } else if (strcmp(ft->exts[0], "*.jpg") == 0) { s = AG_SurfaceFromJPEG(file); } else if (strcmp(ft->exts[0], "*.png") == 0) { s = AG_SurfaceFromPNG(file); } else { AG_SetError("Unrecognized format: %s", ft->exts[0]); return (-1); } if (s == NULL) return (-1); if ((win = AG_WindowNew(0)) == NULL) { AG_SurfaceFree(s); return (-1); } AG_WindowSetCaption(win, "Image <%s>", AG_ShortFilename(file)); /* We use AG_FileOptionFoo() to retrieve per-type options. */ if (AG_FileOptionBool(ft,"invert")) { pSrc = (Uint8 *)s->pixels; for (i = 0; i < s->w*s->h; i++) { Uint8 r, g, b; AG_GetPixelRGB(AG_GET_PIXEL(s,pSrc), s->format, &r,&g,&b); r = 255 - r; g = 255 - g; b = 255 - b; AG_PUT_PIXEL(s, pSrc, AG_MapPixelRGB(s->format, r,g,b)); pSrc += s->format->BytesPerPixel; } } /* * Place an AG_Pixmap(3) widget inside of an AG_Scrollview(3) so * the user can pan the view. */ sv = AG_ScrollviewNew(win, AG_SCROLLVIEW_BY_MOUSE|AG_SCROLLVIEW_EXPAND); AG_PixmapFromSurfaceScaled(sv, 0, s, s->w, s->h); AG_SurfaceFree(s); AG_WindowSetGeometry(win, -1, -1, 320, 240); AG_WindowAttach(winParent, win); AG_WindowShow(win); return (0); }