-static void make_shadow_bitmap(ASS_Renderer *render_priv,
- CompositeHashValue *val, const FilterDesc *filter)
-{
- Bitmap *bm = &val->bm, *bm_o = &val->bm_o, *bm_s = &val->bm_s;
-
- if (!(filter->flags & FILTER_NONZERO_SHADOW)) {
- if (bm->buffer && bm_o->buffer && !(filter->flags & FILTER_BORDER_STYLE_3)) {
- fix_outline(bm, bm_o);
- } else if (bm_o->buffer && !(filter->flags & FILTER_NONZERO_BORDER)) {
- ass_free_bitmap(bm_o);
- memset(bm_o, 0, sizeof(*bm_o));
- }
- return;
- }
-
- // Create shadow and fix outline as needed
- if (bm->buffer && bm_o->buffer && !(filter->flags & FILTER_BORDER_STYLE_3)) {
- copy_bitmap(render_priv->engine, bm_s, bm_o);
- fix_outline(bm, bm_o);
- } else if (bm_o->buffer && (filter->flags & FILTER_NONZERO_BORDER)) {
- copy_bitmap(render_priv->engine, bm_s, bm_o);
- } else if (bm_o->buffer) {
- *bm_s = *bm_o;
- memset(bm_o, 0, sizeof(*bm_o));
- } else if (bm->buffer)
- copy_bitmap(render_priv->engine, bm_s, bm);
-
- if (!bm_s->buffer)
- return;
-
- // Works right even for negative offsets
- // '>>' rounds toward negative infinity, '&' returns correct remainder
- bm_s->left += filter->shadow.x >> 6;
- bm_s->top += filter->shadow.y >> 6;
- shift_bitmap(bm_s, filter->shadow.x & SUBPIXEL_MASK, filter->shadow.y & SUBPIXEL_MASK);
-}
-