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