480
481 static hb_blob_t *
482 reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
483 {
484 FT_Face ft_face = (FT_Face) user_data;
485 FT_Byte *buffer;
486 FT_ULong length = 0;
487 FT_Error error;
488
489 /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
490
491 error = FT_Load_Sfnt_Table (ft_face, tag, 0, nullptr, &length);
492 if (error)
493 return nullptr;
494
495 buffer = (FT_Byte *) malloc (length);
496 if (!buffer)
497 return nullptr;
498
499 error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
500 if (error)
501 return nullptr;
502
503 return hb_blob_create ((const char *) buffer, length,
504 HB_MEMORY_MODE_WRITABLE,
505 buffer, free);
506 }
507
508 /**
509 * hb_ft_face_create:
510 * @ft_face: (destroy destroy) (scope notified):
511 * @destroy:
512 *
513 *
514 *
515 * Return value: (transfer full):
516 * Since: 0.9.2
517 **/
518 hb_face_t *
519 hb_ft_face_create (FT_Face ft_face,
520 hb_destroy_func_t destroy)
521 {
|
480
481 static hb_blob_t *
482 reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
483 {
484 FT_Face ft_face = (FT_Face) user_data;
485 FT_Byte *buffer;
486 FT_ULong length = 0;
487 FT_Error error;
488
489 /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
490
491 error = FT_Load_Sfnt_Table (ft_face, tag, 0, nullptr, &length);
492 if (error)
493 return nullptr;
494
495 buffer = (FT_Byte *) malloc (length);
496 if (!buffer)
497 return nullptr;
498
499 error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
500 if (error) {
501 free (buffer);
502 return nullptr;
503 }
504
505 return hb_blob_create ((const char *) buffer, length,
506 HB_MEMORY_MODE_WRITABLE,
507 buffer, free);
508 }
509
510 /**
511 * hb_ft_face_create:
512 * @ft_face: (destroy destroy) (scope notified):
513 * @destroy:
514 *
515 *
516 *
517 * Return value: (transfer full):
518 * Since: 0.9.2
519 **/
520 hb_face_t *
521 hb_ft_face_create (FT_Face ft_face,
522 hb_destroy_func_t destroy)
523 {
|