sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
ft-hb-ft.c
1/*
2 * Copyright © 2009, 2023 Red Hat, Inc.
3 * Copyright © 2015 Google, Inc.
4 *
5 * Permission is hereby granted, without written agreement and without
6 * license or royalty fees, to use, copy, modify, and distribute this
7 * software and its documentation for any purpose, provided that the
8 * above copyright notice and the following two paragraphs appear in
9 * all copies of this software.
10 *
11 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
12 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
13 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
14 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
15 * DAMAGE.
16 *
17 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
18 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
20 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
21 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
22 *
23 * Red Hat Author(s): Behdad Esfahbod, Matthias Clasen
24 * Google Author(s): Behdad Esfahbod
25 */
26
27#include <freetype/freetype.h>
28#include <freetype/tttables.h>
29
30#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
31
32#include "ft-hb-ft.h"
33
34/* The following three functions are a more or less verbatim
35 * copy of corresponding HarfBuzz code from hb-ft.cc
36 */
37
38static hb_blob_t *
39ft_hb_ft_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data)
40{
41 AF_FaceGlobals globals = (AF_FaceGlobals) user_data;
42
43 FT_Face ft_face = globals->face;
44 FT_Byte *buffer;
45 FT_ULong length = 0;
46 FT_Error error;
47
48 FT_UNUSED (face);
49
50 /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
51
52 error = FT_Load_Sfnt_Table (ft_face, tag, 0, NULL, &length);
53 if (error)
54 return NULL;
55
56 buffer = (FT_Byte *) ft_smalloc (length);
57 if (!buffer)
58 return NULL;
59
60 error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
61 if (error)
62 {
63 free (buffer);
64 return NULL;
65 }
66
67 return hb(blob_create) ((const char *) buffer, length,
68 HB_MEMORY_MODE_WRITABLE,
69 buffer, ft_sfree);
70}
71
72static hb_face_t *
73ft_hb_ft_face_create (AF_FaceGlobals globals)
74{
75 FT_Face ft_face = globals->face;
76
77 hb_face_t *face;
78
79 if (!ft_face->stream->read) {
80 hb_blob_t *blob;
81
82 blob = hb(blob_create) ((const char *) ft_face->stream->base,
83 (unsigned int) ft_face->stream->size,
84 HB_MEMORY_MODE_READONLY,
85 ft_face, NULL);
86 face = hb(face_create) (blob, ft_face->face_index);
87 hb(blob_destroy) (blob);
88 } else {
89 face = hb(face_create_for_tables) (ft_hb_ft_reference_table, globals, NULL);
90 }
91
92 hb(face_set_index) (face, ft_face->face_index);
93 hb(face_set_upem) (face, ft_face->units_per_EM);
94
95 return face;
96}
97
98FT_LOCAL_DEF(hb_font_t *)
99ft_hb_ft_font_create (AF_FaceGlobals globals)
100{
101 hb_font_t *font;
102 hb_face_t *face;
103
104 face = ft_hb_ft_face_create (globals);
105 font = hb(font_create) (face);
106 hb(face_destroy) (face);
107 return font;
108}
109
110#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
111
112/* ANSI C doesn't like empty source files */
113typedef int ft_hb_ft_dummy_;
114
115#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
116
117/* END */