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