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 36288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod/** 37288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * hb_buffer_serialize_list_formats: 38288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 39288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 40288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 41288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Return value: (transfer none): 42288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 43288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Since: 1.0 44288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod **/ 45d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodconst char ** 46d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_list_formats (void) 47d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 48d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return serialize_formats; 49d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 50d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 51288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod/** 52288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * hb_buffer_serialize_format_from_string: 53288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @str: 54288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @len: 55288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 56288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 57288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 58288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Return value: 59288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 60288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Since: 1.0 61288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod **/ 62d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_format_t 63d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_format_from_string (const char *str, int len) 64d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 65d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod /* Upper-case it. */ 667627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod return (hb_buffer_serialize_format_t) (hb_tag_from_string (str, len) & ~0x20202020u); 67d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 68d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 69288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod/** 70288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * hb_buffer_serialize_format_to_string: 71288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @format: 72288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 73288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 74288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 75288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Return value: 76288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 77288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Since: 1.0 78288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod **/ 79d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodconst char * 80d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format) 81d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 82d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod switch (format) 83d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 84d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0]; 85d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1]; 86d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod default: 87d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_INVALID: return NULL; 88d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 89d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 90d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 91d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodstatic unsigned int 92d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod_hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, 93d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int start, 94d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int end, 95d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *buf, 96d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_size, 97d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int *buf_consumed, 98d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, 99d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_flags_t flags) 100d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 101d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL); 102d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL); 103d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 104d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed = 0; 105d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod for (unsigned int i = start; i < end; i++) 106d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 107d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char b[1024]; 108d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *p = b; 109d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 110d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod /* In the following code, we know b is large enough that no overflow can happen. */ 111d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 112d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod#define APPEND(s) HB_STMT_START { strcpy (p, s); p += strlen (s); } HB_STMT_END 113d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 114d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (i) 115d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = ','; 116d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 117d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '{'; 118d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 119d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod APPEND ("\"g\":"); 120d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES)) 121d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 122d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char g[128]; 123d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g)); 124d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '"'; 125d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod for (char *q = g; *q; q++) { 126d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (*q == '"') 127d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '\\'; 128d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = *q; 129d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 130d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '"'; 131d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 132d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod else 13338b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); 134d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 135d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { 13638b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster)); 137d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 138d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 139d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) 140d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 141d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", 142d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod pos[i].x_offset, pos[i].y_offset); 143d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", 144d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod pos[i].x_advance, pos[i].y_advance); 145d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 146d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 147d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '}'; 148d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 149176fd17d02ac183af32a0e710ec32d25c9322021Behdad Esfahbod unsigned int l = p - b; 150176fd17d02ac183af32a0e710ec32d25c9322021Behdad Esfahbod if (buf_size > l) 151d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 152d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod memcpy (buf, b, l); 153d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf += l; 154d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf_size -= l; 155d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed += l; 156d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf = '\0'; 157d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } else 158d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return i - start; 159d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 160d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 161d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return end - start; 162d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 163d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 164d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodstatic unsigned int 165d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod_hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, 166d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int start, 167d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int end, 168d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *buf, 169d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_size, 170d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int *buf_consumed, 171d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, 172d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_flags_t flags) 173d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 174d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL); 175d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL); 176d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 177d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed = 0; 178d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod for (unsigned int i = start; i < end; i++) 179d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 180d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char b[1024]; 181d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *p = b; 182d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 183d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod /* In the following code, we know b is large enough that no overflow can happen. */ 184d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 185d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (i) 186d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '|'; 187d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 188d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES)) 189d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 190d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_glyph_to_string (font, info[i].codepoint, p, 128); 191d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod p += strlen (p); 192d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 193d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod else 19438b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); 195d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 196d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { 19738b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster)); 198d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 199d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 200d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) 201d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 202d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (pos[i].x_offset || pos[i].y_offset) 20338b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset)); 204d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 205d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *p++ = '+'; 20638b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); 20762299826f4905e080b9497bce335e093b287494eBehdad Esfahbod if (pos[i].y_advance) 20838b8b40526a85f33521542e24d1e0c82588efc85Behdad Esfahbod p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); 209d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 210d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 211176fd17d02ac183af32a0e710ec32d25c9322021Behdad Esfahbod unsigned int l = p - b; 212176fd17d02ac183af32a0e710ec32d25c9322021Behdad Esfahbod if (buf_size > l) 213d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 214d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod memcpy (buf, b, l); 215d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf += l; 216d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf_size -= l; 217d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed += l; 218d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf = '\0'; 219d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } else 220d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return i - start; 221d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 222d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 223d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return end - start; 224d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 225d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 226d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod/* Returns number of items, starting at start, that were serialized. */ 227288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod/** 228288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * hb_buffer_serialize_glyphs: 229288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buffer: a buffer. 230288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @start: 231288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @end: 232288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buf: (array length=buf_size): 233288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buf_size: 234288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buf_consumed: (out): 235288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @font: 236288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @format: 237288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @flags: 238288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 239288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 240288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 241288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Return value: 242288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 243288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Since: 1.0 244288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod **/ 245d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodunsigned int 246d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_serialize_glyphs (hb_buffer_t *buffer, 247d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int start, 248d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int end, 249d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod char *buf, 250d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod unsigned int buf_size, 251bcc8f32b4c46cd73f591924c64a6f63df6eaf9e7Behdad Esfahbod unsigned int *buf_consumed, /* May be NULL */ 252d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, /* May be NULL */ 253d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_format_t format, 254d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_flags_t flags) 255d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 256d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod assert (start <= end && end <= buffer->len); 257d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 258bcc8f32b4c46cd73f591924c64a6f63df6eaf9e7Behdad Esfahbod unsigned int sconsumed; 259bcc8f32b4c46cd73f591924c64a6f63df6eaf9e7Behdad Esfahbod if (!buf_consumed) 260bcc8f32b4c46cd73f591924c64a6f63df6eaf9e7Behdad Esfahbod buf_consumed = &sconsumed; 261d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod *buf_consumed = 0; 262d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 263d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || 264d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); 265d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 266d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (unlikely (start == end)) 267d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return 0; 268d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 269d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod if (!font) 270d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod font = hb_font_get_empty (); 271d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 272d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod switch (format) 273d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod { 274d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_TEXT: 275d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return _hb_buffer_serialize_glyphs_text (buffer, start, end, 276d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf, buf_size, buf_consumed, 277d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod font, flags); 278d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 279d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_JSON: 280d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return _hb_buffer_serialize_glyphs_json (buffer, start, end, 281d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod buf, buf_size, buf_consumed, 282d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod font, flags); 283d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 284d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod default: 285d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_INVALID: 286d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod return 0; 287d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 288d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod } 289d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 290d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod 291e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 292e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbodstatic hb_bool_t 29320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodparse_uint (const char *pp, const char *end, uint32_t *pv) 294e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod{ 29520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod char buf[32]; 29620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); 29720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod strncpy (buf, pp, len); 29820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod buf[len] = '\0'; 29920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 30020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod char *p = buf; 30120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod char *pend = p; 30220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod uint32_t v; 30320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 30420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod errno = 0; 30520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod v = strtol (p, &pend, 10); 30620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod if (errno || p == pend || pend - p != end - pp) 30720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return false; 30820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 30920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod *pv = v; 31020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return true; 311e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod} 312e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 31320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodstatic hb_bool_t 31420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodparse_int (const char *pp, const char *end, int32_t *pv) 31520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod{ 31620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod char buf[32]; 31720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); 31820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod strncpy (buf, pp, len); 31920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod buf[len] = '\0'; 32020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 32120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod char *p = buf; 32220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod char *pend = p; 32320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod int32_t v; 32420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 32520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod errno = 0; 32620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod v = strtol (p, &pend, 10); 32720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod if (errno || p == pend || pend - p != end - pp) 32820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return false; 32920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 33020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod *pv = v; 33120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return true; 33220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod} 33320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 33420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod#include "hb-buffer-deserialize-json.hh" 335847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod#include "hb-buffer-deserialize-text.hh" 336e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 337288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod/** 338288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * hb_buffer_deserialize_glyphs: 339288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buffer: a buffer. 340288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buf: (array length=buf_len): 341288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @buf_len: 342288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @end_ptr: (out): 343288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @font: 344288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * @format: 345288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 346288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 347288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 348288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Return value: 349288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * 350288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod * Since: 1.0 351288f2899979bcc9e68f8115cb76e3271ed0e17bcBehdad Esfahbod **/ 352d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_bool_t 353d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbodhb_buffer_deserialize_glyphs (hb_buffer_t *buffer, 354d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod const char *buf, 355e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod int buf_len, /* -1 means nul-terminated */ 356847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod const char **end_ptr, /* May be NULL */ 357d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_font_t *font, /* May be NULL */ 358d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod hb_buffer_serialize_format_t format) 359d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod{ 360847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod const char *end; 361847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod if (!end_ptr) 362847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod end_ptr = &end; 363847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod *end_ptr = buf; 364e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 365e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || 366e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); 367e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 368e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod if (buf_len == -1) 369e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod buf_len = strlen (buf); 370e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 371e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod if (!buf_len) 372e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod { 373847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod *end_ptr = buf; 374847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod return false; 375e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod } 376e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 377e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_GLYPHS); 378e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 379e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod if (!font) 380e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod font = hb_font_get_empty (); 381e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 382e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod switch (format) 383e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod { 384e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_TEXT: 385e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod return _hb_buffer_deserialize_glyphs_text (buffer, 386847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod buf, buf_len, end_ptr, 387e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod font); 388e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 389e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_JSON: 390e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod return _hb_buffer_deserialize_glyphs_json (buffer, 391847794e929831750e97525137ab5e285ccd1064eBehdad Esfahbod buf, buf_len, end_ptr, 392e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod font); 393e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 394e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod default: 395e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod case HB_BUFFER_SERIALIZE_FORMAT_INVALID: 396e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod return false; 397e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod 398e54dd26300f50eb19907a9d39269a363279b3e07Behdad Esfahbod } 399d3e14aafff60e1314d0ef66e42cdde6bf949bb66Behdad Esfahbod} 400