diff --git a/src/Makefile.am b/src/Makefile.am index ff5a6d283..e999c6c34 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -28,11 +28,12 @@ HBSOURCES = \ hb-open-type-private.hh \ hb-ot-head-private.hh \ hb-ot-maxp-private.hh \ + hb-ot-name-private.hh \ + hb-ot-tag.cc \ hb-private.hh \ hb-shape.cc \ hb-unicode-private.hh \ hb-unicode.cc \ - hb-ot-tag.cc \ $(NULL) HBHEADERS = \ hb.h \ diff --git a/src/hb-ot-name-private.hh b/src/hb-ot-name-private.hh new file mode 100644 index 000000000..cbc8c81b0 --- /dev/null +++ b/src/hb-ot-name-private.hh @@ -0,0 +1,91 @@ +/* + * Copyright © 2011 Google, Inc. + * + * This is part of HarfBuzz, a text shaping 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. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_NAME_PRIVATE_HH +#define HB_OT_NAME_PRIVATE_HH + +#include "hb-open-type-private.hh" + + + +/* + * name + */ + +#define HB_OT_TAG_name HB_TAG('n','a','m','e') + +struct NameRecord +{ + inline bool sanitize (hb_sanitize_context_t *c, void *base) { + TRACE_SANITIZE (); + /* We can check from base all the way up to the end of string... */ + return c->check_struct (this) && + c->check_range ((char *) base, (unsigned int) length + offset); + } + + USHORT platformID; /* Platform ID. */ + USHORT encodingID; /* Platform-specific encoding ID. */ + USHORT languageID; /* Language ID. */ + USHORT nameID; /* Name ID. */ + USHORT length; /* String length (in bytes). */ + USHORT offset; /* String offset from start of storage area (in bytes). */ + public: + DEFINE_SIZE_STATIC (12); +}; + +struct name +{ + static const hb_tag_t Tag = HB_OT_TAG_name; + + inline bool sanitize_records (hb_sanitize_context_t *c) { + TRACE_SANITIZE (); + unsigned int _count = count; + for (unsigned int i = 0; i < _count; i++) + if (!nameRecord[i].sanitize (c, this + stringOffset)) return false; + return true; + } + + inline bool sanitize (hb_sanitize_context_t *c) { + TRACE_SANITIZE (); + return c->check_struct (this) && + likely (format == 0 || format == 1) && + c->check_array (nameRecord, nameRecord[0].static_size, count) && + sanitize_records (c); + } + + /* We only implement format 0 for now. */ + private: + USHORT format; /* Format selector (=0/1). */ + USHORT count; /* Number of name records. */ + Offset stringOffset; /* Offset to start of string storage (from start of table). */ + NameRecord nameRecord[VAR]; /* The name records where count is the number of records. */ + public: + DEFINE_SIZE_ARRAY (6, nameRecord); +}; + + + +#endif /* HB_OT_NAME_PRIVATE_HH */ diff --git a/src/hb-uniscribe-shape.cc b/src/hb-uniscribe-shape.cc index 6c93f3b72..ecc801e3a 100644 --- a/src/hb-uniscribe-shape.cc +++ b/src/hb-uniscribe-shape.cc @@ -28,17 +28,19 @@ #include "hb-private.hh" +#include +#include + +typedef ULONG WIN_ULONG; + #include "hb-uniscribe.h" +#include "hb-ot-name-private.hh" #include "hb-ot-tag.h" #include "hb-font-private.hh" - #include "hb-buffer-private.hh" -#include -#include - #ifndef HB_DEBUG_UNISCRIBE @@ -143,7 +145,7 @@ retry: SCRIPT_ITEM items[MAX_ITEMS + 1]; SCRIPT_STATE bidi_state = {0}; - ULONG script_tags[MAX_ITEMS]; + WIN_ULONG script_tags[MAX_ITEMS]; int item_count; bidi_state.uBidiLevel = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;