void NamedSpritesFree(NamedSprites *ns) { if (ns == NULL) { return; } CFREE(ns->name); for (int i = 0; i < (int)ns->pics.size; i++) { PicFree(CArrayGet(&ns->pics, i)); } CArrayTerminate(&ns->pics); }
void PicManagerClear(CArray *pics, CArray *sprites) { for (int i = 0; i < (int)pics->size; i++) { NamedPic *n = CArrayGet(pics, i); CFREE(n->name); PicFree(&n->pic); } CArrayClear(pics); for (int i = 0; i < (int)sprites->size; i++) { NamedSpritesFree(CArrayGet(sprites, i)); } CArrayClear(sprites); }
void PicManagerTerminate(PicManager *pm) { for (int i = 0; i < PIC_MAX; i++) { if (pm->oldPics[i] != NULL) { CFREE(pm->oldPics[i]); } if (PicIsNotNone(&pm->picsFromOld[i])) { PicFree(&pm->picsFromOld[i]); } } PicManagerClear(&pm->pics, &pm->sprites); CArrayTerminate(&pm->pics); CArrayTerminate(&pm->sprites); PicManagerClear(&pm->customPics, &pm->customSprites); CArrayTerminate(&pm->customPics); CArrayTerminate(&pm->customSprites); IMG_Quit(); }
void PicLoad( Pic *p, const struct vec2i size, const struct vec2i offset, const SDL_Surface *image) { memset(p, 0, sizeof *p); p->size = size; p->offset = svec2i_zero(); CMALLOC(p->Data, size.x * size.y * sizeof *((Pic *)0)->Data); // Manually copy the pixels and replace the alpha component, // since our gfx device format has no alpha int srcI = offset.y*image->w + offset.x; for (int i = 0; i < size.x * size.y; i++, srcI++) { const Uint32 pixel = ((Uint32 *)image->pixels)[srcI]; color_t c; SDL_GetRGBA(pixel, image->format, &c.r, &c.g, &c.b, &c.a); // If completely transparent, replace rgb with black (0) too // This is because transparency blitting checks entire pixel if (c.a == 0) { p->Data[i] = 0; } else { p->Data[i] = COLOR2PIXEL(c); } if ((i + 1) % size.x == 0) { srcI += image->w - size.x; } } if (!PicTryMakeTex(p)) { goto bail; } return; bail: PicFree(p); }
void PicManagerGenerateOldPics(PicManager *pm, GraphicsDevice *g) { int i; // Convert old pics into new format ones // TODO: this is wasteful; better to eliminate old pics altogether // Note: always need to reload in editor since colours could change, // requiring an updating of palettes for (i = 0; i < PIC_MAX; i++) { PicPaletted *oldPic = PicManagerGetOldPic(pm, i); if (PicIsNotNone(&pm->picsFromOld[i])) { PicFree(&pm->picsFromOld[i]); } if (oldPic == NULL) { memcpy(&pm->picsFromOld[i], &picNone, sizeof picNone); } else { PicFromPicPaletted(g, &pm->picsFromOld[i], oldPic); } } }