Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2006  Red Hat, Inc.
      3  *
      4  * This is part of HarfBuzz, an OpenType Layout engine library.
      5  *
      6  * Permission is hereby granted, without written agreement and without
      7  * license or royalty fees, to use, copy, modify, and distribute this
      8  * software and its documentation for any purpose, provided that the
      9  * above copyright notice and the following two paragraphs appear in
     10  * all copies of this software.
     11  *
     12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
     13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
     14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
     15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
     16  * DAMAGE.
     17  *
     18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
     19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
     20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
     21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
     22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
     23  *
     24  * Red Hat Author(s): Owen Taylor
     25  */
     26 
     27 #include <stdint.h>
     28 
     29 /* Base Types */
     30 
     31 typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */
     32 typedef char HB_Boolean;
     33 typedef hb_uint32 HB_Fixed; /* 26.6 */
     34 typedef hb_uint32 HB_Glyph;
     35 typedef hb_uint32 HB_Unichar;
     36 
     37 /* Metrics reported by the font backend for use of the shaper */
     38 typedef struct _HB_GlyphMetrics HB_GlyphMetrics;
     39 struct _HB_GlyphMetrics
     40 {
     41     HB_Fixed advance;
     42 
     43     /* Do we need ink/logical extents for the glyph here? */
     44 };
     45 
     46 /*
     47  * HB_Font: Abstract font interface.
     48  *  First pass of this might just have FT_Face *getFace();
     49  */
     50 typedef struct _HB_Font HB_Font;
     51 typedef struct _HB_FontClass HB_FontClass;
     52 
     53 struct HB_FontClass {
     54     HB_Glyph   (*charToGlyph)(HB_Font *font, HB_Unichar chr);
     55     void       (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
     56     HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int *len);
     57     HB_Boolean (*freeSFontTable)(void **cookie);
     58 };
     59 
     60 struct _HB_Font {
     61     HB_FontClass *clazz;
     62 };
     63 
     64 /*
     65  * Language tags, of the form en-us; represented as interned, canonicalized
     66  * strings. hb_language_from_string("en_US"), hb_language_from_string("en-us")
     67  * both return the same (pointer-comparable) HB_Language).
     68  */
     69 typedef struct HB_Language_ *HB_Language;
     70 
     71 HB_Language hb_language_from_string(const char *str);
     72 const char *hb_language_to_string(HB_Language language);
     73 
     74 /* Special treatment for the edges of runs.
     75  */
     76 typedef enum {
     77     HB_RUN_EDGE_LINE_VISUAL_EDGE    = 1 << 0,
     78     HB_RUN_EDGE_LINE_LOGICAL_EDGE   = 1 << 1,
     79     HB_RUN_EDGE_LINE_ADD_HYPHEN     = 1 << 2  /* ???? */
     80 } HB_RunEdge;
     81 
     82 /* Defines optional informaiton in HB_ShapeInput; this allows extension
     83  * of HB_ShapeInput while keeping binary compatibility
     84  */
     85 typedef enum {
     86     HB_SHAPE_START_TYPE = 1 << 0,
     87     HB_SHAPE_END_TYPE   = 1 << 1
     88 } HB_ShapeFlags;
     89 
     90 /* Attributes types are described by "interned strings"; this is a little
     91  * annoying if you want to write a switch statement, but keeps things
     92  * simple.
     93  */
     94 typedef struct _HB_AttributeType *HB_AttributeType;
     95 
     96 HB_AttributeType hb_attribute_type_from_string(const char *str);
     97 const char *hb_attribute_type_to_string(HB_AttributeType attribute_type);
     98 
     99 struct HB_Attribute {
    100     HB_AttributeType type;
    101     int start;
    102     int end;
    103 };
    104 
    105 
    106 /**
    107  * You could handle this like HB_Language, but an enum seems a little nicer;
    108  * another approach would be to use OpenType script tags.
    109  */
    110 typedef enum {
    111     HB_SCRIPT_LATIN
    112     /* ... */
    113 } HB_ShapeScript;
    114 
    115 /* This is just the subset of direction information needed by the shaper */
    116 typedef enum {
    117     HB_DIRECTION_LTR,
    118     HB_DIRECTION_RTL,
    119     HB_DIRECTION_TTB
    120 } HB_Direction;
    121 
    122 typedef struct _HB_ShapeInput HB_ShapeInput;
    123 struct _HB_ShapeInput {
    124     /* Defines what fields the caller has initialized - fields not in
    125      * the enum are mandatory.
    126      */
    127     HB_ShapeFlags flags;
    128 
    129     HB_CodePoint *text;
    130     int length;       /* total length of text to shape */
    131     int shape_offset; /* start of section to shape */
    132     int shape_length; /* number of code points to shape */
    133 
    134     HB_Direction direction;
    135     HB_ShapeScript script;
    136     HB_Language language;
    137 
    138     HB_AttributeType *attributes;
    139     int n_attributes;
    140 
    141     HB_RunEdge start_type;
    142     HB_RunEdge end_type;
    143 };
    144 
    145 struct HB_GlyphItem {
    146     HB_Glyph glyph;
    147 
    148     HB_Fixed x_offset;
    149     HB_Fixed y_offset;
    150     HB_Fixed advance;
    151 
    152     /* Add kashida information, etc, here */
    153 };
    154 
    155 typedef enum {
    156     HB_RESULT_SUCCESS,
    157     HB_RESULT_NO_MEMORY,
    158     HB_SHAPE_RESULT_FAILED
    159 } HB_Result;
    160 
    161 /*
    162  * Buffer for output
    163  */
    164 typedef struct _HB_GlyphBuffer HB_GlyphBuffer;
    165 struct _HB_GlyphBuffer {
    166     int glyph_item_size;
    167     int total_glyphs;
    168 
    169     int *log_clusters; /* Uniscribe style */
    170     int cluster_space;
    171 
    172     int glyph_space;
    173     void *glyph_buffer;
    174 };
    175 
    176 /* Making this self-allocating simplifies writing shapers and
    177  * also keeps things easier for caller. item_size passed in
    178  * must be at least sizeof(HB_GlyphItem) but can be bigger,
    179  * to accomodate application structures that extend HB_GlyphItem.
    180  * The allocated items will be zero-initialized.
    181  *
    182  * (Hack: Harfbuzz could choose to use even a *bigger* item size
    183  * and stick internal information before the public item structure.
    184  * This hack could possibly be used to unify this with HB_Buffer)
    185  */
    186 HB_GlyphBuffer *hb_glyph_buffer_new             (size_t item_size);
    187 void            hb_glyph_buffer_clear           (HB_GlyphBuffer *buf);
    188 HB_Result       hb_glyph_buffer_extend_glyphs   (HB_GlyphBuffer *buf, int n_items);
    189 HB_Result       hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters);
    190 void            hb_glyph_buffer_free            (HB_GlyphBuffer *buf);
    191 
    192 
    193 /* Accessor for a particular glyph */
    194 #define HB_GLYPH_BUFFER_ITEM(buffer, index)
    195 
    196 /*
    197  * Main shaping function
    198  */
    199 HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output);
    200