hb-buffer-serialize.cc revision d3e14aafff60e1314d0ef66e42cdde6bf949bb66
1d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod/* 2d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * Copyright © 2012,2013 Google, Inc. 3d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * 4d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 5d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * 6d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * Permission is hereby granted, without written agreement and without 7d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 8d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * software and its documentation for any purpose, provided that the 9d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 10d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * all copies of this software. 11d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * 12d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * DAMAGE. 17d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * 18d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * 24d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod * Google Author(s): Behdad Esfahbod 25d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod */ 26d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 27d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod#include "hb-buffer-private.hh" 28d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 29d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 30d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodstatic const char *serialize_formats[] = { 31d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod "text", 32d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod "json", 33d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod NULL 34d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod}; 35d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 36d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodconst char ** 37d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_list_formats (void) 38d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 39d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return serialize_formats; 40d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 41d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 42d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_format_t 43d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_format_from_string (const char *str, int len) 44d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 45d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod /* Upper-case it. */ 46d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return (hb_buffer_serialize_format_t) (hb_tag_from_string (str, len) & ~0x20202020); 47d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 48d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 49d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodconst char * 50d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format) 51d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 52d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod switch (format) 53d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 54d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0]; 55d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1]; 56d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod default: 57d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_INVALID: return NULL; 58d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 59d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 60d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 61d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodstatic unsigned int 62d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod_hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, 63d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int start, 64d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int end, 65d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *buf, 66d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_size, 67d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int *buf_consumed, 68d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, 69d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_flags_t flags) 70d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 71d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL); 72d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL); 73d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 74d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed = 0; 75d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod for (unsigned int i = start; i < end; i++) 76d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 77d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char b[1024]; 78d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *p = b; 79d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 80d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod /* In the following code, we know b is large enough that no overflow can happen. */ 81d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 82d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod#define APPEND(s) HB_STMT_START { strcpy (p, s); p += strlen (s); } HB_STMT_END 83d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 84d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (i) 85d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = ','; 86d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 87d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '{'; 88d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 89d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod APPEND ("\"g\":"); 90d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES)) 91d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 92d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char g[128]; 93d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g)); 94d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '"'; 95d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod for (char *q = g; *q; q++) { 96d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (*q == '"') 97d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '\\'; 98d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = *q; 99d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 100d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '"'; 101d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 102d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod else 103d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint); 104d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 105d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { 106d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster); 107d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 108d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 109d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) 110d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 111d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", 112d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod pos[i].x_offset, pos[i].y_offset); 113d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", 114d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod pos[i].x_advance, pos[i].y_advance); 115d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 116d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 117d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '}'; 118d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 119d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (buf_size > (p - b)) 120d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 121d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int l = p - b; 122d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod memcpy (buf, b, l); 123d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf += l; 124d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf_size -= l; 125d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed += l; 126d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf = '\0'; 127d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } else 128d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return i - start; 129d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 130d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 131d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return end - start; 132d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 133d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 134d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodstatic unsigned int 135d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod_hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, 136d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int start, 137d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int end, 138d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *buf, 139d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_size, 140d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int *buf_consumed, 141d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, 142d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_flags_t flags) 143d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 144d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL); 145d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL); 146d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_direction_t direction = hb_buffer_get_direction (buffer); 147d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 148d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed = 0; 149d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod for (unsigned int i = start; i < end; i++) 150d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 151d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char b[1024]; 152d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *p = b; 153d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 154d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod /* In the following code, we know b is large enough that no overflow can happen. */ 155d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 156d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (i) 157d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '|'; 158d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 159d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES)) 160d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 161d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_glyph_to_string (font, info[i].codepoint, p, 128); 162d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += strlen (p); 163d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 164d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod else 165d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint); 166d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 167d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { 168d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster); 169d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 170d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 171d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) 172d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 173d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (pos[i].x_offset || pos[i].y_offset) 174d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset); 175d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 176d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '+'; 177d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (HB_DIRECTION_IS_HORIZONTAL (direction) || pos[i].x_advance) 178d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance); 179d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (HB_DIRECTION_IS_VERTICAL (direction) || pos->y_advance) 180d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance); 181d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 182d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 183d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (buf_size > (p - b)) 184d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 185d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int l = p - b; 186d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod memcpy (buf, b, l); 187d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf += l; 188d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf_size -= l; 189d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed += l; 190d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf = '\0'; 191d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } else 192d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return i - start; 193d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 194d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 195d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return end - start; 196d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 197d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 198d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod/* Returns number of items, starting at start, that were serialized. */ 199d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodunsigned int 200d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_glyphs (hb_buffer_t *buffer, 201d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int start, 202d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int end, 203d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *buf, 204d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_size, 205d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int *buf_consumed, 206d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, /* May be NULL */ 207d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_format_t format, 208d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_flags_t flags) 209d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 210d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod assert (start <= end && end <= buffer->len); 211d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 212d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed = 0; 213d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 214d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || 215d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); 216d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 217d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (unlikely (start == end)) 218d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return 0; 219d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 220d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!font) 221d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod font = hb_font_get_empty (); 222d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 223d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod switch (format) 224d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 225d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_TEXT: 226d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return _hb_buffer_serialize_glyphs_text (buffer, start, end, 227d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf, buf_size, buf_consumed, 228d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod font, flags); 229d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 230d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_JSON: 231d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return _hb_buffer_serialize_glyphs_json (buffer, start, end, 232d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf, buf_size, buf_consumed, 233d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod font, flags); 234d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 235d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod default: 236d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_INVALID: 237d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return 0; 238d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 239d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 240d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 241d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 242d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_bool_t 243d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_deserialize_glyphs (hb_buffer_t *buffer, 244d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod const char *buf, 245d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_len, 246d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int *buf_consumed, 247d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, /* May be NULL */ 248d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_format_t format) 249d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 250d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return false; 251d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 252