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