xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-blob.h (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2009  Red Hat, Inc.
3*2d1272b8SAndroid Build Coastguard Worker  *
4*2d1272b8SAndroid Build Coastguard Worker  *  This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker  *
6*2d1272b8SAndroid Build Coastguard Worker  * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker  * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker  * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker  * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker  * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker  *
12*2d1272b8SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker  * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker  *
18*2d1272b8SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker  *
24*2d1272b8SAndroid Build Coastguard Worker  * Red Hat Author(s): Behdad Esfahbod
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
28*2d1272b8SAndroid Build Coastguard Worker #error "Include <hb.h> instead."
29*2d1272b8SAndroid Build Coastguard Worker #endif
30*2d1272b8SAndroid Build Coastguard Worker 
31*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_BLOB_H
32*2d1272b8SAndroid Build Coastguard Worker #define HB_BLOB_H
33*2d1272b8SAndroid Build Coastguard Worker 
34*2d1272b8SAndroid Build Coastguard Worker #include "hb-common.h"
35*2d1272b8SAndroid Build Coastguard Worker 
36*2d1272b8SAndroid Build Coastguard Worker HB_BEGIN_DECLS
37*2d1272b8SAndroid Build Coastguard Worker 
38*2d1272b8SAndroid Build Coastguard Worker 
39*2d1272b8SAndroid Build Coastguard Worker /**
40*2d1272b8SAndroid Build Coastguard Worker  * hb_memory_mode_t:
41*2d1272b8SAndroid Build Coastguard Worker  * @HB_MEMORY_MODE_DUPLICATE: HarfBuzz immediately makes a copy of the data.
42*2d1272b8SAndroid Build Coastguard Worker  * @HB_MEMORY_MODE_READONLY: HarfBuzz client will never modify the data,
43*2d1272b8SAndroid Build Coastguard Worker  *     and HarfBuzz will never modify the data.
44*2d1272b8SAndroid Build Coastguard Worker  * @HB_MEMORY_MODE_WRITABLE: HarfBuzz client made a copy of the data solely
45*2d1272b8SAndroid Build Coastguard Worker  *     for HarfBuzz, so HarfBuzz may modify the data.
46*2d1272b8SAndroid Build Coastguard Worker  * @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE: See above
47*2d1272b8SAndroid Build Coastguard Worker  *
48*2d1272b8SAndroid Build Coastguard Worker  * Data type holding the memory modes available to
49*2d1272b8SAndroid Build Coastguard Worker  * client programs.
50*2d1272b8SAndroid Build Coastguard Worker  *
51*2d1272b8SAndroid Build Coastguard Worker  * Regarding these various memory-modes:
52*2d1272b8SAndroid Build Coastguard Worker  *
53*2d1272b8SAndroid Build Coastguard Worker  * - In no case shall the HarfBuzz client modify memory
54*2d1272b8SAndroid Build Coastguard Worker  *   that is passed to HarfBuzz in a blob.  If there is
55*2d1272b8SAndroid Build Coastguard Worker  *   any such possibility, @HB_MEMORY_MODE_DUPLICATE should be used
56*2d1272b8SAndroid Build Coastguard Worker  *   such that HarfBuzz makes a copy immediately,
57*2d1272b8SAndroid Build Coastguard Worker  *
58*2d1272b8SAndroid Build Coastguard Worker  * - Use @HB_MEMORY_MODE_READONLY otherwise, unless you really really
59*2d1272b8SAndroid Build Coastguard Worker  *   really know what you are doing,
60*2d1272b8SAndroid Build Coastguard Worker  *
61*2d1272b8SAndroid Build Coastguard Worker  * - @HB_MEMORY_MODE_WRITABLE is appropriate if you really made a
62*2d1272b8SAndroid Build Coastguard Worker  *   copy of data solely for the purpose of passing to
63*2d1272b8SAndroid Build Coastguard Worker  *   HarfBuzz and doing that just once (no reuse!),
64*2d1272b8SAndroid Build Coastguard Worker  *
65*2d1272b8SAndroid Build Coastguard Worker  * - If the font is mmap()ed, it's okay to use
66*2d1272b8SAndroid Build Coastguard Worker  *   @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, however, using that mode
67*2d1272b8SAndroid Build Coastguard Worker  *   correctly is very tricky.  Use @HB_MEMORY_MODE_READONLY instead.
68*2d1272b8SAndroid Build Coastguard Worker  **/
69*2d1272b8SAndroid Build Coastguard Worker typedef enum {
70*2d1272b8SAndroid Build Coastguard Worker   HB_MEMORY_MODE_DUPLICATE,
71*2d1272b8SAndroid Build Coastguard Worker   HB_MEMORY_MODE_READONLY,
72*2d1272b8SAndroid Build Coastguard Worker   HB_MEMORY_MODE_WRITABLE,
73*2d1272b8SAndroid Build Coastguard Worker   HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
74*2d1272b8SAndroid Build Coastguard Worker } hb_memory_mode_t;
75*2d1272b8SAndroid Build Coastguard Worker 
76*2d1272b8SAndroid Build Coastguard Worker /**
77*2d1272b8SAndroid Build Coastguard Worker  * hb_blob_t:
78*2d1272b8SAndroid Build Coastguard Worker  *
79*2d1272b8SAndroid Build Coastguard Worker  * Data type for blobs. A blob wraps a chunk of binary
80*2d1272b8SAndroid Build Coastguard Worker  * data and facilitates its lifecycle management between
81*2d1272b8SAndroid Build Coastguard Worker  * a client program and HarfBuzz.
82*2d1272b8SAndroid Build Coastguard Worker  *
83*2d1272b8SAndroid Build Coastguard Worker  **/
84*2d1272b8SAndroid Build Coastguard Worker typedef struct hb_blob_t hb_blob_t;
85*2d1272b8SAndroid Build Coastguard Worker 
86*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
87*2d1272b8SAndroid Build Coastguard Worker hb_blob_create (const char        *data,
88*2d1272b8SAndroid Build Coastguard Worker 		unsigned int       length,
89*2d1272b8SAndroid Build Coastguard Worker 		hb_memory_mode_t   mode,
90*2d1272b8SAndroid Build Coastguard Worker 		void              *user_data,
91*2d1272b8SAndroid Build Coastguard Worker 		hb_destroy_func_t  destroy);
92*2d1272b8SAndroid Build Coastguard Worker 
93*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
94*2d1272b8SAndroid Build Coastguard Worker hb_blob_create_or_fail (const char        *data,
95*2d1272b8SAndroid Build Coastguard Worker 			unsigned int       length,
96*2d1272b8SAndroid Build Coastguard Worker 			hb_memory_mode_t   mode,
97*2d1272b8SAndroid Build Coastguard Worker 			void              *user_data,
98*2d1272b8SAndroid Build Coastguard Worker 			hb_destroy_func_t  destroy);
99*2d1272b8SAndroid Build Coastguard Worker 
100*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
101*2d1272b8SAndroid Build Coastguard Worker hb_blob_create_from_file (const char *file_name);
102*2d1272b8SAndroid Build Coastguard Worker 
103*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
104*2d1272b8SAndroid Build Coastguard Worker hb_blob_create_from_file_or_fail (const char *file_name);
105*2d1272b8SAndroid Build Coastguard Worker 
106*2d1272b8SAndroid Build Coastguard Worker /* Always creates with MEMORY_MODE_READONLY.
107*2d1272b8SAndroid Build Coastguard Worker  * Even if the parent blob is writable, we don't
108*2d1272b8SAndroid Build Coastguard Worker  * want the user of the sub-blob to be able to
109*2d1272b8SAndroid Build Coastguard Worker  * modify the parent data as that data may be
110*2d1272b8SAndroid Build Coastguard Worker  * shared among multiple sub-blobs.
111*2d1272b8SAndroid Build Coastguard Worker  */
112*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
113*2d1272b8SAndroid Build Coastguard Worker hb_blob_create_sub_blob (hb_blob_t    *parent,
114*2d1272b8SAndroid Build Coastguard Worker 			 unsigned int  offset,
115*2d1272b8SAndroid Build Coastguard Worker 			 unsigned int  length);
116*2d1272b8SAndroid Build Coastguard Worker 
117*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
118*2d1272b8SAndroid Build Coastguard Worker hb_blob_copy_writable_or_fail (hb_blob_t *blob);
119*2d1272b8SAndroid Build Coastguard Worker 
120*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
121*2d1272b8SAndroid Build Coastguard Worker hb_blob_get_empty (void);
122*2d1272b8SAndroid Build Coastguard Worker 
123*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_blob_t *
124*2d1272b8SAndroid Build Coastguard Worker hb_blob_reference (hb_blob_t *blob);
125*2d1272b8SAndroid Build Coastguard Worker 
126*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN void
127*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (hb_blob_t *blob);
128*2d1272b8SAndroid Build Coastguard Worker 
129*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_bool_t
130*2d1272b8SAndroid Build Coastguard Worker hb_blob_set_user_data (hb_blob_t          *blob,
131*2d1272b8SAndroid Build Coastguard Worker 		       hb_user_data_key_t *key,
132*2d1272b8SAndroid Build Coastguard Worker 		       void *              data,
133*2d1272b8SAndroid Build Coastguard Worker 		       hb_destroy_func_t   destroy,
134*2d1272b8SAndroid Build Coastguard Worker 		       hb_bool_t           replace);
135*2d1272b8SAndroid Build Coastguard Worker 
136*2d1272b8SAndroid Build Coastguard Worker 
137*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN void *
138*2d1272b8SAndroid Build Coastguard Worker hb_blob_get_user_data (const hb_blob_t    *blob,
139*2d1272b8SAndroid Build Coastguard Worker 		       hb_user_data_key_t *key);
140*2d1272b8SAndroid Build Coastguard Worker 
141*2d1272b8SAndroid Build Coastguard Worker 
142*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN void
143*2d1272b8SAndroid Build Coastguard Worker hb_blob_make_immutable (hb_blob_t *blob);
144*2d1272b8SAndroid Build Coastguard Worker 
145*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN hb_bool_t
146*2d1272b8SAndroid Build Coastguard Worker hb_blob_is_immutable (hb_blob_t *blob);
147*2d1272b8SAndroid Build Coastguard Worker 
148*2d1272b8SAndroid Build Coastguard Worker 
149*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN unsigned int
150*2d1272b8SAndroid Build Coastguard Worker hb_blob_get_length (hb_blob_t *blob);
151*2d1272b8SAndroid Build Coastguard Worker 
152*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN const char *
153*2d1272b8SAndroid Build Coastguard Worker hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
154*2d1272b8SAndroid Build Coastguard Worker 
155*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN char *
156*2d1272b8SAndroid Build Coastguard Worker hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
157*2d1272b8SAndroid Build Coastguard Worker 
158*2d1272b8SAndroid Build Coastguard Worker HB_END_DECLS
159*2d1272b8SAndroid Build Coastguard Worker 
160*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_BLOB_H */
161