os/graphics/graphicsdeviceinterface/gdi/sgdi/LineBreak.cpp
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/graphics/graphicsdeviceinterface/gdi/sgdi/LineBreak.cpp	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,1990 @@
     1.4 +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
     1.5 +// All rights reserved.
     1.6 +// This component and the accompanying materials are made available
     1.7 +// under the terms of "Eclipse Public License v1.0"
     1.8 +// which accompanies this distribution, and is available
     1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
    1.10 +//
    1.11 +// Initial Contributors:
    1.12 +// Nokia Corporation - initial contribution.
    1.13 +//
    1.14 +// Contributors:
    1.15 +//
    1.16 +// Description:
    1.17 +// This file was last edited on 09/04/2007. Please read the 'Unicode Character Data and Line Break data Update History.doc' file
    1.18 +// for the latest updates.
    1.19 +// 
    1.20 +//
    1.21 +
    1.22 +#include "LineBreak.h"
    1.23 +#include "LineBreakImp.h"
    1.24 +#include <e32std.h>
    1.25 +#include <e32svr.h>
    1.26 +
    1.27 +_LIT(KLinebreakPanicCategory,"LineBreak");
    1.28 +
    1.29 +GLDEF_C void Panic(TInt aError)
    1.30 +	{
    1.31 +	User::Panic(KLinebreakPanicCategory,aError);
    1.32 +	}
    1.33 +
    1.34 +const TUint KOpFlag = 1 << MLineBreaker::EOpLineBreakClass;
    1.35 +const TUint KClFlag = 1 << MLineBreaker::EClLineBreakClass;
    1.36 +const TUint KNsFlag = 1 << MLineBreaker::ENsLineBreakClass;
    1.37 +const TUint KExFlag = 1 << MLineBreaker::EExLineBreakClass;
    1.38 +const TUint KSyFlag = 1 << MLineBreaker::ESyLineBreakClass;
    1.39 +const TUint KIsFlag = 1 << MLineBreaker::EIsLineBreakClass;
    1.40 +const TUint KPrFlag = 1 << MLineBreaker::EPrLineBreakClass;
    1.41 +const TUint KPoFlag = 1 << MLineBreaker::EPoLineBreakClass;
    1.42 +const TUint KNuFlag = 1 << MLineBreaker::ENuLineBreakClass;
    1.43 +const TUint KAlFlag = 1 << MLineBreaker::EAlLineBreakClass;
    1.44 +const TUint KIdFlag = 1 << MLineBreaker::EIdLineBreakClass;
    1.45 +const TUint KInFlag = 1 << MLineBreaker::EInLineBreakClass;
    1.46 +const TUint KBbFlag = 1 << MLineBreaker::EBbLineBreakClass;
    1.47 +const TUint KB2Flag = 1 << MLineBreaker::EB2LineBreakClass;
    1.48 +const TUint KZwFlag = 1 << MLineBreaker::EZwLineBreakClass;
    1.49 +const TUint KCmFlag = 1 << MLineBreaker::ECmLineBreakClass;
    1.50 +const TUint KAiFlag = 1 << MLineBreaker::EAiLineBreakClass;
    1.51 +
    1.52 +const TUint KAiAlFlags = KAiFlag | KAlFlag;
    1.53 +
    1.54 +const TUint KAllBreaks = 0xFFFFFFFF;
    1.55 +const TUint KUsualForbidden = KClFlag | KExFlag | KSyFlag | KIsFlag | KZwFlag;
    1.56 +const TUint KUsualAllowed = KOpFlag | KPrFlag | KPoFlag | KNuFlag | KAiAlFlags | KIdFlag | KInFlag | KBbFlag | KB2Flag;
    1.57 +
    1.58 +const TUint KAlAllowed = KOpFlag | KPrFlag | KPoFlag | KIdFlag | KBbFlag | KB2Flag;
    1.59 +
    1.60 +// A table of break rules, indexed by the class of the character before the possible break.
    1.61 +static const TLineBreakRule TheLineBreakRuleTable[MLineBreaker::ELineBreakClasses] =
    1.62 +	{
    1.63 +	{ KAllBreaks - KCmFlag,0 },														// Op
    1.64 +	{ KUsualForbidden | KNsFlag,KUsualAllowed - KPoFlag },							// Cl
    1.65 +	{ KUsualForbidden | KOpFlag,0 },												// Qu
    1.66 +	{ KUsualForbidden, 0 },															// Gl
    1.67 +	{ KUsualForbidden, KUsualAllowed },												// Ns
    1.68 +	{ KUsualForbidden, KUsualAllowed },												// Ex
    1.69 +	{ KUsualForbidden, KUsualAllowed - KNuFlag },									// Sy
    1.70 +	{ KUsualForbidden, KUsualAllowed - KNuFlag },									// Is
    1.71 +	{ KUsualForbidden, KPrFlag | KPoFlag | KInFlag | KBbFlag | KB2Flag },			// Pr
    1.72 +	{ KUsualForbidden, KUsualAllowed },												// Po
    1.73 +	{ KUsualForbidden, KOpFlag | KPrFlag | KIdFlag | KBbFlag | KB2Flag },			// Nu
    1.74 +	{ KUsualForbidden, KAlAllowed }, // Al
    1.75 +	{ KUsualForbidden, KUsualAllowed - KPoFlag - KInFlag },							// Id
    1.76 +	{ KUsualForbidden, KUsualAllowed - KInFlag },									// In
    1.77 +	{ KUsualForbidden, KUsualAllowed },												// Hy
    1.78 +	{ KUsualForbidden, KUsualAllowed },												// Ba
    1.79 +	{ KUsualForbidden, 0 },															// Bb
    1.80 +	{ KUsualForbidden | KB2Flag, KUsualAllowed },									// B2
    1.81 +	{ KZwFlag, KAllBreaks - KZwFlag - KCmFlag},										// Zw
    1.82 +	{ KUsualForbidden, KOpFlag | KPrFlag | KPoFlag | KIdFlag | KBbFlag | KB2Flag }, // Cm
    1.83 +	{ 0, 0, },																		// Bk
    1.84 +	{ 0, 0, }, // Cr
    1.85 +	{ 0, 0, }, // Lf
    1.86 +	{ 0, 0, },																		// Sg
    1.87 +	{ 0, 0, },																		// Cb
    1.88 +	{ KAllBreaks, 0, },																// Sp
    1.89 +	{ 0, 0, },																		// Sa
    1.90 +	{ KUsualForbidden, KAlAllowed, }, // Ai
    1.91 +	{ 0, 0, }																		// Xx
    1.92 +	};
    1.93 +
    1.94 +/**
    1.95 +A sorted table of ranges of characters, with their line breaking classes.
    1.96 +A range includes all codes for iStart <= code < iEnd.
    1.97 +All these items have fixed range, please don't split any item into more or 
    1.98 +combine consecutive items even if they have the same property,
    1.99 +because these change will cause mismatch with customer definition.
   1.100 +*/
   1.101 +static const TLineBreakRange TheLineBreakRangeTable[] = 
   1.102 +	{
   1.103 +    { 0x0000, 0x0009, MLineBreaker::ECmLineBreakClass },  //<control>
   1.104 +    { 0x0009, 0x000a, MLineBreaker::EBaLineBreakClass },  //<control>
   1.105 +    { 0x000a, 0x000b, MLineBreaker::ELfLineBreakClass },  //<control>
   1.106 +    { 0x000b, 0x000c, MLineBreaker::ECmLineBreakClass },  //<control>
   1.107 +    { 0x000c, 0x000d, MLineBreaker::EBkLineBreakClass },  //<control>
   1.108 +    { 0x000d, 0x000e, MLineBreaker::ECrLineBreakClass },  //<control>
   1.109 +    { 0x000e, 0x0020, MLineBreaker::ECmLineBreakClass },  //<control>
   1.110 +    { 0x0020, 0x0021, MLineBreaker::ESpLineBreakClass },  //space
   1.111 +    { 0x0021, 0x0022, MLineBreaker::EExLineBreakClass },  //exclamation mark
   1.112 +    { 0x0022, 0x0023, MLineBreaker::EQuLineBreakClass },  //quotation mark
   1.113 +    { 0x0023, 0x0024, MLineBreaker::EAlLineBreakClass },  //number sign
   1.114 +    { 0x0024, 0x0025, MLineBreaker::EPrLineBreakClass },  //dollar sign
   1.115 +    { 0x0025, 0x0026, MLineBreaker::EPoLineBreakClass },  //percent sign
   1.116 +    { 0x0026, 0x0027, MLineBreaker::EAlLineBreakClass },  //ampersand
   1.117 +    { 0x0027, 0x0028, MLineBreaker::EQuLineBreakClass },  //apostrophe
   1.118 +    { 0x0028, 0x0029, MLineBreaker::EOpLineBreakClass },  //left parenthesis
   1.119 +    { 0x0029, 0x002a, MLineBreaker::EClLineBreakClass },  //right parenthesis
   1.120 +    { 0x002a, 0x002b, MLineBreaker::EAlLineBreakClass },  //asterisk
   1.121 +    { 0x002b, 0x002c, MLineBreaker::EPrLineBreakClass },  //plus sign
   1.122 +    { 0x002c, 0x002d, MLineBreaker::EIsLineBreakClass },  //comma
   1.123 +    { 0x002d, 0x002e, MLineBreaker::EHyLineBreakClass },  //hyphen-minus
   1.124 +    { 0x002e, 0x002f, MLineBreaker::EIsLineBreakClass },  //full stop
   1.125 +    { 0x002f, 0x0030, MLineBreaker::ESyLineBreakClass },  //solidus
   1.126 +    { 0x0030, 0x003a, MLineBreaker::ENuLineBreakClass },  //digit zero
   1.127 +    { 0x003a, 0x003c, MLineBreaker::EIsLineBreakClass },  //colon
   1.128 +    { 0x003c, 0x003f, MLineBreaker::EAlLineBreakClass },  //less-than sign
   1.129 +    { 0x003f, 0x0040, MLineBreaker::EExLineBreakClass },  //question mark
   1.130 +    { 0x0040, 0x005b, MLineBreaker::EAlLineBreakClass },  //commercial at
   1.131 +    { 0x005b, 0x005c, MLineBreaker::EOpLineBreakClass },  //left square bracket
   1.132 +    { 0x005c, 0x005d, MLineBreaker::EPrLineBreakClass },  //reverse solidus
   1.133 +    { 0x005d, 0x005e, MLineBreaker::EClLineBreakClass },  //right square bracket
   1.134 +    { 0x005e, 0x005f, MLineBreaker::EAlLineBreakClass },  //circumflex accent
   1.135 +    { 0x005f, 0x0060, MLineBreaker::EAlLineBreakClass },  //low line (underscore)
   1.136 +	{ 0x0060, 0x007b, MLineBreaker::EAlLineBreakClass },  //grave accent  
   1.137 +	{ 0x007b, 0x007c, MLineBreaker::EOpLineBreakClass },  //left curly bracket
   1.138 +    { 0x007c, 0x007d, MLineBreaker::EBaLineBreakClass },  //vertical line
   1.139 +    { 0x007d, 0x007e, MLineBreaker::EClLineBreakClass },  //right curly bracket
   1.140 +    { 0x007e, 0x007f, MLineBreaker::EAlLineBreakClass },  //tilde
   1.141 +    { 0x007f, 0x00a0, MLineBreaker::ECmLineBreakClass },  //<control>
   1.142 +    { 0x00a0, 0x00a1, MLineBreaker::EGlLineBreakClass },  //no-break space
   1.143 +    { 0x00a1, 0x00a2, MLineBreaker::EAiLineBreakClass },  //inverted exclamation mark
   1.144 +    { 0x00a2, 0x00a3, MLineBreaker::EPoLineBreakClass },  //cent sign
   1.145 +    { 0x00a3, 0x00a6, MLineBreaker::EPrLineBreakClass },  //pound sign
   1.146 +    { 0x00a6, 0x00a7, MLineBreaker::EAlLineBreakClass },  //broken bar
   1.147 +    { 0x00a7, 0x00a9, MLineBreaker::EAiLineBreakClass },  //section sign
   1.148 +    { 0x00a9, 0x00aa, MLineBreaker::EAlLineBreakClass },  //copyright sign
   1.149 +    { 0x00aa, 0x00ab, MLineBreaker::EAiLineBreakClass },  //feminine ordinal indicator
   1.150 +    { 0x00ab, 0x00ac, MLineBreaker::EQuLineBreakClass },  //left-pointing double angle quotation mark
   1.151 +    { 0x00ac, 0x00ad, MLineBreaker::EAlLineBreakClass },  //not sign
   1.152 +    { 0x00ad, 0x00ae, MLineBreaker::EBaLineBreakClass },  //soft hyphen
   1.153 +    { 0x00ae, 0x00b0, MLineBreaker::EAlLineBreakClass },  //registered sign
   1.154 +    { 0x00b0, 0x00b1, MLineBreaker::EPoLineBreakClass },  //degree sign
   1.155 +    { 0x00b1, 0x00b2, MLineBreaker::EPrLineBreakClass },  //plus-minus sign
   1.156 +    { 0x00b2, 0x00b4, MLineBreaker::EAiLineBreakClass },  //superscript two
   1.157 +    { 0x00b4, 0x00b5, MLineBreaker::EBaLineBreakClass },  //acute accent
   1.158 +    { 0x00b5, 0x00b6, MLineBreaker::EAlLineBreakClass },  //micro sign
   1.159 +    { 0x00b6, 0x00bb, MLineBreaker::EAiLineBreakClass },  //pilcrow sign
   1.160 +    { 0x00bb, 0x00bc, MLineBreaker::EQuLineBreakClass },  //right-pointing double angle quotation mark
   1.161 +    { 0x00bc, 0x00c0, MLineBreaker::EAiLineBreakClass },  //vulgar fraction one quarter
   1.162 +    { 0x00c0, 0x00c6, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with grave
   1.163 +    { 0x00c6, 0x00c7, MLineBreaker::EAiLineBreakClass },  //latin capital letter ae
   1.164 +    { 0x00c7, 0x00d0, MLineBreaker::EAlLineBreakClass },  //latin capital letter c with cedilla
   1.165 +    { 0x00d0, 0x00d1, MLineBreaker::EAiLineBreakClass },  //latin capital letter eth
   1.166 +    { 0x00d1, 0x00d7, MLineBreaker::EAlLineBreakClass },  //latin capital letter n with tilde
   1.167 +    { 0x00d7, 0x00d9, MLineBreaker::EAiLineBreakClass },  //multiplication sign
   1.168 +    { 0x00d9, 0x00de, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with grave
   1.169 +    { 0x00de, 0x00e2, MLineBreaker::EAiLineBreakClass },  //latin capital letter thorn
   1.170 +    { 0x00e2, 0x00e6, MLineBreaker::EAlLineBreakClass },  //latin small letter a with circumflex
   1.171 +    { 0x00e6, 0x00e7, MLineBreaker::EAiLineBreakClass },  //latin small letter ae
   1.172 +    { 0x00e7, 0x00e8, MLineBreaker::EAlLineBreakClass },  //latin small letter c with cedilla
   1.173 +    { 0x00e8, 0x00eb, MLineBreaker::EAiLineBreakClass },  //latin small letter e with grave
   1.174 +    { 0x00eb, 0x00ec, MLineBreaker::EAlLineBreakClass },  //latin small letter e with diaeresis
   1.175 +    { 0x00ec, 0x00ee, MLineBreaker::EAiLineBreakClass },  //latin small letter i with grave
   1.176 +    { 0x00ee, 0x00f0, MLineBreaker::EAlLineBreakClass },  //latin small letter i with circumflex
   1.177 +    { 0x00f0, 0x00f1, MLineBreaker::EAiLineBreakClass },  //latin small letter eth
   1.178 +    { 0x00f1, 0x00f2, MLineBreaker::EAlLineBreakClass },  //latin small letter n with tilde
   1.179 +    { 0x00f2, 0x00f4, MLineBreaker::EAiLineBreakClass },  //latin small letter o with grave
   1.180 +    { 0x00f4, 0x00f7, MLineBreaker::EAlLineBreakClass },  //latin small letter o with circumflex
   1.181 +    { 0x00f7, 0x00fb, MLineBreaker::EAiLineBreakClass },  //division sign
   1.182 +    { 0x00fb, 0x00fc, MLineBreaker::EAlLineBreakClass },  //latin small letter u with circumflex
   1.183 +    { 0x00fc, 0x00fd, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis
   1.184 +    { 0x00fd, 0x00fe, MLineBreaker::EAlLineBreakClass },  //latin small letter y with acute
   1.185 +    { 0x00fe, 0x00ff, MLineBreaker::EAiLineBreakClass },  //latin small letter thorn
   1.186 +    { 0x00ff, 0x0101, MLineBreaker::EAlLineBreakClass },  //latin small letter y with diaeresis
   1.187 +    { 0x0101, 0x0102, MLineBreaker::EAiLineBreakClass },  //latin small letter a with macron
   1.188 +    { 0x0102, 0x0111, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with breve
   1.189 +    { 0x0111, 0x0112, MLineBreaker::EAiLineBreakClass },  //latin small letter d with stroke
   1.190 +    { 0x0112, 0x0113, MLineBreaker::EAlLineBreakClass },  //latin capital letter e with macron
   1.191 +    { 0x0113, 0x0114, MLineBreaker::EAiLineBreakClass },  //latin small letter e with macron
   1.192 +    { 0x0114, 0x011b, MLineBreaker::EAlLineBreakClass },  //latin capital letter e with breve
   1.193 +    { 0x011b, 0x011c, MLineBreaker::EAiLineBreakClass },  //latin small letter e with caron
   1.194 +    { 0x011c, 0x0126, MLineBreaker::EAlLineBreakClass },  //latin capital letter g with circumflex
   1.195 +    { 0x0126, 0x0128, MLineBreaker::EAiLineBreakClass },  //latin capital letter h with stroke
   1.196 +    { 0x0128, 0x012b, MLineBreaker::EAlLineBreakClass },  //latin capital letter i with tilde
   1.197 +    { 0x012b, 0x012c, MLineBreaker::EAiLineBreakClass },  //latin small letter i with macron
   1.198 +    { 0x012c, 0x0131, MLineBreaker::EAlLineBreakClass },  //latin capital letter i with breve
   1.199 +    { 0x0131, 0x0134, MLineBreaker::EAiLineBreakClass },  //latin small letter dotless i
   1.200 +    { 0x0134, 0x0138, MLineBreaker::EAlLineBreakClass },  //latin capital letter j with circumflex
   1.201 +    { 0x0138, 0x0139, MLineBreaker::EAiLineBreakClass },  //latin small letter kra
   1.202 +    { 0x0139, 0x013f, MLineBreaker::EAlLineBreakClass },  //latin capital letter l with acute
   1.203 +    { 0x013f, 0x0143, MLineBreaker::EAiLineBreakClass },  //latin capital letter l with middle dot
   1.204 +    { 0x0143, 0x0144, MLineBreaker::EAlLineBreakClass },  //latin capital letter n with acute
   1.205 +    { 0x0144, 0x0145, MLineBreaker::EAiLineBreakClass },  //latin small letter n with acute
   1.206 +    { 0x0145, 0x0148, MLineBreaker::EAlLineBreakClass },  //latin capital letter n with cedilla
   1.207 +    { 0x0148, 0x014b, MLineBreaker::EAiLineBreakClass },  //latin small letter n with caron
   1.208 +    { 0x014b, 0x014d, MLineBreaker::EAlLineBreakClass },  //latin small letter eng
   1.209 +    { 0x014d, 0x014e, MLineBreaker::EAiLineBreakClass },  //latin small letter o with macron
   1.210 +    { 0x014e, 0x0152, MLineBreaker::EAlLineBreakClass },  //latin capital letter o with breve
   1.211 +    { 0x0152, 0x0154, MLineBreaker::EAiLineBreakClass },  //latin capital ligature oe
   1.212 +    { 0x0154, 0x0166, MLineBreaker::EAlLineBreakClass },  //latin capital letter r with acute
   1.213 +    { 0x0166, 0x0168, MLineBreaker::EAiLineBreakClass },  //latin capital letter t with stroke
   1.214 +    { 0x0168, 0x016b, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with tilde
   1.215 +    { 0x016b, 0x016c, MLineBreaker::EAiLineBreakClass },  //latin small letter u with macron
   1.216 +    { 0x016c, 0x01ce, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with breve
   1.217 +    { 0x01ce, 0x01cf, MLineBreaker::EAiLineBreakClass },  //latin small letter a with caron
   1.218 +    { 0x01cf, 0x01d0, MLineBreaker::EAlLineBreakClass },  //latin capital letter i with caron
   1.219 +    { 0x01d0, 0x01d1, MLineBreaker::EAiLineBreakClass },  //latin small letter i with caron
   1.220 +    { 0x01d1, 0x01d2, MLineBreaker::EAlLineBreakClass },  //latin capital letter o with caron
   1.221 +    { 0x01d2, 0x01d3, MLineBreaker::EAiLineBreakClass },  //latin small letter o with caron
   1.222 +    { 0x01d3, 0x01d4, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with caron
   1.223 +    { 0x01d4, 0x01d5, MLineBreaker::EAiLineBreakClass },  //latin small letter u with caron
   1.224 +    { 0x01d5, 0x01d6, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and macron
   1.225 +    { 0x01d6, 0x01d7, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and macron
   1.226 +    { 0x01d7, 0x01d8, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and acute
   1.227 +    { 0x01d8, 0x01d9, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and acute
   1.228 +    { 0x01d9, 0x01da, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and caron
   1.229 +    { 0x01da, 0x01db, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and caron
   1.230 +    { 0x01db, 0x01dc, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and grave
   1.231 +    { 0x01dc, 0x01dd, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and grave
   1.232 +    { 0x01dd, 0x0250, MLineBreaker::EAlLineBreakClass },  //latin small letter turned e
   1.233 +    { 0x0250, 0x0251, MLineBreaker::EAlLineBreakClass },  //latin small letter turned a
   1.234 +    { 0x0251, 0x0252, MLineBreaker::EAiLineBreakClass },  //latin small letter alpha
   1.235 +    { 0x0252, 0x0261, MLineBreaker::EAlLineBreakClass },  //latin small letter turned alpha
   1.236 +    { 0x0261, 0x0262, MLineBreaker::EAiLineBreakClass },  //latin small letter script g
   1.237 +    { 0x0262, 0x02c7, MLineBreaker::EAlLineBreakClass },  //latin letter small capital g
   1.238 +    { 0x02c7, 0x02c8, MLineBreaker::EAiLineBreakClass },  //caron
   1.239 +    { 0x02c8, 0x02c9, MLineBreaker::EBbLineBreakClass },  //modifier letter vertical line
   1.240 +    { 0x02c9, 0x02cc, MLineBreaker::EAiLineBreakClass },  //modifier letter macron
   1.241 +    { 0x02cc, 0x02cd, MLineBreaker::EBbLineBreakClass },  //modifier letter low vertical line
   1.242 +    { 0x02cd, 0x02ce, MLineBreaker::EAiLineBreakClass },  //modifier letter low macron
   1.243 +    { 0x02ce, 0x02d0, MLineBreaker::EAlLineBreakClass },  //modifier letter low grave accent
   1.244 +    { 0x02d0, 0x02d1, MLineBreaker::EAiLineBreakClass },  //modifier letter triangular colon
   1.245 +    { 0x02d1, 0x02d8, MLineBreaker::EAlLineBreakClass },  //modifier letter half triangular colon
   1.246 +    { 0x02d8, 0x02dc, MLineBreaker::EAiLineBreakClass },  //breve
   1.247 +    { 0x02dc, 0x02dd, MLineBreaker::EAlLineBreakClass },  //small tilde
   1.248 +    { 0x02dd, 0x02de, MLineBreaker::EAiLineBreakClass },  //double acute accent
   1.249 +    { 0x02de, 0x0300, MLineBreaker::EAlLineBreakClass },  //modifier letter rhotic hook
   1.250 +    { 0x0300, 0x034f, MLineBreaker::ECmLineBreakClass },  //combining grave accent
   1.251 +    { 0x034f, 0x0350, MLineBreaker::EGlLineBreakClass },  //COMBINING GRAPHEME JOINER
   1.252 +    { 0x0350, 0x035c, MLineBreaker::ECmLineBreakClass },  //COMBINING RIGHT ARROWHEAD ABOVE
   1.253 +    { 0x035c, 0x0360, MLineBreaker::EGlLineBreakClass },  //COMBINING DOUBLE BREVE BELOW
   1.254 +    { 0x0360, 0x0370, MLineBreaker::ECmLineBreakClass },  //combining double tilde
   1.255 +    { 0x0374, 0x0376, MLineBreaker::EAlLineBreakClass },  //greek numeral sign
   1.256 +    { 0x037a, 0x037b, MLineBreaker::EAlLineBreakClass },  //greek ypogegrammeni
   1.257 +    { 0x037b, 0x037e, MLineBreaker::EAlLineBreakClass },  //GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
   1.258 +    { 0x037e, 0x037f, MLineBreaker::EAlLineBreakClass },  //greek question mark
   1.259 +    { 0x0384, 0x038b, MLineBreaker::EAlLineBreakClass },  //greek tonos
   1.260 +    { 0x038c, 0x038d, MLineBreaker::EAlLineBreakClass },  //greek capital letter omicron with tonos
   1.261 +    { 0x038e, 0x0391, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with tonos
   1.262 +    { 0x0391, 0x03a2, MLineBreaker::EAiLineBreakClass },  //greek capital letter alpha
   1.263 +    { 0x03a3, 0x03aa, MLineBreaker::EAiLineBreakClass },  //greek capital letter sigma
   1.264 +    { 0x03aa, 0x03b1, MLineBreaker::EAlLineBreakClass },  //greek capital letter iota with dialytika
   1.265 +    { 0x03b1, 0x03c2, MLineBreaker::EAiLineBreakClass },  //greek small letter alpha
   1.266 +    { 0x03c2, 0x03c3, MLineBreaker::EAlLineBreakClass },  //greek small letter final sigma
   1.267 +    { 0x03c3, 0x03ca, MLineBreaker::EAiLineBreakClass },  //greek small letter sigma
   1.268 +    { 0x03ca, 0x03cf, MLineBreaker::EAlLineBreakClass },  //greek small letter iota with dialytika
   1.269 +    { 0x03d0, 0x0400, MLineBreaker::EAlLineBreakClass },  //greek beta symbol
   1.270 +    { 0x0400, 0x0401, MLineBreaker::EAlLineBreakClass },  //cyrillic capital letter ie with grave
   1.271 +    { 0x0401, 0x0402, MLineBreaker::EAiLineBreakClass },  //cyrillic capital letter io
   1.272 +    { 0x0402, 0x0410, MLineBreaker::EAlLineBreakClass },  //cyrillic capital letter dje
   1.273 +    { 0x0410, 0x0450, MLineBreaker::EAiLineBreakClass },  //cyrillic capital letter a
   1.274 +    { 0x0450, 0x0451, MLineBreaker::EAlLineBreakClass },  //cyrillic small letter ie with grave
   1.275 +    { 0x0451, 0x0452, MLineBreaker::EAiLineBreakClass },  //cyrillic small letter io
   1.276 +    { 0x0452, 0x0483, MLineBreaker::EAlLineBreakClass },  //cyrillic small letter dje
   1.277 +    { 0x0483, 0x0487, MLineBreaker::ECmLineBreakClass },  //combining cyrillic titlo
   1.278 +    { 0x0488, 0x048a, MLineBreaker::ECmLineBreakClass },  //combining cyrillic hundred thousands sign
   1.279 +    { 0x048a, 0x0514, MLineBreaker::EAlLineBreakClass },  //CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
   1.280 +    { 0x0531, 0x0557, MLineBreaker::EAlLineBreakClass },  //armenian capital letter ayb
   1.281 +    { 0x0559, 0x0560, MLineBreaker::EAlLineBreakClass },  //armenian modifier letter left half ring
   1.282 +    { 0x0561, 0x0588, MLineBreaker::EAlLineBreakClass },  //armenian small letter ayb
   1.283 +    { 0x0589, 0x058a, MLineBreaker::EIsLineBreakClass },  //armenian full stop
   1.284 +    { 0x058a, 0x058b, MLineBreaker::EBaLineBreakClass },  //armenian hyphen
   1.285 +    { 0x0591, 0x05be, MLineBreaker::ECmLineBreakClass },  //hebrew accent etnahta
   1.286 +    { 0x05be, 0x05bf, MLineBreaker::EAlLineBreakClass },  //hebrew punctuation maqaf
   1.287 +    { 0x05bf, 0x05c0, MLineBreaker::ECmLineBreakClass },  //hebrew point rafe
   1.288 +    { 0x05c0, 0x05c1, MLineBreaker::EAlLineBreakClass },  //hebrew punctuation paseq
   1.289 +    { 0x05c1, 0x05c3, MLineBreaker::ECmLineBreakClass },  //hebrew point shin dot
   1.290 +    { 0x05c3, 0x05c4, MLineBreaker::EAlLineBreakClass },  //hebrew punctuation sof pasuq
   1.291 +    { 0x05c4, 0x05c5, MLineBreaker::ECmLineBreakClass },  //hebrew mark upper dot
   1.292 +    { 0x05c5, 0x05c6, MLineBreaker::ECmLineBreakClass },  //HEBREW MARK LOWER DOT
   1.293 +    { 0x05c6, 0x05c7, MLineBreaker::EExLineBreakClass },  //HEBREW PUNCTUATION NUN HAFUKHA
   1.294 +    { 0x05c7, 0x05c8, MLineBreaker::ECmLineBreakClass },  //HEBREW POINT QAMATS QATAN
   1.295 +    { 0x05d0, 0x05eb, MLineBreaker::EAlLineBreakClass },  //hebrew letter alef
   1.296 +    { 0x05f0, 0x05f5, MLineBreaker::EAlLineBreakClass },  //hebrew ligature yiddish double vav
   1.297 +    { 0x0600, 0x0604, MLineBreaker::EAlLineBreakClass },  //ARABIC NUMBER SIGN
   1.298 +    { 0x060b, 0x060c, MLineBreaker::EPoLineBreakClass },  //AFGHANI SIGN
   1.299 +    { 0x060c, 0x060d, MLineBreaker::EExLineBreakClass },  //arabic comma
   1.300 +    { 0x060d, 0x060e, MLineBreaker::EIsLineBreakClass },  //ARABIC DATE SEPARATOR
   1.301 +    { 0x060e, 0x0610, MLineBreaker::EAlLineBreakClass },  //ARABIC POETIC VERSE SIGN
   1.302 +    { 0x0610, 0x0616, MLineBreaker::ECmLineBreakClass },  //ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
   1.303 +    { 0x061b, 0x061c, MLineBreaker::EExLineBreakClass },  //arabic semicolon
   1.304 +    { 0x061e, 0x061f, MLineBreaker::EExLineBreakClass },  //ARABIC TRIPLE DOT PUNCTUATION MARK
   1.305 +    { 0x061f, 0x0620, MLineBreaker::EExLineBreakClass },  //arabic question mark
   1.306 +    { 0x0621, 0x063b, MLineBreaker::EAlLineBreakClass },  //arabic letter hamza
   1.307 +    { 0x0640, 0x064b, MLineBreaker::EAlLineBreakClass },  //arabic tatweel
   1.308 +    { 0x064b, 0x065f, MLineBreaker::ECmLineBreakClass },  //arabic fathatan
   1.309 +    { 0x0660, 0x066a, MLineBreaker::ENuLineBreakClass },  //arabic-indic digit zero
   1.310 +    { 0x066a, 0x066b, MLineBreaker::EExLineBreakClass },  //arabic percent sign
   1.311 +    { 0x066b, 0x066d, MLineBreaker::ENuLineBreakClass },  //arabic decimal & thousands separator
   1.312 +    { 0x066d, 0x066e, MLineBreaker::EAlLineBreakClass },  //arabic five pointed star
   1.313 +    { 0x066e, 0x0670, MLineBreaker::EAlLineBreakClass },  //arabic five pointed star
   1.314 +    { 0x0670, 0x0671, MLineBreaker::ECmLineBreakClass },  //arabic letter superscript alef
   1.315 +    { 0x0671, 0x06d4, MLineBreaker::EAlLineBreakClass },  //arabic letter alef wasla
   1.316 +    { 0x06d4, 0x06d5, MLineBreaker::EExLineBreakClass },  //arabic full stop
   1.317 +    { 0x06d5, 0x06d6, MLineBreaker::EAlLineBreakClass },  //arabic letter ae
   1.318 +    { 0x06d6, 0x06e5, MLineBreaker::ECmLineBreakClass },  //arabic small high ligature sad with lam with alef maksura
   1.319 +    { 0x06e5, 0x06e7, MLineBreaker::EAlLineBreakClass },  //arabic small waw
   1.320 +    { 0x06e7, 0x06e9, MLineBreaker::ECmLineBreakClass },  //arabic small high yeh
   1.321 +    { 0x06e9, 0x06ea, MLineBreaker::EAlLineBreakClass },  //arabic place of sajdah
   1.322 +    { 0x06ea, 0x06ee, MLineBreaker::ECmLineBreakClass },  //arabic empty centre low stop
   1.323 +    { 0x06ee, 0x06f0, MLineBreaker::EAlLineBreakClass },  //ARABIC LETTER DAL WITH INVERTED V
   1.324 +    { 0x06f0, 0x06fa, MLineBreaker::ENuLineBreakClass },  //extended arabic-indic digit zero
   1.325 +    { 0x06fa, 0x070e, MLineBreaker::EAlLineBreakClass },  //arabic letter sheen with dot below
   1.326 +    { 0x070f, 0x0710, MLineBreaker::ECmLineBreakClass },  //syriac abbreviation mark
   1.327 +    { 0x0710, 0x0711, MLineBreaker::EAlLineBreakClass },  //syriac letter alaph
   1.328 +    { 0x0711, 0x0712, MLineBreaker::ECmLineBreakClass },  //syriac letter superscript alaph
   1.329 +    { 0x0712, 0x0730, MLineBreaker::EAlLineBreakClass },  //syriac letter beth
   1.330 +    { 0x0730, 0x074b, MLineBreaker::ECmLineBreakClass },  //syriac pthaha above
   1.331 +    { 0x074d, 0x076e, MLineBreaker::EAlLineBreakClass },  //SYRIAC LETTER SOGDIAN ZHAIN
   1.332 +    { 0x0780, 0x07a6, MLineBreaker::EAlLineBreakClass },  //thaana letter haa
   1.333 +    { 0x07a6, 0x07b1, MLineBreaker::ECmLineBreakClass },  //thaana abafili
   1.334 +    { 0x07b1, 0x07b2, MLineBreaker::EAlLineBreakClass },  //THAANA LETTER NAA
   1.335 +    { 0x07c0, 0x07ca, MLineBreaker::ENuLineBreakClass },  //NKO DIGIT ZERO
   1.336 +    { 0x07ca, 0x07eb, MLineBreaker::EAlLineBreakClass },  //NKO LETTER A
   1.337 +    { 0x07eb, 0x07f4, MLineBreaker::ECmLineBreakClass },  //NKO COMBINING SHORT HIGH TONE
   1.338 +    { 0x07f4, 0x07f8, MLineBreaker::EAlLineBreakClass },  //NKO HIGH TONE APOSTROPHE
   1.339 +    { 0x07f8, 0x07f9, MLineBreaker::EIsLineBreakClass },  //NKO COMMA
   1.340 +    { 0x07f9, 0x07fa, MLineBreaker::EExLineBreakClass },  //NKO EXCLAMATION MARK
   1.341 +    { 0x07fa, 0x07fb, MLineBreaker::EAlLineBreakClass },  //NKO LAJANYALAN
   1.342 +    { 0x0901, 0x0904, MLineBreaker::ECmLineBreakClass },  //devanagari sign candrabindu
   1.343 +    { 0x0904, 0x093a, MLineBreaker::EAlLineBreakClass },  //devanagari letter short a: CR1080
   1.344 +    { 0x093c, 0x093d, MLineBreaker::ECmLineBreakClass },  //devanagari sign nukta
   1.345 +    { 0x093d, 0x093e, MLineBreaker::EAlLineBreakClass },  //devanagari sign avagraha
   1.346 +    { 0x093e, 0x094e, MLineBreaker::ECmLineBreakClass },  //devanagari vowel sign aa
   1.347 +    { 0x0950, 0x0951, MLineBreaker::EAlLineBreakClass },  //devanagari om
   1.348 +    { 0x0951, 0x0955, MLineBreaker::ECmLineBreakClass },  //devanagari stress sign udatta
   1.349 +    { 0x0958, 0x0962, MLineBreaker::EAlLineBreakClass },  //devanagari letter qa
   1.350 +    { 0x0962, 0x0964, MLineBreaker::ECmLineBreakClass },  //devanagari vowel sign vocalic l
   1.351 +    { 0x0964, 0x0966, MLineBreaker::EAlLineBreakClass },  //devanagari danda
   1.352 +    { 0x0966, 0x0970, MLineBreaker::ENuLineBreakClass },  //devanagari digit zero
   1.353 +    { 0x0970, 0x0971, MLineBreaker::EAlLineBreakClass },  //devanagari abbreviation sign
   1.354 +    { 0x097b, 0x0980, MLineBreaker::EAlLineBreakClass },  //devanagari letter gga: CR1080
   1.355 +    { 0x0981, 0x0984, MLineBreaker::ECmLineBreakClass },  //bengali sign candrabindu
   1.356 +    { 0x0985, 0x098d, MLineBreaker::EAlLineBreakClass },  //bengali letter a
   1.357 +    { 0x098f, 0x0991, MLineBreaker::EAlLineBreakClass },  //bengali letter e
   1.358 +    { 0x0993, 0x09a9, MLineBreaker::EAlLineBreakClass },  //bengali letter o
   1.359 +    { 0x09aa, 0x09b1, MLineBreaker::EAlLineBreakClass },  //bengali letter pa
   1.360 +    { 0x09b2, 0x09b3, MLineBreaker::EAlLineBreakClass },  //bengali letter la
   1.361 +    { 0x09b6, 0x09ba, MLineBreaker::EAlLineBreakClass },  //bengali letter sha
   1.362 +    { 0x09bc, 0x09bd, MLineBreaker::ECmLineBreakClass },  //bengali sign nukta
   1.363 +    { 0x09bd, 0x09be, MLineBreaker::EAlLineBreakClass },  //bengali sign avagraha: CR1080
   1.364 +    { 0x09be, 0x09c5, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign aa
   1.365 +    { 0x09c7, 0x09c9, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign e
   1.366 +    { 0x09cb, 0x09ce, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign o
   1.367 +    { 0x09ce, 0x09cf, MLineBreaker::EAlLineBreakClass },  //bengali letter khanda ta: CR1080
   1.368 +    { 0x09d7, 0x09d8, MLineBreaker::ECmLineBreakClass },  //bengali au length mark
   1.369 +    { 0x09dc, 0x09de, MLineBreaker::EAlLineBreakClass },  //bengali letter rra
   1.370 +    { 0x09df, 0x09e2, MLineBreaker::EAlLineBreakClass },  //bengali letter yya
   1.371 +    { 0x09e2, 0x09e4, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign vocalic l
   1.372 +    { 0x09e6, 0x09f0, MLineBreaker::ENuLineBreakClass },  //bengali digit zero
   1.373 +    { 0x09f0, 0x09f2, MLineBreaker::EAlLineBreakClass },  //bengali letter ra with middle diagonal
   1.374 +    { 0x09f2, 0x09f4, MLineBreaker::EPrLineBreakClass },  //bengali rupee mark
   1.375 +    { 0x09f4, 0x09fb, MLineBreaker::EAlLineBreakClass },  //bengali currency numerator one
   1.376 +    { 0x0a01, 0x0a04, MLineBreaker::ECmLineBreakClass },  //gurmukhi sign adak bindi: CR1080
   1.377 +    { 0x0a05, 0x0a0b, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter a
   1.378 +    { 0x0a0f, 0x0a11, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter ee
   1.379 +    { 0x0a13, 0x0a29, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter oo
   1.380 +    { 0x0a2a, 0x0a31, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter pa
   1.381 +    { 0x0a32, 0x0a34, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter la
   1.382 +    { 0x0a35, 0x0a37, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter va
   1.383 +    { 0x0a38, 0x0a3a, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter sa
   1.384 +    { 0x0a3c, 0x0a3d, MLineBreaker::ECmLineBreakClass },  //gurmukhi sign nukta
   1.385 +    { 0x0a3e, 0x0a43, MLineBreaker::ECmLineBreakClass },  //gurmukhi vowel sign aa
   1.386 +    { 0x0a47, 0x0a49, MLineBreaker::ECmLineBreakClass },  //gurmukhi vowel sign ee
   1.387 +    { 0x0a4b, 0x0a4e, MLineBreaker::ECmLineBreakClass },  //gurmukhi vowel sign oo
   1.388 +    { 0x0a59, 0x0a5d, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter khha
   1.389 +    { 0x0a5e, 0x0a5f, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter fa
   1.390 +    { 0x0a66, 0x0a70, MLineBreaker::ENuLineBreakClass },  //gurmukhi digit zero
   1.391 +    { 0x0a70, 0x0a72, MLineBreaker::ECmLineBreakClass },  //gurmukhi tippi
   1.392 +    { 0x0a72, 0x0a75, MLineBreaker::EAlLineBreakClass },  //gurmukhi iri
   1.393 +    { 0x0a81, 0x0a84, MLineBreaker::ECmLineBreakClass },  //gujarati sign candrabindu
   1.394 +    { 0x0a85, 0x0a8d, MLineBreaker::EAlLineBreakClass },  //gujarati letter a: CR1080
   1.395 +    { 0x0a8d, 0x0a8e, MLineBreaker::EAlLineBreakClass },  //gujarati vowel candra e
   1.396 +    { 0x0a8f, 0x0a92, MLineBreaker::EAlLineBreakClass },  //gujarati letter e
   1.397 +    { 0x0a93, 0x0aa9, MLineBreaker::EAlLineBreakClass },  //gujarati letter o
   1.398 +    { 0x0aaa, 0x0ab1, MLineBreaker::EAlLineBreakClass },  //gujarati letter pa
   1.399 +    { 0x0ab2, 0x0ab4, MLineBreaker::EAlLineBreakClass },  //gujarati letter la
   1.400 +    { 0x0ab5, 0x0aba, MLineBreaker::EAlLineBreakClass },  //gujarati letter va
   1.401 +    { 0x0abc, 0x0abd, MLineBreaker::ECmLineBreakClass },  //gujarati sign nukta
   1.402 +    { 0x0abd, 0x0abe, MLineBreaker::EAlLineBreakClass },  //gujarati sign avagraha
   1.403 +    { 0x0abe, 0x0ac6, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign aa
   1.404 +    { 0x0ac7, 0x0aca, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign e
   1.405 +    { 0x0acb, 0x0ace, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign o
   1.406 +    { 0x0ad0, 0x0ad1, MLineBreaker::EAlLineBreakClass },  //gujarati om
   1.407 +    { 0x0ae0, 0x0ae2, MLineBreaker::EAlLineBreakClass },  //gujarati letter vocalic rr: CR1080
   1.408 +    { 0x0ae2, 0x0ae4, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign vocalic l: CR1080
   1.409 +    { 0x0ae6, 0x0af0, MLineBreaker::ENuLineBreakClass },  //gujarati digit zero
   1.410 +    { 0x0af1, 0x0af2, MLineBreaker::EPrLineBreakClass },  //gujarati rupee sign: CR1080
   1.411 +    { 0x0b01, 0x0b04, MLineBreaker::ECmLineBreakClass },  //oriya sign candrabindu
   1.412 +    { 0x0b05, 0x0b0d, MLineBreaker::EAlLineBreakClass },  //oriya letter a
   1.413 +    { 0x0b0f, 0x0b11, MLineBreaker::EAlLineBreakClass },  //oriya letter e
   1.414 +    { 0x0b13, 0x0b29, MLineBreaker::EAlLineBreakClass },  //oriya letter o
   1.415 +    { 0x0b2a, 0x0b31, MLineBreaker::EAlLineBreakClass },  //oriya letter pa
   1.416 +    { 0x0b32, 0x0b34, MLineBreaker::EAlLineBreakClass },  //oriya letter la
   1.417 +    { 0x0b35, 0x0b36, MLineBreaker::EAlLineBreakClass },  //oriya letter va: CR1080
   1.418 +    { 0x0b36, 0x0b3a, MLineBreaker::EAlLineBreakClass },  //oriya letter sha
   1.419 +    { 0x0b3c, 0x0b3d, MLineBreaker::ECmLineBreakClass },  //oriya sign nukta
   1.420 +    { 0x0b3d, 0x0b3e, MLineBreaker::EAlLineBreakClass },  //oriya sign avagraha
   1.421 +    { 0x0b3e, 0x0b44, MLineBreaker::ECmLineBreakClass },  //oriya vowel sign aa
   1.422 +    { 0x0b47, 0x0b49, MLineBreaker::ECmLineBreakClass },  //oriya vowel sign e
   1.423 +    { 0x0b4b, 0x0b4e, MLineBreaker::ECmLineBreakClass },  //oriya vowel sign o
   1.424 +    { 0x0b56, 0x0b58, MLineBreaker::ECmLineBreakClass },  //oriya ai length mark
   1.425 +    { 0x0b5c, 0x0b5e, MLineBreaker::EAlLineBreakClass },  //oriya letter rra
   1.426 +    { 0x0b5f, 0x0b62, MLineBreaker::EAlLineBreakClass },  //oriya letter yya
   1.427 +    { 0x0b66, 0x0b70, MLineBreaker::ENuLineBreakClass },  //oriya digit zero
   1.428 +    { 0x0b70, 0x0b71, MLineBreaker::EAlLineBreakClass },  //oriya isshar
   1.429 +    { 0x0b71, 0x0b72, MLineBreaker::EAlLineBreakClass },  //oriya letter wa: CR1080
   1.430 +    { 0x0b82, 0x0b84, MLineBreaker::ECmLineBreakClass },  //tamil sign anusvara
   1.431 +    { 0x0b85, 0x0b8b, MLineBreaker::EAlLineBreakClass },  //tamil letter a
   1.432 +    { 0x0b8e, 0x0b91, MLineBreaker::EAlLineBreakClass },  //tamil letter e
   1.433 +    { 0x0b92, 0x0b96, MLineBreaker::EAlLineBreakClass },  //tamil letter o
   1.434 +    { 0x0b99, 0x0b9b, MLineBreaker::EAlLineBreakClass },  //tamil letter nga
   1.435 +    { 0x0b9c, 0x0b9d, MLineBreaker::EAlLineBreakClass },  //tamil letter ja
   1.436 +    { 0x0b9e, 0x0ba0, MLineBreaker::EAlLineBreakClass },  //tamil letter nya
   1.437 +    { 0x0ba3, 0x0ba5, MLineBreaker::EAlLineBreakClass },  //tamil letter nna
   1.438 +    { 0x0ba8, 0x0bab, MLineBreaker::EAlLineBreakClass },  //tamil letter na
   1.439 +    { 0x0bae, 0x0bba, MLineBreaker::EAlLineBreakClass },  //tamil letter ma: CR1080
   1.440 +    { 0x0bbe, 0x0bc3, MLineBreaker::ECmLineBreakClass },  //tamil vowel sign aa
   1.441 +    { 0x0bc6, 0x0bc9, MLineBreaker::ECmLineBreakClass },  //tamil vowel sign e
   1.442 +    { 0x0bca, 0x0bce, MLineBreaker::ECmLineBreakClass },  //tamil vowel sign o
   1.443 +    { 0x0bd7, 0x0bd8, MLineBreaker::ECmLineBreakClass },  //tamil au length mark
   1.444 +    { 0x0be6, 0x0bf0, MLineBreaker::ENuLineBreakClass },  //tamil digit one: CR1080
   1.445 +    { 0x0bf0, 0x0bf9, MLineBreaker::EAlLineBreakClass },  //tamil number ten: CR1080
   1.446 +    { 0x0bf9, 0x0bfa, MLineBreaker::EPrLineBreakClass },  //tamil rupee sign: CR1080
   1.447 +    { 0x0bfa, 0x0bfb, MLineBreaker::EAlLineBreakClass },  //tamil number sign: CR1080
   1.448 +    { 0x0c01, 0x0c04, MLineBreaker::ECmLineBreakClass },  //telugu sign candrabindu
   1.449 +    { 0x0c05, 0x0c0d, MLineBreaker::EAlLineBreakClass },  //telugu letter a
   1.450 +    { 0x0c0e, 0x0c11, MLineBreaker::EAlLineBreakClass },  //telugu letter e
   1.451 +    { 0x0c12, 0x0c29, MLineBreaker::EAlLineBreakClass },  //telugu letter o
   1.452 +    { 0x0c2a, 0x0c34, MLineBreaker::EAlLineBreakClass },  //telugu letter pa
   1.453 +    { 0x0c35, 0x0c3a, MLineBreaker::EAlLineBreakClass },  //telugu letter va
   1.454 +    { 0x0c3e, 0x0c45, MLineBreaker::ECmLineBreakClass },  //telugu vowel sign aa
   1.455 +    { 0x0c46, 0x0c49, MLineBreaker::ECmLineBreakClass },  //telugu vowel sign e
   1.456 +    { 0x0c4a, 0x0c4e, MLineBreaker::ECmLineBreakClass },  //telugu vowel sign o
   1.457 +    { 0x0c55, 0x0c57, MLineBreaker::ECmLineBreakClass },  //telugu length mark
   1.458 +    { 0x0c60, 0x0c62, MLineBreaker::EAlLineBreakClass },  //telugu letter vocalic rr
   1.459 +    { 0x0c66, 0x0c70, MLineBreaker::ENuLineBreakClass },  //telugu digit zero
   1.460 +    { 0x0c82, 0x0c84, MLineBreaker::ECmLineBreakClass },  //kannada sign anusvara
   1.461 +    { 0x0c85, 0x0c8d, MLineBreaker::EAlLineBreakClass },  //kannada letter a
   1.462 +    { 0x0c8e, 0x0c91, MLineBreaker::EAlLineBreakClass },  //kannada letter e
   1.463 +    { 0x0c92, 0x0ca9, MLineBreaker::EAlLineBreakClass },  //kannada letter o
   1.464 +    { 0x0caa, 0x0cb4, MLineBreaker::EAlLineBreakClass },  //kannada letter pa
   1.465 +    { 0x0cb5, 0x0cba, MLineBreaker::EAlLineBreakClass },  //kannada letter va
   1.466 +    { 0x0cbc, 0x0cbd, MLineBreaker::ECmLineBreakClass },  //kannada sign nukta: CR1080
   1.467 +    { 0x0cbd, 0x0cbe, MLineBreaker::EAlLineBreakClass },  //kannada sign avagraha: CR1080
   1.468 +    { 0x0cbe, 0x0cc5, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign aa
   1.469 +    { 0x0cc6, 0x0cc9, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign e
   1.470 +    { 0x0cca, 0x0cce, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign o
   1.471 +    { 0x0cd5, 0x0cd7, MLineBreaker::ECmLineBreakClass },  //kannada length mark
   1.472 +    { 0x0cde, 0x0cdf, MLineBreaker::EAlLineBreakClass },  //kannada letter fa
   1.473 +    { 0x0ce0, 0x0ce2, MLineBreaker::EAlLineBreakClass },  //kannada letter vocalic rr
   1.474 +    { 0x0ce2, 0x0ce4, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign vocalic l: CR1080
   1.475 +    { 0x0ce6, 0x0cf0, MLineBreaker::ENuLineBreakClass },  //kannada digit zero
   1.476 +    { 0x0cf1, 0x0cf3, MLineBreaker::EAlLineBreakClass },  //kannada sign jihvamuliya: CR1080
   1.477 +    { 0x0d02, 0x0d04, MLineBreaker::ECmLineBreakClass },  //malayalam sign anusvara
   1.478 +    { 0x0d05, 0x0d0d, MLineBreaker::EAlLineBreakClass },  //malayalam letter a
   1.479 +    { 0x0d0e, 0x0d11, MLineBreaker::EAlLineBreakClass },  //malayalam letter e
   1.480 +    { 0x0d12, 0x0d29, MLineBreaker::EAlLineBreakClass },  //malayalam letter o
   1.481 +    { 0x0d2a, 0x0d3a, MLineBreaker::EAlLineBreakClass },  //malayalam letter pa
   1.482 +    { 0x0d3e, 0x0d44, MLineBreaker::ECmLineBreakClass },  //malayalam vowel sign aa
   1.483 +    { 0x0d46, 0x0d49, MLineBreaker::ECmLineBreakClass },  //malayalam vowel sign e
   1.484 +    { 0x0d4a, 0x0d4e, MLineBreaker::ECmLineBreakClass },  //malayalam vowel sign o
   1.485 +    { 0x0d57, 0x0d58, MLineBreaker::ECmLineBreakClass },  //malayalam au length mark
   1.486 +    { 0x0d60, 0x0d62, MLineBreaker::EAlLineBreakClass },  //malayalam letter vocalic rr
   1.487 +    { 0x0d66, 0x0d70, MLineBreaker::ENuLineBreakClass },  //malayalam digit zero
   1.488 +    { 0x0d82, 0x0d84, MLineBreaker::ECmLineBreakClass },  //sinhala sign anusvaraya
   1.489 +    { 0x0d85, 0x0d97, MLineBreaker::EAlLineBreakClass },  //sinhala letter ayanna
   1.490 +    { 0x0d9a, 0x0db2, MLineBreaker::EAlLineBreakClass },  //sinhala letter alpapraana kayanna
   1.491 +    { 0x0db3, 0x0dbc, MLineBreaker::EAlLineBreakClass },  //sinhala letter sanyaka dayanna
   1.492 +    { 0x0dbd, 0x0dbe, MLineBreaker::EAlLineBreakClass },  //sinhala letter dantaja layanna
   1.493 +    { 0x0dc0, 0x0dc7, MLineBreaker::EAlLineBreakClass },  //sinhala letter vayanna
   1.494 +    { 0x0dca, 0x0dcb, MLineBreaker::ECmLineBreakClass },  //sinhala sign al-lakuna
   1.495 +    { 0x0dcf, 0x0dd5, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign aela-pilla
   1.496 +    { 0x0dd6, 0x0dd7, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign diga paa-pilla
   1.497 +    { 0x0dd8, 0x0de0, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign gaetta-pilla
   1.498 +    { 0x0df2, 0x0df4, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign diga gaetta-pilla
   1.499 +    { 0x0df4, 0x0df5, MLineBreaker::EAlLineBreakClass },  //sinhala punctuation kunddaliya
   1.500 +    { 0x0e01, 0x0e31, MLineBreaker::ESaLineBreakClass },  //thai character ko kai
   1.501 +    { 0x0e31, 0x0e32, MLineBreaker::ECmLineBreakClass },  //thai character mai han-akat
   1.502 +    { 0x0e32, 0x0e34, MLineBreaker::ESaLineBreakClass },  //thai character sara aa
   1.503 +    { 0x0e34, 0x0e3b, MLineBreaker::ECmLineBreakClass },  //thai character sara i
   1.504 +    { 0x0e3f, 0x0e40, MLineBreaker::EPrLineBreakClass },  //thai currency symbol baht
   1.505 +    { 0x0e40, 0x0e47, MLineBreaker::ESaLineBreakClass },  //thai character sara e
   1.506 +    { 0x0e47, 0x0e4f, MLineBreaker::ECmLineBreakClass },  //thai character maitaikhu
   1.507 +    { 0x0e4f, 0x0e50, MLineBreaker::EAlLineBreakClass },  //thai character fongman
   1.508 +    { 0x0e50, 0x0e5a, MLineBreaker::ENuLineBreakClass },  //thai digit zero
   1.509 +    { 0x0e5a, 0x0e5c, MLineBreaker::ENsLineBreakClass },  //thai character angkhankhu
   1.510 +    { 0x0e81, 0x0e83, MLineBreaker::ESaLineBreakClass },  //lao letter ko
   1.511 +    { 0x0e84, 0x0e85, MLineBreaker::ESaLineBreakClass },  //lao letter kho tam
   1.512 +    { 0x0e87, 0x0e89, MLineBreaker::ESaLineBreakClass },  //lao letter ngo
   1.513 +    { 0x0e8a, 0x0e8b, MLineBreaker::ESaLineBreakClass },  //lao letter so tam
   1.514 +    { 0x0e8d, 0x0e8e, MLineBreaker::ESaLineBreakClass },  //lao letter nyo
   1.515 +    { 0x0e94, 0x0e98, MLineBreaker::ESaLineBreakClass },  //lao letter do
   1.516 +    { 0x0e99, 0x0ea0, MLineBreaker::ESaLineBreakClass },  //lao letter no
   1.517 +    { 0x0ea1, 0x0ea4, MLineBreaker::ESaLineBreakClass },  //lao letter mo
   1.518 +    { 0x0ea5, 0x0ea6, MLineBreaker::ESaLineBreakClass },  //lao letter lo loot
   1.519 +    { 0x0ea7, 0x0ea8, MLineBreaker::ESaLineBreakClass },  //lao letter wo
   1.520 +    { 0x0eaa, 0x0eac, MLineBreaker::ESaLineBreakClass },  //lao letter so sung
   1.521 +    { 0x0ead, 0x0eb1, MLineBreaker::ESaLineBreakClass },  //lao letter o
   1.522 +    { 0x0eb1, 0x0eb2, MLineBreaker::ECmLineBreakClass },  //lao vowel sign mai kan
   1.523 +    { 0x0eb2, 0x0eb4, MLineBreaker::ESaLineBreakClass },  //lao vowel sign aa
   1.524 +    { 0x0eb4, 0x0eba, MLineBreaker::ECmLineBreakClass },  //lao vowel sign i
   1.525 +    { 0x0ebb, 0x0ebd, MLineBreaker::ECmLineBreakClass },  //lao vowel sign mai kon
   1.526 +    { 0x0ebd, 0x0ebe, MLineBreaker::ESaLineBreakClass },  //lao semivowel sign nyo
   1.527 +    { 0x0ec0, 0x0ec5, MLineBreaker::ESaLineBreakClass },  //lao vowel sign e
   1.528 +    { 0x0ec6, 0x0ec7, MLineBreaker::ESaLineBreakClass },  //lao ko la
   1.529 +    { 0x0ec8, 0x0ece, MLineBreaker::ECmLineBreakClass },  //lao tone mai ek
   1.530 +    { 0x0ed0, 0x0eda, MLineBreaker::ENuLineBreakClass },  //lao digit zero
   1.531 +    { 0x0edc, 0x0ede, MLineBreaker::ESaLineBreakClass },  //lao ho no
   1.532 +    { 0x0f00, 0x0f0b, MLineBreaker::EAlLineBreakClass },  //tibetan syllable om
   1.533 +    { 0x0f0b, 0x0f0c, MLineBreaker::EBaLineBreakClass },  //tibetan mark intersyllabic tsheg
   1.534 +    { 0x0f0c, 0x0f0d, MLineBreaker::EGlLineBreakClass },  //tibetan mark delimiter tsheg bstar
   1.535 +    { 0x0f0d, 0x0f18, MLineBreaker::EAlLineBreakClass },  //tibetan mark shad
   1.536 +    { 0x0f18, 0x0f1a, MLineBreaker::ECmLineBreakClass },  //tibetan astrological sign -khyud pa
   1.537 +    { 0x0f1a, 0x0f20, MLineBreaker::EAlLineBreakClass },  //tibetan sign rdel dkar gcig
   1.538 +    { 0x0f20, 0x0f2a, MLineBreaker::ENuLineBreakClass },  //tibetan digit zero
   1.539 +    { 0x0f2a, 0x0f35, MLineBreaker::EAlLineBreakClass },  //tibetan digit half one
   1.540 +    { 0x0f35, 0x0f36, MLineBreaker::ECmLineBreakClass },  //tibetan mark ngas bzung nyi zla
   1.541 +    { 0x0f36, 0x0f37, MLineBreaker::EAlLineBreakClass },  //tibetan mark caret -dzud rtags bzhi mig can
   1.542 +    { 0x0f37, 0x0f38, MLineBreaker::ECmLineBreakClass },  //tibetan mark ngas bzung sgor rtags
   1.543 +    { 0x0f38, 0x0f39, MLineBreaker::EAlLineBreakClass },  //tibetan mark che mgo
   1.544 +    { 0x0f39, 0x0f3a, MLineBreaker::ECmLineBreakClass },  //tibetan mark tsa -phru
   1.545 +    { 0x0f3a, 0x0f3b, MLineBreaker::EOpLineBreakClass },  //tibetan mark gug rtags gyon
   1.546 +    { 0x0f3b, 0x0f3c, MLineBreaker::EClLineBreakClass },  //tibetan mark gug rtags gyas
   1.547 +    { 0x0f3c, 0x0f3d, MLineBreaker::EOpLineBreakClass },  //tibetan mark ang khang gyon
   1.548 +    { 0x0f3d, 0x0f3e, MLineBreaker::EClLineBreakClass },  //tibetan mark ang khang gyas
   1.549 +    { 0x0f3e, 0x0f40, MLineBreaker::ECmLineBreakClass },  //tibetan sign yar tshes
   1.550 +    { 0x0f40, 0x0f48, MLineBreaker::EAlLineBreakClass },  //tibetan letter ka
   1.551 +    { 0x0f49, 0x0f6b, MLineBreaker::EAlLineBreakClass },  //tibetan letter nya
   1.552 +    { 0x0f71, 0x0f85, MLineBreaker::ECmLineBreakClass },  //tibetan vowel sign aa
   1.553 +    { 0x0f85, 0x0f86, MLineBreaker::EAlLineBreakClass },  //tibetan mark paluta
   1.554 +    { 0x0f86, 0x0f88, MLineBreaker::ECmLineBreakClass },  //tibetan sign lci rtags
   1.555 +    { 0x0f88, 0x0f8c, MLineBreaker::EAlLineBreakClass },  //tibetan sign lce tsa can
   1.556 +    { 0x0f90, 0x0f98, MLineBreaker::ECmLineBreakClass },  //tibetan subjoined letter ka
   1.557 +    { 0x0f99, 0x0fbd, MLineBreaker::ECmLineBreakClass },  //tibetan subjoined letter nya
   1.558 +    { 0x0fbe, 0x0fc6, MLineBreaker::EAlLineBreakClass },  //tibetan ku ru kha
   1.559 +    { 0x0fc6, 0x0fc7, MLineBreaker::ECmLineBreakClass },  //tibetan symbol padma gdan
   1.560 +    { 0x0fc7, 0x0fcd, MLineBreaker::EAlLineBreakClass },  //tibetan symbol rdo rje rgya gram
   1.561 +    { 0x0fcf, 0x0fd0, MLineBreaker::EAlLineBreakClass },  //tibetan sign rdel nag gsum
   1.562 +    { 0x0fd0, 0x0fd2, MLineBreaker::EBbLineBreakClass },  //TIBETAN MARK BSKA- SHOG GI MGO RGYAN
   1.563 +    { 0x1000, 0x1022, MLineBreaker::ESaLineBreakClass },  //myanmar letter ka
   1.564 +    { 0x1023, 0x1028, MLineBreaker::ESaLineBreakClass },  //myanmar letter i
   1.565 +    { 0x1029, 0x102b, MLineBreaker::ESaLineBreakClass },  //myanmar letter o
   1.566 +    { 0x102c, 0x1033, MLineBreaker::ECmLineBreakClass },  //myanmar vowel sign aa
   1.567 +    { 0x1036, 0x103a, MLineBreaker::ECmLineBreakClass },  //myanmar sign anusvara
   1.568 +    { 0x1040, 0x104a, MLineBreaker::ENuLineBreakClass },  //myanmar digit zero
   1.569 +    { 0x104a, 0x1050, MLineBreaker::EAlLineBreakClass },  //myanmar sign little section
   1.570 +    { 0x1050, 0x1056, MLineBreaker::ESaLineBreakClass },  //myanmar letter sha
   1.571 +    { 0x1056, 0x105a, MLineBreaker::ECmLineBreakClass },  //myanmar vowel sign vocalic r
   1.572 +    { 0x10a0, 0x10c6, MLineBreaker::EAlLineBreakClass },  //georgian capital letter an
   1.573 +    { 0x10d0, 0x10fb, MLineBreaker::EAlLineBreakClass },  //georgian letter an
   1.574 +    { 0x10fb, 0x10fc, MLineBreaker::EAlLineBreakClass },  //georgian paragraph separator
   1.575 +    { 0x10fc, 0x10fd, MLineBreaker::EAlLineBreakClass },  //MODIFIER LETTER GEORGIAN NAR
   1.576 +    { 0x1100, 0x115a, MLineBreaker::EIdLineBreakClass },  //hangul choseong kiyeok
   1.577 +    { 0x115f, 0x1160, MLineBreaker::EIdLineBreakClass },  //hangul choseong filler
   1.578 +    { 0x1160, 0x11a3, MLineBreaker::ECmLineBreakClass },  //hangul jungseong filler
   1.579 +    { 0x11a8, 0x11fa, MLineBreaker::ECmLineBreakClass },  //hangul jongseong kiyeok
   1.580 +    { 0x1200, 0x1248, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable ha
   1.581 +    { 0x1248, 0x1249, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qwa
   1.582 +    { 0x124a, 0x124e, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qwi
   1.583 +    { 0x1250, 0x1257, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qha
   1.584 +    { 0x1258, 0x1259, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qhwa
   1.585 +    { 0x125a, 0x125e, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qhwi
   1.586 +    { 0x1260, 0x1288, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable ba
   1.587 +    { 0x1288, 0x1289, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable xwa
   1.588 +    { 0x128a, 0x128e, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable xwi
   1.589 +    { 0x1290, 0x12b0, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable na
   1.590 +    { 0x12b0, 0x12b1, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kwa
   1.591 +    { 0x12b2, 0x12b6, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kwi
   1.592 +    { 0x12b8, 0x12bf, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kxa
   1.593 +    { 0x12c0, 0x12c1, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kxwa
   1.594 +    { 0x12c2, 0x12c6, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kxwi
   1.595 +    { 0x12c8, 0x12d7, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable wa
   1.596 +    { 0x12d8, 0x1310, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable za
   1.597 +    { 0x1310, 0x1311, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable gwa
   1.598 +    { 0x1312, 0x1316, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable gwi
   1.599 +    { 0x1318, 0x135b, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable gga
   1.600 +    { 0x135f, 0x1360, MLineBreaker::ECmLineBreakClass },  //ETHIOPIC COMBINING GEMINATION MARK
   1.601 +    { 0x1360, 0x1361, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SECTION MARK
   1.602 +    { 0x1361, 0x1362, MLineBreaker::EBaLineBreakClass },  //ethiopic wordspace
   1.603 +    { 0x1362, 0x1369, MLineBreaker::EAlLineBreakClass },  //ethiopic full stop
   1.604 +    { 0x1369, 0x1372, MLineBreaker::ENuLineBreakClass },  //ethiopic digit one
   1.605 +    { 0x1372, 0x137d, MLineBreaker::EAlLineBreakClass },  //ethiopic number ten
   1.606 +    { 0x1380, 0x139a, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE SEBATBEIT MWA
   1.607 +    { 0x13a0, 0x13f5, MLineBreaker::EAlLineBreakClass },  //cherokee letter a
   1.608 +    { 0x1401, 0x1677, MLineBreaker::EAlLineBreakClass },  //canadian syllabics e
   1.609 +    { 0x1680, 0x1681, MLineBreaker::EBaLineBreakClass },  //ogham space mark
   1.610 +    { 0x1681, 0x169b, MLineBreaker::EAlLineBreakClass },  //ogham letter beith
   1.611 +    { 0x169b, 0x169c, MLineBreaker::EOpLineBreakClass },  //ogham feather mark
   1.612 +    { 0x169c, 0x169d, MLineBreaker::EClLineBreakClass },  //ogham reversed feather mark
   1.613 +    { 0x16a0, 0x16f1, MLineBreaker::EAlLineBreakClass },  //runic letter fehu feoh fe f
   1.614 +    { 0x1700, 0x170d, MLineBreaker::EAlLineBreakClass },  //TAGALOG LETTER A
   1.615 +    { 0x170e, 0x1712, MLineBreaker::EAlLineBreakClass },  //TAGALOG LETTER LA
   1.616 +    { 0x1712, 0x1715, MLineBreaker::ECmLineBreakClass },  //TAGALOG VOWEL SIGN I
   1.617 +    { 0x1720, 0x1732, MLineBreaker::EAlLineBreakClass },  //HANUNOO LETTER A
   1.618 +    { 0x1732, 0x1735, MLineBreaker::ECmLineBreakClass },  //HANUNOO VOWEL SIGN I
   1.619 +    { 0x1735, 0x1737, MLineBreaker::EBaLineBreakClass },  //PHILIPPINE SINGLE PUNCTUATION
   1.620 +    { 0x1740, 0x1752, MLineBreaker::EAlLineBreakClass },  //BUHID LETTER A
   1.621 +    { 0x1752, 0x1754, MLineBreaker::ECmLineBreakClass },  //BUHID VOWEL SIGN I
   1.622 +    { 0x1760, 0x176d, MLineBreaker::EAlLineBreakClass },  //TAGBANWA LETTER A
   1.623 +    { 0x176e, 0x1771, MLineBreaker::EAlLineBreakClass },  //TAGBANWA LETTER LA
   1.624 +    { 0x1772, 0x1774, MLineBreaker::ECmLineBreakClass },  //TAGBANWA VOWEL SIGN I
   1.625 +    { 0x1780, 0x17b4, MLineBreaker::ESaLineBreakClass },  //khmer letter ka
   1.626 +    { 0x17b4, 0x17d4, MLineBreaker::ECmLineBreakClass },  //khmer vowel inherent aq
   1.627 +    { 0x17d4, 0x17d5, MLineBreaker::ENsLineBreakClass },  //khmer sign khan
   1.628 +    { 0x17d5, 0x17d6, MLineBreaker::EBaLineBreakClass },  //khmer sign bariyoosan
   1.629 +    { 0x17d6, 0x17db, MLineBreaker::ENsLineBreakClass },  //khmer sign camnuc pii kuuh
   1.630 +    { 0x17db, 0x17dc, MLineBreaker::EPrLineBreakClass },  //khmer currency symbol riel
   1.631 +    { 0x17dc, 0x17dd, MLineBreaker::EAlLineBreakClass },  //khmer sign avakrahasanya
   1.632 +    { 0x17dd, 0x17de, MLineBreaker::ESaLineBreakClass },  //KHMER SIGN ATTHACAN
   1.633 +    { 0x17e0, 0x17ea, MLineBreaker::ENuLineBreakClass },  //khmer digit zero
   1.634 +    { 0x17f0, 0x17fa, MLineBreaker::EAlLineBreakClass },  //KHMER SYMBOL LEK ATTAK SON
   1.635 +    { 0x1800, 0x1806, MLineBreaker::EAlLineBreakClass },  //mongolian birga
   1.636 +    { 0x1806, 0x1807, MLineBreaker::EBbLineBreakClass },  //mongolian todo soft hyphen
   1.637 +    { 0x1807, 0x180b, MLineBreaker::EAlLineBreakClass },  //mongolian sibe syllable boundary marker
   1.638 +    { 0x180b, 0x180f, MLineBreaker::ECmLineBreakClass },  //mongolian free variation selector one
   1.639 +    { 0x1810, 0x181a, MLineBreaker::ENuLineBreakClass },  //mongolian digit zero
   1.640 +    { 0x1820, 0x1878, MLineBreaker::EAlLineBreakClass },  //mongolian letter a
   1.641 +    { 0x1880, 0x18a9, MLineBreaker::EAlLineBreakClass },  //mongolian letter ali gali anusvara one
   1.642 +    { 0x18a9, 0x18aa, MLineBreaker::ECmLineBreakClass },  //mongolian letter ali gali dagalga
   1.643 +    { 0x1900, 0x191d, MLineBreaker::EAlLineBreakClass },  //LIMBU VOWEL-CARRIER LETTER
   1.644 +    { 0x1920, 0x192c, MLineBreaker::ECmLineBreakClass },  //LIMBU VOWEL SIGN A
   1.645 +    { 0x1930, 0x193c, MLineBreaker::ECmLineBreakClass },  //LIMBU SMALL LETTER KA
   1.646 +    { 0x1940, 0x1941, MLineBreaker::EAlLineBreakClass },  //LIMBU SIGN LOO
   1.647 +    { 0x1944, 0x1946, MLineBreaker::EExLineBreakClass },  //LIMBU EXCLAMATION MARK
   1.648 +    { 0x1946, 0x1950, MLineBreaker::ENuLineBreakClass },  //LIMBU DIGIT ZERO
   1.649 +    { 0x1950, 0x196e, MLineBreaker::ESaLineBreakClass },  //TAI LE LETTER KA
   1.650 +    { 0x1970, 0x1975, MLineBreaker::ESaLineBreakClass },  //TAI LE LETTER TONE-2
   1.651 +    { 0x1980, 0x19aa, MLineBreaker::ESaLineBreakClass },  //NEW TAI LUE LETTER HIGH QA
   1.652 +    { 0x19b0, 0x19ca, MLineBreaker::ESaLineBreakClass },  //NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
   1.653 +    { 0x19d0, 0x19da, MLineBreaker::ENuLineBreakClass },  //NEW TAI LUE DIGIT ZERO
   1.654 +    { 0x19de, 0x19e0, MLineBreaker::ESaLineBreakClass },  //NEW TAI LUE SIGN LAE
   1.655 +    { 0x19e0, 0x1a17, MLineBreaker::EAlLineBreakClass },  //KHMER SYMBOL PATHAMASAT
   1.656 +    { 0x1a17, 0x1a1c, MLineBreaker::ECmLineBreakClass },  //BUGINESE VOWEL SIGN I
   1.657 +    { 0x1a1e, 0x1a1f, MLineBreaker::EBaLineBreakClass },  //BUGINESE PALLAWA
   1.658 +    { 0x1a1f, 0x1a20, MLineBreaker::EAlLineBreakClass },  //BUGINESE END OF SECTION
   1.659 +    { 0x1b00, 0x1b05, MLineBreaker::ECmLineBreakClass },  //BALINESE SIGN ULU RICEM
   1.660 +    { 0x1b05, 0x1b34, MLineBreaker::EAlLineBreakClass },  //BALINESE LETTER AKARA
   1.661 +    { 0x1b34, 0x1b45, MLineBreaker::ECmLineBreakClass },  //BALINESE SIGN REREKAN
   1.662 +    { 0x1b45, 0x1b4c, MLineBreaker::EAlLineBreakClass },  //BALINESE LETTER KAF SASAK
   1.663 +    { 0x1b50, 0x1b5a, MLineBreaker::ENuLineBreakClass },  //BALINESE DIGIT ZERO
   1.664 +    { 0x1b5a, 0x1b61, MLineBreaker::EBaLineBreakClass },  //BALINESE PANTI
   1.665 +    { 0x1b61, 0x1b6b, MLineBreaker::EAlLineBreakClass },  //BALINESE MUSICAL SYMBOL DONG
   1.666 +    { 0x1b6b, 0x1b74, MLineBreaker::ECmLineBreakClass },  //BALINESE MUSICAL SYMBOL COMBINING TEGEH
   1.667 +    { 0x1b74, 0x1b7d, MLineBreaker::EAlLineBreakClass },  //BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
   1.668 +    { 0x1d00, 0x1dc0, MLineBreaker::EAlLineBreakClass },  //LATIN LETTER SMALL CAPITAL A
   1.669 +    { 0x1dc0, 0x1dcb, MLineBreaker::ECmLineBreakClass },  //COMBINING DOTTED GRAVE ACCENT
   1.670 +    { 0x1dfe, 0x1e00, MLineBreaker::ECmLineBreakClass },  //COMBINING LEFT ARROWHEAD ABOVE
   1.671 +    { 0x1e00, 0x1e9c, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with ring below
   1.672 +    { 0x1ea0, 0x1efa, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with dot below
   1.673 +    { 0x1f00, 0x1f16, MLineBreaker::EAlLineBreakClass },  //greek small letter alpha with psili
   1.674 +    { 0x1f18, 0x1f1e, MLineBreaker::EAlLineBreakClass },  //greek capital letter epsilon with psili
   1.675 +    { 0x1f20, 0x1f46, MLineBreaker::EAlLineBreakClass },  //greek small letter eta with psili
   1.676 +    { 0x1f48, 0x1f4e, MLineBreaker::EAlLineBreakClass },  //greek capital letter omicron with psili
   1.677 +    { 0x1f50, 0x1f58, MLineBreaker::EAlLineBreakClass },  //greek small letter upsilon with psili
   1.678 +    { 0x1f59, 0x1f5a, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia
   1.679 +    { 0x1f5b, 0x1f5c, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia and varia
   1.680 +    { 0x1f5d, 0x1f5e, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia and oxia
   1.681 +    { 0x1f5f, 0x1f7e, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia and perispomeni
   1.682 +    { 0x1f80, 0x1fb5, MLineBreaker::EAlLineBreakClass },  //greek small letter alpha with psili and ypogegrammeni
   1.683 +    { 0x1fb6, 0x1fc5, MLineBreaker::EAlLineBreakClass },  //greek small letter alpha with perispomeni
   1.684 +    { 0x1fc6, 0x1fd4, MLineBreaker::EAlLineBreakClass },  //greek small letter eta with perispomeni
   1.685 +    { 0x1fd6, 0x1fdc, MLineBreaker::EAlLineBreakClass },  //greek small letter iota with perispomeni
   1.686 +    { 0x1fdd, 0x1ff0, MLineBreaker::EAlLineBreakClass },  //greek dasia and varia
   1.687 +    { 0x1ff2, 0x1ff5, MLineBreaker::EAlLineBreakClass },  //greek small letter omega with varia and ypogegrammeni
   1.688 +    { 0x1ff6, 0x1fff, MLineBreaker::EAlLineBreakClass },  //greek small letter omega with perispomeni
   1.689 +    { 0x2000, 0x2007, MLineBreaker::EBaLineBreakClass },  //en quad
   1.690 +    { 0x2007, 0x2008, MLineBreaker::EGlLineBreakClass },  //figure space
   1.691 +    { 0x2008, 0x200b, MLineBreaker::EBaLineBreakClass },  //punctuation space
   1.692 +    { 0x200b, 0x200c, MLineBreaker::EZwLineBreakClass },  //zero width space
   1.693 +    { 0x200c, 0x2010, MLineBreaker::ECmLineBreakClass },  //zero width non-joiner
   1.694 +    { 0x2010, 0x2011, MLineBreaker::EBaLineBreakClass },  //hyphen
   1.695 +    { 0x2011, 0x2012, MLineBreaker::EGlLineBreakClass },  //non-breaking hyphen
   1.696 +    { 0x2012, 0x2014, MLineBreaker::EBaLineBreakClass },  //figure dash
   1.697 +    { 0x2014, 0x2015, MLineBreaker::EB2LineBreakClass },  //em dash
   1.698 +    { 0x2015, 0x2016, MLineBreaker::EAlLineBreakClass },  //horizontal bar
   1.699 +    { 0x2016, 0x2017, MLineBreaker::EAiLineBreakClass },  //double vertical line
   1.700 +    { 0x2017, 0x2018, MLineBreaker::EAlLineBreakClass },  //double low line
   1.701 +    { 0x2018, 0x201a, MLineBreaker::EQuLineBreakClass },  //left single quotation mark
   1.702 +    { 0x201a, 0x201b, MLineBreaker::EOpLineBreakClass },  //single low-9 quotation mark
   1.703 +    { 0x201b, 0x201e, MLineBreaker::EQuLineBreakClass },  //single high-reversed-9 quotation mark
   1.704 +    { 0x201e, 0x201f, MLineBreaker::EOpLineBreakClass },  //double low-9 quotation mark
   1.705 +    { 0x201f, 0x2020, MLineBreaker::EQuLineBreakClass },  //double high-reversed-9 quotation mark
   1.706 +    { 0x2020, 0x2022, MLineBreaker::EAiLineBreakClass },  //dagger
   1.707 +    { 0x2022, 0x2024, MLineBreaker::EAlLineBreakClass },  //bullet
   1.708 +    { 0x2024, 0x2027, MLineBreaker::EInLineBreakClass },  //one dot leader
   1.709 +    { 0x2027, 0x2028, MLineBreaker::EBaLineBreakClass },  //hyphenation point
   1.710 +    { 0x2028, 0x202a, MLineBreaker::EBkLineBreakClass },  //line separator
   1.711 +    { 0x202a, 0x202f, MLineBreaker::ECmLineBreakClass },  //left-to-right embedding
   1.712 +    { 0x202f, 0x2030, MLineBreaker::EGlLineBreakClass },  //narrow no-break space
   1.713 +    { 0x2030, 0x2038, MLineBreaker::EPoLineBreakClass },  //per mille sign
   1.714 +    { 0x2038, 0x2039, MLineBreaker::EAlLineBreakClass },  //caret
   1.715 +    { 0x2039, 0x203b, MLineBreaker::EQuLineBreakClass },  //single left-pointing angle quotation mark
   1.716 +    { 0x203b, 0x203c, MLineBreaker::EAiLineBreakClass },  //reference mark
   1.717 +    { 0x203c, 0x203d, MLineBreaker::ENsLineBreakClass },  //double exclamation mark
   1.718 +    { 0x203d, 0x2044, MLineBreaker::EAlLineBreakClass },  //interrobang
   1.719 +    { 0x2044, 0x2045, MLineBreaker::ENsLineBreakClass },  //fraction slash
   1.720 +    { 0x2045, 0x2046, MLineBreaker::EOpLineBreakClass },  //left square bracket with quill
   1.721 +    { 0x2046, 0x2047, MLineBreaker::EClLineBreakClass },  //right square bracket with quill
   1.722 +    { 0x2047, 0x2048, MLineBreaker::ENsLineBreakClass },  //DOUBLE QUESTION MARK
   1.723 +    { 0x2048, 0x2056, MLineBreaker::EAlLineBreakClass },  //question exclamation mark
   1.724 +    { 0x2056, 0x2057, MLineBreaker::EBaLineBreakClass },  //THREE DOT PUNCTUATION
   1.725 +    { 0x2057, 0x2058, MLineBreaker::EAlLineBreakClass },  //QUADRUPLE PRIME
   1.726 +    { 0x2058, 0x205c, MLineBreaker::EBaLineBreakClass },  //FOUR DOT PUNCTUATION
   1.727 +    { 0x205c, 0x205d, MLineBreaker::EAlLineBreakClass },  //DOTTED CROSS
   1.728 +    { 0x205d, 0x2060, MLineBreaker::EBaLineBreakClass },  //TRICOLON
   1.729 +    { 0x2060, 0x2061, MLineBreaker::EGlLineBreakClass },  //WORD JOINER
   1.730 +    { 0x2061, 0x2064, MLineBreaker::EAlLineBreakClass },  //FUNCTION APPLICATION
   1.731 +    { 0x206a, 0x2070, MLineBreaker::ECmLineBreakClass },  //inhibit symmetric swapping
   1.732 +    { 0x2070, 0x2071, MLineBreaker::EAlLineBreakClass },  //superscript zero
   1.733 +    { 0x2071, 0x2072, MLineBreaker::EAlLineBreakClass },  //SUPERSCRIPT LATIN SMALL LETTER I
   1.734 +    { 0x2074, 0x2075, MLineBreaker::EAiLineBreakClass },  //superscript four
   1.735 +    { 0x2075, 0x207d, MLineBreaker::EAlLineBreakClass },  //superscript five
   1.736 +    { 0x207d, 0x207e, MLineBreaker::EOpLineBreakClass },  //superscript left parenthesis
   1.737 +    { 0x207e, 0x207f, MLineBreaker::EClLineBreakClass },  //superscript right parenthesis
   1.738 +    { 0x207f, 0x2080, MLineBreaker::EAiLineBreakClass },  //superscript latin small letter n
   1.739 +    { 0x2080, 0x2081, MLineBreaker::EAlLineBreakClass },  //subscript zero
   1.740 +    { 0x2081, 0x2085, MLineBreaker::EAiLineBreakClass },  //subscript one
   1.741 +    { 0x2085, 0x208d, MLineBreaker::EAlLineBreakClass },  //subscript five
   1.742 +    { 0x208d, 0x208e, MLineBreaker::EOpLineBreakClass },  //subscript left parenthesis
   1.743 +    { 0x208e, 0x208f, MLineBreaker::EClLineBreakClass },  //subscript right parenthesis
   1.744 +    { 0x2090, 0x2095, MLineBreaker::EAlLineBreakClass },  //LATIN SUBSCRIPT SMALL LETTER A
   1.745 +    { 0x20a0, 0x20a7, MLineBreaker::EPrLineBreakClass },  //euro-currency sign
   1.746 +    { 0x20a7, 0x20a8, MLineBreaker::EPoLineBreakClass },  //peseta sign
   1.747 +    { 0x20a8, 0x20b6, MLineBreaker::EPrLineBreakClass },  //rupee sign
   1.748 +    { 0x20d0, 0x20f0, MLineBreaker::ECmLineBreakClass },  //combining left harpoon above
   1.749 +    { 0x2100, 0x2103, MLineBreaker::EAlLineBreakClass },  //account of
   1.750 +    { 0x2103, 0x2104, MLineBreaker::EPoLineBreakClass },  //degree celsius
   1.751 +    { 0x2104, 0x2105, MLineBreaker::EAlLineBreakClass },  //centre line symbol
   1.752 +    { 0x2105, 0x2106, MLineBreaker::EAiLineBreakClass },  //care of
   1.753 +    { 0x2106, 0x2109, MLineBreaker::EAlLineBreakClass },  //cada una
   1.754 +    { 0x2109, 0x210a, MLineBreaker::EPoLineBreakClass },  //degree fahrenheit
   1.755 +    { 0x210a, 0x2113, MLineBreaker::EAlLineBreakClass },  //script small g
   1.756 +    { 0x2113, 0x2114, MLineBreaker::EAiLineBreakClass },  //script small l
   1.757 +    { 0x2114, 0x2116, MLineBreaker::EAlLineBreakClass },  //l b bar symbol
   1.758 +    { 0x2116, 0x2117, MLineBreaker::EPrLineBreakClass },  //numero sign
   1.759 +    { 0x2117, 0x2121, MLineBreaker::EAlLineBreakClass },  //sound recording copyright
   1.760 +    { 0x2121, 0x2123, MLineBreaker::EAiLineBreakClass },  //telephone sign
   1.761 +    { 0x2123, 0x2126, MLineBreaker::EAlLineBreakClass },  //versicle
   1.762 +    { 0x2126, 0x2127, MLineBreaker::EPoLineBreakClass },  //ohm sign
   1.763 +    { 0x2127, 0x212b, MLineBreaker::EAlLineBreakClass },  //inverted ohm sign
   1.764 +    { 0x212b, 0x212c, MLineBreaker::EAiLineBreakClass },  //angstrom sign
   1.765 +    { 0x212c, 0x214f, MLineBreaker::EAlLineBreakClass },  //script capital b
   1.766 +    { 0x2153, 0x2154, MLineBreaker::EAlLineBreakClass },  //vulgar fraction one third
   1.767 +    { 0x2154, 0x2156, MLineBreaker::EAiLineBreakClass },  //vulgar fraction two thirds
   1.768 +    { 0x2156, 0x215b, MLineBreaker::EAlLineBreakClass },  //vulgar fraction two fifths
   1.769 +    { 0x215b, 0x215c, MLineBreaker::EAiLineBreakClass },  //vulgar fraction one eighth
   1.770 +    { 0x215c, 0x215e, MLineBreaker::EAlLineBreakClass },  //vulgar fraction three eighths
   1.771 +    { 0x215e, 0x215f, MLineBreaker::EAiLineBreakClass },  //vulgar fraction seven eighths
   1.772 +    { 0x215f, 0x2160, MLineBreaker::EAlLineBreakClass },  //fraction numerator one
   1.773 +    { 0x2160, 0x216c, MLineBreaker::EAiLineBreakClass },  //roman numeral one
   1.774 +    { 0x216c, 0x2170, MLineBreaker::EAlLineBreakClass },  //roman numeral fifty
   1.775 +    { 0x2170, 0x217a, MLineBreaker::EAiLineBreakClass },  //small roman numeral one
   1.776 +    { 0x217a, 0x2185, MLineBreaker::EAlLineBreakClass },  //small roman numeral eleven
   1.777 +    { 0x2190, 0x219a, MLineBreaker::EAiLineBreakClass },  //leftwards arrow
   1.778 +    { 0x219a, 0x21d2, MLineBreaker::EAlLineBreakClass },  //leftwards arrow with stroke
   1.779 +    { 0x21d2, 0x21d3, MLineBreaker::EAiLineBreakClass },  //rightwards double arrow
   1.780 +    { 0x21d3, 0x21d4, MLineBreaker::EAlLineBreakClass },  //downwards double arrow
   1.781 +    { 0x21d4, 0x21d5, MLineBreaker::EAiLineBreakClass },  //left right double arrow
   1.782 +    { 0x21d5, 0x2200, MLineBreaker::EAlLineBreakClass },  //up down double arrow
   1.783 +    { 0x2200, 0x2201, MLineBreaker::EAiLineBreakClass },  //for all
   1.784 +    { 0x2201, 0x2202, MLineBreaker::EAlLineBreakClass },  //complement
   1.785 +    { 0x2202, 0x2204, MLineBreaker::EAiLineBreakClass },  //partial differential
   1.786 +    { 0x2204, 0x2207, MLineBreaker::EAlLineBreakClass },  //there does not exist
   1.787 +    { 0x2207, 0x2209, MLineBreaker::EAiLineBreakClass },  //nabla
   1.788 +    { 0x2209, 0x220b, MLineBreaker::EAlLineBreakClass },  //not an element of
   1.789 +    { 0x220b, 0x220c, MLineBreaker::EAiLineBreakClass },  //contains as member
   1.790 +    { 0x220c, 0x220f, MLineBreaker::EAlLineBreakClass },  //does not contain as member
   1.791 +    { 0x220f, 0x2210, MLineBreaker::EAiLineBreakClass },  //n-ary product
   1.792 +    { 0x2210, 0x2211, MLineBreaker::EAlLineBreakClass },  //n-ary coproduct
   1.793 +    { 0x2211, 0x2212, MLineBreaker::EAiLineBreakClass },  //n-ary summation
   1.794 +    { 0x2212, 0x2214, MLineBreaker::EPrLineBreakClass },  //minus sign
   1.795 +    { 0x2214, 0x2215, MLineBreaker::EAlLineBreakClass },  //dot plus
   1.796 +    { 0x2215, 0x2216, MLineBreaker::EAiLineBreakClass },  //division slash
   1.797 +    { 0x2216, 0x221a, MLineBreaker::EAlLineBreakClass },  //set minus
   1.798 +    { 0x221a, 0x221b, MLineBreaker::EAiLineBreakClass },  //square root
   1.799 +    { 0x221b, 0x221d, MLineBreaker::EAlLineBreakClass },  //cube root
   1.800 +    { 0x221d, 0x2221, MLineBreaker::EAiLineBreakClass },  //proportional to
   1.801 +    { 0x2221, 0x2223, MLineBreaker::EAlLineBreakClass },  //measured angle
   1.802 +    { 0x2223, 0x2224, MLineBreaker::EAiLineBreakClass },  //divides
   1.803 +    { 0x2224, 0x2225, MLineBreaker::EAlLineBreakClass },  //does not divide
   1.804 +    { 0x2225, 0x2226, MLineBreaker::EAiLineBreakClass },  //parallel to
   1.805 +    { 0x2226, 0x2227, MLineBreaker::EAlLineBreakClass },  //not parallel to
   1.806 +    { 0x2227, 0x222d, MLineBreaker::EAiLineBreakClass },  //logical and
   1.807 +    { 0x222d, 0x222e, MLineBreaker::EAlLineBreakClass },  //triple integral
   1.808 +    { 0x222e, 0x222f, MLineBreaker::EAiLineBreakClass },  //contour integral
   1.809 +    { 0x222f, 0x2234, MLineBreaker::EAlLineBreakClass },  //surface integral
   1.810 +    { 0x2234, 0x2238, MLineBreaker::EAiLineBreakClass },  //therefore
   1.811 +    { 0x2238, 0x223c, MLineBreaker::EAlLineBreakClass },  //dot minus
   1.812 +    { 0x223c, 0x223e, MLineBreaker::EAiLineBreakClass },  //tilde operator
   1.813 +    { 0x223e, 0x2248, MLineBreaker::EAlLineBreakClass },  //inverted lazy s
   1.814 +    { 0x2248, 0x2249, MLineBreaker::EAiLineBreakClass },  //almost equal to
   1.815 +    { 0x2249, 0x224c, MLineBreaker::EAlLineBreakClass },  //not almost equal to
   1.816 +    { 0x224c, 0x224d, MLineBreaker::EAiLineBreakClass },  //all equal to
   1.817 +    { 0x224d, 0x2252, MLineBreaker::EAlLineBreakClass },  //equivalent to
   1.818 +    { 0x2252, 0x2253, MLineBreaker::EAiLineBreakClass },  //approximately equal to or the image of
   1.819 +    { 0x2253, 0x2260, MLineBreaker::EAlLineBreakClass },  //image of or approximately equal to
   1.820 +    { 0x2260, 0x2262, MLineBreaker::EAiLineBreakClass },  //not equal to
   1.821 +    { 0x2262, 0x2264, MLineBreaker::EAlLineBreakClass },  //not identical to
   1.822 +    { 0x2264, 0x2268, MLineBreaker::EAiLineBreakClass },  //less-than or equal to
   1.823 +    { 0x2268, 0x226a, MLineBreaker::EAlLineBreakClass },  //less-than but not equal to
   1.824 +    { 0x226a, 0x226c, MLineBreaker::EAiLineBreakClass },  //much less-than
   1.825 +    { 0x226c, 0x226e, MLineBreaker::EAlLineBreakClass },  //between
   1.826 +    { 0x226e, 0x2270, MLineBreaker::EAiLineBreakClass },  //not less-than
   1.827 +    { 0x2270, 0x2282, MLineBreaker::EAlLineBreakClass },  //neither less-than nor equal to
   1.828 +    { 0x2282, 0x2284, MLineBreaker::EAiLineBreakClass },  //subset of
   1.829 +    { 0x2284, 0x2286, MLineBreaker::EAlLineBreakClass },  //not a subset of
   1.830 +    { 0x2286, 0x2288, MLineBreaker::EAiLineBreakClass },  //subset of or equal to
   1.831 +    { 0x2288, 0x2295, MLineBreaker::EAlLineBreakClass },  //neither a subset of nor equal to
   1.832 +    { 0x2295, 0x2296, MLineBreaker::EAiLineBreakClass },  //circled plus
   1.833 +    { 0x2296, 0x2299, MLineBreaker::EAlLineBreakClass },  //circled minus
   1.834 +    { 0x2299, 0x229a, MLineBreaker::EAiLineBreakClass },  //circled dot operator
   1.835 +    { 0x229a, 0x22a5, MLineBreaker::EAlLineBreakClass },  //circled ring operator
   1.836 +    { 0x22a5, 0x22a6, MLineBreaker::EAiLineBreakClass },  //up tack
   1.837 +    { 0x22a6, 0x22bf, MLineBreaker::EAlLineBreakClass },  //assertion
   1.838 +    { 0x22bf, 0x22c0, MLineBreaker::EAiLineBreakClass },  //right triangle
   1.839 +    { 0x22c0, 0x2312, MLineBreaker::EAlLineBreakClass },  //n-ary logical and
   1.840 +    { 0x2312, 0x2313, MLineBreaker::EAiLineBreakClass },  //arc
   1.841 +    { 0x2313, 0x2329, MLineBreaker::EAlLineBreakClass },  //segment
   1.842 +    { 0x2329, 0x232a, MLineBreaker::EOpLineBreakClass },  //left-pointing angle bracket
   1.843 +    { 0x232a, 0x232b, MLineBreaker::EClLineBreakClass },  //right-pointing angle bracket
   1.844 +    { 0x232b, 0x23e8, MLineBreaker::EAlLineBreakClass },  //erase to the left
   1.845 +    { 0x2400, 0x2427, MLineBreaker::EAlLineBreakClass },  //symbol for null
   1.846 +    { 0x2440, 0x244b, MLineBreaker::EAlLineBreakClass },  //ocr hook
   1.847 +    { 0x2460, 0x24c0, MLineBreaker::EAiLineBreakClass },  //circled digit one
   1.848 +    { 0x24c0, 0x24d0, MLineBreaker::EAlLineBreakClass },  //circled latin capital letter k
   1.849 +    { 0x24d0, 0x24ea, MLineBreaker::EAiLineBreakClass },  //circled latin small letter a
   1.850 +    { 0x24ea, 0x24eb, MLineBreaker::EAlLineBreakClass },  //circled digit zero
   1.851 +    { 0x24eb, 0x24ff, MLineBreaker::EAiLineBreakClass },  //NEGATIVE CIRCLED NUMBER ELEVEN
   1.852 +    { 0x24ff, 0x2500, MLineBreaker::EAlLineBreakClass },  //NEGATIVE CIRCLED DIGIT ZERO
   1.853 +    { 0x2500, 0x254c, MLineBreaker::EAiLineBreakClass },  //box drawings light horizontal
   1.854 +    { 0x254c, 0x2550, MLineBreaker::EAlLineBreakClass },  //box drawings light double dash horizontal
   1.855 +    { 0x2550, 0x2575, MLineBreaker::EAiLineBreakClass },  //box drawings double horizontal
   1.856 +    { 0x2575, 0x2580, MLineBreaker::EAlLineBreakClass },  //box drawings light up
   1.857 +    { 0x2580, 0x2590, MLineBreaker::EAiLineBreakClass },  //upper half block
   1.858 +    { 0x2590, 0x2592, MLineBreaker::EAlLineBreakClass },  //right half block
   1.859 +    { 0x2592, 0x2596, MLineBreaker::EAiLineBreakClass },  //medium shade
   1.860 +    { 0x2596, 0x25a0, MLineBreaker::EAlLineBreakClass },  //QUADRANT LOWER LEFT
   1.861 +    { 0x25a0, 0x25a2, MLineBreaker::EAiLineBreakClass },  //black square
   1.862 +    { 0x25a2, 0x25a3, MLineBreaker::EAlLineBreakClass },  //white square with rounded corners
   1.863 +    { 0x25a3, 0x25aa, MLineBreaker::EAiLineBreakClass },  //white square containing black small square
   1.864 +    { 0x25aa, 0x25b2, MLineBreaker::EAlLineBreakClass },  //black small square
   1.865 +    { 0x25b2, 0x25b4, MLineBreaker::EAiLineBreakClass },  //black up-pointing triangle
   1.866 +    { 0x25b4, 0x25b6, MLineBreaker::EAlLineBreakClass },  //black up-pointing small triangle
   1.867 +    { 0x25b6, 0x25b8, MLineBreaker::EAiLineBreakClass },  //black right-pointing triangle
   1.868 +    { 0x25b8, 0x25bc, MLineBreaker::EAlLineBreakClass },  //black right-pointing small triangle
   1.869 +    { 0x25bc, 0x25be, MLineBreaker::EAiLineBreakClass },  //black down-pointing triangle
   1.870 +    { 0x25be, 0x25c0, MLineBreaker::EAlLineBreakClass },  //black down-pointing small triangle
   1.871 +    { 0x25c0, 0x25c2, MLineBreaker::EAiLineBreakClass },  //black left-pointing triangle
   1.872 +    { 0x25c2, 0x25c6, MLineBreaker::EAlLineBreakClass },  //black left-pointing small triangle
   1.873 +    { 0x25c6, 0x25c8, MLineBreaker::EAiLineBreakClass },  //black diamond
   1.874 +    { 0x25c8, 0x25cb, MLineBreaker::EAlLineBreakClass },  //white diamond containing black small diamond
   1.875 +    { 0x25cb, 0x25cc, MLineBreaker::EAiLineBreakClass },  //white circle
   1.876 +    { 0x25cc, 0x25ce, MLineBreaker::EAlLineBreakClass },  //dotted circle
   1.877 +    { 0x25ce, 0x25d2, MLineBreaker::EAiLineBreakClass },  //bullseye
   1.878 +    { 0x25d2, 0x25e2, MLineBreaker::EAlLineBreakClass },  //circle with lower half black
   1.879 +    { 0x25e2, 0x25e6, MLineBreaker::EAiLineBreakClass },  //black lower right triangle
   1.880 +    { 0x25e6, 0x25ef, MLineBreaker::EAlLineBreakClass },  //white bullet
   1.881 +    { 0x25ef, 0x25f0, MLineBreaker::EAiLineBreakClass },  //large circle
   1.882 +    { 0x25f0, 0x2605, MLineBreaker::EAlLineBreakClass },  //white square with upper left quadrant
   1.883 +    { 0x2605, 0x2607, MLineBreaker::EAiLineBreakClass },  //black star
   1.884 +    { 0x2607, 0x2609, MLineBreaker::EAlLineBreakClass },  //lightning
   1.885 +    { 0x2609, 0x260a, MLineBreaker::EAiLineBreakClass },  //sun
   1.886 +    { 0x260a, 0x260e, MLineBreaker::EAlLineBreakClass },  //ascending node
   1.887 +    { 0x260e, 0x2610, MLineBreaker::EAiLineBreakClass },  //black telephone
   1.888 +    { 0x2610, 0x2614, MLineBreaker::EAlLineBreakClass },  //ballot box
   1.889 +    { 0x2614, 0x2618, MLineBreaker::EAiLineBreakClass },  //UMBRELLA WITH RAIN DROPS
   1.890 +    { 0x2618, 0x261c, MLineBreaker::EAlLineBreakClass },  //SHAMROCK
   1.891 +    { 0x261c, 0x261d, MLineBreaker::EAiLineBreakClass },  //white left pointing index
   1.892 +    { 0x261d, 0x261e, MLineBreaker::EAlLineBreakClass },  //white up pointing index
   1.893 +    { 0x261e, 0x261f, MLineBreaker::EAiLineBreakClass },  //white right pointing index
   1.894 +    { 0x261f, 0x2640, MLineBreaker::EAlLineBreakClass },  //white down pointing index
   1.895 +    { 0x2640, 0x2641, MLineBreaker::EAiLineBreakClass },  //female sign
   1.896 +    { 0x2641, 0x2642, MLineBreaker::EAlLineBreakClass },  //earth
   1.897 +    { 0x2642, 0x2643, MLineBreaker::EAiLineBreakClass },  //male sign
   1.898 +    { 0x2643, 0x2660, MLineBreaker::EAlLineBreakClass },  //jupiter
   1.899 +    { 0x2660, 0x2662, MLineBreaker::EAiLineBreakClass },  //black spade suit
   1.900 +    { 0x2662, 0x2663, MLineBreaker::EAlLineBreakClass },  //white diamond suit
   1.901 +    { 0x2663, 0x2666, MLineBreaker::EAiLineBreakClass },  //black club suit
   1.902 +    { 0x2666, 0x2667, MLineBreaker::EAlLineBreakClass },  //black diamond suit
   1.903 +    { 0x2667, 0x266b, MLineBreaker::EAiLineBreakClass },  //white club suit
   1.904 +    { 0x266b, 0x266c, MLineBreaker::EAlLineBreakClass },  //beamed eighth notes
   1.905 +    { 0x266c, 0x266e, MLineBreaker::EAiLineBreakClass },  //beamed sixteenth notes
   1.906 +    { 0x266e, 0x266f, MLineBreaker::EAlLineBreakClass },  //music natural sign
   1.907 +    { 0x266f, 0x2670, MLineBreaker::EAiLineBreakClass },  //music sharp sign
   1.908 +    { 0x2670, 0x269d, MLineBreaker::EAlLineBreakClass },  //west syriac cross
   1.909 +    { 0x26a0, 0x26b3, MLineBreaker::EAlLineBreakClass },  //WARNING SIGN
   1.910 +    { 0x2701, 0x2705, MLineBreaker::EAlLineBreakClass },  //upper blade scissors
   1.911 +    { 0x2706, 0x270a, MLineBreaker::EAlLineBreakClass },  //telephone location sign
   1.912 +    { 0x270c, 0x2728, MLineBreaker::EAlLineBreakClass },  //victory hand
   1.913 +    { 0x2729, 0x274c, MLineBreaker::EAlLineBreakClass },  //stress outlined white star
   1.914 +    { 0x274d, 0x274e, MLineBreaker::EAlLineBreakClass },  //shadowed white circle
   1.915 +    { 0x274f, 0x2753, MLineBreaker::EAlLineBreakClass },  //lower right drop-shadowed white square
   1.916 +    { 0x2756, 0x2757, MLineBreaker::EAlLineBreakClass },  //black diamond minus white x
   1.917 +    { 0x2758, 0x275f, MLineBreaker::EAlLineBreakClass },  //light vertical bar
   1.918 +    { 0x2761, 0x2768, MLineBreaker::EAlLineBreakClass },  //curved stem paragraph sign ornament
   1.919 +    { 0x2768, 0x2769, MLineBreaker::EOpLineBreakClass },  //MEDIUM LEFT PARENTHESIS ORNAMENT
   1.920 +    { 0x2769, 0x276a, MLineBreaker::EClLineBreakClass },  //MEDIUM RIGHT PARENTHESIS ORNAMENT
   1.921 +    { 0x276a, 0x276b, MLineBreaker::EOpLineBreakClass },  //MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
   1.922 +    { 0x276b, 0x276c, MLineBreaker::EClLineBreakClass },  //MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
   1.923 +    { 0x276c, 0x276d, MLineBreaker::EOpLineBreakClass },  //MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
   1.924 +    { 0x276d, 0x276e, MLineBreaker::EClLineBreakClass },  //MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
   1.925 +    { 0x276e, 0x276f, MLineBreaker::EOpLineBreakClass },  //HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
   1.926 +    { 0x276f, 0x2770, MLineBreaker::EClLineBreakClass },  //HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
   1.927 +    { 0x2770, 0x2771, MLineBreaker::EOpLineBreakClass },  //HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
   1.928 +    { 0x2771, 0x2772, MLineBreaker::EClLineBreakClass },  //HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
   1.929 +    { 0x2772, 0x2773, MLineBreaker::EOpLineBreakClass },  //LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
   1.930 +    { 0x2773, 0x2774, MLineBreaker::EClLineBreakClass },  //LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
   1.931 +    { 0x2774, 0x2775, MLineBreaker::EOpLineBreakClass },  //MEDIUM LEFT CURLY BRACKET ORNAMENT
   1.932 +    { 0x2775, 0x2776, MLineBreaker::EClLineBreakClass },  //MEDIUM RIGHT CURLY BRACKET ORNAMENT
   1.933 +    { 0x2776, 0x2795, MLineBreaker::EAlLineBreakClass },  //dingbat negative circled digit one
   1.934 +    { 0x2798, 0x27b0, MLineBreaker::EAlLineBreakClass },  //heavy south east arrow
   1.935 +    { 0x27b1, 0x27bf, MLineBreaker::EAlLineBreakClass },  //notched upper right-shadowed white rightwards arrow
   1.936 +    { 0x27c0, 0x27c5, MLineBreaker::EAlLineBreakClass },  //THREE DIMENSIONAL ANGLE
   1.937 +    { 0x27c5, 0x27c6, MLineBreaker::EOpLineBreakClass },  //LEFT S-SHAPED BAG DELIMITER
   1.938 +    { 0x27c6, 0x27c7, MLineBreaker::EClLineBreakClass },  //RIGHT S-SHAPED BAG DELIMITER
   1.939 +    { 0x27c7, 0x27cb, MLineBreaker::EAlLineBreakClass },  //OR WITH DOT INSIDE
   1.940 +    { 0x27d0, 0x27e6, MLineBreaker::EAlLineBreakClass },  //WHITE DIAMOND WITH CENTRED DOT
   1.941 +    { 0x27e6, 0x27e7, MLineBreaker::EOpLineBreakClass },  //MATHEMATICAL LEFT WHITE SQUARE BRACKET
   1.942 +    { 0x27e7, 0x27e8, MLineBreaker::EClLineBreakClass },  //MATHEMATICAL RIGHT WHITE SQUARE BRACKET
   1.943 +    { 0x27e8, 0x27e9, MLineBreaker::EOpLineBreakClass },  //MATHEMATICAL LEFT ANGLE BRACKET
   1.944 +    { 0x27e9, 0x27ea, MLineBreaker::EClLineBreakClass },  //MATHEMATICAL RIGHT ANGLE BRACKET
   1.945 +    { 0x27ea, 0x27eb, MLineBreaker::EOpLineBreakClass },  //MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
   1.946 +    { 0x27eb, 0x27ec, MLineBreaker::EClLineBreakClass },  //MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
   1.947 +    { 0x27f0, 0x2983, MLineBreaker::EAlLineBreakClass },  //UPWARDS QUADRUPLE ARROW
   1.948 +    { 0x2983, 0x2984, MLineBreaker::EOpLineBreakClass },  //LEFT WHITE CURLY BRACKET
   1.949 +    { 0x2984, 0x2985, MLineBreaker::EClLineBreakClass },  //RIGHT WHITE CURLY BRACKET
   1.950 +    { 0x2985, 0x2986, MLineBreaker::EOpLineBreakClass },  //LEFT WHITE PARENTHESIS
   1.951 +    { 0x2986, 0x2987, MLineBreaker::EClLineBreakClass },  //RIGHT WHITE PARENTHESIS
   1.952 +    { 0x2987, 0x2988, MLineBreaker::EOpLineBreakClass },  //Z NOTATION LEFT IMAGE BRACKET
   1.953 +    { 0x2988, 0x2989, MLineBreaker::EClLineBreakClass },  //Z NOTATION RIGHT IMAGE BRACKET
   1.954 +    { 0x2989, 0x298a, MLineBreaker::EOpLineBreakClass },  //Z NOTATION LEFT BINDING BRACKET
   1.955 +    { 0x298a, 0x298b, MLineBreaker::EClLineBreakClass },  //Z NOTATION RIGHT BINDING BRACKET
   1.956 +    { 0x298b, 0x298c, MLineBreaker::EOpLineBreakClass },  //LEFT SQUARE BRACKET WITH UNDERBAR
   1.957 +    { 0x298c, 0x298d, MLineBreaker::EClLineBreakClass },  //RIGHT SQUARE BRACKET WITH UNDERBAR
   1.958 +    { 0x298d, 0x298e, MLineBreaker::EOpLineBreakClass },  //LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
   1.959 +    { 0x298e, 0x298f, MLineBreaker::EClLineBreakClass },  //RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
   1.960 +    { 0x298f, 0x2990, MLineBreaker::EOpLineBreakClass },  //LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
   1.961 +    { 0x2990, 0x2991, MLineBreaker::EClLineBreakClass },  //RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
   1.962 +    { 0x2991, 0x2992, MLineBreaker::EOpLineBreakClass },  //LEFT ANGLE BRACKET WITH DOT
   1.963 +    { 0x2992, 0x2993, MLineBreaker::EClLineBreakClass },  //RIGHT ANGLE BRACKET WITH DOT
   1.964 +    { 0x2993, 0x2994, MLineBreaker::EOpLineBreakClass },  //LEFT ARC LESS-THAN BRACKET
   1.965 +    { 0x2994, 0x2995, MLineBreaker::EClLineBreakClass },  //RIGHT ARC GREATER-THAN BRACKET
   1.966 +    { 0x2995, 0x2996, MLineBreaker::EOpLineBreakClass },  //DOUBLE LEFT ARC GREATER-THAN BRACKET
   1.967 +    { 0x2996, 0x2997, MLineBreaker::EClLineBreakClass },  //DOUBLE RIGHT ARC LESS-THAN BRACKET
   1.968 +    { 0x2997, 0x2998, MLineBreaker::EOpLineBreakClass },  //LEFT BLACK TORTOISE SHELL BRACKET
   1.969 +    { 0x2998, 0x2999, MLineBreaker::EClLineBreakClass },  //RIGHT BLACK TORTOISE SHELL BRACKET
   1.970 +    { 0x2999, 0x29d8, MLineBreaker::EAlLineBreakClass },  //DOTTED FENCE
   1.971 +    { 0x29d8, 0x29d9, MLineBreaker::EOpLineBreakClass },  //LEFT WIGGLY FENCE
   1.972 +    { 0x29d9, 0x29da, MLineBreaker::EClLineBreakClass },  //RIGHT WIGGLY FENCE
   1.973 +    { 0x29da, 0x29db, MLineBreaker::EOpLineBreakClass },  //LEFT DOUBLE WIGGLY FENCE
   1.974 +    { 0x29db, 0x29dc, MLineBreaker::EClLineBreakClass },  //RIGHT DOUBLE WIGGLY FENCE
   1.975 +    { 0x29dc, 0x29fc, MLineBreaker::EAlLineBreakClass },  //INCOMPLETE INFINITY
   1.976 +    { 0x29fc, 0x29fd, MLineBreaker::EOpLineBreakClass },  //LEFT-POINTING CURVED ANGLE BRACKET
   1.977 +    { 0x29fd, 0x29fe, MLineBreaker::EClLineBreakClass },  //RIGHT-POINTING CURVED ANGLE BRACKET
   1.978 +    { 0x29fe, 0x2b1b, MLineBreaker::EAlLineBreakClass },  //TINY
   1.979 +    { 0x2b20, 0x2b24, MLineBreaker::EAlLineBreakClass },  //WHITE PENTAGON
   1.980 +    { 0x2c00, 0x2c2f, MLineBreaker::EAlLineBreakClass },  //GLAGOLITIC CAPITAL LETTER AZU
   1.981 +    { 0x2c30, 0x2c5f, MLineBreaker::EAlLineBreakClass },  //GLAGOLITIC SMALL LETTER AZU
   1.982 +    { 0x2c60, 0x2c6d, MLineBreaker::EAlLineBreakClass },  //LATIN CAPITAL LETTER L WITH DOUBLE BAR
   1.983 +    { 0x2c74, 0x2c78, MLineBreaker::EAlLineBreakClass },  //LATIN SMALL LETTER V WITH CURL
   1.984 +    { 0x2c80, 0x2ceb, MLineBreaker::EAlLineBreakClass },  //COPTIC CAPITAL LETTER ALFA
   1.985 +    { 0x2cf9, 0x2cfd, MLineBreaker::EBaLineBreakClass },  //COPTIC OLD NUBIAN FULL STOP
   1.986 +    { 0x2cfd, 0x2cfe, MLineBreaker::EAlLineBreakClass },  //COPTIC FRACTION ONE HALF
   1.987 +    { 0x2cfe, 0x2d00, MLineBreaker::EBaLineBreakClass },  //COPTIC FULL STOP
   1.988 +    { 0x2d00, 0x2d26, MLineBreaker::EAlLineBreakClass },  //GEORGIAN SMALL LETTER AN
   1.989 +    { 0x2d30, 0x2d66, MLineBreaker::EAlLineBreakClass },  //TIFINAGH LETTER YA
   1.990 +    { 0x2d6f, 0x2d70, MLineBreaker::EAlLineBreakClass },  //TIFINAGH MODIFIER LETTER LABIALIZATION MARK
   1.991 +    { 0x2d80, 0x2d97, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE LOA
   1.992 +    { 0x2da0, 0x2da7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE SSA
   1.993 +    { 0x2da8, 0x2daf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE CCA
   1.994 +    { 0x2db0, 0x2db7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE ZZA
   1.995 +    { 0x2db8, 0x2dbf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE CCHA
   1.996 +    { 0x2dc0, 0x2dc7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE QYA
   1.997 +    { 0x2dc8, 0x2dcf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE KYA
   1.998 +    { 0x2dd0, 0x2dd7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE XYA
   1.999 +    { 0x2dd8, 0x2ddf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE GYA
  1.1000 +    { 0x2e00, 0x2e0e, MLineBreaker::EQuLineBreakClass },  //RIGHT ANGLE SUBSTITUTION MARKER
  1.1001 +    { 0x2e0e, 0x2e16, MLineBreaker::EBaLineBreakClass },  //EDITORIAL CORONIS
  1.1002 +    { 0x2e16, 0x2e17, MLineBreaker::EAlLineBreakClass },  //DOTTED RIGHT-POINTING ANGLE
  1.1003 +    { 0x2e17, 0x2e18, MLineBreaker::EBaLineBreakClass },  //DOUBLE OBLIQUE HYPHEN
  1.1004 +    { 0x2e1c, 0x2e1e, MLineBreaker::EQuLineBreakClass },  //LEFT LOW PARAPHRASE BRACKET
  1.1005 +    { 0x2e80, 0x2e9a, MLineBreaker::EIdLineBreakClass },  //cjk radical repeat
  1.1006 +    { 0x2e9b, 0x2ef4, MLineBreaker::EIdLineBreakClass },  //cjk radical choke
  1.1007 +    { 0x2f00, 0x2fd6, MLineBreaker::EIdLineBreakClass },  //kangxi radical one
  1.1008 +    { 0x2ff0, 0x2ffc, MLineBreaker::EIdLineBreakClass },  //ideographic description character left to right
  1.1009 +    { 0x3000, 0x3001, MLineBreaker::EIdLineBreakClass },  //ideographic space
  1.1010 +    { 0x3001, 0x3003, MLineBreaker::EClLineBreakClass },  //ideographic comma
  1.1011 +    { 0x3003, 0x3005, MLineBreaker::EIdLineBreakClass },  //ditto mark
  1.1012 +    { 0x3005, 0x3006, MLineBreaker::ENsLineBreakClass },  //ideographic iteration mark
  1.1013 +    { 0x3006, 0x3008, MLineBreaker::EIdLineBreakClass },  //ideographic closing mark
  1.1014 +    { 0x3008, 0x3009, MLineBreaker::EOpLineBreakClass },  //left angle bracket
  1.1015 +    { 0x3009, 0x300a, MLineBreaker::EClLineBreakClass },  //right angle bracket
  1.1016 +    { 0x300a, 0x300b, MLineBreaker::EOpLineBreakClass },  //left double angle bracket
  1.1017 +    { 0x300b, 0x300c, MLineBreaker::EClLineBreakClass },  //right double angle bracket
  1.1018 +    { 0x300c, 0x300d, MLineBreaker::EOpLineBreakClass },  //left corner bracket
  1.1019 +    { 0x300d, 0x300e, MLineBreaker::EClLineBreakClass },  //right corner bracket
  1.1020 +    { 0x300e, 0x300f, MLineBreaker::EOpLineBreakClass },  //left white corner bracket
  1.1021 +    { 0x300f, 0x3010, MLineBreaker::EClLineBreakClass },  //right white corner bracket
  1.1022 +    { 0x3010, 0x3011, MLineBreaker::EOpLineBreakClass },  //left black lenticular bracket
  1.1023 +    { 0x3011, 0x3012, MLineBreaker::EClLineBreakClass },  //right black lenticular bracket
  1.1024 +    { 0x3012, 0x3014, MLineBreaker::EIdLineBreakClass },  //postal mark
  1.1025 +    { 0x3014, 0x3015, MLineBreaker::EOpLineBreakClass },  //left tortoise shell bracket
  1.1026 +    { 0x3015, 0x3016, MLineBreaker::EClLineBreakClass },  //right tortoise shell bracket
  1.1027 +    { 0x3016, 0x3017, MLineBreaker::EOpLineBreakClass },  //left white lenticular bracket
  1.1028 +    { 0x3017, 0x3018, MLineBreaker::EClLineBreakClass },  //right white lenticular bracket
  1.1029 +    { 0x3018, 0x3019, MLineBreaker::EOpLineBreakClass },  //left white tortoise shell bracket
  1.1030 +    { 0x3019, 0x301a, MLineBreaker::EClLineBreakClass },  //right white tortoise shell bracket
  1.1031 +    { 0x301a, 0x301b, MLineBreaker::EOpLineBreakClass },  //left white square bracket
  1.1032 +    { 0x301b, 0x301c, MLineBreaker::EClLineBreakClass },  //right white square bracket
  1.1033 +    { 0x301c, 0x301d, MLineBreaker::ENsLineBreakClass },  //wave dash
  1.1034 +    { 0x301d, 0x301e, MLineBreaker::EOpLineBreakClass },  //reversed double prime quotation mark
  1.1035 +    { 0x301e, 0x3020, MLineBreaker::EClLineBreakClass },  //double prime quotation mark
  1.1036 +    { 0x3020, 0x302a, MLineBreaker::EIdLineBreakClass },  //postal mark face
  1.1037 +    { 0x302a, 0x3030, MLineBreaker::ECmLineBreakClass },  //ideographic level tone mark
  1.1038 +    { 0x3030, 0x303b, MLineBreaker::EIdLineBreakClass },  //wavy dash
  1.1039 +    { 0x303b, 0x303d, MLineBreaker::ENsLineBreakClass },  //VERTICAL IDEOGRAPHIC ITERATION MARK
  1.1040 +    { 0x303d, 0x3040, MLineBreaker::EIdLineBreakClass },  //PART ALTERNATION MARK
  1.1041 +    { 0x3041, 0x3042, MLineBreaker::ENsLineBreakClass },  //hiragana letter small a
  1.1042 +    { 0x3042, 0x3043, MLineBreaker::EIdLineBreakClass },  //hiragana letter a
  1.1043 +    { 0x3043, 0x3044, MLineBreaker::ENsLineBreakClass },  //hiragana letter small i
  1.1044 +    { 0x3044, 0x3045, MLineBreaker::EIdLineBreakClass },  //hiragana letter i
  1.1045 +    { 0x3045, 0x3046, MLineBreaker::ENsLineBreakClass },  //hiragana letter small u
  1.1046 +    { 0x3046, 0x3047, MLineBreaker::EIdLineBreakClass },  //hiragana letter u
  1.1047 +    { 0x3047, 0x3048, MLineBreaker::ENsLineBreakClass },  //hiragana letter small e
  1.1048 +    { 0x3048, 0x3049, MLineBreaker::EIdLineBreakClass },  //hiragana letter e
  1.1049 +    { 0x3049, 0x304a, MLineBreaker::ENsLineBreakClass },  //hiragana letter small o
  1.1050 +    { 0x304a, 0x3063, MLineBreaker::EIdLineBreakClass },  //hiragana letter o
  1.1051 +    { 0x3063, 0x3064, MLineBreaker::ENsLineBreakClass },  //hiragana letter small tu
  1.1052 +    { 0x3064, 0x3083, MLineBreaker::EIdLineBreakClass },  //hiragana letter tu
  1.1053 +    { 0x3083, 0x3084, MLineBreaker::ENsLineBreakClass },  //hiragana letter small ya
  1.1054 +    { 0x3084, 0x3085, MLineBreaker::EIdLineBreakClass },  //hiragana letter ya
  1.1055 +    { 0x3085, 0x3086, MLineBreaker::ENsLineBreakClass },  //hiragana letter small yu
  1.1056 +    { 0x3086, 0x3087, MLineBreaker::EIdLineBreakClass },  //hiragana letter yu
  1.1057 +    { 0x3087, 0x3088, MLineBreaker::ENsLineBreakClass },  //hiragana letter small yo
  1.1058 +    { 0x3088, 0x308e, MLineBreaker::EIdLineBreakClass },  //hiragana letter yo
  1.1059 +    { 0x308e, 0x308f, MLineBreaker::ENsLineBreakClass },  //hiragana letter small wa
  1.1060 +    { 0x308f, 0x3095, MLineBreaker::EIdLineBreakClass },  //hiragana letter wa
  1.1061 +    { 0x3095, 0x3097, MLineBreaker::ENsLineBreakClass },  //HIRAGANA LETTER SMALL KA
  1.1062 +    { 0x3099, 0x309b, MLineBreaker::ECmLineBreakClass },  //combining katakana-hiragana voiced sound mark
  1.1063 +    { 0x309b, 0x309f, MLineBreaker::ENsLineBreakClass },  //katakana-hiragana voiced sound mark
  1.1064 +    { 0x309f, 0x30a0, MLineBreaker::EIdLineBreakClass },  //HIRAGANA DIGRAPH YORI
  1.1065 +    { 0x30a0, 0x30a1, MLineBreaker::ENsLineBreakClass },  //KATAKANA-HIRAGANA DOUBLE HYPHEN
  1.1066 +    { 0x30a1, 0x30a2, MLineBreaker::ENsLineBreakClass },  //katakana letter small a
  1.1067 +    { 0x30a2, 0x30a3, MLineBreaker::EIdLineBreakClass },  //katakana letter a
  1.1068 +    { 0x30a3, 0x30a4, MLineBreaker::ENsLineBreakClass },  //katakana letter small i
  1.1069 +    { 0x30a4, 0x30a5, MLineBreaker::EIdLineBreakClass },  //katakana letter i
  1.1070 +    { 0x30a5, 0x30a6, MLineBreaker::ENsLineBreakClass },  //katakana letter small u
  1.1071 +    { 0x30a6, 0x30a7, MLineBreaker::EIdLineBreakClass },  //katakana letter u
  1.1072 +    { 0x30a7, 0x30a8, MLineBreaker::ENsLineBreakClass },  //katakana letter small e
  1.1073 +    { 0x30a8, 0x30a9, MLineBreaker::EIdLineBreakClass },  //katakana letter e
  1.1074 +    { 0x30a9, 0x30aa, MLineBreaker::ENsLineBreakClass },  //katakana letter small o
  1.1075 +    { 0x30aa, 0x30c3, MLineBreaker::EIdLineBreakClass },  //katakana letter o
  1.1076 +    { 0x30c3, 0x30c4, MLineBreaker::ENsLineBreakClass },  //katakana letter small tu
  1.1077 +    { 0x30c4, 0x30e3, MLineBreaker::EIdLineBreakClass },  //katakana letter tu
  1.1078 +    { 0x30e3, 0x30e4, MLineBreaker::ENsLineBreakClass },  //katakana letter small ya
  1.1079 +    { 0x30e4, 0x30e5, MLineBreaker::EIdLineBreakClass },  //katakana letter ya
  1.1080 +    { 0x30e5, 0x30e6, MLineBreaker::ENsLineBreakClass },  //katakana letter small yu
  1.1081 +    { 0x30e6, 0x30e7, MLineBreaker::EIdLineBreakClass },  //katakana letter yu
  1.1082 +    { 0x30e7, 0x30e8, MLineBreaker::ENsLineBreakClass },  //katakana letter small yo
  1.1083 +    { 0x30e8, 0x30ee, MLineBreaker::EIdLineBreakClass },  //katakana letter yo
  1.1084 +    { 0x30ee, 0x30ef, MLineBreaker::ENsLineBreakClass },  //katakana letter small wa
  1.1085 +    { 0x30ef, 0x30f5, MLineBreaker::EIdLineBreakClass },  //katakana letter wa
  1.1086 +    { 0x30f5, 0x30f7, MLineBreaker::ENsLineBreakClass },  //katakana letter small ka
  1.1087 +    { 0x30f7, 0x30fb, MLineBreaker::EIdLineBreakClass },  //katakana letter va
  1.1088 +    { 0x30fb, 0x30fc, MLineBreaker::ENsLineBreakClass },  //katakana middle dot
  1.1089 +    { 0x30fc, 0x30fd, MLineBreaker::EIdLineBreakClass },  //katakana-hiragana prolonged sound mark
  1.1090 +    { 0x30fd, 0x30fe, MLineBreaker::ENsLineBreakClass },  //katakana iteration mark
  1.1091 +    { 0x30fe, 0x30ff, MLineBreaker::EIdLineBreakClass },  //katakana voiced iteration mark
  1.1092 +    { 0x30ff, 0x3100, MLineBreaker::EIdLineBreakClass },  //KATAKANA DIGRAPH KOTO
  1.1093 +    { 0x3105, 0x312d, MLineBreaker::EIdLineBreakClass },  //bopomofo letter b
  1.1094 +    { 0x3131, 0x318f, MLineBreaker::EIdLineBreakClass },  //hangul letter kiyeok
  1.1095 +    { 0x3190, 0x31b8, MLineBreaker::EIdLineBreakClass },  //ideographic annotation linking mark
  1.1096 +    { 0x31c0, 0x31d0, MLineBreaker::EIdLineBreakClass },  //CJK STROKE T
  1.1097 +    { 0x31f0, 0x3200, MLineBreaker::ENsLineBreakClass },  //KATAKANA LETTER SMALL KU
  1.1098 +    { 0x3200, 0x321f, MLineBreaker::EIdLineBreakClass },  //parenthesized hangul kiyeok
  1.1099 +    { 0x3220, 0x3244, MLineBreaker::EIdLineBreakClass },  //parenthesized ideograph one
  1.1100 +    { 0x3250, 0x32ff, MLineBreaker::EIdLineBreakClass },  //PARTNERSHIP SIGN
  1.1101 +    { 0x3300, 0x4db6, MLineBreaker::EIdLineBreakClass },  //square apaato
  1.1102 +    { 0x4dc0, 0x4e00, MLineBreaker::EAlLineBreakClass },  //HEXAGRAM FOR THE CREATIVE HEAVEN
  1.1103 +    { 0x4e00, 0x9fbb, MLineBreaker::EIdLineBreakClass },  //<cjk ideograph,
  1.1104 +    { 0xa000, 0xa48d, MLineBreaker::EIdLineBreakClass },  //yi syllable it
  1.1105 +    { 0xa490, 0xa4c6, MLineBreaker::EIdLineBreakClass },  //yi radical qot
  1.1106 +    { 0xa4c6, 0xa4c7, MLineBreaker::EIdLineBreakClass },  //yi radical ke
  1.1107 +    { 0xa700, 0xa71b, MLineBreaker::EAlLineBreakClass },  //MODIFIER LETTER CHINESE TONE YIN PING
  1.1108 +    { 0xa720, 0xa722, MLineBreaker::EAlLineBreakClass },  //MODIFIER LETTER STRESS AND HIGH TONE
  1.1109 +    { 0xa800, 0xa802, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER A
  1.1110 +    { 0xa802, 0xa803, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI SIGN DVISVARA
  1.1111 +    { 0xa803, 0xa806, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER U
  1.1112 +    { 0xa806, 0xa807, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI SIGN HASANTA
  1.1113 +    { 0xa807, 0xa80b, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER KO
  1.1114 +    { 0xa80b, 0xa80c, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI SIGN ANUSVARA
  1.1115 +    { 0xa80c, 0xa823, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER CO
  1.1116 +    { 0xa823, 0xa828, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI VOWEL SIGN A
  1.1117 +    { 0xa828, 0xa82c, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI POETRY MARK-1
  1.1118 +    { 0xa840, 0xa874, MLineBreaker::EAlLineBreakClass },  //PHAGS-PA LETTER KA
  1.1119 +    { 0xa874, 0xa876, MLineBreaker::EBbLineBreakClass },  //PHAGS-PA SINGLE HEAD MARK
  1.1120 +    { 0xa876, 0xa878, MLineBreaker::EExLineBreakClass },  //PHAGS-PA MARK SHAD
  1.1121 +    { 0xac00, 0xd7a4, MLineBreaker::EIdLineBreakClass },  //<hangul syllable,
  1.1122 +    { 0xd800, 0xe000, MLineBreaker::ESgLineBreakClass },  //<non private use high surrogate,
  1.1123 +    { 0xe000, 0xf900, MLineBreaker::EAiLineBreakClass },  //<private use,
  1.1124 +    { 0xf900, 0xfa2e, MLineBreaker::EIdLineBreakClass },  //cjk compatibility ideograph-f900
  1.1125 +    { 0xfa30, 0xfa6b, MLineBreaker::EIdLineBreakClass },  //CJK COMPATIBILITY IDEOGRAPH-FA30
  1.1126 +    { 0xfa70, 0xfada, MLineBreaker::EIdLineBreakClass },  //CJK COMPATIBILITY IDEOGRAPH-FA70
  1.1127 +    { 0xfb00, 0xfb07, MLineBreaker::EAlLineBreakClass },  //latin small ligature ff
  1.1128 +    { 0xfb13, 0xfb18, MLineBreaker::EAlLineBreakClass },  //armenian small ligature men now
  1.1129 +    { 0xfb1d, 0xfb1e, MLineBreaker::EAlLineBreakClass },  //hebrew letter yod with hiriq
  1.1130 +    { 0xfb1e, 0xfb1f, MLineBreaker::ECmLineBreakClass },  //hebrew point judeo-spanish varika
  1.1131 +    { 0xfb1f, 0xfb37, MLineBreaker::EAlLineBreakClass },  //hebrew ligature yiddish yod yod patah
  1.1132 +    { 0xfb38, 0xfb3d, MLineBreaker::EAlLineBreakClass },  //hebrew letter tet with dagesh
  1.1133 +    { 0xfb3e, 0xfb3f, MLineBreaker::EAlLineBreakClass },  //hebrew letter mem with dagesh
  1.1134 +    { 0xfb40, 0xfb42, MLineBreaker::EAlLineBreakClass },  //hebrew letter nun with dagesh
  1.1135 +    { 0xfb43, 0xfb45, MLineBreaker::EAlLineBreakClass },  //hebrew letter final pe with dagesh
  1.1136 +    { 0xfb46, 0xfbb2, MLineBreaker::EAlLineBreakClass },  //hebrew letter tsadi with dagesh
  1.1137 +    { 0xfbd3, 0xfd3e, MLineBreaker::EAlLineBreakClass },  //arabic letter ng isolated form
  1.1138 +    { 0xfd3e, 0xfd3f, MLineBreaker::EOpLineBreakClass },  //ornate left parenthesis
  1.1139 +    { 0xfd3f, 0xfd40, MLineBreaker::EClLineBreakClass },  //ornate right parenthesis
  1.1140 +    { 0xfd50, 0xfd90, MLineBreaker::EAlLineBreakClass },  //arabic ligature teh with jeem with meem initial form
  1.1141 +    { 0xfd92, 0xfdc8, MLineBreaker::EAlLineBreakClass },  //arabic ligature meem with jeem with khah initial form
  1.1142 +    { 0xfdf0, 0xfdfc, MLineBreaker::EAlLineBreakClass },  //arabic ligature salla used as koranic stop sign isolated form
  1.1143 +    { 0xfdfc, 0xfdfd, MLineBreaker::EPoLineBreakClass },  //RIAL SIGN
  1.1144 +    { 0xfdfd, 0xfdfe, MLineBreaker::EAlLineBreakClass },  //ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
  1.1145 +    { 0xfe00, 0xfe10, MLineBreaker::ECmLineBreakClass },  //VARIATION SELECTOR-1
  1.1146 +    { 0xfe10, 0xfe11, MLineBreaker::EIsLineBreakClass },  //PRESENTATION FORM FOR VERTICAL COMMA
  1.1147 +    { 0xfe11, 0xfe13, MLineBreaker::EClLineBreakClass },  //PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
  1.1148 +    { 0xfe13, 0xfe15, MLineBreaker::EIsLineBreakClass },  //PRESENTATION FORM FOR VERTICAL COLON
  1.1149 +    { 0xfe15, 0xfe17, MLineBreaker::EExLineBreakClass },  //PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
  1.1150 +    { 0xfe17, 0xfe18, MLineBreaker::EOpLineBreakClass },  //PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
  1.1151 +    { 0xfe18, 0xfe19, MLineBreaker::EClLineBreakClass },  //PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
  1.1152 +    { 0xfe19, 0xfe1a, MLineBreaker::EInLineBreakClass },  //PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
  1.1153 +    { 0xfe20, 0xfe24, MLineBreaker::ECmLineBreakClass },  //combining ligature left half
  1.1154 +    { 0xfe30, 0xfe35, MLineBreaker::EIdLineBreakClass },  //presentation form for vertical two dot leader
  1.1155 +    { 0xfe35, 0xfe36, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left parenthesis
  1.1156 +    { 0xfe36, 0xfe37, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right parenthesis
  1.1157 +    { 0xfe37, 0xfe38, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left curly bracket
  1.1158 +    { 0xfe38, 0xfe39, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right curly bracket
  1.1159 +    { 0xfe39, 0xfe3a, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left tortoise shell bracket
  1.1160 +    { 0xfe3a, 0xfe3b, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right tortoise shell bracket
  1.1161 +    { 0xfe3b, 0xfe3c, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left black lenticular bracket
  1.1162 +    { 0xfe3c, 0xfe3d, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right black lenticular bracket
  1.1163 +    { 0xfe3d, 0xfe3e, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left double angle bracket
  1.1164 +    { 0xfe3e, 0xfe3f, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right double angle bracket
  1.1165 +    { 0xfe3f, 0xfe40, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left angle bracket
  1.1166 +    { 0xfe40, 0xfe41, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right angle bracket
  1.1167 +    { 0xfe41, 0xfe42, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left corner bracket
  1.1168 +    { 0xfe42, 0xfe43, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right corner bracket
  1.1169 +    { 0xfe43, 0xfe44, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left white corner bracket
  1.1170 +    { 0xfe44, 0xfe45, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right white corner bracket
  1.1171 +    { 0xfe45, 0xfe47, MLineBreaker::EIdLineBreakClass },  //SESAME DOT
  1.1172 +    { 0xfe47, 0xfe48, MLineBreaker::EOpLineBreakClass },  //PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
  1.1173 +    { 0xfe48, 0xfe49, MLineBreaker::EClLineBreakClass },  //PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
  1.1174 +    { 0xfe49, 0xfe50, MLineBreaker::EIdLineBreakClass },  //dashed overline
  1.1175 +    { 0xfe50, 0xfe51, MLineBreaker::EClLineBreakClass },  //small comma
  1.1176 +    { 0xfe51, 0xfe52, MLineBreaker::EIdLineBreakClass },  //small ideographic comma
  1.1177 +    { 0xfe52, 0xfe53, MLineBreaker::EClLineBreakClass },  //small full stop
  1.1178 +    { 0xfe54, 0xfe56, MLineBreaker::ENsLineBreakClass },  //small semicolon
  1.1179 +    { 0xfe56, 0xfe58, MLineBreaker::EExLineBreakClass },  //small question mark
  1.1180 +    { 0xfe58, 0xfe59, MLineBreaker::EIdLineBreakClass },  //small em dash
  1.1181 +    { 0xfe59, 0xfe5a, MLineBreaker::EOpLineBreakClass },  //small left parenthesis
  1.1182 +    { 0xfe5a, 0xfe5b, MLineBreaker::EClLineBreakClass },  //small right parenthesis
  1.1183 +    { 0xfe5b, 0xfe5c, MLineBreaker::EOpLineBreakClass },  //small left curly bracket
  1.1184 +    { 0xfe5c, 0xfe5d, MLineBreaker::EClLineBreakClass },  //small right curly bracket
  1.1185 +    { 0xfe5d, 0xfe5e, MLineBreaker::EOpLineBreakClass },  //small left tortoise shell bracket
  1.1186 +    { 0xfe5e, 0xfe5f, MLineBreaker::EClLineBreakClass },  //small right tortoise shell bracket
  1.1187 +    { 0xfe5f, 0xfe67, MLineBreaker::EIdLineBreakClass },  //small number sign
  1.1188 +    { 0xfe68, 0xfe69, MLineBreaker::EIdLineBreakClass },  //small reverse solidus
  1.1189 +    { 0xfe69, 0xfe6a, MLineBreaker::EPrLineBreakClass },  //small dollar sign
  1.1190 +    { 0xfe6a, 0xfe6b, MLineBreaker::EPoLineBreakClass },  //small percent sign
  1.1191 +    { 0xfe6b, 0xfe6c, MLineBreaker::EAlLineBreakClass },  //small commercial at
  1.1192 +    { 0xfe70, 0xfe74, MLineBreaker::EAlLineBreakClass },  //arabic fathatan isolated form
  1.1193 +    { 0xfe74, 0xfe75, MLineBreaker::EAlLineBreakClass },  //arabic kasratan isolated form
  1.1194 +    { 0xfe76, 0xfefd, MLineBreaker::EAlLineBreakClass },  //arabic fatha isolated form
  1.1195 +    { 0xfeff, 0xff00, MLineBreaker::EGlLineBreakClass },  //zero width no-break space
  1.1196 +    { 0xff01, 0xff02, MLineBreaker::EExLineBreakClass },  //fullwidth exclamation mark
  1.1197 +    { 0xff02, 0xff04, MLineBreaker::EIdLineBreakClass },  //fullwidth quotation mark
  1.1198 +    { 0xff04, 0xff05, MLineBreaker::EPrLineBreakClass },  //fullwidth dollar sign
  1.1199 +    { 0xff05, 0xff06, MLineBreaker::EPoLineBreakClass },  //fullwidth percent sign
  1.1200 +    { 0xff06, 0xff08, MLineBreaker::EIdLineBreakClass },  //fullwidth ampersand
  1.1201 +    { 0xff08, 0xff09, MLineBreaker::EOpLineBreakClass },  //fullwidth left parenthesis
  1.1202 +    { 0xff09, 0xff0a, MLineBreaker::EClLineBreakClass },  //fullwidth right parenthesis
  1.1203 +    { 0xff0a, 0xff0c, MLineBreaker::EIdLineBreakClass },  //fullwidth asterisk
  1.1204 +    { 0xff0c, 0xff0d, MLineBreaker::EClLineBreakClass },  //fullwidth comma
  1.1205 +    { 0xff0d, 0xff0e, MLineBreaker::EIdLineBreakClass },  //fullwidth hyphen-minus
  1.1206 +    { 0xff0e, 0xff0f, MLineBreaker::EClLineBreakClass },  //fullwidth full stop
  1.1207 +    { 0xff0f, 0xff1a, MLineBreaker::EIdLineBreakClass },  //fullwidth solidus
  1.1208 +    { 0xff1a, 0xff1c, MLineBreaker::ENsLineBreakClass },  //fullwidth colon
  1.1209 +    { 0xff1c, 0xff1f, MLineBreaker::EIdLineBreakClass },  //fullwidth less-than sign
  1.1210 +    { 0xff1f, 0xff20, MLineBreaker::EExLineBreakClass },  //fullwidth question mark
  1.1211 +    { 0xff20, 0xff3b, MLineBreaker::EIdLineBreakClass },  //fullwidth commercial at
  1.1212 +    { 0xff3b, 0xff3c, MLineBreaker::EOpLineBreakClass },  //fullwidth left square bracket
  1.1213 +    { 0xff3c, 0xff3d, MLineBreaker::EIdLineBreakClass },  //fullwidth reverse solidus
  1.1214 +    { 0xff3d, 0xff3e, MLineBreaker::EClLineBreakClass },  //fullwidth right square bracket
  1.1215 +    { 0xff3e, 0xff5b, MLineBreaker::EIdLineBreakClass },  //fullwidth circumflex accent
  1.1216 +    { 0xff5b, 0xff5c, MLineBreaker::EOpLineBreakClass },  //fullwidth left curly bracket
  1.1217 +    { 0xff5c, 0xff5d, MLineBreaker::EIdLineBreakClass },  //fullwidth vertical line
  1.1218 +    { 0xff5d, 0xff5e, MLineBreaker::EClLineBreakClass },  //fullwidth right curly bracket
  1.1219 +    { 0xff5e, 0xff5f, MLineBreaker::EIdLineBreakClass },  //fullwidth tilde
  1.1220 +    { 0xff5f, 0xff60, MLineBreaker::EOpLineBreakClass },  //FULLWIDTH LEFT WHITE PARENTHESIS
  1.1221 +    { 0xff60, 0xff61, MLineBreaker::EClLineBreakClass },  //FULLWIDTH RIGHT WHITE PARENTHESIS
  1.1222 +    { 0xff61, 0xff62, MLineBreaker::EClLineBreakClass },  //halfwidth ideographic full stop
  1.1223 +    { 0xff62, 0xff63, MLineBreaker::EOpLineBreakClass },  //halfwidth left corner bracket
  1.1224 +    { 0xff63, 0xff65, MLineBreaker::EClLineBreakClass },  //halfwidth right corner bracket
  1.1225 +    { 0xff65, 0xff66, MLineBreaker::ENsLineBreakClass },  //halfwidth katakana middle dot
  1.1226 +    { 0xff66, 0xff67, MLineBreaker::EAlLineBreakClass },  //halfwidth katakana letter wo
  1.1227 +    { 0xff67, 0xff71, MLineBreaker::ENsLineBreakClass },  //halfwidth katakana letter small a
  1.1228 +    { 0xff71, 0xff9e, MLineBreaker::EAlLineBreakClass },  //halfwidth katakana letter a
  1.1229 +    { 0xff9e, 0xffa0, MLineBreaker::ENsLineBreakClass },  //halfwidth katakana voiced sound mark
  1.1230 +    { 0xffa0, 0xffbf, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul filler
  1.1231 +    { 0xffc2, 0xffc8, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter a
  1.1232 +    { 0xffca, 0xffd0, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter yeo
  1.1233 +    { 0xffd2, 0xffd8, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter yo
  1.1234 +    { 0xffda, 0xffdd, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter eu
  1.1235 +    { 0xffe0, 0xffe1, MLineBreaker::EPoLineBreakClass },  //fullwidth cent sign
  1.1236 +    { 0xffe1, 0xffe2, MLineBreaker::EPrLineBreakClass },  //fullwidth pound sign
  1.1237 +    { 0xffe2, 0xffe5, MLineBreaker::EIdLineBreakClass },  //fullwidth not sign
  1.1238 +    { 0xffe5, 0xffe7, MLineBreaker::EPrLineBreakClass },  //fullwidth yen sign
  1.1239 +    { 0xffe8, 0xffef, MLineBreaker::EAlLineBreakClass },  //halfwidth forms light vertical
  1.1240 +    { 0xfff9, 0xfffc, MLineBreaker::ECmLineBreakClass },  //interlinear annotation anchor
  1.1241 +    { 0xfffc, 0xfffd, MLineBreaker::ECbLineBreakClass },  //object replacement character
  1.1242 +    { 0xfffd, 0xfffe, MLineBreaker::EAiLineBreakClass },  //replacement character
  1.1243 +    { 0x10000, 0x1000c, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B008 A
  1.1244 +    { 0x1000d, 0x10027, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B036 JO
  1.1245 +    { 0x10028, 0x1003b, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B060 RA
  1.1246 +    { 0x1003c, 0x1003e, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B017 ZA
  1.1247 +    { 0x1003f, 0x1004e, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B020 ZO
  1.1248 +    { 0x10050, 0x1005e, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYMBOL B018
  1.1249 +    { 0x10080, 0x100fb, MLineBreaker::EAlLineBreakClass },  //LINEAR B IDEOGRAM B100 MAN
  1.1250 +    { 0x10100, 0x10103, MLineBreaker::EBaLineBreakClass },  //AEGEAN WORD SEPARATOR LINE
  1.1251 +    { 0x10107, 0x10134, MLineBreaker::EAlLineBreakClass },  //AEGEAN NUMBER ONE
  1.1252 +    { 0x10137, 0x1018b, MLineBreaker::EAlLineBreakClass },  //AEGEAN WEIGHT BASE UNIT
  1.1253 +    { 0x10300, 0x1031f, MLineBreaker::EAlLineBreakClass },  //OLD ITALIC LETTER A
  1.1254 +    { 0x10320, 0x10324, MLineBreaker::EAlLineBreakClass },  //OLD ITALIC NUMERAL ONE
  1.1255 +    { 0x10330, 0x1034b, MLineBreaker::EAlLineBreakClass },  //GOTHIC LETTER AHSA
  1.1256 +    { 0x10380, 0x1039e, MLineBreaker::EAlLineBreakClass },  //UGARITIC LETTER ALPA
  1.1257 +    { 0x1039f, 0x103a0, MLineBreaker::EBaLineBreakClass },  //UGARITIC WORD DIVIDER
  1.1258 +    { 0x103a0, 0x103c4, MLineBreaker::EAlLineBreakClass },  //OLD PERSIAN SIGN A
  1.1259 +    { 0x103c8, 0x103d0, MLineBreaker::EAlLineBreakClass },  //OLD PERSIAN SIGN AURAMAZDAA
  1.1260 +    { 0x103d0, 0x103d1, MLineBreaker::EBaLineBreakClass },  //OLD PERSIAN WORD DIVIDER
  1.1261 +    { 0x103d1, 0x103d6, MLineBreaker::EAlLineBreakClass },  //OLD PERSIAN NUMBER ONE
  1.1262 +    { 0x10400, 0x1049e, MLineBreaker::EAlLineBreakClass },  //DESERET CAPITAL LETTER LONG I
  1.1263 +    { 0x104a0, 0x104aa, MLineBreaker::ENuLineBreakClass },  //OSMANYA DIGIT ZERO
  1.1264 +    { 0x10800, 0x10806, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE A
  1.1265 +    { 0x10808, 0x10809, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE JO
  1.1266 +    { 0x1080a, 0x10836, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE KA
  1.1267 +    { 0x10837, 0x10839, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE XA
  1.1268 +    { 0x1083c, 0x1083d, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE ZA
  1.1269 +    { 0x1083f, 0x10840, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE ZO
  1.1270 +    { 0x10900, 0x1091a, MLineBreaker::EAlLineBreakClass },  //PHOENICIAN LETTER ALF
  1.1271 +    { 0x1091f, 0x10920, MLineBreaker::EBaLineBreakClass },  //PHOENICIAN WORD SEPARATOR
  1.1272 +    { 0x10a00, 0x10a01, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER A
  1.1273 +    { 0x10a01, 0x10a04, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VOWEL SIGN I
  1.1274 +    { 0x10a05, 0x10a07, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VOWEL SIGN E
  1.1275 +    { 0x10a0c, 0x10a10, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VOWEL LENGTH MARK
  1.1276 +    { 0x10a10, 0x10a14, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER KA
  1.1277 +    { 0x10a15, 0x10a18, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER CA
  1.1278 +    { 0x10a19, 0x10a34, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER NYA
  1.1279 +    { 0x10a38, 0x10a3b, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI SIGN BAR ABOVE
  1.1280 +    { 0x10a3f, 0x10a40, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VIRAMA
  1.1281 +    { 0x10a40, 0x10a48, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI DIGIT ONE
  1.1282 +    { 0x10a50, 0x10a58, MLineBreaker::EBaLineBreakClass },  //KHAROSHTHI PUNCTUATION DOT
  1.1283 +    { 0x10a58, 0x10a59, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI PUNCTUATION LINES
  1.1284 +    { 0x12000, 0x1236f, MLineBreaker::EAlLineBreakClass },  //CUNEIFORM SIGN A
  1.1285 +    { 0x12400, 0x12463, MLineBreaker::EAlLineBreakClass },  //CUNEIFORM NUMERIC SIGN TWO ASH
  1.1286 +    { 0x12470, 0x12474, MLineBreaker::EBaLineBreakClass },  //CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
  1.1287 +    { 0x1d000, 0x1d0f6, MLineBreaker::EAlLineBreakClass },  //BYZANTINE MUSICAL SYMBOL PSILI
  1.1288 +    { 0x1d100, 0x1d127, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL SINGLE BARLINE
  1.1289 +    { 0x1d12a, 0x1d165, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL DOUBLE SHARP
  1.1290 +    { 0x1d165, 0x1d16a, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING STEM
  1.1291 +    { 0x1d16a, 0x1d16d, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL FINGERED TREMOLO-1
  1.1292 +    { 0x1d16d, 0x1d183, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING AUGMENTATION DOT
  1.1293 +    { 0x1d183, 0x1d185, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL ARPEGGIATO UP
  1.1294 +    { 0x1d185, 0x1d18c, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING DOIT
  1.1295 +    { 0x1d18c, 0x1d1aa, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL RINFORZANDO
  1.1296 +    { 0x1d1aa, 0x1d1ae, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING DOWN BOW
  1.1297 +    { 0x1d1ae, 0x1d1de, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL PEDAL MARK
  1.1298 +    { 0x1d200, 0x1d242, MLineBreaker::EAlLineBreakClass },  //GREEK VOCAL NOTATION SYMBOL-1
  1.1299 +    { 0x1d242, 0x1d245, MLineBreaker::ECmLineBreakClass },  //COMBINING GREEK MUSICAL TRISEME
  1.1300 +    { 0x1d245, 0x1d246, MLineBreaker::EAlLineBreakClass },  //GREEK MUSICAL LEIMMA
  1.1301 +    { 0x1d300, 0x1d357, MLineBreaker::EAlLineBreakClass },  //MONOGRAM FOR EARTH
  1.1302 +    { 0x1d360, 0x1d372, MLineBreaker::EAlLineBreakClass },  //COUNTING ROD UNIT DIGIT ONE
  1.1303 +    { 0x1d400, 0x1d455, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL BOLD CAPITAL A
  1.1304 +    { 0x1d456, 0x1d49d, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL ITALIC SMALL I
  1.1305 +    { 0x1d49e, 0x1d4a0, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL C
  1.1306 +    { 0x1d4a2, 0x1d4a3, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL G
  1.1307 +    { 0x1d4a5, 0x1d4a7, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL J
  1.1308 +    { 0x1d4a9, 0x1d4ad, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL N
  1.1309 +    { 0x1d4ae, 0x1d4ba, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL S
  1.1310 +    { 0x1d4bb, 0x1d4bc, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT SMALL F
  1.1311 +    { 0x1d4bd, 0x1d4c4, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT SMALL H
  1.1312 +    { 0x1d4c5, 0x1d506, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT SMALL P
  1.1313 +    { 0x1d507, 0x1d50b, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR CAPITAL D
  1.1314 +    { 0x1d50d, 0x1d515, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR CAPITAL J
  1.1315 +    { 0x1d516, 0x1d51d, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR CAPITAL S
  1.1316 +    { 0x1d51e, 0x1d53a, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR SMALL A
  1.1317 +    { 0x1d53b, 0x1d53f, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL D
  1.1318 +    { 0x1d540, 0x1d545, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL I
  1.1319 +    { 0x1d546, 0x1d547, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL O
  1.1320 +    { 0x1d54a, 0x1d551, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL S
  1.1321 +    { 0x1d552, 0x1d6a6, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK SMALL A
  1.1322 +    { 0x1d6a8, 0x1d7cc, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL BOLD CAPITAL ALPHA
  1.1323 +    { 0x1d7ce, 0x1d800, MLineBreaker::ENuLineBreakClass },  //MATHEMATICAL BOLD DIGIT ZERO
  1.1324 +    { 0x20000, 0x2a6d6, MLineBreaker::EIdLineBreakClass },  //<CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
  1.1325 +    { 0x2f800, 0x2fa1e, MLineBreaker::EIdLineBreakClass },  //CJK COMPATIBILITY IDEOGRAPH-2F800
  1.1326 +    { 0xe0001, 0xe0002, MLineBreaker::ECmLineBreakClass },  //LANGUAGE TAG
  1.1327 +    { 0xe0020, 0xe0080, MLineBreaker::ECmLineBreakClass },  //TAG SPACE
  1.1328 +    { 0xe0100, 0xe01f0, MLineBreaker::ECmLineBreakClass },  //VARIATION SELECTOR-17
  1.1329 +    { 0xf0000, 0xffffd, MLineBreaker::EXxLineBreakClass },  //<Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
  1.1330 +    { 0x100000, 0x10fffd, MLineBreaker::EXxLineBreakClass },  //<Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
  1.1331 +	};
  1.1332 +
  1.1333 +static const TInt TheLineBreakRanges = sizeof(TheLineBreakRangeTable) / sizeof(TheLineBreakRangeTable[0]);
  1.1334 +
  1.1335 +void TestLineBreakTables(void)
  1.1336 +	{
  1.1337 +#ifdef _DEBUG
  1.1338 +	TUint prev_end = 0;
  1.1339 +	for (int i = 0; i < TheLineBreakRanges; i++)
  1.1340 +		{
  1.1341 +		const TLineBreakRange& r = TheLineBreakRangeTable[i];
  1.1342 +		if (r.iStart >= r.iEnd || r.iClass >= MLineBreaker::ELineBreakClasses || r.iStart < prev_end)
  1.1343 +			Panic(ELineBreakPanic_BadTable);
  1.1344 +		prev_end = r.iEnd;
  1.1345 +		}
  1.1346 +#endif
  1.1347 +	}
  1.1348 +
  1.1349 +TUint TLineBreakClassCache::LineBreakClass(TUint aChar)
  1.1350 +	{
  1.1351 +	if (aChar >= iStart && aChar < iEnd)
  1.1352 +		return iClass;
  1.1353 +	TUint new_start, new_end;
  1.1354 +	TUint new_class = iBreaker.LineBreakClass(aChar,new_start,new_end);
  1.1355 +	if (new_start < new_end - 1)
  1.1356 +		{
  1.1357 +		iStart = new_start;
  1.1358 +		iEnd = new_end;
  1.1359 +		iClass = new_class;
  1.1360 +		}
  1.1361 +	return new_class;
  1.1362 +	}
  1.1363 +
  1.1364 +EXPORT_C TBool MLineBreaker::LineBreakPossible(
  1.1365 +	TUint aPrevClass, TUint aNextClass, TBool aHaveSpaces) const
  1.1366 +/** Returns whether line breaks are legal between a character of line breaking 
  1.1367 +class aPrevClass and aNextClass, with intervening spaces or not as determined 
  1.1368 +by aHaveSpaces. 
  1.1369 +
  1.1370 +@param aPrevClass The class before the potential line break.
  1.1371 +@param aNextClass The class after the potential line break.
  1.1372 +@param aHaveSpaces Whether spaces separate the characters.
  1.1373 +@return ETrue if and only if a line break is legal in the situation described. */
  1.1374 +	{
  1.1375 +	if (aPrevClass >= ELineBreakClasses || aNextClass >= ELineBreakClasses)
  1.1376 +		return FALSE;
  1.1377 +	const TLineBreakRule& rule = TheLineBreakRuleTable[aPrevClass];
  1.1378 +	TUint flag = 1 << aNextClass;
  1.1379 +	if (rule.iForbid & flag)
  1.1380 +		return FALSE;
  1.1381 +	return aHaveSpaces || (rule.iAllow & flag);
  1.1382 +	}
  1.1383 +
  1.1384 +EXPORT_C TUint MLineBreaker::LineBreakClass(TUint aCode,TUint& aRangeStart,TUint& aRangeEnd) const
  1.1385 +/** Converts Unicode character into line breaking class. 
  1.1386 +
  1.1387 +@param aCode Input Unicode value.
  1.1388 +@param aRangeStart Returns the start of the contiguous range of characters 
  1.1389 +including aCode that have the returned line breaking class.
  1.1390 +@param aRangeEnd Returns the end of the contiguous range of characters including 
  1.1391 +aCode that have the returned line breaking class.
  1.1392 +@return The line breaking class for aCode. */
  1.1393 +	{
  1.1394 +	aRangeStart = aCode;
  1.1395 +	aRangeEnd = aCode + 1;
  1.1396 +
  1.1397 +	// First check for a space; this needs to be fast.
  1.1398 +	if (aCode == 0x0020)
  1.1399 +		return ESpLineBreakClass;
  1.1400 +
  1.1401 +	// Now search the table.
  1.1402 +	const TLineBreakRange* base = TheLineBreakRangeTable;
  1.1403 +	const TLineBreakRange* end = base + TheLineBreakRanges;
  1.1404 +	while (base < end)
  1.1405 +		{
  1.1406 +		int n = end - base;
  1.1407 +		const TLineBreakRange* r = &base[n / 2];
  1.1408 +		if (r->iStart > aCode)
  1.1409 +			end = r;
  1.1410 +		else if (r->iEnd <= aCode)
  1.1411 +			base = r + 1;
  1.1412 +		else
  1.1413 +			{
  1.1414 +			aRangeStart = r->iStart;
  1.1415 +			aRangeEnd = r->iEnd;
  1.1416 +			return r->iClass;
  1.1417 +			}
  1.1418 +		}
  1.1419 +
  1.1420 +	// If the character was not in the table determine the line break class using the Unicode character category.
  1.1421 +	TChar::TCategory cat = TChar(aCode).GetCategory();
  1.1422 +	switch (cat)
  1.1423 +		{
  1.1424 +		case TChar::ELuCategory:
  1.1425 +		case TChar::ELlCategory:
  1.1426 +		case TChar::ELtCategory:
  1.1427 +		case TChar::ELoCategory:
  1.1428 +		case TChar::ESmCategory:
  1.1429 +		case TChar::ESoCategory:
  1.1430 +			return EAlLineBreakClass;
  1.1431 +
  1.1432 +		case TChar::ESkCategory:
  1.1433 +			if (TChar(aCode).GetCjkWidth() == TChar::EWide)
  1.1434 +				return ENsLineBreakClass;
  1.1435 +			else
  1.1436 +				return EAlLineBreakClass;
  1.1437 +
  1.1438 +		case TChar::ELmCategory:
  1.1439 +			{
  1.1440 +			TChar::TCjkWidth cjk_width = TChar(aCode).GetCjkWidth();
  1.1441 +			if (cjk_width == TChar::EWide || cjk_width == TChar::EHalfWidth)
  1.1442 +				return ENsLineBreakClass;
  1.1443 +			}
  1.1444 +			break;
  1.1445 +
  1.1446 +		case TChar::EMnCategory:
  1.1447 +		case TChar::EMcCategory:
  1.1448 +		case TChar::EMeCategory:
  1.1449 +		case TChar::ECcCategory:
  1.1450 +		case TChar::ECfCategory:
  1.1451 +			return ECmLineBreakClass;
  1.1452 +
  1.1453 +		case TChar::ENdCategory:
  1.1454 +			return ENuLineBreakClass;
  1.1455 +
  1.1456 +		case TChar::EPsCategory:
  1.1457 +			return EOpLineBreakClass;
  1.1458 +
  1.1459 +		case TChar::EPeCategory:
  1.1460 +			return EClLineBreakClass;
  1.1461 +
  1.1462 +		case TChar::EScCategory:
  1.1463 +			return EPrLineBreakClass;
  1.1464 +
  1.1465 +		case TChar::EPfCategory:
  1.1466 +		case TChar::EPiCategory:
  1.1467 +			return EQuLineBreakClass;
  1.1468 +
  1.1469 +		case TChar::ECsCategory:
  1.1470 +			return ESgLineBreakClass;
  1.1471 +
  1.1472 +		default:
  1.1473 +			break;
  1.1474 +		}
  1.1475 +
  1.1476 +	// If it has still not been found it may be an ideographic character not covered above.
  1.1477 +	if (aCode >= 0x3000 && aCode <= 0x3FFF)
  1.1478 +		return EIdLineBreakClass;
  1.1479 +
  1.1480 +	// Or it may be a surrogate; assume plane 1 is alphabetic, plane 2 is ideographic.
  1.1481 +	if (aCode >= 0x10000 && aCode <= 0x1FFFF)
  1.1482 +		return EAlLineBreakClass;
  1.1483 +	if (aCode >= 0x20000 && aCode <= 0x2FFFF)
  1.1484 +		return EIdLineBreakClass;
  1.1485 +
  1.1486 +	// Return the catch-all class.
  1.1487 +	return EXxLineBreakClass;
  1.1488 +	}
  1.1489 +
  1.1490 +
  1.1491 +EXPORT_C TBool MLineBreaker::IsHangingCharacter(TUint) const
  1.1492 +/** Returns ETrue if the character value may be positioned outside the margins. 
  1.1493 +	
  1.1494 +@param aChar Chatacter to test
  1.1495 +@return ETrue if the character value may be positioned outside the margins. */
  1.1496 +    {
  1.1497 +	return EFalse;
  1.1498 +	}
  1.1499 +
  1.1500 +TInt MakeSurrogate(TInt aHigh, TInt aLow)
  1.1501 +	{
  1.1502 +	return (aHigh << 10) + (aLow & 0x3FF)
  1.1503 +		+ (0x10000 - 0xD800*0x400);
  1.1504 +	}
  1.1505 +
  1.1506 +inline TBool IsSurrogate(TInt aChar)
  1.1507 +	{
  1.1508 +	return (aChar & 0xF800) == 0xD800;
  1.1509 +	}
  1.1510 +
  1.1511 +inline TBool IsHighSurrogate(TInt aChar)
  1.1512 +	{
  1.1513 +	return (aChar & 0xFC00) == 0xD800;
  1.1514 +	}
  1.1515 +
  1.1516 +inline TBool IsLowSurrogate(TInt aChar)
  1.1517 +	{
  1.1518 +	return (aChar & 0xFC00) == 0xDC00;
  1.1519 +	}
  1.1520 +
  1.1521 +/**
  1.1522 +Move past the current character and return the next.
  1.1523 +@param aPtr
  1.1524 +	Pointer to the current character. On return, contains a pointer to the next
  1.1525 +	character.
  1.1526 +@param aLimit
  1.1527 +	Limit of the iteration. For positive aOffset (moving forwards) this should
  1.1528 +	be one less than the end of the text. For negative aOffset (moving
  1.1529 +	backwards) this should be the start of the text.
  1.1530 +@param aOffset
  1.1531 +	1 for moving forward, -1 for moving backward.
  1.1532 +@return
  1.1533 +	Unicode character value or -1 on error.
  1.1534 +@internalComponent
  1.1535 +*/
  1.1536 +TInt MoveTextPtr(const TText*& aPtr, const TText* aLimit, TInt aOffset)
  1.1537 +	{
  1.1538 +	// if (aPtr - aLimit) has the same sign as aOffset then we are
  1.1539 +	// already too far.
  1.1540 +	if (0 <= ((aPtr - aLimit) ^ aOffset)
  1.1541 +		&& aLimit)
  1.1542 +		return -1;
  1.1543 +	TInt c = 0;
  1.1544 +	for (;;)
  1.1545 +		{
  1.1546 +		if (aPtr == aLimit)
  1.1547 +			return -1;
  1.1548 +		aPtr += aOffset;
  1.1549 +		TInt lastc = c;
  1.1550 +		c = *aPtr;
  1.1551 +		if (!IsSurrogate(c))
  1.1552 +			return c;
  1.1553 +		if (aOffset < 0)
  1.1554 +			{
  1.1555 +			if (IsHighSurrogate(c) && IsLowSurrogate(lastc))
  1.1556 +				return MakeSurrogate(c, lastc);
  1.1557 +			}
  1.1558 +		else
  1.1559 +			{
  1.1560 +			if (IsHighSurrogate(lastc) && IsLowSurrogate(c))
  1.1561 +				{
  1.1562 +				// found a surrogate pair
  1.1563 +				// Set the pointer to the first of the pair
  1.1564 +				--aPtr;
  1.1565 +				return MakeSurrogate(lastc, c);
  1.1566 +				}
  1.1567 +			}
  1.1568 +		}
  1.1569 +	}
  1.1570 +
  1.1571 +/** Find the line break class of the latest character within [aFirst, aP+1]
  1.1572 +to have non-CM line break class.
  1.1573 +@pre aP points to a character of CM class.
  1.1574 +*/
  1.1575 +inline TUint GetGlyphClusterLineBreakClass(const TText* aP,
  1.1576 +	const TText* aFirst, TLineBreakClassCache& aBreaker)
  1.1577 +	{
  1.1578 +	TInt ch = MoveTextPtr(aP, aFirst, -1);
  1.1579 +	while (0 <= ch)
  1.1580 +		{
  1.1581 +		TUint cl = aBreaker.LineBreakClass(ch);
  1.1582 +		if (cl != MLineBreaker::ECmLineBreakClass)
  1.1583 +			return cl;
  1.1584 +		ch = MoveTextPtr(aP, aFirst, -1);
  1.1585 +		}
  1.1586 +	return MLineBreaker::ECmLineBreakClass;
  1.1587 +	}
  1.1588 +
  1.1589 +void TLineBreakClassIterator::Set(const TText* aFirst, const TText* aText, TLineBreakClassCache& aBreaker)
  1.1590 +	{
  1.1591 +	iFirst = aFirst;
  1.1592 +	iCurrent = aText;
  1.1593 +	TInt c = *aText;
  1.1594 +	if (IsHighSurrogate(c))
  1.1595 +		{
  1.1596 +		if (IsLowSurrogate(aText[1]))
  1.1597 +			c = MakeSurrogate(c, aText[1]);
  1.1598 +		}
  1.1599 +	iClass = aBreaker.LineBreakClass(c);
  1.1600 +	if (iClass == MLineBreaker::ECmLineBreakClass)
  1.1601 +		{
  1.1602 +		TUint baseLbCls = GetGlyphClusterLineBreakClass(iCurrent, iFirst, aBreaker);
  1.1603 +		if (baseLbCls ==  MLineBreaker::ESaLineBreakClass)
  1.1604 +			iClass = MLineBreaker::ESaLineBreakClass;
  1.1605 +		}
  1.1606 +	}
  1.1607 +
  1.1608 +void TLineBreakClassIterator::SetNull()
  1.1609 +	{
  1.1610 +	iFirst = iCurrent = 0;
  1.1611 +	}
  1.1612 +
  1.1613 +TBool TLineBreakClassIterator::Move(const TText* aLimit,
  1.1614 +	const TText* aLimitAfterSpaces, TInt aOffset,
  1.1615 +	TBool& aHasSpaces, TLineBreakClassCache& aBreaker)
  1.1616 +	{
  1.1617 +	TInt c = MoveTextPtr(iCurrent, aLimit, aOffset);
  1.1618 +	if (c < 0)
  1.1619 +		return EFalse;
  1.1620 +	TUint lbClass = aBreaker.LineBreakClass(c);
  1.1621 +	if (lbClass == MLineBreaker::ESpLineBreakClass)
  1.1622 +		{
  1.1623 +		aHasSpaces = ETrue;
  1.1624 +		while (lbClass == MLineBreaker::ESpLineBreakClass)
  1.1625 +			{
  1.1626 +			c = MoveTextPtr(iCurrent, aLimitAfterSpaces, aOffset);
  1.1627 +			// We have hit the limit, but there might be more text to search
  1.1628 +			// after the spaces.
  1.1629 +			if (c < 0)
  1.1630 +				{
  1.1631 +				iClass = MLineBreaker::ESpLineBreakClass;
  1.1632 +				return ETrue;
  1.1633 +				}
  1.1634 +			lbClass = aBreaker.LineBreakClass(c);
  1.1635 +			}
  1.1636 +		iClass = lbClass;
  1.1637 +		return ETrue;
  1.1638 +		}
  1.1639 +		
  1.1640 +	// Cm class characters taken on their base character's 
  1.1641 +	// line break property in the combining character sequence
  1.1642 +	// See D14 in Conformance chapter of Unicode 3.0 book.
  1.1643 +	// We do this just for Complex content to maintain backwards
  1.1644 +	// compatibility otherwise original test cases fail.
  1.1645 +	if (lbClass == MLineBreaker::ECmLineBreakClass)
  1.1646 +		{
  1.1647 +		TUint baseLbCls = GetGlyphClusterLineBreakClass(iCurrent, iFirst, aBreaker);
  1.1648 +	    if (baseLbCls ==  MLineBreaker::ESaLineBreakClass)
  1.1649 +	        lbClass = MLineBreaker::ESaLineBreakClass;
  1.1650 +		}
  1.1651 +	    
  1.1652 +	aHasSpaces = EFalse;
  1.1653 +	if (lbClass == MLineBreaker::ESaLineBreakClass
  1.1654 +		&& iClass == MLineBreaker::ESaLineBreakClass)
  1.1655 +		{
  1.1656 +		// We have at least two SA characters, so we need to find the
  1.1657 +		// total extent of the SA block. GetLineBreakInContext will be asked
  1.1658 +		// to find the break.
  1.1659 +		const TText* p = iCurrent;
  1.1660 +		while (0 <= c && lbClass == MLineBreaker::ESaLineBreakClass)
  1.1661 +			{
  1.1662 +			iCurrent = p;
  1.1663 +			c = MoveTextPtr(p, aOffset < 0? iFirst : aLimitAfterSpaces, aOffset);
  1.1664 +			lbClass = aBreaker.LineBreakClass(c);
  1.1665 +			
  1.1666 +			// Cm class characters taken on their base character's 
  1.1667 +	        // line break property. See above.
  1.1668 +        	if (lbClass == MLineBreaker::ECmLineBreakClass)
  1.1669 +        		{
  1.1670 +				TUint baseLbCls = GetGlyphClusterLineBreakClass(p, iFirst, aBreaker);
  1.1671 +        	    if (baseLbCls ==  MLineBreaker::ESaLineBreakClass)
  1.1672 +        	        lbClass = MLineBreaker::ESaLineBreakClass;
  1.1673 +        		}
  1.1674 +        	if (lbClass == MLineBreaker::EZwLineBreakClass)
  1.1675 +   				{
  1.1676 +   				iCurrent = p;
  1.1677 +   				}
  1.1678 +			}
  1.1679 +		return ETrue;
  1.1680 +		}
  1.1681 +	iClass = lbClass;
  1.1682 +	return ETrue;
  1.1683 +	}
  1.1684 +
  1.1685 +TLineBreakIterator::TLineBreakIterator(TLineBreakClassCache& aBreaker,
  1.1686 +	const TText* aText, TInt aLength, TBool aForwards,
  1.1687 +	TInt aMinBreakPos, TInt aMaxBreakPos)
  1.1688 +	: iBreaker(aBreaker), iText(aText), iTextLength(aLength), iHasSpaces(EFalse)
  1.1689 +	{
  1.1690 +	if (aMinBreakPos < 1)
  1.1691 +		aMinBreakPos = 1;
  1.1692 +	// Find the next valid character and see if it can hang
  1.1693 +	// over the margin.
  1.1694 +	const TText* endText = aText + aLength;
  1.1695 +	const TText* max = aText + aMaxBreakPos;
  1.1696 +	if (endText <= max && aText < endText)
  1.1697 +		{
  1.1698 +		// let 'max' point to last character
  1.1699 +		max = endText - 1;
  1.1700 +		if (IsLowSurrogate(*max))
  1.1701 +			{
  1.1702 +			ASSERT(aLength > 1);
  1.1703 +			--max;
  1.1704 +			ASSERT(IsHighSurrogate(*max));
  1.1705 +			}
  1.1706 +		}
  1.1707 +	TInt c = 0xFFFF;
  1.1708 +	while (max < endText)
  1.1709 +		{
  1.1710 +		TInt lastc = c;
  1.1711 +		c = *max;
  1.1712 +		if ((c & 0xF800) != 0xD800)
  1.1713 +			break;
  1.1714 +		if ((lastc & 0xFC00) == 0xD800
  1.1715 +			&& (c & 0xFC00) == 0xDC00)
  1.1716 +			{
  1.1717 +			c = MakeSurrogate(lastc, c);
  1.1718 +			break;
  1.1719 +			}
  1.1720 +		++max;
  1.1721 +		}
  1.1722 +	if (c != 0xFFFF && max + 1 < endText
  1.1723 +		&& aBreaker.Breaker().IsHangingCharacter(c))
  1.1724 +		// Set max to just beyond hanging character
  1.1725 +		++max;
  1.1726 +	// till here, 'max' points to the "end" of a character
  1.1727 +
  1.1728 +	// set up the iteration.
  1.1729 +	iMinBreakPos = aText + aMinBreakPos;
  1.1730 +	iMaxBreakPos = aText + aMaxBreakPos;
  1.1731 +	// Increment or Decrement must be called to complete set up.
  1.1732 +	if (max < aText + aMinBreakPos)
  1.1733 +		{
  1.1734 +		// no possible line breaks
  1.1735 +		iLimit = 0;
  1.1736 +		iAfterBreak.SetNull();
  1.1737 +		iBeforeBreak.SetNull();
  1.1738 +		}
  1.1739 +	else if (aForwards)
  1.1740 +		{
  1.1741 +		iLimit = max;	// point to the 'end' of the last character (low surrogate if supplementary)
  1.1742 +		iLimitAfterSpaces = endText - 1;
  1.1743 +		iAfterBreak.Set(iText, aText + aMinBreakPos - 1, aBreaker);
  1.1744 +		}
  1.1745 +	else
  1.1746 +		{
  1.1747 +		iLimit = aText + aMinBreakPos - 1;
  1.1748 +		iLimitAfterSpaces = iLimit;
  1.1749 +		iBeforeBreak.Set(iText, max - 1, aBreaker);
  1.1750 +		iBeforeBreak.Move(endText - 1, endText - 1, 1, iHasSpaces, aBreaker);
  1.1751 +		}
  1.1752 +	}
  1.1753 +
  1.1754 +TBool TLineBreakIterator::IsBreak(TBool aForwards)
  1.1755 +	{
  1.1756 +	TInt beforeClass = iBeforeBreak.Class();
  1.1757 +	TInt afterClass = iAfterBreak.Class();
  1.1758 +	const MLineBreaker& breaker = iBreaker.Breaker();
  1.1759 +
  1.1760 +	// Line break characters overhang the margin
  1.1761 +	// along with the spaces that precede them.
  1.1762 +	if (afterClass == MLineBreaker::EBkLineBreakClass)
  1.1763 +		{
  1.1764 +		const TText* p = iAfterBreak.Ptr();
  1.1765 +		MoveTextPtr(p, iText + iTextLength, 1);
  1.1766 +		iAfterBreak.Set(iText, p, iBreaker);
  1.1767 +		return ETrue;
  1.1768 +		}
  1.1769 +
  1.1770 +	// Find break within this run of SA text
  1.1771 +	const TText* startOfSaText = iBeforeBreak.Ptr();
  1.1772 +	const TText* endOfSaText = iAfterBreak.Ptr();
  1.1773 +	
  1.1774 +	if ((beforeClass != MLineBreaker::ESaLineBreakClass && *startOfSaText != KWhiteSpace) || 
  1.1775 +			(afterClass != MLineBreaker::ESaLineBreakClass))
  1.1776 +		// Complex (South-East Asian) line breaking rules not required.
  1.1777 +		return breaker.LineBreakPossible(beforeClass, afterClass, iHasSpaces);
  1.1778 +
  1.1779 +	MoveTextPtr(endOfSaText, iText + iTextLength, 1);
  1.1780 +	const TText* minBreak = startOfSaText < iMinBreakPos ?
  1.1781 +		iMinBreakPos : startOfSaText + 1;
  1.1782 +	const TText* maxBreak = iMaxBreakPos < endOfSaText ?
  1.1783 +		iMaxBreakPos : endOfSaText - 1;
  1.1784 +	TInt breakPos;
  1.1785 +	TPtrC saText(startOfSaText, endOfSaText - startOfSaText);
  1.1786 +	if (!breaker.GetLineBreakInContext(saText,
  1.1787 +		minBreak - startOfSaText, maxBreak - startOfSaText,
  1.1788 +		aForwards, breakPos))
  1.1789 +		return EFalse;
  1.1790 +
  1.1791 +	// Convert the break position within SA text into iterator positions.
  1.1792 +	const TText* p = startOfSaText + breakPos;
  1.1793 +		iAfterBreak.Set(iText, p, iBreaker);
  1.1794 +		if (*p != KZeroWidthSpace) MoveTextPtr(p, 0, -1);
  1.1795 +		iBeforeBreak.Set(iText, p, iBreaker);
  1.1796 +
  1.1797 +		return ETrue;
  1.1798 +	}
  1.1799 +
  1.1800 +TBool TLineBreakIterator::HasContingentBreak() const
  1.1801 +	{
  1.1802 +	return iBeforeBreak.Class() == MLineBreaker::ECbLineBreakClass
  1.1803 +		|| iAfterBreak.Class() == MLineBreaker::ECbLineBreakClass;
  1.1804 +	}
  1.1805 +
  1.1806 +TInt TLineBreakIterator::PreviousClass() const
  1.1807 +	{
  1.1808 +	return iBeforeBreak.Class();
  1.1809 +	}
  1.1810 +
  1.1811 +TInt TLineBreakIterator::NextClass() const
  1.1812 +	{
  1.1813 +	return iAfterBreak.Class();
  1.1814 +	}
  1.1815 +
  1.1816 +TBool TLineBreakIterator::HasSpaces() const
  1.1817 +	{
  1.1818 +	return iHasSpaces;
  1.1819 +	}
  1.1820 +
  1.1821 +TBool TLineBreakIterator::Decrement()
  1.1822 +	{
  1.1823 +	iAfterBreak = iBeforeBreak;
  1.1824 +	return iBeforeBreak.Move(iLimit, iLimitAfterSpaces, -1, iHasSpaces, iBreaker);
  1.1825 +	}
  1.1826 +
  1.1827 +TBool TLineBreakIterator::Increment()
  1.1828 +	{
  1.1829 +	iBeforeBreak = iAfterBreak;
  1.1830 +	return iAfterBreak.Move(iLimit, iLimitAfterSpaces, 1, iHasSpaces, iBreaker);
  1.1831 +	}
  1.1832 +
  1.1833 +TInt TLineBreakIterator::BreakPos() const
  1.1834 +	{
  1.1835 +	const TText* t = iBeforeBreak.Ptr();
  1.1836 +	MoveTextPtr(t, 0, 1);
  1.1837 +	return t - iText;
  1.1838 +	}
  1.1839 +
  1.1840 +TInt TLineBreakIterator::BeforeBreakPos() const
  1.1841 +	{
  1.1842 +	return iBeforeBreak.Ptr() - iText;
  1.1843 +	}
  1.1844 +
  1.1845 +TInt TLineBreakIterator::AfterBreakPos() const
  1.1846 +	{
  1.1847 +	return iAfterBreak.Ptr() - iText;
  1.1848 +	}
  1.1849 +
  1.1850 +TBool HasContingentBreak(TLineBreakIterator& aIterator,
  1.1851 +	MContingentLineBreaker& aCbDelegate)
  1.1852 +	{
  1.1853 +	if (aIterator.PreviousClass() == MLineBreaker::ECbLineBreakClass
  1.1854 +		&& aCbDelegate.IsLegalBreakAfter(
  1.1855 +		aIterator.BeforeBreakPos(), aIterator.NextClass(),
  1.1856 +		aIterator.HasSpaces()))
  1.1857 +		return ETrue;
  1.1858 +	if (aIterator.NextClass() == MLineBreaker::ECbLineBreakClass
  1.1859 +		&& aCbDelegate.IsLegalBreakBefore(
  1.1860 +		aIterator.AfterBreakPos(), aIterator.PreviousClass(),
  1.1861 +		aIterator.HasSpaces()))
  1.1862 +		return ETrue;
  1.1863 +	return EFalse;
  1.1864 +	}
  1.1865 +
  1.1866 +TBool FindBreak(TLineBreakIterator& aIterator, TBool aForwards,
  1.1867 +	MContingentLineBreaker* aCbDelegate)
  1.1868 +	{
  1.1869 +	while (aForwards? aIterator.Increment() : aIterator.Decrement())
  1.1870 +		{
  1.1871 +		if (aCbDelegate && aIterator.HasContingentBreak())
  1.1872 +			{
  1.1873 +			if (HasContingentBreak(aIterator, *aCbDelegate))
  1.1874 +				{
  1.1875 +				return ETrue;
  1.1876 +				}
  1.1877 +			}
  1.1878 +		else if (aIterator.IsBreak(aForwards))
  1.1879 +			{
  1.1880 +			return ETrue;
  1.1881 +			}
  1.1882 +		}
  1.1883 +	return EFalse;
  1.1884 +	}
  1.1885 +
  1.1886 +TBool HasContingentBreakL(TLineBreakIterator& aIterator,
  1.1887 +	MContingentLineBreakerL& aCbDelegate)
  1.1888 +	{
  1.1889 +	if (aIterator.PreviousClass() == MLineBreaker::ECbLineBreakClass
  1.1890 +		&& aCbDelegate.IsLegalBreakAfterL(
  1.1891 +		aIterator.BeforeBreakPos(), aIterator.NextClass(),
  1.1892 +		aIterator.HasSpaces()))
  1.1893 +		return ETrue;
  1.1894 +	if (aIterator.NextClass() == MLineBreaker::ECbLineBreakClass
  1.1895 +		&& aCbDelegate.IsLegalBreakBeforeL(
  1.1896 +		aIterator.AfterBreakPos(), aIterator.PreviousClass(),
  1.1897 +		aIterator.HasSpaces()))
  1.1898 +		return ETrue;
  1.1899 +	return EFalse;
  1.1900 +	}
  1.1901 +
  1.1902 +TBool FindBreakL(TLineBreakIterator& aIterator, TBool aForwards,
  1.1903 +	MContingentLineBreakerL* aCbDelegate)
  1.1904 +	{
  1.1905 +	while (aForwards? aIterator.Increment() : aIterator.Decrement())
  1.1906 +		{
  1.1907 +		if (aCbDelegate && aIterator.HasContingentBreak())
  1.1908 +			{
  1.1909 +			if (HasContingentBreakL(aIterator, *aCbDelegate))
  1.1910 +				return ETrue;
  1.1911 +			}
  1.1912 +		else if (aIterator.IsBreak(aForwards))
  1.1913 +			return ETrue;
  1.1914 +		}
  1.1915 +	return EFalse;
  1.1916 +	}
  1.1917 +
  1.1918 +EXPORT_C TBool MLineBreaker::GetLineBreak(const TDesC& aText,
  1.1919 +	TInt aMinBreakPos, TInt aMaxBreakPos, TBool aForwards,
  1.1920 +	MContingentLineBreaker* aCbDelegate,
  1.1921 +	TInt& aBreakPos, TInt& aBreakPosAfterSpaces) const
  1.1922 +/** Finds the line break according to the rules in the virtual functions. 
  1.1923 +
  1.1924 +@param aText The text to be broken.
  1.1925 +@param aMinBreakPos The smallest allowed result.
  1.1926 +@param aMaxBreakPos The position of the first character that fails to fit the 
  1.1927 +measure.
  1.1928 +@param aForwards ETrue to find the earliest legal break opportunity, EFalse 
  1.1929 +to find the last.
  1.1930 +@param aCbDelegate Object to resolve breaks around characters with the CB (cointingent 
  1.1931 +break) line breaking class. Typically this class is only used for character 
  1.1932 +0xFFFD, which usually marks the position of embedded pictures. May be NULL, 
  1.1933 +in which case LineBreakPossible() determines whether these breaks are legal.
  1.1934 +@param aBreakPos Returns the position of the break.
  1.1935 +@param aBreakPosAfterSpaces Returns the position of the start of the next line.
  1.1936 +@return ETrue if successful, EFalse if no legal line breaks were found. */
  1.1937 +    {
  1.1938 +	TLineBreakClassCache cache(*this);
  1.1939 +	const TText* text = aText.Ptr();
  1.1940 +	TLineBreakIterator it(cache, text, aText.Length(),
  1.1941 +		aForwards, aMinBreakPos, aMaxBreakPos);
  1.1942 +	if (!FindBreak(it, aForwards, aCbDelegate))
  1.1943 +		return EFalse;
  1.1944 +	aBreakPos = it.BreakPos();
  1.1945 +	aBreakPosAfterSpaces = it.AfterBreakPos();
  1.1946 +	return ETrue;
  1.1947 +	}
  1.1948 +
  1.1949 +EXPORT_C TBool MLineBreaker::GetLineBreakL(const TDesC& aText,
  1.1950 +	TInt aMinBreakPos, TInt aMaxBreakPos, TBool aForwards,
  1.1951 +	MContingentLineBreakerL* aCbDelegate,
  1.1952 +	TInt& aBreakPos, TInt& aBreakPosAfterSpaces) const
  1.1953 +/** Exactly the same as GetLineBreak, but aCbDelegate's functions may leave so 
  1.1954 +the whole function may leave. 
  1.1955 +
  1.1956 +@param aText The text to be broken.
  1.1957 +@param aMinBreakPos The smallest allowed result.
  1.1958 +@param aMaxBreakPos he position of the first character that fails to fit the 
  1.1959 +measure.
  1.1960 +@param aForwards ETrue to find the earliest legal break opportunity, EFalse 
  1.1961 +to find the last.
  1.1962 +@param aCbDelegate Object to resolve breaks around characters with the CB (cointingent 
  1.1963 +break) line breaking class. Typically this class is only used for character 
  1.1964 +0xFFFD, which usually marks the position of embedded pictures. May be NULL, 
  1.1965 +in which case LineBreakPossible() determines whether these breaks are legal.
  1.1966 +@param aBreakPos Returns the position of the break.
  1.1967 +@param aBreakPosAfterSpaces Returns the position of the start of the next line.
  1.1968 +@return ETrue if successful, EFalse if no legal line breaks were found. */
  1.1969 +	{
  1.1970 +	if (aMaxBreakPos < aMinBreakPos)
  1.1971 +		return EFalse;
  1.1972 +	TLineBreakClassCache cache(*this);
  1.1973 +	const TText* text = aText.Ptr();
  1.1974 +	TLineBreakIterator it(cache, text, aText.Length(),
  1.1975 +		aForwards, aMinBreakPos, aMaxBreakPos);
  1.1976 +	if (!FindBreakL(it, aForwards, aCbDelegate))
  1.1977 +		return EFalse;
  1.1978 +	aBreakPos = it.BreakPos();
  1.1979 +	aBreakPosAfterSpaces = it.AfterBreakPos();
  1.1980 +	return ETrue;
  1.1981 +	}
  1.1982 +EXPORT_C void* MLineBreaker::ExtendedInterface(TUid&) const 
  1.1983 +/** Returns an interface to more functions, or 0 if these are unsupported.
  1.1984 +Currently there are no other functions, so 0 is always returned. If this
  1.1985 +function is overridden, it must base call if aUid is not recognised,
  1.1986 +rather than just returning 0.
  1.1987 +@param aUid Identifies the interface to be returned.
  1.1988 +@return A pointer to the extended interface, or 0 if not supported. */
  1.1989 +	{ 
  1.1990 +	return 0; 
  1.1991 +	}
  1.1992 +
  1.1993 +