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 *
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED)
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
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED)
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 *
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_hb_fallback_shaper_font_data_create (hb_font_t *font HB_UNUSED)
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
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data HB_UNUSED)
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
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_hb_fallback_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
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){
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /* TODO
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   *
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   * - Apply fallback kern.
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   * - Handle Variation Selectors?
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   * - Apply normalization?
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   *
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   * This will make the fallback shaper into a dumb "TrueType"
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   * shaper which many people unfortunately still request.
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   */
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_codepoint_t space;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool has_space = font->get_glyph (' ', 0, &space);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer->clear_positions ();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  hb_direction_t direction = buffer->props.direction;
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  hb_unicode_funcs_t *unicode = buffer->unicode;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int count = buffer->len;
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  hb_glyph_info_t *info = buffer->info;
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  hb_glyph_position_t *pos = buffer->pos;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned int i = 0; i < count; i++)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (has_space && unicode->is_default_ignorable (info[i].codepoint)) {
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      info[i].codepoint = space;
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pos[i].x_advance = 0;
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pos[i].y_advance = 0;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    font->get_glyph (info[i].codepoint, 0, &info[i].codepoint);
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    font->get_glyph_advance_for_direction (info[i].codepoint,
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					   direction,
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					   &pos[i].x_advance,
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					   &pos[i].y_advance);
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    font->subtract_glyph_origin_for_direction (info[i].codepoint,
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					       direction,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					       &pos[i].x_offset,
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					       &pos[i].y_offset);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (HB_DIRECTION_IS_BACKWARD (direction))
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hb_buffer_reverse (buffer);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
142