12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright © 2010,2011 Google, Inc. 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This is part of HarfBuzz, a text shaping library. 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Permission is hereby granted, without written agreement and without 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * software and its documentation for any purpose, provided that the 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * above copyright notice and the following two paragraphs appear in 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * all copies of this software. 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * DAMAGE. 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Google Author(s): Behdad Esfahbod 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef HAVE_CONFIG_H 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "config.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "hb.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "hb-ot.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef HAVE_GLIB 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <glib.h> 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdlib.h> 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdio.h> 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)main (int argc, char **argv) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_blob_t *blob = NULL; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (argc != 2) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fprintf (stderr, "usage: %s font-file\n", argv[0]); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exit (1); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Create the blob */ 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char *font_data; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int len; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_destroy_func_t destroy; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void *user_data; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_memory_mode_t mm; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef HAVE_GLIB 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) font_data = g_mapped_file_get_contents (mf); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) len = g_mapped_file_get_length (mf); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) destroy = (hb_destroy_func_t) g_mapped_file_unref; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_data = (void *) mf; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE *f = fopen (argv[1], "rb"); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fseek (f, 0, SEEK_END); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) len = ftell (f); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fseek (f, 0, SEEK_SET); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) font_data = (const char *) malloc (len); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!font_data) len = 0; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) len = fread ((char *) font_data, 1, len, f); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) destroy = free; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_data = (void *) font_data; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fclose (f); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mm = HB_MEMORY_MODE_WRITABLE; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob = hb_blob_create (font_data, len, mm, user_data, destroy); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Create the face */ 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_face_t *face = hb_face_create (blob, 0 /* first face */); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_blob_destroy (blob); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blob = NULL; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int p[5]; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ret = hb_ot_layout_get_size_params (face, p, p+1, p+2, p+3, p+4); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printf ("%g %u %u %g %g\n", p[0]/10., p[1], p[2], p[3]/10., p[4]/10.); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !ret; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 94