/src/mozilla-central/intl/lwbrk/nsPangoBreaker.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
3 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | | |
6 | | #include "nsComplexBreaker.h" |
7 | | |
8 | | #include <pango/pango-break.h> |
9 | | #include "nsUTF8Utils.h" |
10 | | #include "nsString.h" |
11 | | #include "nsTArray.h" |
12 | | |
13 | | void |
14 | | NS_GetComplexLineBreaks(const char16_t* aText, uint32_t aLength, |
15 | | uint8_t* aBreakBefore) |
16 | 0 | { |
17 | 0 | NS_ASSERTION(aText, "aText shouldn't be null"); |
18 | 0 |
|
19 | 0 | memset(aBreakBefore, false, aLength * sizeof(uint8_t)); |
20 | 0 |
|
21 | 0 | AutoTArray<PangoLogAttr, 2000> attrBuffer; |
22 | 0 | if (!attrBuffer.AppendElements(aLength + 1)) |
23 | 0 | return; |
24 | 0 | |
25 | 0 | NS_ConvertUTF16toUTF8 aUTF8(aText, aLength); |
26 | 0 |
|
27 | 0 | const gchar* p = aUTF8.Data(); |
28 | 0 | const gchar* end = p + aUTF8.Length(); |
29 | 0 | uint32_t u16Offset = 0; |
30 | 0 |
|
31 | 0 | static PangoLanguage* language = pango_language_from_string("en"); |
32 | 0 |
|
33 | 0 | while (p < end) |
34 | 0 | { |
35 | 0 | PangoLogAttr* attr = attrBuffer.Elements(); |
36 | 0 | pango_get_log_attrs(p, end - p, -1, language, attr, attrBuffer.Length()); |
37 | 0 |
|
38 | 0 | while (p < end) |
39 | 0 | { |
40 | 0 | aBreakBefore[u16Offset] = attr->is_line_break; |
41 | 0 | if (NS_IS_LOW_SURROGATE(aText[u16Offset])) |
42 | 0 | aBreakBefore[++u16Offset] = false; // Skip high surrogate |
43 | 0 | ++u16Offset; |
44 | 0 |
|
45 | 0 | // We're iterating over text obtained from NS_ConvertUTF16toUTF8, |
46 | 0 | // so we know we have valid UTF-8 and don't need to check for |
47 | 0 | // errors. |
48 | 0 | uint32_t ch = UTF8CharEnumerator::NextChar(&p, end); |
49 | 0 | ++attr; |
50 | 0 |
|
51 | 0 | if (!ch) { |
52 | 0 | // pango_break (pango 1.16.2) only analyses text before the |
53 | 0 | // first NUL (but sets one extra attr). Workaround loop to call |
54 | 0 | // pango_break again to analyse after the NUL is done somewhere else |
55 | 0 | // (gfx/thebes/gfxFontconfigFonts.cpp: SetupClusterBoundaries()). |
56 | 0 | // So, we do the same here for pango_get_log_attrs. |
57 | 0 | break; |
58 | 0 | } |
59 | 0 | } |
60 | 0 | } |
61 | 0 | } |
62 | | |