diff options
Diffstat (limited to 'libass/ass_bitmap.h')
-rw-r--r-- | libass/ass_bitmap.h | 70 |
1 files changed, 52 insertions, 18 deletions
diff --git a/libass/ass_bitmap.h b/libass/ass_bitmap.h index 901adc7..7817d33 100644 --- a/libass/ass_bitmap.h +++ b/libass/ass_bitmap.h @@ -19,6 +19,7 @@ #ifndef LIBASS_BITMAP_H #define LIBASS_BITMAP_H +#include <stdbool.h> #include <ft2build.h> #include FT_GLYPH_H @@ -29,6 +30,51 @@ typedef struct ass_synth_priv ASS_SynthPriv; ASS_SynthPriv *ass_synth_init(double); void ass_synth_done(ASS_SynthPriv *priv); +struct segment; +typedef void (*FillSolidTileFunc)(uint8_t *buf, ptrdiff_t stride, int set); +typedef void (*FillHalfplaneTileFunc)(uint8_t *buf, ptrdiff_t stride, + int32_t a, int32_t b, int64_t c, int32_t scale); +typedef void (*FillGenericTileFunc)(uint8_t *buf, ptrdiff_t stride, + const struct segment *line, size_t n_lines, + int winding); + +typedef void (*BitmapBlendFunc)(uint8_t *dst, intptr_t dst_stride, + uint8_t *src, intptr_t src_stride, + intptr_t height, intptr_t width); +typedef void (*BitmapMulFunc)(uint8_t *dst, intptr_t dst_stride, + uint8_t *src1, intptr_t src1_stride, + uint8_t *src2, intptr_t src2_stride, + intptr_t width, intptr_t height); + +typedef void (*BeBlurFunc)(uint8_t *buf, intptr_t w, intptr_t h, + intptr_t stride, uint16_t *tmp); + +#define C_ALIGN_ORDER 5 + +typedef struct { + int align_order; // log2(alignment) + + // rasterizer functions +#if CONFIG_RASTERIZER + int tile_order; // log2(tile_size) + FillSolidTileFunc fill_solid; + FillHalfplaneTileFunc fill_halfplane; + FillGenericTileFunc fill_generic; +#endif + + // blend functions + BitmapBlendFunc add_bitmaps, sub_bitmaps; + BitmapMulFunc mul_bitmaps; + + // be blur function + BeBlurFunc be_blur; +} BitmapEngine; + +extern const BitmapEngine ass_bitmap_engine_c; +extern const BitmapEngine ass_bitmap_engine_sse2; +extern const BitmapEngine ass_bitmap_engine_avx2; + + typedef struct { size_t n_contours, max_contours; size_t *contours; @@ -46,12 +92,15 @@ typedef struct { unsigned char *buffer; // h * stride buffer } Bitmap; +Bitmap *alloc_bitmap(const BitmapEngine *engine, int w, int h); +Bitmap *copy_bitmap(const BitmapEngine *engine, const Bitmap *src); +void ass_free_bitmap(Bitmap *bm); + Bitmap *outline_to_bitmap(ASS_Renderer *render_priv, ASS_Outline *outline, int bord); -Bitmap *alloc_bitmap(int w, int h); - -void ass_synth_blur(ASS_SynthPriv *priv_blur, int opaque_box, int be, +void ass_synth_blur(const BitmapEngine *engine, + ASS_SynthPriv *priv_blur, int opaque_box, int be, double blur_radius, Bitmap *bm_g, Bitmap *bm_o); /** @@ -65,30 +114,15 @@ int outline_to_bitmap2(ASS_Renderer *render_priv, ASS_Outline *outline, ASS_Outline *border, Bitmap **bm_g, Bitmap **bm_o); -void ass_free_bitmap(Bitmap *bm); void ass_gauss_blur(unsigned char *buffer, unsigned *tmp2, int width, int height, int stride, unsigned *m2, int r, int mwidth); int be_padding(int be); -void be_blur_c(uint8_t *buf, intptr_t w, - intptr_t h, intptr_t stride, - uint16_t *tmp); void be_blur_pre(uint8_t *buf, intptr_t w, intptr_t h, intptr_t stride); void be_blur_post(uint8_t *buf, intptr_t w, intptr_t h, intptr_t stride); -void add_bitmaps_c(uint8_t *dst, intptr_t dst_stride, - uint8_t *src, intptr_t src_stride, - intptr_t height, intptr_t width); -void sub_bitmaps_c(uint8_t *dst, intptr_t dst_stride, - uint8_t *src, intptr_t src_stride, - intptr_t height, intptr_t width); -void mul_bitmaps_c(uint8_t *dst, intptr_t dst_stride, - uint8_t *src1, intptr_t src1_stride, - uint8_t *src2, intptr_t src2_stride, - intptr_t w, intptr_t h); void shift_bitmap(Bitmap *bm, int shift_x, int shift_y); void fix_outline(Bitmap *bm_g, Bitmap *bm_o); -Bitmap *copy_bitmap(const Bitmap *src); #endif /* LIBASS_BITMAP_H */ |