| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2009 Red Hat, Inc. | 2 * Copyright © 2009 Red Hat, Inc. |
| 3 * | 3 * |
| 4 * This is part of HarfBuzz, a text shaping library. | 4 * This is part of HarfBuzz, a text shaping library. |
| 5 * | 5 * |
| 6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
| 8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
| 9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
| 10 * all copies of this software. | 10 * all copies of this software. |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 * @mode: Memory mode for @data. | 84 * @mode: Memory mode for @data. |
| 85 * @user_data: Data parameter to pass to @destroy. | 85 * @user_data: Data parameter to pass to @destroy. |
| 86 * @destroy: Callback to call when @data is not needed anymore. | 86 * @destroy: Callback to call when @data is not needed anymore. |
| 87 * | 87 * |
| 88 * Creates a new "blob" object wrapping @data. The @mode parameter is used | 88 * Creates a new "blob" object wrapping @data. The @mode parameter is used |
| 89 * to negotiate ownership and lifecycle of @data. | 89 * to negotiate ownership and lifecycle of @data. |
| 90 * | 90 * |
| 91 * Return value: New blob, or the empty blob if something failed or if @length i
s | 91 * Return value: New blob, or the empty blob if something failed or if @length i
s |
| 92 * zero. Destroy with hb_blob_destroy(). | 92 * zero. Destroy with hb_blob_destroy(). |
| 93 * | 93 * |
| 94 * Since: 1.0 | 94 * Since: 0.9.2 |
| 95 **/ | 95 **/ |
| 96 hb_blob_t * | 96 hb_blob_t * |
| 97 hb_blob_create (const char *data, | 97 hb_blob_create (const char *data, |
| 98 unsigned int length, | 98 unsigned int length, |
| 99 hb_memory_mode_t mode, | 99 hb_memory_mode_t mode, |
| 100 void *user_data, | 100 void *user_data, |
| 101 hb_destroy_func_t destroy) | 101 hb_destroy_func_t destroy) |
| 102 { | 102 { |
| 103 hb_blob_t *blob; | 103 hb_blob_t *blob; |
| 104 | 104 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 * will never modify data in the parent blob. The parent data is not | 140 * will never modify data in the parent blob. The parent data is not |
| 141 * expected to be modified, and will result in undefined behavior if it | 141 * expected to be modified, and will result in undefined behavior if it |
| 142 * is. | 142 * is. |
| 143 * | 143 * |
| 144 * Makes @parent immutable. | 144 * Makes @parent immutable. |
| 145 * | 145 * |
| 146 * Return value: New blob, or the empty blob if something failed or if | 146 * Return value: New blob, or the empty blob if something failed or if |
| 147 * @length is zero or @offset is beyond the end of @parent's data. Destroy | 147 * @length is zero or @offset is beyond the end of @parent's data. Destroy |
| 148 * with hb_blob_destroy(). | 148 * with hb_blob_destroy(). |
| 149 * | 149 * |
| 150 * Since: 1.0 | 150 * Since: 0.9.2 |
| 151 **/ | 151 **/ |
| 152 hb_blob_t * | 152 hb_blob_t * |
| 153 hb_blob_create_sub_blob (hb_blob_t *parent, | 153 hb_blob_create_sub_blob (hb_blob_t *parent, |
| 154 unsigned int offset, | 154 unsigned int offset, |
| 155 unsigned int length) | 155 unsigned int length) |
| 156 { | 156 { |
| 157 hb_blob_t *blob; | 157 hb_blob_t *blob; |
| 158 | 158 |
| 159 if (!length || offset >= parent->length) | 159 if (!length || offset >= parent->length) |
| 160 return hb_blob_get_empty (); | 160 return hb_blob_get_empty (); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 172 | 172 |
| 173 /** | 173 /** |
| 174 * hb_blob_get_empty: | 174 * hb_blob_get_empty: |
| 175 * | 175 * |
| 176 * Returns the singleton empty blob. | 176 * Returns the singleton empty blob. |
| 177 * | 177 * |
| 178 * See TODO:link object types for more information. | 178 * See TODO:link object types for more information. |
| 179 * | 179 * |
| 180 * Return value: (transfer full): the empty blob. | 180 * Return value: (transfer full): the empty blob. |
| 181 * | 181 * |
| 182 * Since: 1.0 | 182 * Since: 0.9.2 |
| 183 **/ | 183 **/ |
| 184 hb_blob_t * | 184 hb_blob_t * |
| 185 hb_blob_get_empty (void) | 185 hb_blob_get_empty (void) |
| 186 { | 186 { |
| 187 static const hb_blob_t _hb_blob_nil = { | 187 static const hb_blob_t _hb_blob_nil = { |
| 188 HB_OBJECT_HEADER_STATIC, | 188 HB_OBJECT_HEADER_STATIC, |
| 189 | 189 |
| 190 true, /* immutable */ | 190 true, /* immutable */ |
| 191 | 191 |
| 192 NULL, /* data */ | 192 NULL, /* data */ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 203 /** | 203 /** |
| 204 * hb_blob_reference: (skip) | 204 * hb_blob_reference: (skip) |
| 205 * @blob: a blob. | 205 * @blob: a blob. |
| 206 * | 206 * |
| 207 * Increases the reference count on @blob. | 207 * Increases the reference count on @blob. |
| 208 * | 208 * |
| 209 * See TODO:link object types for more information. | 209 * See TODO:link object types for more information. |
| 210 * | 210 * |
| 211 * Return value: @blob. | 211 * Return value: @blob. |
| 212 * | 212 * |
| 213 * Since: 1.0 | 213 * Since: 0.9.2 |
| 214 **/ | 214 **/ |
| 215 hb_blob_t * | 215 hb_blob_t * |
| 216 hb_blob_reference (hb_blob_t *blob) | 216 hb_blob_reference (hb_blob_t *blob) |
| 217 { | 217 { |
| 218 return hb_object_reference (blob); | 218 return hb_object_reference (blob); |
| 219 } | 219 } |
| 220 | 220 |
| 221 /** | 221 /** |
| 222 * hb_blob_destroy: (skip) | 222 * hb_blob_destroy: (skip) |
| 223 * @blob: a blob. | 223 * @blob: a blob. |
| 224 * | 224 * |
| 225 * Descreases the reference count on @blob, and if it reaches zero, destroys | 225 * Descreases the reference count on @blob, and if it reaches zero, destroys |
| 226 * @blob, freeing all memory, possibly calling the destroy-callback the blob | 226 * @blob, freeing all memory, possibly calling the destroy-callback the blob |
| 227 * was created for if it has not been called already. | 227 * was created for if it has not been called already. |
| 228 * | 228 * |
| 229 * See TODO:link object types for more information. | 229 * See TODO:link object types for more information. |
| 230 * | 230 * |
| 231 * Since: 1.0 | 231 * Since: 0.9.2 |
| 232 **/ | 232 **/ |
| 233 void | 233 void |
| 234 hb_blob_destroy (hb_blob_t *blob) | 234 hb_blob_destroy (hb_blob_t *blob) |
| 235 { | 235 { |
| 236 if (!hb_object_destroy (blob)) return; | 236 if (!hb_object_destroy (blob)) return; |
| 237 | 237 |
| 238 _hb_blob_destroy_user_data (blob); | 238 _hb_blob_destroy_user_data (blob); |
| 239 | 239 |
| 240 free (blob); | 240 free (blob); |
| 241 } | 241 } |
| 242 | 242 |
| 243 /** | 243 /** |
| 244 * hb_blob_set_user_data: (skip) | 244 * hb_blob_set_user_data: (skip) |
| 245 * @blob: a blob. | 245 * @blob: a blob. |
| 246 * @key: key for data to set. | 246 * @key: key for data to set. |
| 247 * @data: data to set. | 247 * @data: data to set. |
| 248 * @destroy: callback to call when @data is not needed anymore. | 248 * @destroy: callback to call when @data is not needed anymore. |
| 249 * @replace: whether to replace an existing data with the same key. | 249 * @replace: whether to replace an existing data with the same key. |
| 250 * | 250 * |
| 251 * Return value: | 251 * Return value: |
| 252 * | 252 * |
| 253 * Since: 1.0 | 253 * Since: 0.9.2 |
| 254 **/ | 254 **/ |
| 255 hb_bool_t | 255 hb_bool_t |
| 256 hb_blob_set_user_data (hb_blob_t *blob, | 256 hb_blob_set_user_data (hb_blob_t *blob, |
| 257 hb_user_data_key_t *key, | 257 hb_user_data_key_t *key, |
| 258 void * data, | 258 void * data, |
| 259 hb_destroy_func_t destroy, | 259 hb_destroy_func_t destroy, |
| 260 hb_bool_t replace) | 260 hb_bool_t replace) |
| 261 { | 261 { |
| 262 return hb_object_set_user_data (blob, key, data, destroy, replace); | 262 return hb_object_set_user_data (blob, key, data, destroy, replace); |
| 263 } | 263 } |
| 264 | 264 |
| 265 /** | 265 /** |
| 266 * hb_blob_get_user_data: (skip) | 266 * hb_blob_get_user_data: (skip) |
| 267 * @blob: a blob. | 267 * @blob: a blob. |
| 268 * @key: key for data to get. | 268 * @key: key for data to get. |
| 269 * | 269 * |
| 270 * | 270 * |
| 271 * | 271 * |
| 272 * Return value: (transfer none): | 272 * Return value: (transfer none): |
| 273 * | 273 * |
| 274 * Since: 1.0 | 274 * Since: 0.9.2 |
| 275 **/ | 275 **/ |
| 276 void * | 276 void * |
| 277 hb_blob_get_user_data (hb_blob_t *blob, | 277 hb_blob_get_user_data (hb_blob_t *blob, |
| 278 hb_user_data_key_t *key) | 278 hb_user_data_key_t *key) |
| 279 { | 279 { |
| 280 return hb_object_get_user_data (blob, key); | 280 return hb_object_get_user_data (blob, key); |
| 281 } | 281 } |
| 282 | 282 |
| 283 | 283 |
| 284 /** | 284 /** |
| 285 * hb_blob_make_immutable: | 285 * hb_blob_make_immutable: |
| 286 * @blob: a blob. | 286 * @blob: a blob. |
| 287 * | 287 * |
| 288 * | 288 * |
| 289 * | 289 * |
| 290 * Since: 1.0 | 290 * Since: 0.9.2 |
| 291 **/ | 291 **/ |
| 292 void | 292 void |
| 293 hb_blob_make_immutable (hb_blob_t *blob) | 293 hb_blob_make_immutable (hb_blob_t *blob) |
| 294 { | 294 { |
| 295 if (hb_object_is_inert (blob)) | 295 if (hb_object_is_inert (blob)) |
| 296 return; | 296 return; |
| 297 | 297 |
| 298 blob->immutable = true; | 298 blob->immutable = true; |
| 299 } | 299 } |
| 300 | 300 |
| 301 /** | 301 /** |
| 302 * hb_blob_is_immutable: | 302 * hb_blob_is_immutable: |
| 303 * @blob: a blob. | 303 * @blob: a blob. |
| 304 * | 304 * |
| 305 * | 305 * |
| 306 * | 306 * |
| 307 * Return value: TODO | 307 * Return value: TODO |
| 308 * | 308 * |
| 309 * Since: 1.0 | 309 * Since: 0.9.2 |
| 310 **/ | 310 **/ |
| 311 hb_bool_t | 311 hb_bool_t |
| 312 hb_blob_is_immutable (hb_blob_t *blob) | 312 hb_blob_is_immutable (hb_blob_t *blob) |
| 313 { | 313 { |
| 314 return blob->immutable; | 314 return blob->immutable; |
| 315 } | 315 } |
| 316 | 316 |
| 317 | 317 |
| 318 /** | 318 /** |
| 319 * hb_blob_get_length: | 319 * hb_blob_get_length: |
| 320 * @blob: a blob. | 320 * @blob: a blob. |
| 321 * | 321 * |
| 322 * | 322 * |
| 323 * | 323 * |
| 324 * Return value: the length of blob data in bytes. | 324 * Return value: the length of blob data in bytes. |
| 325 * | 325 * |
| 326 * Since: 1.0 | 326 * Since: 0.9.2 |
| 327 **/ | 327 **/ |
| 328 unsigned int | 328 unsigned int |
| 329 hb_blob_get_length (hb_blob_t *blob) | 329 hb_blob_get_length (hb_blob_t *blob) |
| 330 { | 330 { |
| 331 return blob->length; | 331 return blob->length; |
| 332 } | 332 } |
| 333 | 333 |
| 334 /** | 334 /** |
| 335 * hb_blob_get_data: | 335 * hb_blob_get_data: |
| 336 * @blob: a blob. | 336 * @blob: a blob. |
| 337 * @length: (out): | 337 * @length: (out): |
| 338 * | 338 * |
| 339 * | 339 * |
| 340 * | 340 * |
| 341 * Returns: (transfer none) (array length=length): | 341 * Returns: (transfer none) (array length=length): |
| 342 * | 342 * |
| 343 * Since: 1.0 | 343 * Since: 0.9.2 |
| 344 **/ | 344 **/ |
| 345 const char * | 345 const char * |
| 346 hb_blob_get_data (hb_blob_t *blob, unsigned int *length) | 346 hb_blob_get_data (hb_blob_t *blob, unsigned int *length) |
| 347 { | 347 { |
| 348 if (length) | 348 if (length) |
| 349 *length = blob->length; | 349 *length = blob->length; |
| 350 | 350 |
| 351 return blob->data; | 351 return blob->data; |
| 352 } | 352 } |
| 353 | 353 |
| 354 /** | 354 /** |
| 355 * hb_blob_get_data_writable: | 355 * hb_blob_get_data_writable: |
| 356 * @blob: a blob. | 356 * @blob: a blob. |
| 357 * @length: (out): output length of the writable data. | 357 * @length: (out): output length of the writable data. |
| 358 * | 358 * |
| 359 * Tries to make blob data writable (possibly copying it) and | 359 * Tries to make blob data writable (possibly copying it) and |
| 360 * return pointer to data. | 360 * return pointer to data. |
| 361 * | 361 * |
| 362 * Fails if blob has been made immutable, or if memory allocation | 362 * Fails if blob has been made immutable, or if memory allocation |
| 363 * fails. | 363 * fails. |
| 364 * | 364 * |
| 365 * Returns: (transfer none) (array length=length): Writable blob data, | 365 * Returns: (transfer none) (array length=length): Writable blob data, |
| 366 * or %NULL if failed. | 366 * or %NULL if failed. |
| 367 * | 367 * |
| 368 * Since: 1.0 | 368 * Since: 0.9.2 |
| 369 **/ | 369 **/ |
| 370 char * | 370 char * |
| 371 hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length) | 371 hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length) |
| 372 { | 372 { |
| 373 if (!_try_writable (blob)) { | 373 if (!_try_writable (blob)) { |
| 374 if (length) | 374 if (length) |
| 375 *length = 0; | 375 *length = 0; |
| 376 | 376 |
| 377 return NULL; | 377 return NULL; |
| 378 } | 378 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 | 470 |
| 471 memcpy (new_data, blob->data, blob->length); | 471 memcpy (new_data, blob->data, blob->length); |
| 472 _hb_blob_destroy_user_data (blob); | 472 _hb_blob_destroy_user_data (blob); |
| 473 blob->mode = HB_MEMORY_MODE_WRITABLE; | 473 blob->mode = HB_MEMORY_MODE_WRITABLE; |
| 474 blob->data = new_data; | 474 blob->data = new_data; |
| 475 blob->user_data = new_data; | 475 blob->user_data = new_data; |
| 476 blob->destroy = free; | 476 blob->destroy = free; |
| 477 | 477 |
| 478 return true; | 478 return true; |
| 479 } | 479 } |
| OLD | NEW |