/* Insert a new animation frame. */ int AG_AnimFrameNew(AG_Anim *a, const AG_Surface *su) { AG_AnimFrame *afNew, *af; AG_Surface *suTmp = NULL; int nf; AG_MutexLock(&a->lock); if (su->w != a->w || su->h != a->h) { if (AG_ScaleSurface(su, a->w, a->h, &suTmp) == -1) goto fail; } else { if ((suTmp = AG_SurfaceConvert(su, a->format)) == NULL) goto fail; } if ((afNew = TryRealloc(a->f, (a->n+1)*sizeof(AG_AnimFrame))) == NULL) { goto fail; } a->f = afNew; af = &a->f[a->n]; af->flags = 0; if ((af->pixels = TryMalloc(su->h*a->pitch)) == NULL) { a->n--; goto fail; } memcpy(af->pixels, suTmp->pixels, su->h*a->pitch); nf = a->n++; AG_MutexUnlock(&a->lock); AG_SurfaceFree(suTmp); return (nf); fail: AG_MutexUnlock(&a->lock); if (suTmp != NULL) { AG_SurfaceFree(suTmp); } return (-1); }
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. } } }