[HB] Rename harfbuzz-buffer to hb-buffer
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 20 May 2009 09:42:12 +0000 (05:42 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 2 Nov 2009 19:40:15 +0000 (14:40 -0500)
src/Makefile.am
src/harfbuzz-buffer-private.h [deleted file]
src/harfbuzz-buffer.c [deleted file]
src/harfbuzz-buffer.h [deleted file]
src/hb-buffer-private.h [new file with mode: 0644]
src/hb-buffer.c [new file with mode: 0644]
src/hb-buffer.h [new file with mode: 0644]
src/hb-ot-layout-gsubgpos-private.h
src/hb-ot-layout-private.h
src/hb-ot-layout.cc
src/hb-ot-layout.h

index dc92c7a69d5bd164531d03476c2aa9e6c5fd5365..3f662db8b2f287b282ed7fc12a56c5b12c6d3bd4 100644 (file)
@@ -11,7 +11,8 @@ CXX = gcc $(GCCOPTS) -g -fno-rtti -fno-exceptions -Wabi -Wpadded -Wcast-align
 noinst_LTLIBRARIES = libharfbuzz-1.la
 
 HBSOURCES =  \
-       harfbuzz-buffer.c \
+       hb-buffer.c \
+       hb-buffer-private.h \
        hb-private.h \
        hb-ot-layout.cc \
        hb-ot-layout-common-private.h \
@@ -25,7 +26,7 @@ HBSOURCES =  \
 
 HBHEADERS = \
        hb-common.h \
-       harfbuzz-buffer.h \
+       hb-buffer.h \
        hb-ot-layout.h \
        $(NULL)
 
diff --git a/src/harfbuzz-buffer-private.h b/src/harfbuzz-buffer-private.h
deleted file mode 100644 (file)
index 752149f..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2004,2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_BUFFER_PRIVATE_H
-#define HARFBUZZ_BUFFER_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-#define HB_GLYPH_PROPERTY_UNKNOWN 0xFFFF
-
-HB_INTERNAL void
-_hb_buffer_swap( HB_Buffer buffer );
-
-HB_INTERNAL void
-_hb_buffer_clear_output( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_clear_positions( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyphs( HB_Buffer  buffer,
-                             HB_UShort  num_in,
-                             HB_UShort  num_out,
-                             HB_UShort *glyph_data,
-                             HB_UShort  component,
-                             HB_UShort  ligID );
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyph ( HB_Buffer buffer,
-                             HB_UInt   glyph_index,
-                             HB_UShort component,
-                             HB_UShort ligID );
-
-HB_INTERNAL HB_Error
-_hb_buffer_next_glyph ( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_replace_glyph ( HB_Buffer buffer,
-                          HB_UInt   glyph_index );
-
-HB_INTERNAL HB_UShort
-_hb_buffer_allocate_ligid( HB_Buffer buffer );
-
-
-/* convenience macros */
-
-#define IN_GLYPH( pos )        (buffer->in_string[(pos)].gindex)
-#define IN_ITEM( pos )         (&buffer->in_string[(pos)])
-#define IN_CURGLYPH()          (buffer->in_string[buffer->in_pos].gindex)
-#define IN_CURITEM()           (&buffer->in_string[buffer->in_pos])
-#define IN_PROPERTIES( pos )   (buffer->in_string[(pos)].properties)
-#define IN_LIGID( pos )        (buffer->in_string[(pos)].ligID)
-#define IN_COMPONENT( pos )    (buffer->in_string[(pos)].component)
-#define POSITION( pos )        (&buffer->positions[(pos)])
-#define CURPOSITION()          (&buffer->positions[buffer->in_pos])
-#define OUT_GLYPH( pos )       (buffer->out_string[(pos)].gindex)
-#define OUT_ITEM( pos )        (&buffer->out_string[(pos)])
-
-#define CHECK_Property( layout, index, flags, properties )                                     \
-          ({unsigned int _p; error = _hb_ot_layout_check_glyph_property((layout), (index), (flags), (&_p)) \
-                ? HB_Err_Ok : HB_Err_Not_Covered, *(properties) = _p; error;})
-
-#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID )             \
-          ( ( error = _hb_buffer_add_output_glyphs( (buffer),                            \
-                                                   (num_in), (num_out),                \
-                                                    (glyph_data), (component), (ligID)  \
-                                                  ) ) != HB_Err_Ok )
-#define ADD_Glyph( buffer, glyph_index, component, ligID )                             \
-          ( ( error = _hb_buffer_add_output_glyph( (buffer),                             \
-                                                    (glyph_index), (component), (ligID) \
-                                                  ) ) != HB_Err_Ok )
-#define REPLACE_Glyph( buffer, glyph_index )                           \
-          ( ( error = _hb_buffer_replace_glyph( (buffer), (glyph_index) ) ) != HB_Err_Ok )
-#define COPY_Glyph( buffer )                                                           \
-         ( (error = _hb_buffer_next_glyph ( buffer ) ) != HB_Err_Ok )
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_BUFFER_PRIVATE_H */
diff --git a/src/harfbuzz-buffer.c b/src/harfbuzz-buffer.c
deleted file mode 100644 (file)
index 133cb80..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2004,2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-buffer-private.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-gpos-private.h"
-
-/* Here is how the buffer works internally:
- *
- * There are two string pointers: in_string and out_string.  They
- * always have same allocated size, but different length and positions.
- *
- * As an optimization, both in_string and out_string may point to the
- * same piece of memory, which is owned by in_string.  This remains the
- * case as long as:
- *
- *   - copy_glyph() is called
- *   - replace_glyph() is called with inplace=TRUE
- *   - add_output_glyph() and add_output_glyphs() are not called
- *
- * In that case swap(), and copy_glyph(), and replace_glyph() are all
- * mostly no-op.
- *
- * As soon an add_output_glyph[s]() or replace_glyph() with inplace=FALSE is
- * called, out_string is moved over to an alternate buffer (alt_string), and
- * its current contents (out_length entries) are copied to the alt buffer.
- * This should all remain transparent to the user.  swap() then switches
- * in_string and alt_string.  alt_string is not allocated until its needed,
- * but after that it's grown with in_string unconditionally.
- *
- * The buffer->separate_out boolean keeps status of whether out_string points
- * to in_string (FALSE) or alt_string (TRUE).
- */
-
-/* Internal API */
-
-/*static XXX */ void
-hb_buffer_ensure (hb_buffer_t  *buffer,
-                 unsigned int  size)
-{
-  HB_UInt new_allocated = buffer->allocated;
-  /* XXX err handling */
-
-  if (size > new_allocated)
-    {
-      HB_Error error;
-
-      while (size > new_allocated)
-       new_allocated += (new_allocated >> 1) + 8;
-
-      if (buffer->positions)
-       buffer->positions = realloc (buffer->positions, new_allocated * sizeof (buffer->positions[0]));
-
-      buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0]));
-
-      if (buffer->separate_out)
-        {
-         buffer->alt_string = realloc (buffer->alt_string, new_allocated * sizeof (buffer->alt_string[0]));
-         buffer->out_string = buffer->alt_string;
-       }
-      else
-        {
-         buffer->out_string = buffer->in_string;
-
-         if (buffer->alt_string)
-           {
-             free (buffer->alt_string);
-             buffer->alt_string = NULL;
-           }
-       }
-
-      buffer->allocated = new_allocated;
-    }
-}
-
-static HB_Error
-hb_buffer_duplicate_out_buffer (HB_Buffer buffer)
-{
-  if (!buffer->alt_string)
-    buffer->alt_string = malloc (buffer->allocated * sizeof (buffer->alt_string[0]));
-
-  buffer->out_string = buffer->alt_string;
-  memcpy (buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]));
-  buffer->separate_out = TRUE;
-
-  return HB_Err_Ok;
-}
-
-/* Public API */
-
-hb_buffer_t *
-hb_buffer_new (void)
-{
-  hb_buffer_t *buffer;
-
-  buffer = malloc (sizeof (hb_buffer_t));
-  if (HB_UNLIKELY (!buffer))
-    return NULL;
-
-  buffer->allocated = 0;
-  buffer->in_string = NULL;
-  buffer->alt_string = NULL;
-  buffer->positions = NULL;
-
-  hb_buffer_clear (buffer);
-
-  return buffer;
-}
-
-void
-hb_buffer_free (HB_Buffer buffer)
-{
-  free (buffer->in_string);
-  free (buffer->alt_string);
-  free (buffer->positions);
-  free (buffer);
-}
-
-void
-hb_buffer_clear (HB_Buffer buffer)
-{
-  buffer->in_length = 0;
-  buffer->out_length = 0;
-  buffer->in_pos = 0;
-  buffer->out_pos = 0;
-  buffer->out_string = buffer->in_string;
-  buffer->separate_out = FALSE;
-  buffer->max_ligID = 0;
-}
-
-void
-hb_buffer_add_glyph (HB_Buffer buffer,
-                     HB_UInt   glyph_index,
-                     HB_UInt   properties,
-                     HB_UInt   cluster)
-{
-  HB_Error error;
-  HB_GlyphItem glyph;
-  
-  hb_buffer_ensure (buffer, buffer->in_length + 1);
-
-  glyph = &buffer->in_string[buffer->in_length];
-  glyph->gindex = glyph_index;
-  glyph->properties = properties;
-  glyph->cluster = cluster;
-  glyph->component = 0;
-  glyph->ligID = 0;
-  glyph->gproperty = HB_GLYPH_PROPERTY_UNKNOWN;
-
-  buffer->in_length++;
-}
-
-/* HarfBuzz-Internal API */
-
-HB_INTERNAL void
-_hb_buffer_clear_output (HB_Buffer buffer)
-{
-  buffer->out_length = 0;
-  buffer->out_pos = 0;
-  buffer->out_string = buffer->in_string;
-  buffer->separate_out = FALSE;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_clear_positions (HB_Buffer buffer)
-{
-  _hb_buffer_clear_output (buffer);
-
-  if (!buffer->positions)
-    buffer->positions = malloc (buffer->allocated * sizeof (buffer->positions[0]));
-
-  memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length);
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL void
-_hb_buffer_swap (HB_Buffer buffer)
-{
-  HB_GlyphItem tmp_string;
-  int tmp_length;
-  int tmp_pos;
-
-  if (buffer->separate_out)
-    {
-      tmp_string = buffer->in_string;
-      buffer->in_string = buffer->out_string;
-      buffer->out_string = tmp_string;
-      buffer->alt_string = buffer->out_string;
-    }
-
-  tmp_length = buffer->in_length;
-  buffer->in_length = buffer->out_length;
-  buffer->out_length = tmp_length;
-
-  tmp_pos = buffer->in_pos;
-  buffer->in_pos = buffer->out_pos;
-  buffer->out_pos = tmp_pos;
-}
-
-/* The following function copies `num_out' elements from `glyph_data'
-   to `buffer->out_string', advancing the in array pointer in the structure
-   by `num_in' elements, and the out array pointer by `num_out' elements.
-   Finally, it sets the `length' field of `out' equal to
-   `pos' of the `out' structure.
-
-   If `component' is 0xFFFF, the component value from buffer->in_pos
-   will copied `num_out' times, otherwise `component' itself will
-   be used to fill the `component' fields.
-
-   If `ligID' is 0xFFFF, the ligID value from buffer->in_pos
-   will copied `num_out' times, otherwise `ligID' itself will
-   be used to fill the `ligID' fields.
-
-   The properties for all replacement glyphs are taken
-   from the glyph at position `buffer->in_pos'.
-
-   The cluster value for the glyph at position buffer->in_pos is used
-   for all replacement glyphs */
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyphs (HB_Buffer  buffer,
-                             HB_UShort  num_in,
-                             HB_UShort  num_out,
-                             HB_UShort *glyph_data,
-                             HB_UShort  component,
-                             HB_UShort  ligID)
-{
-  HB_Error  error;
-  HB_UShort i;
-  HB_UInt properties;
-  HB_UInt cluster;
-
-  hb_buffer_ensure (buffer, buffer->out_pos + num_out);
-
-  if (!buffer->separate_out)
-    {
-      error = hb_buffer_duplicate_out_buffer (buffer);
-      if (error)
-       return error;
-    }
-
-  properties = buffer->in_string[buffer->in_pos].properties;
-  cluster = buffer->in_string[buffer->in_pos].cluster;
-  if (component == 0xFFFF)
-    component = buffer->in_string[buffer->in_pos].component;
-  if (ligID == 0xFFFF)
-    ligID = buffer->in_string[buffer->in_pos].ligID;
-
-  for (i = 0; i < num_out; i++)
-  {
-    HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i];
-
-    item->gindex = glyph_data[i];
-    item->properties = properties;
-    item->cluster = cluster;
-    item->component = component;
-    item->ligID = ligID;
-    item->gproperty = HB_GLYPH_PROPERTY_UNKNOWN;
-  }
-
-  buffer->in_pos  += num_in;
-  buffer->out_pos += num_out;
-
-  buffer->out_length = buffer->out_pos;
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyph (HB_Buffer buffer,
-                            HB_UInt   glyph_index,
-                            HB_UShort component,
-                            HB_UShort ligID)
-{
-  HB_UShort glyph_data =  glyph_index;
-
-  return _hb_buffer_add_output_glyphs (buffer, 1, 1,
-                                       &glyph_data, component, ligID);
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_next_glyph (HB_Buffer buffer)
-{
-  HB_Error  error;
-
-  if (buffer->separate_out)
-    {
-      hb_buffer_ensure (buffer, buffer->out_pos + 1);
-
-      buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos];
-    }
-
-  buffer->in_pos++;
-  buffer->out_pos++;
-  buffer->out_length = buffer->out_pos;
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_replace_glyph (HB_Buffer buffer,
-                         HB_UInt   glyph_index)
-{
-  if (!buffer->separate_out)
-    {
-      buffer->out_string[buffer->out_pos].gindex = glyph_index;
-
-      buffer->in_pos++;
-      buffer->out_pos++;
-      buffer->out_length = buffer->out_pos;
-    }
-  else
-    {
-      return _hb_buffer_add_output_glyph (buffer, glyph_index, 0xFFFF, 0xFFFF);
-    }
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_UShort
-_hb_buffer_allocate_ligid (HB_Buffer buffer)
-{
-  return ++buffer->max_ligID;
-}
diff --git a/src/harfbuzz-buffer.h b/src/harfbuzz-buffer.h
deleted file mode 100644 (file)
index 668753c..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2004,2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_BUFFER_H
-#define HARFBUZZ_BUFFER_H
-
-#include "hb-common.h"
-
-HB_BEGIN_DECLS();
-
-typedef struct HB_GlyphItemRec_ {
-  hb_codepoint_t gindex;
-  unsigned int   properties;
-  unsigned int   cluster;
-  unsigned short component;
-  unsigned short ligID;
-  unsigned short gproperty;
-} HB_GlyphItemRec, *HB_GlyphItem;
-
-typedef struct HB_PositionRec_ {
-  hb_position_t  x_pos;
-  hb_position_t  y_pos;
-  hb_position_t  x_advance;
-  hb_position_t  y_advance;
-  unsigned short back;         /* number of glyphs to go back
-                                  for drawing current glyph   */
-  hb_bool_t      new_advance;  /* if set, the advance width values are
-                                  absolute, i.e., they won't be
-                                  added to the original glyph's value
-                                  but rather replace them.            */
-  short          cursive_chain; /* character to which this connects,
-                                  may be positive or negative; used
-                                  only internally                     */
-} HB_PositionRec, *HB_Position;
-
-
-typedef struct _hb_buffer_t {
-  unsigned int allocated;
-
-  unsigned int in_length;
-  unsigned int out_length;
-  unsigned int in_pos;
-  unsigned int out_pos;
-  
-  hb_bool_t     separate_out;
-  HB_GlyphItem  in_string;
-  HB_GlyphItem  out_string;
-  HB_GlyphItem  alt_string;
-  HB_Position   positions;
-  unsigned int  max_ligID;
-} HB_BufferRec, *HB_Buffer, hb_buffer_t;
-
-hb_buffer_t *
-hb_buffer_new (void);
-
-void
-hb_buffer_free (hb_buffer_t *buffer);
-
-void
-hb_buffer_clear (hb_buffer_t *buffer);
-
-void
-hb_buffer_add_glyph (hb_buffer_t    *buffer,
-                    hb_codepoint_t  glyph_index,
-                    unsigned int    properties,
-                    unsigned int    cluster);
-
-HB_END_DECLS();
-
-#endif /* HARFBUZZ_BUFFER_H */
diff --git a/src/hb-buffer-private.h b/src/hb-buffer-private.h
new file mode 100644 (file)
index 0000000..dec3130
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 1998-2004  David Turner and Werner Lemberg
+ * Copyright (C) 2004,2007  Red Hat, Inc.
+ *
+ * This is part of HarfBuzz, an OpenType Layout engine library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ */
+
+#ifndef HB_BUFFER_PRIVATE_H
+#define HB_BUFFER_PRIVATE_H
+
+#include "harfbuzz-impl.h"
+#include "hb-buffer.h"
+
+HB_BEGIN_HEADER
+
+#define HB_GLYPH_PROPERTY_UNKNOWN 0xFFFF
+
+HB_INTERNAL void
+_hb_buffer_swap( HB_Buffer buffer );
+
+HB_INTERNAL void
+_hb_buffer_clear_output( HB_Buffer buffer );
+
+HB_INTERNAL HB_Error
+_hb_buffer_clear_positions( HB_Buffer buffer );
+
+HB_INTERNAL HB_Error
+_hb_buffer_add_output_glyphs( HB_Buffer  buffer,
+                             HB_UShort  num_in,
+                             HB_UShort  num_out,
+                             HB_UShort *glyph_data,
+                             HB_UShort  component,
+                             HB_UShort  ligID );
+
+HB_INTERNAL HB_Error
+_hb_buffer_add_output_glyph ( HB_Buffer buffer,
+                             HB_UInt   glyph_index,
+                             HB_UShort component,
+                             HB_UShort ligID );
+
+HB_INTERNAL HB_Error
+_hb_buffer_next_glyph ( HB_Buffer buffer );
+
+HB_INTERNAL HB_Error
+_hb_buffer_replace_glyph ( HB_Buffer buffer,
+                          HB_UInt   glyph_index );
+
+HB_INTERNAL HB_UShort
+_hb_buffer_allocate_ligid( HB_Buffer buffer );
+
+
+/* convenience macros */
+
+#define IN_GLYPH( pos )        (buffer->in_string[(pos)].gindex)
+#define IN_ITEM( pos )         (&buffer->in_string[(pos)])
+#define IN_CURGLYPH()          (buffer->in_string[buffer->in_pos].gindex)
+#define IN_CURITEM()           (&buffer->in_string[buffer->in_pos])
+#define IN_PROPERTIES( pos )   (buffer->in_string[(pos)].properties)
+#define IN_LIGID( pos )        (buffer->in_string[(pos)].ligID)
+#define IN_COMPONENT( pos )    (buffer->in_string[(pos)].component)
+#define POSITION( pos )        (&buffer->positions[(pos)])
+#define CURPOSITION()          (&buffer->positions[buffer->in_pos])
+#define OUT_GLYPH( pos )       (buffer->out_string[(pos)].gindex)
+#define OUT_ITEM( pos )        (&buffer->out_string[(pos)])
+
+#define CHECK_Property( layout, index, flags, properties )                                     \
+          ({unsigned int _p; error = _hb_ot_layout_check_glyph_property((layout), (index), (flags), (&_p)) \
+                ? HB_Err_Ok : HB_Err_Not_Covered, *(properties) = _p; error;})
+
+#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID )             \
+          ( ( error = _hb_buffer_add_output_glyphs( (buffer),                            \
+                                                   (num_in), (num_out),                \
+                                                    (glyph_data), (component), (ligID)  \
+                                                  ) ) != HB_Err_Ok )
+#define ADD_Glyph( buffer, glyph_index, component, ligID )                             \
+          ( ( error = _hb_buffer_add_output_glyph( (buffer),                             \
+                                                    (glyph_index), (component), (ligID) \
+                                                  ) ) != HB_Err_Ok )
+#define REPLACE_Glyph( buffer, glyph_index )                           \
+          ( ( error = _hb_buffer_replace_glyph( (buffer), (glyph_index) ) ) != HB_Err_Ok )
+#define COPY_Glyph( buffer )                                                           \
+         ( (error = _hb_buffer_next_glyph ( buffer ) ) != HB_Err_Ok )
+
+HB_END_HEADER
+
+#endif /* HB_BUFFER_PRIVATE_H */
diff --git a/src/hb-buffer.c b/src/hb-buffer.c
new file mode 100644 (file)
index 0000000..5998126
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 1998-2004  David Turner and Werner Lemberg
+ * Copyright (C) 2004,2007  Red Hat, Inc.
+ *
+ * This is part of HarfBuzz, an OpenType Layout engine library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ */
+
+#include "harfbuzz-impl.h"
+#include "hb-buffer-private.h"
+
+/* Here is how the buffer works internally:
+ *
+ * There are two string pointers: in_string and out_string.  They
+ * always have same allocated size, but different length and positions.
+ *
+ * As an optimization, both in_string and out_string may point to the
+ * same piece of memory, which is owned by in_string.  This remains the
+ * case as long as:
+ *
+ *   - copy_glyph() is called
+ *   - replace_glyph() is called with inplace=TRUE
+ *   - add_output_glyph() and add_output_glyphs() are not called
+ *
+ * In that case swap(), and copy_glyph(), and replace_glyph() are all
+ * mostly no-op.
+ *
+ * As soon an add_output_glyph[s]() or replace_glyph() with inplace=FALSE is
+ * called, out_string is moved over to an alternate buffer (alt_string), and
+ * its current contents (out_length entries) are copied to the alt buffer.
+ * This should all remain transparent to the user.  swap() then switches
+ * in_string and alt_string.  alt_string is not allocated until its needed,
+ * but after that it's grown with in_string unconditionally.
+ *
+ * The buffer->separate_out boolean keeps status of whether out_string points
+ * to in_string (FALSE) or alt_string (TRUE).
+ */
+
+/* Internal API */
+
+/*static XXX */ void
+hb_buffer_ensure (hb_buffer_t  *buffer,
+                 unsigned int  size)
+{
+  HB_UInt new_allocated = buffer->allocated;
+  /* XXX err handling */
+
+  if (size > new_allocated)
+    {
+      HB_Error error;
+
+      while (size > new_allocated)
+       new_allocated += (new_allocated >> 1) + 8;
+
+      if (buffer->positions)
+       buffer->positions = realloc (buffer->positions, new_allocated * sizeof (buffer->positions[0]));
+
+      buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0]));
+
+      if (buffer->separate_out)
+        {
+         buffer->alt_string = realloc (buffer->alt_string, new_allocated * sizeof (buffer->alt_string[0]));
+         buffer->out_string = buffer->alt_string;
+       }
+      else
+        {
+         buffer->out_string = buffer->in_string;
+
+         if (buffer->alt_string)
+           {
+             free (buffer->alt_string);
+             buffer->alt_string = NULL;
+           }
+       }
+
+      buffer->allocated = new_allocated;
+    }
+}
+
+static HB_Error
+hb_buffer_duplicate_out_buffer (HB_Buffer buffer)
+{
+  if (!buffer->alt_string)
+    buffer->alt_string = malloc (buffer->allocated * sizeof (buffer->alt_string[0]));
+
+  buffer->out_string = buffer->alt_string;
+  memcpy (buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]));
+  buffer->separate_out = TRUE;
+
+  return HB_Err_Ok;
+}
+
+/* Public API */
+
+hb_buffer_t *
+hb_buffer_new (void)
+{
+  hb_buffer_t *buffer;
+
+  buffer = malloc (sizeof (hb_buffer_t));
+  if (HB_UNLIKELY (!buffer))
+    return NULL;
+
+  buffer->allocated = 0;
+  buffer->in_string = NULL;
+  buffer->alt_string = NULL;
+  buffer->positions = NULL;
+
+  hb_buffer_clear (buffer);
+
+  return buffer;
+}
+
+void
+hb_buffer_free (HB_Buffer buffer)
+{
+  free (buffer->in_string);
+  free (buffer->alt_string);
+  free (buffer->positions);
+  free (buffer);
+}
+
+void
+hb_buffer_clear (HB_Buffer buffer)
+{
+  buffer->in_length = 0;
+  buffer->out_length = 0;
+  buffer->in_pos = 0;
+  buffer->out_pos = 0;
+  buffer->out_string = buffer->in_string;
+  buffer->separate_out = FALSE;
+  buffer->max_ligID = 0;
+}
+
+void
+hb_buffer_add_glyph (HB_Buffer buffer,
+                     HB_UInt   glyph_index,
+                     HB_UInt   properties,
+                     HB_UInt   cluster)
+{
+  HB_Error error;
+  HB_GlyphItem glyph;
+
+  hb_buffer_ensure (buffer, buffer->in_length + 1);
+
+  glyph = &buffer->in_string[buffer->in_length];
+  glyph->gindex = glyph_index;
+  glyph->properties = properties;
+  glyph->cluster = cluster;
+  glyph->component = 0;
+  glyph->ligID = 0;
+  glyph->gproperty = HB_GLYPH_PROPERTY_UNKNOWN;
+
+  buffer->in_length++;
+}
+
+/* HarfBuzz-Internal API */
+
+HB_INTERNAL void
+_hb_buffer_clear_output (HB_Buffer buffer)
+{
+  buffer->out_length = 0;
+  buffer->out_pos = 0;
+  buffer->out_string = buffer->in_string;
+  buffer->separate_out = FALSE;
+}
+
+HB_INTERNAL HB_Error
+_hb_buffer_clear_positions (HB_Buffer buffer)
+{
+  _hb_buffer_clear_output (buffer);
+
+  if (!buffer->positions)
+    buffer->positions = malloc (buffer->allocated * sizeof (buffer->positions[0]));
+
+  memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length);
+
+  return HB_Err_Ok;
+}
+
+HB_INTERNAL void
+_hb_buffer_swap (HB_Buffer buffer)
+{
+  HB_GlyphItem tmp_string;
+  int tmp_length;
+  int tmp_pos;
+
+  if (buffer->separate_out)
+    {
+      tmp_string = buffer->in_string;
+      buffer->in_string = buffer->out_string;
+      buffer->out_string = tmp_string;
+      buffer->alt_string = buffer->out_string;
+    }
+
+  tmp_length = buffer->in_length;
+  buffer->in_length = buffer->out_length;
+  buffer->out_length = tmp_length;
+
+  tmp_pos = buffer->in_pos;
+  buffer->in_pos = buffer->out_pos;
+  buffer->out_pos = tmp_pos;
+}
+
+/* The following function copies `num_out' elements from `glyph_data'
+   to `buffer->out_string', advancing the in array pointer in the structure
+   by `num_in' elements, and the out array pointer by `num_out' elements.
+   Finally, it sets the `length' field of `out' equal to
+   `pos' of the `out' structure.
+
+   If `component' is 0xFFFF, the component value from buffer->in_pos
+   will copied `num_out' times, otherwise `component' itself will
+   be used to fill the `component' fields.
+
+   If `ligID' is 0xFFFF, the ligID value from buffer->in_pos
+   will copied `num_out' times, otherwise `ligID' itself will
+   be used to fill the `ligID' fields.
+
+   The properties for all replacement glyphs are taken
+   from the glyph at position `buffer->in_pos'.
+
+   The cluster value for the glyph at position buffer->in_pos is used
+   for all replacement glyphs */
+HB_INTERNAL HB_Error
+_hb_buffer_add_output_glyphs (HB_Buffer  buffer,
+                             HB_UShort  num_in,
+                             HB_UShort  num_out,
+                             HB_UShort *glyph_data,
+                             HB_UShort  component,
+                             HB_UShort  ligID)
+{
+  HB_Error  error;
+  HB_UShort i;
+  HB_UInt properties;
+  HB_UInt cluster;
+
+  hb_buffer_ensure (buffer, buffer->out_pos + num_out);
+
+  if (!buffer->separate_out)
+    {
+      error = hb_buffer_duplicate_out_buffer (buffer);
+      if (error)
+       return error;
+    }
+
+  properties = buffer->in_string[buffer->in_pos].properties;
+  cluster = buffer->in_string[buffer->in_pos].cluster;
+  if (component == 0xFFFF)
+    component = buffer->in_string[buffer->in_pos].component;
+  if (ligID == 0xFFFF)
+    ligID = buffer->in_string[buffer->in_pos].ligID;
+
+  for (i = 0; i < num_out; i++)
+  {
+    HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i];
+
+    item->gindex = glyph_data[i];
+    item->properties = properties;
+    item->cluster = cluster;
+    item->component = component;
+    item->ligID = ligID;
+    item->gproperty = HB_GLYPH_PROPERTY_UNKNOWN;
+  }
+
+  buffer->in_pos  += num_in;
+  buffer->out_pos += num_out;
+
+  buffer->out_length = buffer->out_pos;
+
+  return HB_Err_Ok;
+}
+
+HB_INTERNAL HB_Error
+_hb_buffer_add_output_glyph (HB_Buffer buffer,
+                            HB_UInt   glyph_index,
+                            HB_UShort component,
+                            HB_UShort ligID)
+{
+  HB_UShort glyph_data =  glyph_index;
+
+  return _hb_buffer_add_output_glyphs (buffer, 1, 1,
+                                       &glyph_data, component, ligID);
+}
+
+HB_INTERNAL HB_Error
+_hb_buffer_next_glyph (HB_Buffer buffer)
+{
+  HB_Error  error;
+
+  if (buffer->separate_out)
+    {
+      hb_buffer_ensure (buffer, buffer->out_pos + 1);
+
+      buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos];
+    }
+
+  buffer->in_pos++;
+  buffer->out_pos++;
+  buffer->out_length = buffer->out_pos;
+
+  return HB_Err_Ok;
+}
+
+HB_INTERNAL HB_Error
+_hb_buffer_replace_glyph (HB_Buffer buffer,
+                         HB_UInt   glyph_index)
+{
+  if (!buffer->separate_out)
+    {
+      buffer->out_string[buffer->out_pos].gindex = glyph_index;
+
+      buffer->in_pos++;
+      buffer->out_pos++;
+      buffer->out_length = buffer->out_pos;
+    }
+  else
+    {
+      return _hb_buffer_add_output_glyph (buffer, glyph_index, 0xFFFF, 0xFFFF);
+    }
+
+  return HB_Err_Ok;
+}
+
+HB_INTERNAL HB_UShort
+_hb_buffer_allocate_ligid (HB_Buffer buffer)
+{
+  return ++buffer->max_ligID;
+}
diff --git a/src/hb-buffer.h b/src/hb-buffer.h
new file mode 100644 (file)
index 0000000..93ac3ee
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 1998-2004  David Turner and Werner Lemberg
+ * Copyright (C) 2004,2007  Red Hat, Inc.
+ *
+ * This is part of HarfBuzz, an OpenType Layout engine library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
+ */
+
+#ifndef HB_BUFFER_H
+#define HB_BUFFER_H
+
+#include "hb-common.h"
+
+HB_BEGIN_DECLS();
+
+typedef struct HB_GlyphItemRec_ {
+  hb_codepoint_t gindex;
+  unsigned int   properties;
+  unsigned int   cluster;
+  unsigned short component;
+  unsigned short ligID;
+  unsigned short gproperty;
+} HB_GlyphItemRec, *HB_GlyphItem;
+
+typedef struct HB_PositionRec_ {
+  hb_position_t  x_pos;
+  hb_position_t  y_pos;
+  hb_position_t  x_advance;
+  hb_position_t  y_advance;
+  unsigned short back;         /* number of glyphs to go back
+                                  for drawing current glyph   */
+  hb_bool_t      new_advance;  /* if set, the advance width values are
+                                  absolute, i.e., they won't be
+                                  added to the original glyph's value
+                                  but rather replace them.            */
+  short          cursive_chain; /* character to which this connects,
+                                  may be positive or negative; used
+                                  only internally                     */
+} HB_PositionRec, *HB_Position;
+
+
+typedef struct _hb_buffer_t {
+  unsigned int allocated;
+
+  unsigned int in_length;
+  unsigned int out_length;
+  unsigned int in_pos;
+  unsigned int out_pos;
+
+  hb_bool_t     separate_out;
+  HB_GlyphItem  in_string;
+  HB_GlyphItem  out_string;
+  HB_GlyphItem  alt_string;
+  HB_Position   positions;
+  unsigned int  max_ligID;
+} HB_BufferRec, *HB_Buffer, hb_buffer_t;
+
+hb_buffer_t *
+hb_buffer_new (void);
+
+void
+hb_buffer_free (hb_buffer_t *buffer);
+
+void
+hb_buffer_clear (hb_buffer_t *buffer);
+
+void
+hb_buffer_add_glyph (hb_buffer_t    *buffer,
+                    hb_codepoint_t  glyph_index,
+                    unsigned int    properties,
+                    unsigned int    cluster);
+
+HB_END_DECLS();
+
+#endif /* HB_BUFFER_H */
index 758841c6ce3fa0f1be0c23c26cd050d0763cac0a..2f5a94bb3584cbd5c6af52d92c4b21eb7b70d5de 100644 (file)
@@ -28,7 +28,7 @@
 #define HB_OT_LAYOUT_GSUBGPOS_PRIVATE_H
 
 #include "hb-ot-layout-gdef-private.h"
-#include "harfbuzz-buffer-private.h" /* XXX */
+#include "hb-buffer-private.h" /* XXX */
 
 
 #define APPLY_ARG_DEF \
index 80c36b4e78ea25e770fa2149ed3bcc73d0f5caa2..a469119e453ca7b1c6eecf1e8788fc9a70274188 100644 (file)
@@ -31,7 +31,7 @@
 #include "hb-ot-layout.h"
 
 /* XXX */
-#include "harfbuzz-buffer.h"
+#include "hb-buffer.h"
 
 
 typedef unsigned int hb_ot_layout_class_t;
index 5e3b483ccf93e632dbceeb03052aa37db66d25fd..a98a34d8c2ec38c452ee0ec991934fe7ff6e1389 100644 (file)
@@ -28,6 +28,9 @@
 
 #define HB_OT_LAYOUT_CC
 
+/* XXX */
+#include "hb-buffer-private.h"
+
 #include "hb-ot-layout.h"
 #include "hb-ot-layout-private.h"
 
@@ -36,8 +39,6 @@
 #include "hb-ot-layout-gsub-private.h"
 #include "hb-ot-layout-gpos-private.h"
 
-/* XXX */
-#include "harfbuzz-buffer-private.h"
 
 #include <stdlib.h>
 #include <string.h>
index 6aa05fcc66a7aa1483ac6eca6942a2a8b042fae6..c1dbdcae311675859ab6d7c32044c23cd6e36868 100644 (file)
@@ -28,7 +28,7 @@
 #define HB_OT_LAYOUT_H
 
 #include "hb-common.h"
-#include "harfbuzz-buffer.h"
+#include "hb-buffer.h"
 
 HB_BEGIN_DECLS();