summaryrefslogtreecommitdiffstats
path: root/libass/ass_rasterizer.h
diff options
context:
space:
mode:
Diffstat (limited to 'libass/ass_rasterizer.h')
-rw-r--r--libass/ass_rasterizer.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/libass/ass_rasterizer.h b/libass/ass_rasterizer.h
new file mode 100644
index 0000000..93c7e6f
--- /dev/null
+++ b/libass/ass_rasterizer.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 Vabishchevich Nikolay <vabnick@gmail.com>
+ *
+ * This file is part of libass.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef LIBASS_RASTERIZER_H
+#define LIBASS_RASTERIZER_H
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include <stddef.h>
+#include <stdint.h>
+
+
+enum {
+ SEGFLAG_UP = 1,
+ SEGFLAG_UR_DL = 2,
+ SEGFLAG_EXACT_LEFT = 4,
+ SEGFLAG_EXACT_RIGHT = 8,
+ SEGFLAG_EXACT_BOTTOM = 16,
+ SEGFLAG_EXACT_TOP = 32
+};
+
+// Polyline segment struct
+struct segment {
+ int64_t c;
+ int32_t a, b, scale, flags;
+ int32_t x_min, x_max, y_min, y_max;
+};
+
+
+typedef void (*FillSolidTileFunc)(uint8_t *buf, ptrdiff_t stride);
+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);
+
+void ass_fill_solid_tile16_c(uint8_t *buf, ptrdiff_t stride);
+void ass_fill_solid_tile32_c(uint8_t *buf, ptrdiff_t stride);
+void ass_fill_halfplane_tile16_c(uint8_t *buf, ptrdiff_t stride,
+ int32_t a, int32_t b, int64_t c, int32_t scale);
+void ass_fill_halfplane_tile32_c(uint8_t *buf, ptrdiff_t stride,
+ int32_t a, int32_t b, int64_t c, int32_t scale);
+void ass_fill_generic_tile16_c(uint8_t *buf, ptrdiff_t stride,
+ const struct segment *line, size_t n_lines,
+ int winding);
+void ass_fill_generic_tile32_c(uint8_t *buf, ptrdiff_t stride,
+ const struct segment *line, size_t n_lines,
+ int winding);
+
+typedef struct ass_rasterizer {
+ int outline_error; // acceptable error (in 1/64 pixel units)
+
+ int tile_order; // log2(tile_size)
+ FillSolidTileFunc fill_solid;
+ FillHalfplaneTileFunc fill_halfplane;
+ FillGenericTileFunc fill_generic;
+
+ int32_t x_min, x_max, y_min, y_max; // usable after rasterizer_set_outline
+
+ // internal buffers
+ struct segment *linebuf[2];
+ size_t size[2], capacity[2];
+} ASS_Rasterizer;
+
+void rasterizer_init(ASS_Rasterizer *rst);
+void rasterizer_done(ASS_Rasterizer *rst);
+/**
+ * \brief Convert FreeType outline to polyline and calculate exact bounds
+ */
+int rasterizer_set_outline(ASS_Rasterizer *rst, const FT_Outline *path);
+/**
+ * \brief Polyline rasterization function
+ * \param x0, y0, width, height in: source window (full pixel units)
+ * \param buf out: aligned output buffer (size = stride * height)
+ * \param stride output buffer stride (aligned)
+ * \param vert_flip vertical flip flag
+ * \return zero on error
+ * Deletes preprocessed polyline after work.
+ */
+int rasterizer_fill(ASS_Rasterizer *rst, uint8_t *buf, int x0, int y0,
+ int width, int height, ptrdiff_t stride, int vert_flip);
+
+
+#endif /* LIBASS_RASTERIZER_H */