hb-fallback-shape.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2011  Google, Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  This is part of HarfBuzz, a text shaping library.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER fallback
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shaper-impl-private.hh"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * shaper face data
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_fallback_shaper_face_data_t {};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_fallback_shaper_face_data_t *
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shaper_face_data_create (hb_face_t *face)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * shaper font data
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_fallback_shaper_font_data_t {};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_fallback_shaper_font_data_t *
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shaper_font_data_create (hb_font_t *font)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (hb_fallback_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * shaper shape_plan data
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_fallback_shaper_shape_plan_data_t {};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_fallback_shaper_shape_plan_data_t *
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    const hb_feature_t *user_features HB_UNUSED,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    unsigned int        num_user_features HB_UNUSED)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shaper_shape_plan_data_destroy (hb_fallback_shaper_shape_plan_data_t *data HB_UNUSED)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * shaper
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_fallback_shape (hb_shape_plan_t    *shape_plan,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hb_font_t          *font,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    hb_buffer_t        *buffer,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const hb_feature_t *features HB_UNUSED,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    unsigned int        num_features HB_UNUSED)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_codepoint_t space;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font->get_glyph (' ', 0, &space);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer->guess_properties ();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer->clear_positions ();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int count = buffer->len;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned int i = 0; i < count; i++)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buffer->unicode->is_default_ignorable (buffer->info[i].codepoint)) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer->info[i].codepoint = space;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer->pos[i].x_advance = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer->pos[i].y_advance = 0;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    font->get_glyph (buffer->info[i].codepoint, 0, &buffer->info[i].codepoint);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    font->get_glyph_advance_for_direction (buffer->info[i].codepoint,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   buffer->props.direction,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   &buffer->pos[i].x_advance,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   &buffer->pos[i].y_advance);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    font->subtract_glyph_origin_for_direction (buffer->info[i].codepoint,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       buffer->props.direction,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       &buffer->pos[i].x_offset,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       &buffer->pos[i].y_offset);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hb_buffer_reverse (buffer);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
130