1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2011,2012 Google, Inc. 3*2d1272b8SAndroid Build Coastguard Worker * 4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 5*2d1272b8SAndroid Build Coastguard Worker * 6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 11*2d1272b8SAndroid Build Coastguard Worker * 12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 17*2d1272b8SAndroid Build Coastguard Worker * 18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23*2d1272b8SAndroid Build Coastguard Worker * 24*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod 25*2d1272b8SAndroid Build Coastguard Worker */ 26*2d1272b8SAndroid Build Coastguard Worker 27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_SHAPE_CONSUMER_HH 28*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPE_CONSUMER_HH 29*2d1272b8SAndroid Build Coastguard Worker 30*2d1272b8SAndroid Build Coastguard Worker #include "font-options.hh" 31*2d1272b8SAndroid Build Coastguard Worker #include "shape-options.hh" 32*2d1272b8SAndroid Build Coastguard Worker #include "text-options.hh" 33*2d1272b8SAndroid Build Coastguard Worker 34*2d1272b8SAndroid Build Coastguard Worker 35*2d1272b8SAndroid Build Coastguard Worker template <typename output_t> 36*2d1272b8SAndroid Build Coastguard Worker struct shape_consumer_t : shape_options_t 37*2d1272b8SAndroid Build Coastguard Worker { add_optionsshape_consumer_t38*2d1272b8SAndroid Build Coastguard Worker void add_options (option_parser_t *parser) 39*2d1272b8SAndroid Build Coastguard Worker { 40*2d1272b8SAndroid Build Coastguard Worker shape_options_t::add_options (parser); 41*2d1272b8SAndroid Build Coastguard Worker output.add_options (parser); 42*2d1272b8SAndroid Build Coastguard Worker } 43*2d1272b8SAndroid Build Coastguard Worker 44*2d1272b8SAndroid Build Coastguard Worker template <typename app_t> initshape_consumer_t45*2d1272b8SAndroid Build Coastguard Worker void init (const app_t *app) 46*2d1272b8SAndroid Build Coastguard Worker { 47*2d1272b8SAndroid Build Coastguard Worker failed = false; 48*2d1272b8SAndroid Build Coastguard Worker buffer = hb_buffer_create (); 49*2d1272b8SAndroid Build Coastguard Worker 50*2d1272b8SAndroid Build Coastguard Worker output.init (buffer, app); 51*2d1272b8SAndroid Build Coastguard Worker } 52*2d1272b8SAndroid Build Coastguard Worker template <typename app_t> consume_lineshape_consumer_t53*2d1272b8SAndroid Build Coastguard Worker bool consume_line (app_t &app) 54*2d1272b8SAndroid Build Coastguard Worker { 55*2d1272b8SAndroid Build Coastguard Worker unsigned int text_len; 56*2d1272b8SAndroid Build Coastguard Worker const char *text; 57*2d1272b8SAndroid Build Coastguard Worker if (!(text = app.get_line (&text_len))) 58*2d1272b8SAndroid Build Coastguard Worker return false; 59*2d1272b8SAndroid Build Coastguard Worker 60*2d1272b8SAndroid Build Coastguard Worker output.new_line (); 61*2d1272b8SAndroid Build Coastguard Worker 62*2d1272b8SAndroid Build Coastguard Worker for (unsigned int n = num_iterations; n; n--) 63*2d1272b8SAndroid Build Coastguard Worker { 64*2d1272b8SAndroid Build Coastguard Worker populate_buffer (buffer, text, text_len, app.text_before, app.text_after, app.font); 65*2d1272b8SAndroid Build Coastguard Worker if (n == 1) 66*2d1272b8SAndroid Build Coastguard Worker output.consume_text (buffer, text, text_len, utf8_clusters); 67*2d1272b8SAndroid Build Coastguard Worker 68*2d1272b8SAndroid Build Coastguard Worker const char *error = nullptr; 69*2d1272b8SAndroid Build Coastguard Worker if (!shape (app.font, buffer, &error)) 70*2d1272b8SAndroid Build Coastguard Worker { 71*2d1272b8SAndroid Build Coastguard Worker failed = true; 72*2d1272b8SAndroid Build Coastguard Worker output.error (error); 73*2d1272b8SAndroid Build Coastguard Worker if (hb_buffer_get_content_type (buffer) == HB_BUFFER_CONTENT_TYPE_GLYPHS) 74*2d1272b8SAndroid Build Coastguard Worker break; 75*2d1272b8SAndroid Build Coastguard Worker else 76*2d1272b8SAndroid Build Coastguard Worker return true; 77*2d1272b8SAndroid Build Coastguard Worker } 78*2d1272b8SAndroid Build Coastguard Worker } 79*2d1272b8SAndroid Build Coastguard Worker 80*2d1272b8SAndroid Build Coastguard Worker if (glyphs) 81*2d1272b8SAndroid Build Coastguard Worker output.consume_glyphs (buffer, nullptr, 0, false); 82*2d1272b8SAndroid Build Coastguard Worker else 83*2d1272b8SAndroid Build Coastguard Worker output.consume_glyphs (buffer, text, text_len, utf8_clusters); 84*2d1272b8SAndroid Build Coastguard Worker return true; 85*2d1272b8SAndroid Build Coastguard Worker } 86*2d1272b8SAndroid Build Coastguard Worker template <typename app_t> finishshape_consumer_t87*2d1272b8SAndroid Build Coastguard Worker void finish (const app_t *app) 88*2d1272b8SAndroid Build Coastguard Worker { 89*2d1272b8SAndroid Build Coastguard Worker output.finish (buffer, app); 90*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer); 91*2d1272b8SAndroid Build Coastguard Worker buffer = nullptr; 92*2d1272b8SAndroid Build Coastguard Worker } 93*2d1272b8SAndroid Build Coastguard Worker 94*2d1272b8SAndroid Build Coastguard Worker public: 95*2d1272b8SAndroid Build Coastguard Worker bool failed = false; 96*2d1272b8SAndroid Build Coastguard Worker 97*2d1272b8SAndroid Build Coastguard Worker protected: 98*2d1272b8SAndroid Build Coastguard Worker output_t output; 99*2d1272b8SAndroid Build Coastguard Worker 100*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = nullptr; 101*2d1272b8SAndroid Build Coastguard Worker }; 102*2d1272b8SAndroid Build Coastguard Worker 103*2d1272b8SAndroid Build Coastguard Worker 104*2d1272b8SAndroid Build Coastguard Worker #endif 105