Beispiel #1
0
Datei: anim.c Projekt: adsr/agar
/* Load an animation from a series of PNG files. */
AG_Anim *
AG_AnimFromPNGs(const char *pattern)
{
	AG_Anim *a = NULL;
	AG_Surface *su;
	char path[AG_PATHNAME_MAX];
	int i;

	for (i = 0; ; i++) {
		Snprintf(path, sizeof(path), pattern, i);
		if (!AG_FileExists(path)) {
			if (i == 0) {
				continue;
			} else {
				break;
			}
		}
		if ((su = AG_SurfaceFromPNG(path)) == NULL) {
			break;
		}
		if (a == NULL) {
			a = AG_AnimRGBA(su->w, su->h,
			    su->format->BitsPerPixel, 0,
			    su->format->Rmask,
			    su->format->Gmask,
			    su->format->Bmask,
			    su->format->Amask);
			if (a == NULL) {
				AG_SurfaceFree(su);
				return (NULL);
			}
		}
		if (AG_AnimFrameNew(a,su) == -1) {
			goto fail;
		}
	}
	return (a);
fail:
	AG_AnimFree(a);
	return (NULL);
}
Beispiel #2
0
BOOL LoadGlobalIconPng(char *path, char *filename)
{
	
   char fullpath[MAXPATHLEN + 1];
   int len;
      
   if(filename == NULL) return FALSE;
   if(strlen(filename) >= MAXPATHLEN) return FALSE;
   fullpath[0] = '\0';
   if(path == NULL) {
#ifdef RSSDIR
      strcpy(fullpath, RSSDIR);
#else
      strcpy(fullpath, "./.xm7/");
#endif
   } else {
      if(strlen(path) >= MAXPATHLEN) return FALSE;
      strcpy(fullpath, path); 
   }
   
   len = strlen(fullpath) + strlen(filename);
   if(len >= MAXPATHLEN) return FALSE;
   strcat(fullpath, filename);
   
   if(!AG_FileExists(fullpath)) { // Fallback
      return FALSE;
   } else {
      AG_Surface *mark;
      AG_Surface *scaled;
      scaled = NULL;
      
      mark = AG_SurfaceFromPNG(fullpath);
      if(mark != NULL) {
	 SDL_Surface *icon;
	 
	 if(AG_ScaleSurface(mark, 32, 32, &scaled) < 0) { // Scale because Windows-Icon must be 32x32.
	    AG_SurfaceFree(mark);
	    return FALSE;
	 }
	 
	 icon = (SDL_Surface *)AG_SurfaceExportSDL(scaled);
	 if(icon == NULL) {
	    AG_SurfaceFree(scaled);
	    AG_SurfaceFree(mark);
	    return FALSE;
	 }
	 
	 if(AG_UsingSDL(NULL) && (agDriverSw != NULL)) {
	    SDL_WM_SetIcon(icon, NULL);
	 } else if(agDriverMw) {
//	    AG_WindowSetIcon(MainWindow, mark);
	 }
	 
	 SDL_FreeSurface(icon);
	 AG_SurfaceFree(scaled);
	 AG_SurfaceFree(mark);
	 return TRUE;
      } else {
	 return FALSE; // Illegal PNG.
      }
   }

}
Beispiel #3
0
/* 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);
}
Beispiel #4
0
static int
TestGUI(void *obj, AG_Window *win)
{
	char path[AG_PATHNAME_MAX];
	AG_Surface *su, *su2;

	/* Load, display and save a PNG file. */
	AG_LabelNewS(win, 0, "Loading agar.png:");
	if (!AG_ConfigFile("load-path", "agar", "png", path, sizeof(path))) {
		if ((su = AG_SurfaceFromPNG(path)) == NULL) {
			AG_LabelNew(win, 0, "%s: %s", path, AG_GetError());
		} else {
			AG_PixmapFromSurface(win, 0, su);
		}
		AG_LabelNewS(win, 0, "Saving agar.png:");
		if (AG_SurfaceExportPNG(su, "agar-save.png") == -1) {
			AG_LabelNew(win, 0, "Save failed: %s", AG_GetError());
		} else {
			if ((su2 = AG_SurfaceFromPNG("agar-save.png")) == NULL) {
				AG_LabelNew(win, 0, "Load failed: %s", AG_GetError());
			} else {
				AG_PixmapFromSurface(win, 0, su2);
			}
		}
	} else {
		AG_LabelNewS(win, 0, AG_GetError());
	}

	/* Load/save a PNG file in indexed color format. */
	AG_LabelNewS(win, 0, "Loading agar-index.png:");
	if (!AG_ConfigFile("load-path", "agar-index", "png", path, sizeof(path))) {
		if ((su = AG_SurfaceFromPNG(path)) == NULL) {
			AG_LabelNew(win, 0, "Failed: %s", AG_GetError());
		} else {
			AG_PixmapFromSurface(win, 0, su);
		}
		AG_LabelNewS(win, 0, "Saving agar-index.png:");
		if (AG_SurfaceExportPNG(su, "agar-index-save.png") == -1) {
			AG_LabelNew(win, 0, "Save failed: %s", AG_GetError());
		} else {
			if ((su2 = AG_SurfaceFromPNG("agar-index-save.png")) == NULL) {
				AG_LabelNew(win, 0, "Load failed: %s", AG_GetError());
			} else {
				AG_PixmapFromSurface(win, 0, su2);
			}
		}
	} else {
		AG_LabelNewS(win, 0, AG_GetError());
	}

	/* Load/save a JPEG file. */
	AG_LabelNewS(win, 0, "Loading pepe.jpg:");
	if (!AG_ConfigFile("load-path", "pepe", "jpg", path, sizeof(path))) {
		if ((su = AG_SurfaceFromJPEG(path)) == NULL) {
			AG_LabelNew(win, 0, "Failed: %s", AG_GetError());
		} else {
			AG_PixmapFromSurface(win, 0, su);
		}
		AG_LabelNewS(win, 0, "Saving pepe.jpg:");
		if (AG_SurfaceExportJPEG(su, "pepe-save.jpg") == -1) {
			AG_LabelNew(win, 0, "Save failed: %s", AG_GetError());
		} else {
			if ((su2 = AG_SurfaceFromJPEG("pepe-save.jpg")) == NULL) {
				AG_LabelNew(win, 0, "Load failed: %s", AG_GetError());
			} else {
				AG_PixmapFromSurface(win, 0, su2);
			}
		}
	} else {
		AG_LabelNewS(win, 0, AG_GetError());
	}
	return (0);
}