1be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod/* 2be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * Copyright © 2010,2011 Google, Inc. 3be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * 4be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 5be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * 6be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * Permission is hereby granted, without written agreement and without 7be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 8be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * software and its documentation for any purpose, provided that the 9be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 10be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * all copies of this software. 11be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * 12be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * DAMAGE. 17be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * 18be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * 24be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod * Google Author(s): Behdad Esfahbod 25be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod */ 26be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 27be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#ifdef HAVE_CONFIG_H 28be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include "config.h" 29be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#endif 30be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 31be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include "hb.h" 32be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include "hb-ot.h" 33be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 34be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#ifdef HAVE_GLIB 35be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include <glib.h> 36be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#endif 37be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include <stdlib.h> 38be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include <stdio.h> 39be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 40be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#ifdef HAVE_FREETYPE 41be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#include "hb-ft.h" 42be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#endif 43be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 44be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbodint 45be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbodmain (int argc, char **argv) 46be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod{ 47be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod hb_blob_t *blob = NULL; 48be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 49be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod if (argc != 4 && argc != 5) { 50abd0c05f1f7f0546593bb2f1c4d59db12cb32e46Behdad Esfahbod fprintf (stderr, "usage: %s font-file lookup-index first-glyph [second-glyph]\n", argv[0]); 51be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod exit (1); 52be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod } 53be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 54be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod /* Create the blob */ 55be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod { 56be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod const char *font_data; 57be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod unsigned int len; 58be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod hb_destroy_func_t destroy; 59be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod void *user_data; 60be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod hb_memory_mode_t mm; 61be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 62be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#ifdef HAVE_GLIB 63bb0e4ba3e9c5a407fc5d73c914e429d24d336380Behdad Esfahbod GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL); 64be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod font_data = g_mapped_file_get_contents (mf); 65be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod len = g_mapped_file_get_length (mf); 66be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod destroy = (hb_destroy_func_t) g_mapped_file_unref; 67be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod user_data = (void *) mf; 68be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; 69be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#else 70be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod FILE *f = fopen (argv[1], "rb"); 71be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod fseek (f, 0, SEEK_END); 72be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod len = ftell (f); 73be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod fseek (f, 0, SEEK_SET); 74be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod font_data = (const char *) malloc (len); 75be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod if (!font_data) len = 0; 76be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod len = fread ((char *) font_data, 1, len, f); 77be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod destroy = free; 78be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod user_data = (void *) font_data; 79be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod fclose (f); 80be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod mm = HB_MEMORY_MODE_WRITABLE; 81be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod#endif 82be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 83be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod blob = hb_blob_create (font_data, len, mm, user_data, destroy); 84be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod } 85be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 86be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod /* Create the face */ 87be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod hb_face_t *face = hb_face_create (blob, 0 /* first face */); 88be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod hb_blob_destroy (blob); 89be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod blob = NULL; 90be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod 916f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod hb_font_t *font = hb_font_create (face); 926f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod#ifdef HAVE_FREETYPE 936f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod hb_ft_font_set_funcs (font); 946f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod#endif 956f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod 96be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod unsigned int len = argc - 3; 976f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod hb_codepoint_t glyphs[2]; 986f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod if (!hb_font_glyph_from_string (font, argv[3], -1, &glyphs[0]) || 996f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod (argc > 4 && 1006f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod !hb_font_glyph_from_string (font, argv[4], -1, &glyphs[1]))) 1016f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod return 2; 102362a990b2246f5448ecb9d600761f710aea7d42dBehdad Esfahbod return !hb_ot_layout_lookup_would_substitute (face, strtol (argv[2], NULL, 0), glyphs, len, false); 103be73a5f9368136ecbdb211b96516ad0c554c8201Behdad Esfahbod} 104