summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/autotrace/autotrace.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/3rdparty/autotrace/autotrace.h413
1 files changed, 413 insertions, 0 deletions
diff --git a/src/3rdparty/autotrace/autotrace.h b/src/3rdparty/autotrace/autotrace.h
new file mode 100644
index 0000000..e56be9a
--- /dev/null
+++ b/src/3rdparty/autotrace/autotrace.h
@@ -0,0 +1,413 @@
+/* autotrace.h --- Autotrace API
+
+ Copyright (C) 2000, 2001, 2002 Martin Weber
+
+ The author can be contacted at <martweb@gmx.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef AUTOTRACE_H
+#define AUTOTRACE_H
+
+#include <stdio.h>
+
+#include "types.h"
+#include "color.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef N_
+#define N_(x) x
+#endif /* Not def: N_ */
+
+/* ===================================================================== *
+ * Typedefs
+ * ===================================================================== */
+
+/* Third degree is the highest we deal with. */
+ enum _at_polynomial_degree {
+ AT_LINEARTYPE = 1,
+ AT_QUADRATICTYPE = 2,
+ AT_CUBICTYPE = 3,
+ AT_PARALLELELLIPSETYPE = 4,
+ AT_ELLIPSETYPE = 5,
+ AT_CIRCLETYPE = 6
+ /* not the real number of points to define a
+ circle but to distinguish between a cubic spline */
+ };
+
+ enum _at_msg_type {
+ AT_MSG_NOT_SET = 0, /* is used in autotrace internally */
+ AT_MSG_FATAL = 1,
+ AT_MSG_WARNING,
+ };
+
+ typedef struct _at_fitting_opts_type at_fitting_opts_type;
+ typedef struct _at_input_opts_type at_input_opts_type;
+ typedef struct _at_output_opts_type at_output_opts_type;
+ typedef struct _at_bitmap at_bitmap;
+ typedef enum _at_polynomial_degree at_polynomial_degree;
+ typedef struct _at_spline_type at_spline_type;
+ typedef struct _at_spline_list_type at_spline_list_type;
+ typedef struct _at_spline_list_array_type at_spline_list_array_type;
+#define at_splines_type at_spline_list_array_type
+ typedef enum _at_msg_type at_msg_type;
+
+/* A Bezier spline can be represented as four points in the real plane:
+ a starting point, ending point, and two control points. The
+ curve always lies in the convex hull defined by the four points. It
+ is also convenient to save the divergence of the spline from the
+ straight line defined by the endpoints. */
+ struct _at_spline_type {
+ at_real_coord v[4]; /* The control points. */
+ at_polynomial_degree degree;
+ gfloat linearity;
+ };
+
+/* Each outline in a character is typically represented by many
+ splines. So, here is a list structure for that: */
+ struct _at_spline_list_type {
+ at_spline_type *data;
+ unsigned length;
+ gboolean clockwise;
+ at_color color;
+ gboolean open;
+ };
+
+/* Each character is in general made up of many outlines. So here is one
+ more list structure. */
+ struct _at_spline_list_array_type {
+ at_spline_list_type *data;
+ unsigned length;
+
+ /* splines bbox */
+ unsigned short height, width;
+
+ /* the values for following members are inherited from
+ at_fitting_opts_type */
+ at_color *background_color;
+ gboolean centerline;
+ gboolean preserve_width;
+ gfloat width_weight_factor;
+
+ };
+
+/* Fitting option.
+ With using at_fitting_opts_doc macro, the description of
+ each option could be get. e.g. at_fitting_opts_doc(background_color) */
+ struct _at_fitting_opts_type {
+#define at_doc__background_color \
+N_("background-color <hexadezimal>: the color of the background that " \
+"should be ignored, for example FFFFFF; " \
+"default is no background color.")
+ at_color *background_color;
+
+#define at_doc__charcode \
+N_("charcode <unsigned>: code of character to load from GF file, " \
+"allowed are 0..255; default is the first character in font.")
+ unsigned charcode;
+
+#define at_doc__color_count \
+N_("color-count <unsigned>: number of colors a color bitmap is reduced to, " \
+"it does not work on grayscale, allowed are 1..256; " \
+"default is 0, that means not color reduction is done.")
+ unsigned color_count;
+
+#define at_doc__corner_always_threshold \
+N_("corner-always-threshold <angle-in-degrees>: if the angle at a pixel is " \
+"less than this, it is considered a corner, even if it is within " \
+"`corner-surround' pixels of another corner; default is 60. ")
+ gfloat corner_always_threshold;
+
+#define at_doc__corner_surround \
+N_("corner-surround <unsigned>: number of pixels on either side of a " \
+"point to consider when determining if that point is a corner; " \
+"default is 4. ")
+ unsigned corner_surround;
+
+#define at_doc__corner_threshold \
+N_("corner-threshold <angle-in-degrees>: if a pixel, its predecessor(s), " \
+"and its successor(s) meet at an angle smaller than this, it's a " \
+"corner; default is 100. ")
+ gfloat corner_threshold;
+
+#define at_doc__error_threshold \
+N_("error-threshold <real>: subdivide fitted curves that are off by " \
+"more pixels than this; default is 2.0. ")
+ gfloat error_threshold;
+
+#define at_doc__filter_iterations \
+N_("filter-iterations <unsigned>: smooth the curve this many times " \
+"before fitting; default is 4.")
+ unsigned filter_iterations;
+
+#define at_doc__line_reversion_threshold \
+N_("line-reversion-threshold <real>: if a spline is closer to a straight " \
+"line than this, weighted by the square of the curve length, keep it a " \
+"straight line even if it is a list with curves; default is .01. ")
+ gfloat line_reversion_threshold;
+
+#define at_doc__line_threshold \
+N_("line-threshold <real>: if the spline is not more than this far away " \
+"from the straight line defined by its endpoints," \
+"then output a straight line; default is 1. ")
+ gfloat line_threshold;
+
+#define at_doc__remove_adjacent_corners \
+N_("remove-adjacent-corners: remove corners that are adjacent; " \
+"default doesn't remove.")
+ gboolean remove_adjacent_corners;
+
+#define at_doc__tangent_surround \
+N_("tangent-surround <unsigned>: number of points on either side of a " \
+"point to consider when computing the tangent at that point; " \
+" default is 3.")
+ unsigned tangent_surround;
+
+#define at_doc__despeckle_level \
+N_("despeckle-level <unsigned>: 0..20; default is no despeckling. ")
+ unsigned despeckle_level;
+
+#define at_doc__despeckle_tightness \
+N_("despeckle-tightness <real>: 0.0..8.0; default is 2.0. ")
+ gfloat despeckle_tightness;
+
+#define at_doc__noise_removal \
+N_("noise-removal <real>: 1.0..0.0; default is 0.99. ")
+ gfloat noise_removal;
+
+#define at_doc__centerline \
+N_("centerline: trace a character's centerline, rather than its outline. ")
+ gboolean centerline;
+
+#define at_doc__preserve_width \
+N_("preserve-width: whether to preserve linewith with centerline fitting; " \
+"default doesn't preserve.")
+ gboolean preserve_width;
+
+#define at_doc__width_weight_factor \
+N_("width-weight-factor <real>: weight factor for fitting the linewidth.")
+ gfloat width_weight_factor;
+ };
+
+ struct _at_input_opts_type {
+ at_color *background_color;
+ unsigned charcode; /* Character code used only in GF input. */
+ };
+
+ struct _at_output_opts_type {
+ int dpi; /* DPI is used only in MIF output. */
+ };
+
+ struct _at_bitmap {
+ unsigned short height;
+ unsigned short width;
+ unsigned char *bitmap;
+ unsigned int np;
+ };
+
+ typedef
+ void (*at_msg_func) (const gchar * msg, at_msg_type msg_type, gpointer client_data);
+
+/*
+ * Autotrace initializer
+ */
+#define AUTOTRACE_INIT
+ void autotrace_init(void);
+
+/*
+ * IO Handler typedefs
+ */
+
+ typedef struct _at_bitmap_reader at_bitmap_reader;
+ struct _at_bitmap_reader;
+
+ typedef struct _at_spline_writer at_spline_writer;
+ struct _at_spline_writer;
+
+/*
+ * Progress handler typedefs
+ * 0.0 <= percentage <= 1.0
+ */
+ typedef void (*at_progress_func) (gfloat percentage, gpointer client_data);
+
+/*
+ * Test cancel
+ * Return TRUE if auto-tracing should be stopped.
+ */
+ typedef gboolean(*at_testcancel_func) (gpointer client_data);
+
+/* ===================================================================== *
+ * Functions
+ * ===================================================================== */
+
+/* --------------------------------------------------------------------- *
+ * Fitting option related
+ *
+ * TODO: internal data access, copy
+ * --------------------------------------------------------------------- */
+ at_fitting_opts_type *at_fitting_opts_new(void);
+ at_fitting_opts_type *at_fitting_opts_copy(at_fitting_opts_type * original);
+ void at_fitting_opts_free(at_fitting_opts_type * opts);
+
+/* Gettextize */
+#define at_fitting_opts_doc(opt) at_fitting_opts_doc_func(at_doc__##opt)
+/* Don't use next function directly from clients */
+ const char *at_fitting_opts_doc_func(char *string);
+
+/* --------------------------------------------------------------------- *
+ * Input option related
+ *
+ * TODO: internal data access
+ * --------------------------------------------------------------------- */
+ at_input_opts_type *at_input_opts_new(void);
+ at_input_opts_type *at_input_opts_copy(at_input_opts_type * original);
+ void at_input_opts_free(at_input_opts_type * opts);
+
+/* --------------------------------------------------------------------- *
+ * Output option related
+ *
+ * TODO: internal data access
+ * --------------------------------------------------------------------- */
+ at_output_opts_type *at_output_opts_new(void);
+ at_output_opts_type *at_output_opts_copy(at_output_opts_type * original);
+ void at_output_opts_free(at_output_opts_type * opts);
+
+/* --------------------------------------------------------------------- *
+ * Bitmap related
+ *
+ * TODO: internal data access
+ * --------------------------------------------------------------------- */
+
+/* There is two way to build at_bitmap.
+ 1. Using input reader
+ Use at_bitmap_read.
+ at_input_get_handler_by_suffix or
+ at_input_get_handler will help you to get at_bitmap_reader.
+ 2. Allocating a bitmap and rendering an image on it by yourself
+ Use at_bitmap_new.
+
+ In both case, you have to call at_bitmap_free when at_bitmap *
+ data are no longer needed. */
+ at_bitmap *at_bitmap_read(at_bitmap_reader * reader, gchar * filename, at_input_opts_type * opts, at_msg_func msg_func, gpointer msg_data);
+ at_bitmap *at_bitmap_new(unsigned short width, unsigned short height, unsigned int planes);
+ at_bitmap *at_bitmap_copy(const at_bitmap * src);
+
+/* We have to export functions that supports internal datum
+ access. Such functions might be useful for
+ at_bitmap_new user. */
+ unsigned short at_bitmap_get_width(const at_bitmap * bitmap);
+ unsigned short at_bitmap_get_height(const at_bitmap * bitmap);
+ unsigned short at_bitmap_get_planes(const at_bitmap * bitmap);
+ void at_bitmap_get_color(const at_bitmap * bitmap, unsigned int row, unsigned int col, at_color * color);
+ gboolean at_bitmap_equal_color(const at_bitmap * bitmap, unsigned int row, unsigned int col, at_color * color);
+ void at_bitmap_free(at_bitmap * bitmap);
+
+/* --------------------------------------------------------------------- *
+ * Spline related
+ *
+ * TODO: internal data access
+ * --------------------------------------------------------------------- */
+/* at_splines_new
+
+ args:
+
+ BITMAP is modified in at_splines_new according to opts. Therefore
+ if you need the original bitmap image, you have to make a backup of
+ BITMAP with using at_bitmap_copy.
+
+ MSG_FUNC and MSG_DATA are used to notify a client errors and
+ warning from autotrace. NULL is valid value for MSG_FUNC if
+ the client is not interested in the notifications. */
+ at_splines_type *at_splines_new(at_bitmap * bitmap, at_fitting_opts_type * opts, at_msg_func msg_func, gpointer msg_data);
+
+/* at_splines_new_full
+
+ args:
+
+ NOTIFY_PROGRESS is called repeatedly inside at_splines_new_full
+ to notify the progress of the execution. This might be useful for
+ interactive applications. NOTIFY_PROGRESS is called following
+ format:
+
+ NOTIFY_PROGRESS (percentage, progress_data);
+
+ test_cancel is called repeatedly inside at_splines_new_full
+ to test whether the execution is canceled or not.
+ If test_cancel returns TRUE, execution of at_splines_new_full
+ is stopped as soon as possible and returns NULL. If test_cancel
+ returns FALSE, nothing happens. test_cancel is called following
+ format:
+
+ TEST_CANCEL (testcancel_data);
+
+ NULL is valid value for notify_progress and/or test_cancel if
+ you don't need to know the progress of the execution and/or
+ cancel the execution */
+ at_splines_type *at_splines_new_full(at_bitmap * bitmap, at_fitting_opts_type * opts, at_msg_func msg_func, gpointer msg_data, at_progress_func notify_progress, gpointer progress_data, at_testcancel_func test_cancel, gpointer testcancel_data);
+
+ void at_splines_write(at_spline_writer * writer, FILE * writeto, gchar * file_name, at_output_opts_type * opts, at_splines_type * splines, at_msg_func msg_func, gpointer msg_data);
+
+ void at_splines_free(at_splines_type * splines);
+
+/* --------------------------------------------------------------------- *
+ * Input related
+ * --------------------------------------------------------------------- */
+ at_bitmap_reader *at_input_get_handler(gchar * filename);
+ at_bitmap_reader *at_input_get_handler_by_suffix(gchar * suffix);
+
+ const char **at_input_list_new(void);
+ void at_input_list_free(const char **list);
+
+/* at_input_shortlist
+ return value: Do free by yourself */
+ char *at_input_shortlist(void);
+
+/* --------------------------------------------------------------------- *
+ * Output related
+ * --------------------------------------------------------------------- */
+ at_spline_writer *at_output_get_handler(gchar * filename);
+ at_spline_writer *at_output_get_handler_by_suffix(const gchar * suffix);
+ const char **at_output_list_new(void);
+ void at_output_list_free(const char **list);
+
+/* at_output_shortlist
+ return value: Do free by yourself */
+ char *at_output_shortlist(void);
+
+/* --------------------------------------------------------------------- *
+ * Misc
+ * --------------------------------------------------------------------- */
+
+/* at_version
+
+ args:
+ LONG_FORMAT == TRUE: "AutoTrace version x.y"
+ LONG_FORMAT == FALSE: "x.y"
+
+ return value: Don't free. It is allocated statically */
+ const char *at_version(gboolean long_format);
+
+/* at_home_site
+
+ return value: Don't free. It is allocated statically */
+ const char *at_home_site(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* AUTOTRACE_H */