Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 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 | |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 27 | #ifndef HB_SHAPE_CONSUMER_HH |
| 28 | #define HB_SHAPE_CONSUMER_HH |
| 29 | |
Behdad Esfahbod | 58c2233 | 2021-08-06 23:45:59 -0600 | [diff] [blame] | 30 | #include "font-options.hh" |
Behdad Esfahbod | c3599fd | 2021-08-06 23:24:28 -0600 | [diff] [blame] | 31 | #include "shape-options.hh" |
Behdad Esfahbod | 97a9e4e | 2021-08-11 19:28:16 -0600 | [diff] [blame] | 32 | #include "text-options.hh" |
Behdad Esfahbod | 17f40b7 | 2017-10-27 09:22:30 -0600 | [diff] [blame] | 33 | |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 34 | |
| 35 | template <typename output_t> |
Behdad Esfahbod | 4e97678 | 2021-08-06 22:53:44 -0600 | [diff] [blame] | 36 | struct shape_consumer_t : shape_options_t |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 37 | { |
Behdad Esfahbod | e109f9a | 2021-08-05 11:05:51 -0600 | [diff] [blame] | 38 | void add_options (option_parser_t *parser) |
| 39 | { |
Behdad Esfahbod | 4e97678 | 2021-08-06 22:53:44 -0600 | [diff] [blame] | 40 | shape_options_t::add_options (parser); |
Behdad Esfahbod | e109f9a | 2021-08-05 11:05:51 -0600 | [diff] [blame] | 41 | output.add_options (parser); |
| 42 | } |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 43 | |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 44 | template <typename app_t> |
| 45 | void init (const app_t *app) |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 46 | { |
Behdad Esfahbod | 5db0683 | 2012-06-02 12:13:08 -0400 | [diff] [blame] | 47 | failed = false; |
Behdad Esfahbod | fc0339e | 2021-08-05 13:35:46 -0600 | [diff] [blame] | 48 | buffer = hb_buffer_create (); |
Behdad Esfahbod | e603505 | 2017-07-18 19:14:19 -0700 | [diff] [blame] | 49 | |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 50 | output.init (buffer, app); |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 51 | } |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 52 | template <typename app_t> |
| 53 | bool consume_line (app_t &app) |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 54 | { |
Behdad Esfahbod | 97a9e4e | 2021-08-11 19:28:16 -0600 | [diff] [blame] | 55 | unsigned int text_len; |
| 56 | const char *text; |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 57 | if (!(text = app.get_line (&text_len))) |
Behdad Esfahbod | 97a9e4e | 2021-08-11 19:28:16 -0600 | [diff] [blame] | 58 | return false; |
| 59 | |
Behdad Esfahbod | 5db0683 | 2012-06-02 12:13:08 -0400 | [diff] [blame] | 60 | output.new_line (); |
Behdad Esfahbod | ae62166 | 2012-06-02 12:21:19 -0400 | [diff] [blame] | 61 | |
Behdad Esfahbod | 4e97678 | 2021-08-06 22:53:44 -0600 | [diff] [blame] | 62 | for (unsigned int n = num_iterations; n; n--) |
Behdad Esfahbod | 50067e2 | 2013-04-11 16:31:01 -0400 | [diff] [blame] | 63 | { |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 64 | populate_buffer (buffer, text, text_len, app.text_before, app.text_after); |
Behdad Esfahbod | e404608 | 2013-04-17 23:49:54 -0400 | [diff] [blame] | 65 | if (n == 1) |
Behdad Esfahbod | 4e97678 | 2021-08-06 22:53:44 -0600 | [diff] [blame] | 66 | output.consume_text (buffer, text, text_len, utf8_clusters); |
Seigo Nonaka | c62d6f4 | 2023-03-01 19:52:57 +0900 | [diff] [blame] | 67 | |
| 68 | const char *error = nullptr; |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 69 | if (!shape (app.font, buffer, &error)) |
Behdad Esfahbod | e603505 | 2017-07-18 19:14:19 -0700 | [diff] [blame] | 70 | { |
Behdad Esfahbod | 50067e2 | 2013-04-11 16:31:01 -0400 | [diff] [blame] | 71 | failed = true; |
Behdad Esfahbod | d205227 | 2017-08-11 15:12:25 -0700 | [diff] [blame] | 72 | output.error (error); |
| 73 | if (hb_buffer_get_content_type (buffer) == HB_BUFFER_CONTENT_TYPE_GLYPHS) |
| 74 | break; |
| 75 | else |
Behdad Esfahbod | 97a9e4e | 2021-08-11 19:28:16 -0600 | [diff] [blame] | 76 | return true; |
Behdad Esfahbod | 50067e2 | 2013-04-11 16:31:01 -0400 | [diff] [blame] | 77 | } |
Behdad Esfahbod | 5db0683 | 2012-06-02 12:13:08 -0400 | [diff] [blame] | 78 | } |
| 79 | |
Behdad Esfahbod | 4e97678 | 2021-08-06 22:53:44 -0600 | [diff] [blame] | 80 | output.consume_glyphs (buffer, text, text_len, utf8_clusters); |
Behdad Esfahbod | 97a9e4e | 2021-08-11 19:28:16 -0600 | [diff] [blame] | 81 | return true; |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 82 | } |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 83 | template <typename app_t> |
| 84 | void finish (const app_t *app) |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 85 | { |
Behdad Esfahbod | da285d5 | 2021-09-14 08:28:12 -0400 | [diff] [blame] | 86 | output.finish (buffer, app); |
Behdad Esfahbod | e603505 | 2017-07-18 19:14:19 -0700 | [diff] [blame] | 87 | hb_buffer_destroy (buffer); |
Behdad Esfahbod | dbdbfe3 | 2017-10-15 12:11:08 +0200 | [diff] [blame] | 88 | buffer = nullptr; |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 89 | } |
| 90 | |
Behdad Esfahbod | 5db0683 | 2012-06-02 12:13:08 -0400 | [diff] [blame] | 91 | public: |
Behdad Esfahbod | e57dd66 | 2021-08-05 10:33:31 -0600 | [diff] [blame] | 92 | bool failed = false; |
Behdad Esfahbod | 5db0683 | 2012-06-02 12:13:08 -0400 | [diff] [blame] | 93 | |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 94 | protected: |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 95 | output_t output; |
| 96 | |
Behdad Esfahbod | e57dd66 | 2021-08-05 10:33:31 -0600 | [diff] [blame] | 97 | hb_buffer_t *buffer = nullptr; |
Behdad Esfahbod | 45675e5 | 2012-05-15 23:10:39 -0400 | [diff] [blame] | 98 | }; |
| 99 | |
| 100 | |
| 101 | #endif |