Start to sketch APIs for subsetting

This commit is contained in:
Rod Sheeter 2018-01-17 22:09:07 -08:00
parent fcb8be1a38
commit 9ccb8366f6
7 changed files with 162 additions and 0 deletions

View File

@ -27,7 +27,9 @@ HBNONPCLIBS =
HBDEPS =
HBSOURCES = $(HB_BASE_sources)
HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources)
HBSOURCES += $(HB_SUBSET_sources)
HBHEADERS = $(HB_BASE_headers)
HBHEADERS += $(HB_SUBSET_headers)
HBNODISTHEADERS = $(HB_NODIST_headers)
if HAVE_OT

View File

@ -181,6 +181,10 @@ HB_UCDN_sources = hb-ucdn.cc
HB_ICU_sources = hb-icu.cc
HB_ICU_headers = hb-icu.h
# Sources for libharfbuzz-subset
HB_SUBSET_sources = hb-subset.cc
HB_SUBSET_headers = hb-subset.h
HB_GOBJECT_sources = hb-gobject-structs.cc
HB_GOBJECT_STRUCTS_headers = hb-gobject-structs.h
HB_GOBJECT_headers = hb-gobject.h $(HB_GOBJECT_STRUCTS_headers)

0
src/hb-subset.cc Normal file
View File

88
src/hb-subset.h Normal file
View File

@ -0,0 +1,88 @@
/*
* Copyright © 2018 Google
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Google Author(s): Rod Sheeter
*/
#ifndef HB_H_IN
#error "Include <hb.h> instead."
#endif
#ifndef HB_SUBSET_H
#define HB_SUBSET_H
#include "hb-common.h"
#include "hb-face.h"
HB_BEGIN_DECLS
/*
* hb_subset_profile_t
* Things that change based on target environment, e.g. OS
*/
typedef struct hb_subset_profile_t hb_subset_profile_t;
HB_EXTERN hb_subset_profile_t *
hb_subset_profile_create();
HB_EXTERN void
hb_subset_profile_destroy(hb_subset_profile_t *profile);
/*
* hb_subset_input_t
* Things that change based on the input. Characters to keep, etc.
*/
typedef struct hb_subset_input_t hb_subset_input_t;
HB_EXTERN hb_subset_input_t *
hb_subset_input_create();
HB_EXTERN void
hb_subset_input_destroy(hb_subset_input_t *subset_input);
/*
* hb_subset_face_t
* Reusable subset-ready plan for a given face. Threadsafe for multiple
* concurrent subset operations.
*/
typedef struct hb_subset_face_t hb_subset_face_t;
HB_EXTERN hb_subset_face_t *
hb_subset_face_create(hb_face_t *face);
HB_EXTERN void
hb_subset_face_destroy(hb_subset_face_t *face);
HB_EXTERN hb_bool_t
hb_subset(hb_subset_profile_t *profile,
hb_subset_input_t *input,
hb_subset_face_t *face
hb_blob_t *result /* OUT */);
HB_END_DECLS
#endif /* HB_SUBSET_H */

View File

@ -46,6 +46,9 @@ endif # HAVE_FREETYPE
hb_shape_SOURCES = $(HB_SHAPE_sources)
bin_PROGRAMS += hb-shape
hb_subset_SOURCES = $(HB_SUBSET_sources)
bin_PROGRAMS += hb-subset
if HAVE_OT
hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
bin_PROGRAMS += hb-ot-shape-closure

View File

@ -28,3 +28,7 @@ HB_OT_SHAPE_CLOSURE_sources = \
options.hh \
main-font-text.hh \
$(NULL)
HB_SUBSET_sources = \
hb-subset.cc \
$(NULL)

61
util/hb-subset.cc Normal file
View File

@ -0,0 +1,61 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "hb-private.hh"
#include "hb-blob.h"
int
main (int argc, char **argv)
{
int exit_code = 0;
int fd = open("/tmp/Lobster-Regular.ttf", O_RDONLY);
if (fd == -1) {
perror("Unable to open file");
exit(1);
}
void *mapped_file = MAP_FAILED;
char *raw_font = nullptr;
struct stat stat;
if (fstat(fd, &stat) != -1) {
printf("File is %zu bytes\n", stat.st_size);
void *mapped_file = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (mapped_file != MAP_FAILED) {
raw_font = static_cast<char*>(mapped_file);
} else {
perror("Failed to map file");
}
} else {
perror("Unable to fstat");
}
if (raw_font) {
printf("Mapped file\n");
for (int i = 0; i < 4; i++) {
printf("%02x", *(raw_font + i));
}
printf("\n");
hb_blob_t *font_blob = hb_blob_create(raw_font, stat.st_size, HB_MEMORY_MODE_READONLY, nullptr, nullptr);
}
if (mapped_file != MAP_FAILED) {
if (munmap(mapped_file, stat.st_size) == -1) {
perror("Unable to unmap file");
exit_code = 1;
}
}
if (close(fd) == -1) {
perror("Unable to close file");
exit_code = 1;
}
return exit_code;
}