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