michael@0: /* michael@0: * Copyright © 2011 Google, Inc. michael@0: * michael@0: * This is part of HarfBuzz, a text shaping library. michael@0: * michael@0: * Permission is hereby granted, without written agreement and without michael@0: * license or royalty fees, to use, copy, modify, and distribute this michael@0: * software and its documentation for any purpose, provided that the michael@0: * above copyright notice and the following two paragraphs appear in michael@0: * all copies of this software. michael@0: * michael@0: * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR michael@0: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES michael@0: * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN michael@0: * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH michael@0: * DAMAGE. michael@0: * michael@0: * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, michael@0: * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND michael@0: * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS michael@0: * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO michael@0: * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. michael@0: * michael@0: * Google Author(s): Behdad Esfahbod michael@0: */ michael@0: michael@0: #define HB_SHAPER fallback michael@0: #include "hb-shaper-impl-private.hh" michael@0: michael@0: michael@0: /* michael@0: * shaper face data michael@0: */ michael@0: michael@0: struct hb_fallback_shaper_face_data_t {}; michael@0: michael@0: hb_fallback_shaper_face_data_t * michael@0: _hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED) michael@0: { michael@0: return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED; michael@0: } michael@0: michael@0: void michael@0: _hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED) michael@0: { michael@0: } michael@0: michael@0: michael@0: /* michael@0: * shaper font data michael@0: */ michael@0: michael@0: struct hb_fallback_shaper_font_data_t {}; michael@0: michael@0: hb_fallback_shaper_font_data_t * michael@0: _hb_fallback_shaper_font_data_create (hb_font_t *font HB_UNUSED) michael@0: { michael@0: return (hb_fallback_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; michael@0: } michael@0: michael@0: void michael@0: _hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data HB_UNUSED) michael@0: { michael@0: } michael@0: michael@0: michael@0: /* michael@0: * shaper shape_plan data michael@0: */ michael@0: michael@0: struct hb_fallback_shaper_shape_plan_data_t {}; michael@0: michael@0: hb_fallback_shaper_shape_plan_data_t * michael@0: _hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, michael@0: const hb_feature_t *user_features HB_UNUSED, michael@0: unsigned int num_user_features HB_UNUSED) michael@0: { michael@0: return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; michael@0: } michael@0: michael@0: void michael@0: _hb_fallback_shaper_shape_plan_data_destroy (hb_fallback_shaper_shape_plan_data_t *data HB_UNUSED) michael@0: { michael@0: } michael@0: michael@0: michael@0: /* michael@0: * shaper michael@0: */ michael@0: michael@0: hb_bool_t michael@0: _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED, michael@0: hb_font_t *font, michael@0: hb_buffer_t *buffer, michael@0: const hb_feature_t *features HB_UNUSED, michael@0: unsigned int num_features HB_UNUSED) michael@0: { michael@0: /* TODO michael@0: * michael@0: * - Apply fallback kern. michael@0: * - Handle Variation Selectors? michael@0: * - Apply normalization? michael@0: * michael@0: * This will make the fallback shaper into a dumb "TrueType" michael@0: * shaper which many people unfortunately still request. michael@0: */ michael@0: michael@0: bool has_space; michael@0: hb_codepoint_t space; michael@0: has_space = font->get_glyph (' ', 0, &space); michael@0: michael@0: buffer->clear_positions (); michael@0: michael@0: unsigned int count = buffer->len; michael@0: michael@0: for (unsigned int i = 0; i < count; i++) michael@0: { michael@0: if (has_space && buffer->unicode->is_default_ignorable (buffer->info[i].codepoint)) { michael@0: buffer->info[i].codepoint = space; michael@0: buffer->pos[i].x_advance = 0; michael@0: buffer->pos[i].y_advance = 0; michael@0: continue; michael@0: } michael@0: font->get_glyph (buffer->info[i].codepoint, 0, &buffer->info[i].codepoint); michael@0: font->get_glyph_advance_for_direction (buffer->info[i].codepoint, michael@0: buffer->props.direction, michael@0: &buffer->pos[i].x_advance, michael@0: &buffer->pos[i].y_advance); michael@0: font->subtract_glyph_origin_for_direction (buffer->info[i].codepoint, michael@0: buffer->props.direction, michael@0: &buffer->pos[i].x_offset, michael@0: &buffer->pos[i].y_offset); michael@0: } michael@0: michael@0: if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction)) michael@0: hb_buffer_reverse (buffer); michael@0: michael@0: return true; michael@0: }