hb-subset.cc 3.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Copyright © 2009  Red Hat, Inc.
 * Copyright © 2012  Google, Inc.
 *
 *  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): Garret Rieger, Rod Sheeter
 */

#include "hb-object-private.hh"
29
#include "hb-private.hh"
30

31
#include "hb-subset-glyf.hh"
32
#include "hb-subset-private.hh"
33
#include "hb-subset-plan.hh"
34

35 36
#include "hb-ot-glyf-table.hh"

37 38 39 40

const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};


41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
struct hb_subset_profile_t {
  hb_object_header_t header;
  ASSERT_POD ();
};

/**
 * hb_subset_profile_create:
 *
 * Return value: New profile with default settings.
 *
 * Since: 1.7.5
 **/
hb_subset_profile_t *
hb_subset_profile_create ()
{
  return hb_object_create<hb_subset_profile_t>();
}

/**
 * hb_subset_profile_destroy:
 *
 * Since: 1.7.5
 **/
void
hb_subset_profile_destroy (hb_subset_profile_t *profile)
{
  if (!hb_object_destroy (profile)) return;

  free (profile);
}

/**
 * hb_subset_input_create:
 *
 * Return value: New subset input.
 *
 * Since: 1.7.5
 **/
hb_subset_input_t *
G
Garret Rieger 已提交
80
hb_subset_input_create (hb_set_t *codepoints)
81
{
G
Garret Rieger 已提交
82 83 84 85 86 87
  if (unlikely (!codepoints))
    codepoints = hb_set_get_empty();

  hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
  input->codepoints = hb_set_reference(codepoints);
  return input;
88 89 90 91 92 93 94 95 96 97 98 99
}

/**
 * hb_subset_input_destroy:
 *
 * Since: 1.7.5
 **/
void
hb_subset_input_destroy(hb_subset_input_t *subset_input)
{
  if (!hb_object_destroy (subset_input)) return;

G
Garret Rieger 已提交
100
  hb_set_destroy (subset_input->codepoints);
101 102 103 104 105 106 107 108 109 110 111 112 113
  free (subset_input);
}


/**
 * hb_subset:
 * @profile: profile to use for the subsetting.
 * @input: input to use for the subsetting.
 * @face: font face data to be subset.
 * @result: subsetting result.
 *
 * Subsets a font according to provided profile and input.
 **/
114 115 116 117
hb_face_t *
hb_subset (hb_face_t *source,
	   hb_subset_profile_t *profile,
           hb_subset_input_t *input)
118
{
119
  if (unlikely (!profile || !input || !source)) return nullptr;
120

121
  hb_subset_plan_t *plan = hb_subset_plan_create (source, profile, input);
122

123 124 125 126
  hb_codepoint_t old_gid = -1;
  while (hb_set_next(plan->glyphs_to_retain, &old_gid)) {
    hb_codepoint_t new_gid;
    if (hb_subset_plan_new_gid_for_old_id(plan, old_gid, &new_gid)) {
R
Rod Sheeter 已提交
127
      DEBUG_MSG(SUBSET, nullptr, "Remap %d : %d", old_gid, new_gid);
128
    } else {
R
Rod Sheeter 已提交
129
      DEBUG_MSG(SUBSET, nullptr, "Remap %d : DOOM! No new ID", old_gid);
130 131
    }
  }
132 133 134 135 136 137 138
  // TODO:
  // - Create initial header + table directory
  // - Loop through the set of tables to be kept:
  //   - Perform table specific subsetting if defined.
  //   - copy the table into the output.
  // - Fix header + table directory.

139
  bool success = true;
140

141
  hb_blob_t *glyf_prime = nullptr;
142
  if (hb_subset_glyf (plan, source, &glyf_prime)) {
143 144 145 146 147 148
    // TODO: write new glyf to new face.
  } else {
    success = false;
  }
  hb_blob_destroy (glyf_prime);

149
  hb_subset_plan_destroy (plan);
150
  return success ? hb_face_reference (source) : nullptr;
151
}