/*1* Copyright © 2009 Red Hat, Inc.2*3* This is part of HarfBuzz, a text shaping library.4*5* Permission is hereby granted, without written agreement and without6* license or royalty fees, to use, copy, modify, and distribute this7* software and its documentation for any purpose, provided that the8* above copyright notice and the following two paragraphs appear in9* all copies of this software.10*11* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR12* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES13* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN14* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH15* DAMAGE.16*17* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,18* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND19* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS20* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO21* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.22*23* Red Hat Author(s): Behdad Esfahbod24*/2526#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)27#error "Include <hb.h> instead."28#endif2930#ifndef HB_BLOB_H31#define HB_BLOB_H3233#include "hb-common.h"3435HB_BEGIN_DECLS363738/**39* hb_memory_mode_t:40* @HB_MEMORY_MODE_DUPLICATE: HarfBuzz immediately makes a copy of the data.41* @HB_MEMORY_MODE_READONLY: HarfBuzz client will never modify the data,42* and HarfBuzz will never modify the data.43* @HB_MEMORY_MODE_WRITABLE: HarfBuzz client made a copy of the data solely44* for HarfBuzz, so HarfBuzz may modify the data.45* @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE: See above46*47* Data type holding the memory modes available to48* client programs.49*50* Regarding these various memory-modes:51*52* - In no case shall the HarfBuzz client modify memory53* that is passed to HarfBuzz in a blob. If there is54* any such possibility, @HB_MEMORY_MODE_DUPLICATE should be used55* such that HarfBuzz makes a copy immediately,56*57* - Use @HB_MEMORY_MODE_READONLY otherwise, unless you really really58* really know what you are doing,59*60* - @HB_MEMORY_MODE_WRITABLE is appropriate if you really made a61* copy of data solely for the purpose of passing to62* HarfBuzz and doing that just once (no reuse!),63*64* - If the font is mmap()ed, it's okay to use65* @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, however, using that mode66* correctly is very tricky. Use @HB_MEMORY_MODE_READONLY instead.67**/68typedef enum {69HB_MEMORY_MODE_DUPLICATE,70HB_MEMORY_MODE_READONLY,71HB_MEMORY_MODE_WRITABLE,72HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE73} hb_memory_mode_t;7475/**76* hb_blob_t:77*78* Data type for blobs. A blob wraps a chunk of binary79* data and facilitates its lifecycle management between80* a client program and HarfBuzz.81*82**/83typedef struct hb_blob_t hb_blob_t;8485HB_EXTERN hb_blob_t *86hb_blob_create (const char *data,87unsigned int length,88hb_memory_mode_t mode,89void *user_data,90hb_destroy_func_t destroy);9192HB_EXTERN hb_blob_t *93hb_blob_create_or_fail (const char *data,94unsigned int length,95hb_memory_mode_t mode,96void *user_data,97hb_destroy_func_t destroy);9899HB_EXTERN hb_blob_t *100hb_blob_create_from_file (const char *file_name);101102HB_EXTERN hb_blob_t *103hb_blob_create_from_file_or_fail (const char *file_name);104105/* Always creates with MEMORY_MODE_READONLY.106* Even if the parent blob is writable, we don't107* want the user of the sub-blob to be able to108* modify the parent data as that data may be109* shared among multiple sub-blobs.110*/111HB_EXTERN hb_blob_t *112hb_blob_create_sub_blob (hb_blob_t *parent,113unsigned int offset,114unsigned int length);115116HB_EXTERN hb_blob_t *117hb_blob_copy_writable_or_fail (hb_blob_t *blob);118119HB_EXTERN hb_blob_t *120hb_blob_get_empty (void);121122HB_EXTERN hb_blob_t *123hb_blob_reference (hb_blob_t *blob);124125HB_EXTERN void126hb_blob_destroy (hb_blob_t *blob);127128HB_EXTERN hb_bool_t129hb_blob_set_user_data (hb_blob_t *blob,130hb_user_data_key_t *key,131void * data,132hb_destroy_func_t destroy,133hb_bool_t replace);134135136HB_EXTERN void *137hb_blob_get_user_data (const hb_blob_t *blob,138hb_user_data_key_t *key);139140141HB_EXTERN void142hb_blob_make_immutable (hb_blob_t *blob);143144HB_EXTERN hb_bool_t145hb_blob_is_immutable (hb_blob_t *blob);146147148HB_EXTERN unsigned int149hb_blob_get_length (hb_blob_t *blob);150151HB_EXTERN const char *152hb_blob_get_data (hb_blob_t *blob, unsigned int *length);153154HB_EXTERN char *155hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);156157HB_END_DECLS158159#endif /* HB_BLOB_H */160161162