|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- /* Pango
- * pango-engine.h: Engines for script and language specific processing
- *
- * Copyright (C) 2000,2003 Red Hat Software
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
- #ifndef __PANGO_ENGINE_H__
- #define __PANGO_ENGINE_H__
-
- #include <pango/pango-types.h>
- #include <pango/pango-item.h>
- #include <pango/pango-font.h>
- #include <pango/pango-glyph.h>
- #include <pango/pango-script.h>
-
- G_BEGIN_DECLS
-
- #ifdef PANGO_ENABLE_ENGINE
-
- /* Module API */
-
- #include <gmodule.h>
-
- #define PANGO_RENDER_TYPE_NONE "PangoRenderNone"
-
- #define PANGO_TYPE_ENGINE (pango_engine_get_type ())
- #define PANGO_ENGINE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_ENGINE, PangoEngine))
- #define PANGO_IS_ENGINE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_ENGINE))
- #define PANGO_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_ENGINE, PangoEngineClass))
- #define PANGO_IS_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_ENGINE))
- #define PANGO_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_ENGINE, PangoEngineClass))
-
- typedef struct _PangoEngine PangoEngine;
- typedef struct _PangoEngineClass PangoEngineClass;
-
- /**
- * PangoEngine:
- *
- * #PangoEngine is the base class for all types of language and
- * script specific engines. It has no functionality by itself.
- **/
- struct _PangoEngine
- {
- /*< private >*/
- GObject parent_instance;
- };
-
- /**
- * PangoEngineClass:
- *
- * Class structure for #PangoEngine
- **/
- struct _PangoEngineClass
- {
- /*< private >*/
- GObjectClass parent_class;
- };
-
- GType pango_engine_get_type (void) G_GNUC_CONST;
-
- #define PANGO_ENGINE_TYPE_LANG "PangoEngineLang"
-
- #define PANGO_TYPE_ENGINE_LANG (pango_engine_lang_get_type ())
- #define PANGO_ENGINE_LANG(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_ENGINE_LANG, PangoEngineLang))
- #define PANGO_IS_ENGINE_LANG(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_ENGINE_LANG))
- #define PANGO_ENGINE_LANG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_ENGINE_LANG, PangoEngineLangClass))
- #define PANGO_IS_ENGINE_LANG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_ENGINE_LANG))
- #define PANGO_ENGINE_LANG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_ENGINE_LANG, PangoEngineLangClass))
-
- typedef struct _PangoEngineLangClass PangoEngineLangClass;
-
- /**
- * PangoEngineLang:
- *
- * The #PangoEngineLang class is implemented by engines that
- * customize the rendering-system independent part of the
- * Pango pipeline for a particular script or language. For
- * instance, a custom #PangoEngineLang could be provided for
- * Thai to implement the dictionary-based word boundary
- * lookups needed for that language.
- **/
- struct _PangoEngineLang
- {
- /*< private >*/
- PangoEngine parent_instance;
- };
-
- /**
- * PangoEngineLangClass:
- * @script_break: Provides a custom implementation of pango_break().
- * If %NULL, pango_default_break() is used instead. If not %NULL, for
- * Pango versions before 1.16 (module interface version before 1.6.0),
- * this was called instead of pango_default_break(), but in newer versions,
- * pango_default_break() is always called and this is called after that to
- * allow tailoring the breaking results.
- *
- * Class structure for #PangoEngineLang
- **/
- struct _PangoEngineLangClass
- {
- /*< private >*/
- PangoEngineClass parent_class;
-
- /*< public >*/
- void (*script_break) (PangoEngineLang *engine,
- const char *text,
- int len,
- PangoAnalysis *analysis,
- PangoLogAttr *attrs,
- int attrs_len);
- };
-
- GType pango_engine_lang_get_type (void) G_GNUC_CONST;
-
- #define PANGO_ENGINE_TYPE_SHAPE "PangoEngineShape"
-
- #define PANGO_TYPE_ENGINE_SHAPE (pango_engine_shape_get_type ())
- #define PANGO_ENGINE_SHAPE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_ENGINE_SHAPE, PangoEngineShape))
- #define PANGO_IS_ENGINE_SHAPE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_ENGINE_SHAPE))
- #define PANGO_ENGINE_SHAPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_ENGINE_SHAPE, PangoEngine_ShapeClass))
- #define PANGO_IS_ENGINE_SHAPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_ENGINE_SHAPE))
- #define PANGO_ENGINE_SHAPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_ENGINE_SHAPE, PangoEngineShapeClass))
-
- typedef struct _PangoEngineShapeClass PangoEngineShapeClass;
-
- /**
- * PangoEngineShape
- *
- * The #PangoEngineShape class is implemented by engines that
- * customize the rendering-system dependent part of the
- * Pango pipeline for a particular script or language.
- * A #PangoEngineShape implementation is then specific to both
- * a particular rendering system or group of rendering systems
- * and to a particular script. For instance, there is one
- * #PangoEngineShape implementation to handle shaping Arabic
- * for Fontconfig-based backends.
- **/
- struct _PangoEngineShape
- {
- PangoEngine parent_instance;
- };
-
- /**
- * PangoEngineShapeClass:
- * @script_shape: Given a font, a piece of text, and a #PangoAnalysis
- * structure, converts characters to glyphs and positions the
- * resulting glyphs. The results are stored in the #PangoGlyphString
- * that is passed in. (The implementation should resize it
- * appropriately using pango_glyph_string_set_size()). All fields
- * of the @log_clusters and @glyphs array must be filled in, with
- * the exception that Pango will automatically generate
- * <literal>glyphs->glyphs[i].attr.is_cluster_start</literal>
- * using the @log_clusters array. Each input character must occur in one
- * of the output logical clusters;
- * if no rendering is desired for a character, this may involve
- * inserting glyphs with the #PangoGlyph ID #PANGO_GLYPH_EMPTY, which
- * is guaranteed never to render. If the shaping fails for any reason,
- * the shaper should return with an empty (zero-size) glyph string.
- * If the shaper has not set the size on the glyph string yet, simply
- * returning signals the failure too.
- * @covers: Returns the characters that this engine can cover
- * with a given font for a given language. If not overridden, the default
- * implementation simply returns the coverage information for the
- * font itself unmodified.
- *
- * Class structure for #PangoEngineShape
- **/
- struct _PangoEngineShapeClass
- {
- /*< private >*/
- PangoEngineClass parent_class;
-
- /*< public >*/
- void (*script_shape) (PangoEngineShape *engine,
- PangoFont *font,
- const char *text,
- int length,
- const PangoAnalysis *analysis,
- PangoGlyphString *glyphs);
- PangoCoverageLevel (*covers) (PangoEngineShape *engine,
- PangoFont *font,
- PangoLanguage *language,
- gunichar wc);
- };
-
- GType pango_engine_shape_get_type (void) G_GNUC_CONST;
-
- typedef struct _PangoEngineInfo PangoEngineInfo;
- typedef struct _PangoEngineScriptInfo PangoEngineScriptInfo;
-
- struct _PangoEngineScriptInfo
- {
- PangoScript script;
- const gchar *langs;
- };
-
- struct _PangoEngineInfo
- {
- const gchar *id;
- const gchar *engine_type;
- const gchar *render_type;
- PangoEngineScriptInfo *scripts;
- gint n_scripts;
- };
-
- /**
- * script_engine_list:
- * @engines: location to store a pointer to an array of engines.
- * @n_engines: location to store the number of elements in @engines.
- *
- * Function to be provided by a module to list the engines that the
- * module supplies. The function stores a pointer to an array
- * of #PangoEngineInfo structures and the length of that array in
- * the given location.
- *
- * Note that script_engine_init() will not be called before this
- * function.
- **/
- void script_engine_list (PangoEngineInfo **engines,
- int *n_engines);
-
- /**
- * script_engine_init:
- * @module: a #GTypeModule structure used to associate any
- * GObject types created in this module with the module.
- *
- * Function to be provided by a module to register any
- * GObject types in the module.
- **/
- void script_engine_init (GTypeModule *module);
-
-
- /**
- * script_engine_exit:
- *
- * Function to be provided by the module that is called
- * when the module is unloading. Frequently does nothing.
- **/
- void script_engine_exit (void);
-
- /**
- * script_engine_create:
- * @id: the ID of an engine as reported by script_engine_list.
- *
- * Function to be provided by the module to create an instance
- * of one of the engines implemented by the module.
- *
- * Return value: a newly created #PangoEngine of the specified
- * type, or %NULL if an error occurred. (In normal operation,
- * a module should not return %NULL. A %NULL return is only
- * acceptable in the case where system misconfiguration or
- * bugs in the driver routine are encountered.)
- **/
- PangoEngine *script_engine_create (const char *id);
-
- /* Utility macro used by PANGO_ENGINE_LANG_DEFINE_TYPE and
- * PANGO_ENGINE_LANG_DEFINE_TYPE
- */
- #define PANGO_ENGINE_DEFINE_TYPE(name, prefix, class_init, instance_init, parent_type) \
- static GType prefix ## _type; \
- static void \
- prefix ## _register_type (GTypeModule *module) \
- { \
- const GTypeInfo object_info = \
- { \
- sizeof (name ## Class), \
- (GBaseInitFunc) NULL, \
- (GBaseFinalizeFunc) NULL, \
- (GClassInitFunc) class_init, \
- (GClassFinalizeFunc) NULL, \
- NULL, /* class_data */ \
- sizeof (name), \
- 0, /* n_prelocs */ \
- (GInstanceInitFunc) instance_init, \
- NULL /* value_table */ \
- }; \
- \
- prefix ## _type = g_type_module_register_type (module, parent_type, \
- # name, \
- &object_info, 0); \
- }
-
- /**
- * PANGO_ENGINE_LANG_DEFINE_TYPE:
- * @name: Name of the the type to register (for example:, <literal>ArabicEngineFc</literal>
- * @prefix: Prefix for symbols that will be defined (for example:, <literal>arabic_engine_fc</literal>
- * @class_init: Class initialization function for the new type, or %NULL
- * @instance_init: Instance initialization function for the new type, or %NULL
- *
- * Outputs the necessary code for GObject type registration for a
- * #PangoEngineLang class defined in a module. Two static symbols
- * are defined.
- *
- * <programlisting>
- * static GType <replaceable>prefix</replaceable>_type;
- * static void <replaceable>prefix</replaceable>_register_type (GTypeModule module);
- * </programlisting>
- *
- * The <function><replaceable>prefix</replaceable>_register_type()</function>
- * function should be called in your script_engine_init() function for
- * each type that your module implements, and then your script_engine_create()
- * function can create instances of the object as follows:
- *
- * <informalexample><programlisting>
- * PangoEngine *engine = g_object_new (<replaceable>prefix</replaceable>_type, NULL);
- * </programlisting></informalexample>
- **/
- #define PANGO_ENGINE_LANG_DEFINE_TYPE(name, prefix, class_init, instance_init) \
- PANGO_ENGINE_DEFINE_TYPE (name, prefix, \
- class_init, instance_init, \
- PANGO_TYPE_ENGINE_LANG)
-
- /**
- * PANGO_ENGINE_SHAPE_DEFINE_TYPE:
- * @name: Name of the the type to register (for example:, <literal>ArabicEngineFc</literal>
- * @prefix: Prefix for symbols that will be defined (for example:, <literal>arabic_engine_fc</literal>
- * @class_init: Class initialization function for the new type, or %NULL
- * @instance_init: Instance initialization function for the new type, or %NULL
- *
- * Outputs the necessary code for GObject type registration for a
- * #PangoEngineShape class defined in a module. Two static symbols
- * are defined.
- *
- * <programlisting>
- * static GType <replaceable>prefix</replaceable>_type;
- * static void <replaceable>prefix</replaceable>_register_type (GTypeModule module);
- * </programlisting>
- *
- * The <function><replaceable>prefix</replaceable>_register_type()</function>
- * function should be called in your script_engine_init() function for
- * each type that your module implements, and then your script_engine_create()
- * function can create instances of the object as follows:
- *
- * <informalexample><programlisting>
- * PangoEngine *engine = g_object_new (<replaceable>prefix</replaceable>_type, NULL);
- * </programlisting></informalexample>
- **/
- #define PANGO_ENGINE_SHAPE_DEFINE_TYPE(name, prefix, class_init, instance_init) \
- PANGO_ENGINE_DEFINE_TYPE (name, prefix, \
- class_init, instance_init, \
- PANGO_TYPE_ENGINE_SHAPE)
-
- /* Macro used for possibly builtin Pango modules. Not useful
- * for externally build modules. If we are compiling a module standalone,
- * then we name the entry points script_engine_list, etc. But if we
- * are compiling it for inclusion directly in Pango, then we need them to
- * to have distinct names for this module, so we prepend a prefix.
- *
- * The two intermediate macros are to deal with details of the C
- * preprocessor; token pasting tokens must be function arguments,
- * and macro substitution isn't used on function arguments that
- * are used for token pasting.
- */
- #ifdef PANGO_MODULE_PREFIX
- #define PANGO_MODULE_ENTRY(func) _PANGO_MODULE_ENTRY2(PANGO_MODULE_PREFIX,func)
- #define _PANGO_MODULE_ENTRY2(prefix,func) _PANGO_MODULE_ENTRY3(prefix,func)
- #define _PANGO_MODULE_ENTRY3(prefix,func) prefix##_script_engine_##func
- #else
- #define PANGO_MODULE_ENTRY(func) script_engine_##func
- #endif
-
- #endif /* PANGO_ENABLE_ENGINE */
-
- G_END_DECLS
-
- #endif /* __PANGO_ENGINE_H__ */
|