120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod/* 220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * Copyright © 2013 Google, Inc. 320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * 420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * 620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * Permission is hereby granted, without written agreement and without 720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * software and its documentation for any purpose, provided that the 920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 1020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * all copies of this software. 1120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * 1220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 1320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 1420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 1520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 1620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * DAMAGE. 1720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * 1820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 1920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 2020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 2120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 2220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 2320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * 2420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod * Google Author(s): Behdad Esfahbod 2520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod */ 2620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 2720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod#ifndef HB_BUFFER_DESERIALIZE_JSON_HH 2820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod#define HB_BUFFER_DESERIALIZE_JSON_HH 2920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 3020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod#include "hb-private.hh" 3120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 3220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod%%{ 3320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 3420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodmachine deserialize_json; 3520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodalphtype unsigned char; 3620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodwrite data; 3720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 3820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction clear_item { 3920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod memset (&info, 0, sizeof (info)); 4020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod memset (&pos , 0, sizeof (pos )); 4120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod} 4220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 4320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction add_item { 4420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod buffer->add_info (info); 4520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod if (buffer->in_error) 4620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return false; 4720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod buffer->pos[buffer->len - 1] = pos; 4820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod *end_ptr = p; 4920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod} 5020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 5120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction tok { 5220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod tok = p; 5320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod} 5420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 5520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_glyph { 5620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod if (!hb_font_glyph_from_string (font, 5720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod tok, p - tok, 5820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod &info.codepoint)) 5920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return false; 6020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod} 6120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 6220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_gid { if (!parse_uint (tok, p, &info.codepoint)) return false; } 6320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; } 6420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; } 6520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; } 6620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; } 6720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodaction parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; } 6820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 6920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodunum = '0' | [1-9] digit*; 7020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodnum = '-'? unum; 7120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 7220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodcomma = space* ',' space*; 7320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodcolon = space* ':' space*; 7420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 75778d7f844cb330289830c95431269db06ba1c969Behdad Esfahbodglyph_id = unum; 76778d7f844cb330289830c95431269db06ba1c969Behdad Esfahbodglyph_name = alpha (alnum|'_'|'.'|'-')*; 7720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 78778d7f844cb330289830c95431269db06ba1c969Behdad Esfahbodglyph_string = '"' (glyph_name >tok %parse_glyph) '"'; 79778d7f844cb330289830c95431269db06ba1c969Behdad Esfahbodglyph_number = (glyph_id >tok %parse_gid); 80778d7f844cb330289830c95431269db06ba1c969Behdad Esfahbod 81778d7f844cb330289830c95431269db06ba1c969Behdad Esfahbodglyph = "\"g\"" colon (glyph_string | glyph_number); 8220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodcluster = "\"cl\"" colon (unum >tok %parse_cluster); 8320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodxoffset = "\"dx\"" colon (num >tok %parse_x_offset); 8420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodyoffset = "\"dy\"" colon (num >tok %parse_y_offset); 8520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodxadvance= "\"ax\"" colon (num >tok %parse_x_advance); 8620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodyadvance= "\"ay\"" colon (num >tok %parse_y_advance); 8720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 8820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodelement = glyph | cluster | xoffset | yoffset | xadvance | yadvance; 8920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahboditem = 9020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod ( '{' space* element (comma element)* space* '}') 9120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod >clear_item 9220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod @add_item 9320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod ; 9420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 9520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodmain := space* item (comma item)* space* (','|']')?; 9620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 9720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod}%% 9820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 9920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbodstatic hb_bool_t 10020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, 10120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod const char *buf, 10220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod unsigned int buf_len, 10320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod const char **end_ptr, 10420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod hb_font_t *font) 10520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod{ 10620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod const char *p = buf, *pe = buf + buf_len; 10720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 10820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod /* Ensure we have positions. */ 10920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod (void) hb_buffer_get_glyph_positions (buffer, NULL); 11020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 11120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod while (p < pe && ISSPACE (*p)) 11220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod p++; 11320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod if (p < pe && *p == (buffer->len ? ',' : '[')) 11420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod { 11520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod *end_ptr = ++p; 11620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod } 11720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 11820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod const char *tok = NULL; 11920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod int cs; 1205c87120b8178566ddae99d9825edc24f9b87ea3dBehdad Esfahbod hb_glyph_info_t info = {0}; 1215c87120b8178566ddae99d9825edc24f9b87ea3dBehdad Esfahbod hb_glyph_position_t pos = {0}; 12220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod %%{ 12320b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod write init; 12420b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod write exec; 12520b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod }%% 12620b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 12720b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod *end_ptr = p; 12820b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 12920b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod return p == pe && *(p-1) != ']'; 13020b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod} 13120b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod 13220b817ac21147e0a8edbf23ef071c2f4ce6c2b95Behdad Esfahbod#endif /* HB_BUFFER_DESERIALIZE_JSON_HH */ 133