| 60 | } |
| 61 | |
| 62 | static void MergeClusters(std::vector<Info>& infos) { |
| 63 | auto groupEnd = [&](size_t start) -> size_t { |
| 64 | while (++start < infos.size() && infos[start].isContinuation) |
| 65 | ; |
| 66 | return start; |
| 67 | }; |
| 68 | |
| 69 | for (size_t count = infos.size(), start = 0, end = count ? groupEnd(0) : 0; start < count; |
| 70 | start = end, end = groupEnd(start)) { |
| 71 | if (end - start < 2) { |
| 72 | continue; |
| 73 | } |
| 74 | |
| 75 | auto cluster = infos[start].cluster; |
| 76 | |
| 77 | for (size_t i = start + 1; i < end; i++) { |
| 78 | cluster = std::min(cluster, infos[i].cluster); |
| 79 | } |
| 80 | |
| 81 | /* Extend end */ |
| 82 | while (end < infos.size() && infos[end - 1].cluster == infos[end].cluster) { |
| 83 | end++; |
| 84 | } |
| 85 | |
| 86 | /* Extend start */ |
| 87 | while (0 < start && infos[start - 1].cluster == infos[start].cluster) { |
| 88 | start--; |
| 89 | } |
| 90 | |
| 91 | for (auto i = start; i < end; i++) { |
| 92 | infos[i].cluster = cluster; |
| 93 | } |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | std::vector<ShapedGlyph> NativeTextShaper::Shape(const std::string& text, |
| 98 | std::shared_ptr<tgfx::Typeface> typeface) { |