static bool resize_tmp(ASS_SynthPriv *priv, int w, int h) { if (w >= INT_MAX || (w + 1) > SIZE_MAX / 2 / sizeof(unsigned) / FFMAX(h, 1)) return false; size_t needed = sizeof(unsigned) * (w + 1) * h; if (priv->tmp && priv->tmp_allocated >= needed) return true; ass_aligned_free(priv->tmp); priv->tmp_allocated = FFMAX(needed, priv->tmp_allocated * 2); priv->tmp = ass_aligned_alloc(32, priv->tmp_allocated); return !!priv->tmp; }
Bitmap *alloc_bitmap(int w, int h) { Bitmap *bm; unsigned align = (w >= 32) ? 32 : ((w >= 16) ? 16 : 1); unsigned s = ass_align(align, w); bm = malloc(sizeof(Bitmap)); bm->buffer = ass_aligned_alloc(align, s * h + 32); memset(bm->buffer, 0, s * h + 32); bm->w = w; bm->h = h; bm->stride = s; bm->left = bm->top = 0; return bm; }
void resize_tmp(ASS_SynthPriv *priv, int w, int h) { if (priv->tmp_w >= w && priv->tmp_h >= h) return; if (priv->tmp_w == 0) priv->tmp_w = 64; if (priv->tmp_h == 0) priv->tmp_h = 64; while (priv->tmp_w < w) priv->tmp_w *= 2; while (priv->tmp_h < h) priv->tmp_h *= 2; ass_aligned_free(priv->tmp); priv->tmp = ass_aligned_alloc(32, (priv->tmp_w + 1) * priv->tmp_h * sizeof(unsigned)); }
static Bitmap *alloc_bitmap_raw(int w, int h) { Bitmap *bm; unsigned align = (w >= 32) ? 32 : ((w >= 16) ? 16 : 1); size_t s = ass_align(align, w); // Too often we use ints as offset for bitmaps => use INT_MAX. if (s > (INT_MAX - 32) / FFMAX(h, 1)) return NULL; bm = malloc(sizeof(Bitmap)); if (!bm) return NULL; bm->buffer = ass_aligned_alloc(align, s * h + 32); if (!bm->buffer) { free(bm); return NULL; } bm->w = w; bm->h = h; bm->stride = s; bm->left = bm->top = 0; return bm; }