OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/fxcrt/fx_ext.h" | 7 #include "../../include/fxcrt/fx_ext.h" |
8 #include "fx_arabic.h" | 8 #include "fx_arabic.h" |
9 extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; | 9 extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; |
10 #ifdef __cplusplus | 10 #ifdef __cplusplus |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 }; | 207 }; |
208 FX_LPCARBFORMTABLE FX_GetArabicFormTable(FX_WCHAR unicode) | 208 FX_LPCARBFORMTABLE FX_GetArabicFormTable(FX_WCHAR unicode) |
209 { | 209 { |
210 if (unicode < 0x622 || unicode > 0x6d5) { | 210 if (unicode < 0x622 || unicode > 0x6d5) { |
211 return NULL; | 211 return NULL; |
212 } | 212 } |
213 return g_FX_ArabicFormTables + unicode - 0x622; | 213 return g_FX_ArabicFormTables + unicode - 0x622; |
214 } | 214 } |
215 FX_WCHAR FX_GetArabicFromAlefTable(FX_WCHAR alef) | 215 FX_WCHAR FX_GetArabicFromAlefTable(FX_WCHAR alef) |
216 { | 216 { |
217 static const FX_INT32 s_iAlefCount = sizeof(gs_FX_AlefTable) / sizeof(FX_ARA
ALEF); | 217 static const int32_t s_iAlefCount = sizeof(gs_FX_AlefTable) / sizeof(FX_ARAA
LEF); |
218 for (FX_INT32 iStart = 0; iStart < s_iAlefCount; iStart ++) { | 218 for (int32_t iStart = 0; iStart < s_iAlefCount; iStart ++) { |
219 const FX_ARAALEF &v = gs_FX_AlefTable[iStart]; | 219 const FX_ARAALEF &v = gs_FX_AlefTable[iStart]; |
220 if (v.wAlef == alef) { | 220 if (v.wAlef == alef) { |
221 return v.wIsolated; | 221 return v.wIsolated; |
222 } | 222 } |
223 } | 223 } |
224 return alef; | 224 return alef; |
225 } | 225 } |
226 FX_WCHAR FX_GetArabicFromShaddaTable(FX_WCHAR shadda) | 226 FX_WCHAR FX_GetArabicFromShaddaTable(FX_WCHAR shadda) |
227 { | 227 { |
228 static const FX_INT32 s_iShaddaCount = sizeof(gs_FX_ShaddaTable) / sizeof(FX
_ARASHADDA); | 228 static const int32_t s_iShaddaCount = sizeof(gs_FX_ShaddaTable) / sizeof(FX_
ARASHADDA); |
229 for (FX_INT32 iStart = 0; iStart < s_iShaddaCount; iStart ++) { | 229 for (int32_t iStart = 0; iStart < s_iShaddaCount; iStart ++) { |
230 const FX_ARASHADDA &v = gs_FX_ShaddaTable[iStart]; | 230 const FX_ARASHADDA &v = gs_FX_ShaddaTable[iStart]; |
231 if (v.wShadda == shadda) { | 231 if (v.wShadda == shadda) { |
232 return v.wIsolated; | 232 return v.wIsolated; |
233 } | 233 } |
234 } | 234 } |
235 return shadda; | 235 return shadda; |
236 } | 236 } |
237 #ifdef __cplusplus | 237 #ifdef __cplusplus |
238 }; | 238 }; |
239 #endif | 239 #endif |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 return NULL; | 300 return NULL; |
301 } | 301 } |
302 eType = (FX_CHARTYPE)pTC->GetCharType(); | 302 eType = (FX_CHARTYPE)pTC->GetCharType(); |
303 wChar = (FX_WCHAR)pTC->m_wCharCode; | 303 wChar = (FX_WCHAR)pTC->m_wCharCode; |
304 FX_LPCARBFORMTABLE pFT = FX_GetArabicFormTable(wChar); | 304 FX_LPCARBFORMTABLE pFT = FX_GetArabicFormTable(wChar); |
305 if (pFT == NULL || eType >= FX_CHARTYPE_ArabicNormal) { | 305 if (pFT == NULL || eType >= FX_CHARTYPE_ArabicNormal) { |
306 eType = FX_CHARTYPE_Unknown; | 306 eType = FX_CHARTYPE_Unknown; |
307 } | 307 } |
308 return pFT; | 308 return pFT; |
309 } | 309 } |
310 void FX_BidiReverseString(CFX_WideString &wsText, FX_INT32 iStart, FX_INT32 iCou
nt) | 310 void FX_BidiReverseString(CFX_WideString &wsText, int32_t iStart, int32_t iCount
) |
311 { | 311 { |
312 FXSYS_assert(iStart > -1 && iStart < wsText.GetLength()); | 312 FXSYS_assert(iStart > -1 && iStart < wsText.GetLength()); |
313 FXSYS_assert(iCount >= 0 && iStart + iCount <= wsText.GetLength()); | 313 FXSYS_assert(iCount >= 0 && iStart + iCount <= wsText.GetLength()); |
314 FX_WCHAR wch; | 314 FX_WCHAR wch; |
315 FX_LPWSTR pStart = (FX_LPWSTR)(FX_LPCWSTR)wsText; | 315 FX_LPWSTR pStart = (FX_LPWSTR)(FX_LPCWSTR)wsText; |
316 pStart += iStart; | 316 pStart += iStart; |
317 FX_LPWSTR pEnd = pStart + iCount - 1; | 317 FX_LPWSTR pEnd = pStart + iCount - 1; |
318 while (pStart < pEnd) { | 318 while (pStart < pEnd) { |
319 wch = *pStart; | 319 wch = *pStart; |
320 *pStart ++ = *pEnd; | 320 *pStart ++ = *pEnd; |
321 *pEnd -- = wch; | 321 *pEnd -- = wch; |
322 } | 322 } |
323 } | 323 } |
324 void FX_BidiSetDeferredRun(CFX_Int32Array &values, FX_INT32 iStart, FX_INT32 iCo
unt, FX_INT32 iValue) | 324 void FX_BidiSetDeferredRun(CFX_Int32Array &values, int32_t iStart, int32_t iCoun
t, int32_t iValue) |
325 { | 325 { |
326 FXSYS_assert(iStart > -1 && iStart <= values.GetSize()); | 326 FXSYS_assert(iStart > -1 && iStart <= values.GetSize()); |
327 FXSYS_assert(iStart - iCount > -1); | 327 FXSYS_assert(iStart - iCount > -1); |
328 for (FX_INT32 i = iStart - 1; i >= iStart - iCount; i --) { | 328 for (int32_t i = iStart - 1; i >= iStart - iCount; i --) { |
329 values.SetAt(i, iValue); | 329 values.SetAt(i, iValue); |
330 } | 330 } |
331 } | 331 } |
332 const FX_INT32 gc_FX_BidiNTypes[] = { | 332 const int32_t gc_FX_BidiNTypes[] = { |
333 FX_BIDICLASS_N, | 333 FX_BIDICLASS_N, |
334 FX_BIDICLASS_L, | 334 FX_BIDICLASS_L, |
335 FX_BIDICLASS_R, | 335 FX_BIDICLASS_R, |
336 FX_BIDICLASS_AN, | 336 FX_BIDICLASS_AN, |
337 FX_BIDICLASS_EN, | 337 FX_BIDICLASS_EN, |
338 FX_BIDICLASS_AL, | 338 FX_BIDICLASS_AL, |
339 FX_BIDICLASS_NSM, | 339 FX_BIDICLASS_NSM, |
340 FX_BIDICLASS_CS, | 340 FX_BIDICLASS_CS, |
341 FX_BIDICLASS_ES, | 341 FX_BIDICLASS_ES, |
342 FX_BIDICLASS_ET, | 342 FX_BIDICLASS_ET, |
343 FX_BIDICLASS_BN, | 343 FX_BIDICLASS_BN, |
344 FX_BIDICLASS_BN, | 344 FX_BIDICLASS_BN, |
345 FX_BIDICLASS_N, | 345 FX_BIDICLASS_N, |
346 FX_BIDICLASS_B, | 346 FX_BIDICLASS_B, |
347 FX_BIDICLASS_RLO, | 347 FX_BIDICLASS_RLO, |
348 FX_BIDICLASS_RLE, | 348 FX_BIDICLASS_RLE, |
349 FX_BIDICLASS_LRO, | 349 FX_BIDICLASS_LRO, |
350 FX_BIDICLASS_LRE, | 350 FX_BIDICLASS_LRE, |
351 FX_BIDICLASS_PDF, | 351 FX_BIDICLASS_PDF, |
352 FX_BIDICLASS_ON, | 352 FX_BIDICLASS_ON, |
353 }; | 353 }; |
354 void FX_BidiClassify(const CFX_WideString &wsText, CFX_Int32Array &classes, FX_B
OOL bWS) | 354 void FX_BidiClassify(const CFX_WideString &wsText, CFX_Int32Array &classes, FX_B
OOL bWS) |
355 { | 355 { |
356 FXSYS_assert(wsText.GetLength() == classes.GetSize()); | 356 FXSYS_assert(wsText.GetLength() == classes.GetSize()); |
357 FX_INT32 iCount = wsText.GetLength(); | 357 int32_t iCount = wsText.GetLength(); |
358 FX_LPCWSTR pwsStart = (FX_LPCWSTR)wsText; | 358 FX_LPCWSTR pwsStart = (FX_LPCWSTR)wsText; |
359 FX_WCHAR wch; | 359 FX_WCHAR wch; |
360 FX_INT32 iCls; | 360 int32_t iCls; |
361 if (bWS) { | 361 if (bWS) { |
362 for (FX_INT32 i = 0; i < iCount; i ++) { | 362 for (int32_t i = 0; i < iCount; i ++) { |
363 wch = *pwsStart ++; | 363 wch = *pwsStart ++; |
364 iCls = ((gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_BIDICLAS
SBITSMASK) >> FX_BIDICLASSBITS); | 364 iCls = ((gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_BIDICLAS
SBITSMASK) >> FX_BIDICLASSBITS); |
365 classes.SetAt(i, iCls); | 365 classes.SetAt(i, iCls); |
366 } | 366 } |
367 } else { | 367 } else { |
368 for (FX_INT32 i = 0; i < iCount; i ++) { | 368 for (int32_t i = 0; i < iCount; i ++) { |
369 wch = *pwsStart ++; | 369 wch = *pwsStart ++; |
370 iCls = ((gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_BIDICLAS
SBITSMASK) >> FX_BIDICLASSBITS); | 370 iCls = ((gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_BIDICLAS
SBITSMASK) >> FX_BIDICLASSBITS); |
371 classes.SetAt(i, gc_FX_BidiNTypes[iCls]); | 371 classes.SetAt(i, gc_FX_BidiNTypes[iCls]); |
372 } | 372 } |
373 } | 373 } |
374 } | 374 } |
375 FX_INT32 FX_BidiResolveExplicit(FX_INT32 iBaseLevel, FX_INT32 iDirection, CFX_In
t32Array &classes, CFX_Int32Array &levels, FX_INT32 iStart, FX_INT32 iCount, FX_
INT32 iNest) | 375 int32_t FX_BidiResolveExplicit(int32_t iBaseLevel, int32_t iDirection, CFX_Int32
Array &classes, CFX_Int32Array &levels, int32_t iStart, int32_t iCount, int32_t
iNest) |
376 { | 376 { |
377 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL && iNest >= 0)
; | 377 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL && iNest >= 0)
; |
378 FXSYS_assert(classes.GetSize() == levels.GetSize()); | 378 FXSYS_assert(classes.GetSize() == levels.GetSize()); |
379 FXSYS_assert(iStart >= 0 && iStart < classes.GetSize()); | 379 FXSYS_assert(iStart >= 0 && iStart < classes.GetSize()); |
380 FXSYS_assert(iCount >= 0 && iStart + iCount <= classes.GetSize()); | 380 FXSYS_assert(iCount >= 0 && iStart + iCount <= classes.GetSize()); |
381 if (iCount < 1) { | 381 if (iCount < 1) { |
382 return 0; | 382 return 0; |
383 } | 383 } |
384 #if 0 | 384 #if 0 |
385 FX_INT32 iLastNest = iNest; | 385 int32_t iLastNest = iNest; |
386 #endif | 386 #endif |
387 FX_INT32 iSize = classes.GetSize(); | 387 int32_t iSize = classes.GetSize(); |
388 FX_INT32 i = iStart, iCur, iCls; | 388 int32_t i = iStart, iCur, iCls; |
389 for (; i < iSize && iCount > 0; i ++, iCount --) { | 389 for (; i < iSize && iCount > 0; i ++, iCount --) { |
390 iCur = iCls = classes.GetAt(i); | 390 iCur = iCls = classes.GetAt(i); |
391 #if 0 | 391 #if 0 |
392 switch (iCls) { | 392 switch (iCls) { |
393 case FX_BIDICLASS_LRO: | 393 case FX_BIDICLASS_LRO: |
394 case FX_BIDICLASS_LRE: | 394 case FX_BIDICLASS_LRE: |
395 classes.SetAt(i, FX_BIDICLASS_BN); | 395 classes.SetAt(i, FX_BIDICLASS_BN); |
396 iCls = FX_BIDICLASS_BN; | 396 iCls = FX_BIDICLASS_BN; |
397 iNest ++; | 397 iNest ++; |
398 if (FX_BidiGreaterEven(iBaseLevel) <= MAX_LEVEL) { | 398 if (FX_BidiGreaterEven(iBaseLevel) <= MAX_LEVEL) { |
399 FX_INT32 iLevel = FX_BidiGreaterEven(iBaseLevel); | 399 int32_t iLevel = FX_BidiGreaterEven(iBaseLevel); |
400 levels.SetAt(i, iLevel); | 400 levels.SetAt(i, iLevel); |
401 i += FX_BidiResolveExplicit(iLevel, | 401 i += FX_BidiResolveExplicit(iLevel, |
402 (iCls == FX_BIDICLASS_LRE ? FX_B
IDICLASS_N : FX_BIDICLASS_L), | 402 (iCls == FX_BIDICLASS_LRE ? FX_B
IDICLASS_N : FX_BIDICLASS_L), |
403 classes, | 403 classes, |
404 levels, | 404 levels, |
405 i + 1, | 405 i + 1, |
406 iCount - 1, | 406 iCount - 1, |
407 iNest); | 407 iNest); |
408 iNest --; | 408 iNest --; |
409 continue; | 409 continue; |
410 } | 410 } |
411 break; | 411 break; |
412 case FX_BIDICLASS_RLO: | 412 case FX_BIDICLASS_RLO: |
413 case FX_BIDICLASS_RLE: | 413 case FX_BIDICLASS_RLE: |
414 classes.SetAt(i, FX_BIDICLASS_BN); | 414 classes.SetAt(i, FX_BIDICLASS_BN); |
415 iCls = FX_BIDICLASS_BN; | 415 iCls = FX_BIDICLASS_BN; |
416 iNest ++; | 416 iNest ++; |
417 if (FX_BidiGreaterOdd(iBaseLevel) <= MAX_LEVEL) { | 417 if (FX_BidiGreaterOdd(iBaseLevel) <= MAX_LEVEL) { |
418 FX_INT32 iLevel = FX_BidiGreaterOdd(iBaseLevel); | 418 int32_t iLevel = FX_BidiGreaterOdd(iBaseLevel); |
419 levels.SetAt(i, iLevel); | 419 levels.SetAt(i, iLevel); |
420 i += FX_BidiResolveExplicit(iLevel, | 420 i += FX_BidiResolveExplicit(iLevel, |
421 (iCls == FX_BIDICLASS_RLE ? FX_B
IDICLASS_N : FX_BIDICLASS_R), | 421 (iCls == FX_BIDICLASS_RLE ? FX_B
IDICLASS_N : FX_BIDICLASS_R), |
422 classes, | 422 classes, |
423 levels, | 423 levels, |
424 i + 1, | 424 i + 1, |
425 iCount - 1, | 425 iCount - 1, |
426 iNest); | 426 iNest); |
427 iNest --; | 427 iNest --; |
428 continue; | 428 continue; |
(...skipping 16 matching lines...) Expand all Loading... |
445 if (iDirection != FX_BIDICLASS_N) { | 445 if (iDirection != FX_BIDICLASS_N) { |
446 iCls = iDirection; | 446 iCls = iDirection; |
447 } | 447 } |
448 if (iCur != FX_BIDICLASS_BN) { | 448 if (iCur != FX_BIDICLASS_BN) { |
449 classes.SetAt(i, iCls); | 449 classes.SetAt(i, iCls); |
450 } | 450 } |
451 levels.SetAt(i, iBaseLevel); | 451 levels.SetAt(i, iBaseLevel); |
452 } | 452 } |
453 return i - iStart; | 453 return i - iStart; |
454 } | 454 } |
455 const FX_INT32 gc_FX_BidiWeakStates[][10] = { | 455 const int32_t gc_FX_BidiWeakStates[][10] = { |
456 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWSxa, FX_BWSao, FX_BWSao, FX_BWSao}, | 456 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWSxa, FX_BWSao, FX_BWSao, FX_BWSao}, |
457 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSxr, FX_BWSro, FX_BWSro, FX_BWSrt}, | 457 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSxr, FX_BWSro, FX_BWSro, FX_BWSrt}, |
458 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSxl, FX_BWSlo, FX_BWSlo, FX_BWSlt}, | 458 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSxl, FX_BWSlo, FX_BWSlo, FX_BWSlt}, |
459 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWSao, FX_BWSao, FX_BWSao, FX_BWSao}, | 459 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWSao, FX_BWSao, FX_BWSao, FX_BWSao}, |
460 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSro, FX_BWSro, FX_BWSro, FX_BWSrt}, | 460 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSro, FX_BWSro, FX_BWSro, FX_BWSrt}, |
461 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlo, FX_BWSlo, FX_BWSlo, FX_BWSlt}, | 461 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlo, FX_BWSlo, FX_BWSlo, FX_BWSlt}, |
462 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSrt, FX_BWSro, FX_BWSro, FX_BWSrt}, | 462 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSrt, FX_BWSro, FX_BWSro, FX_BWSrt}, |
463 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlt, FX_BWSlo, FX_BWSlo, FX_BWSlt}, | 463 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlt, FX_BWSlo, FX_BWSlo, FX_BWSlt}, |
464 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWScn, FX_BWSac, FX_BWSao, FX_BWSao}, | 464 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWScn, FX_BWSac, FX_BWSao, FX_BWSao}, |
465 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSra, FX_BWSrc, FX_BWSro, FX_BWSrt}, | 465 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSra, FX_BWSrc, FX_BWSro, FX_BWSrt}, |
466 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSre, FX_BWSrs, FX_BWSrs, FX_BWSret}, | 466 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSre, FX_BWSrs, FX_BWSrs, FX_BWSret}, |
467 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSla, FX_BWSlc, FX_BWSlo, FX_BWSlt}, | 467 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSla, FX_BWSlc, FX_BWSlo, FX_BWSlt}, |
468 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSle, FX_BWSls, FX_BWSls, FX_BWSlet}, | 468 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSle, FX_BWSls, FX_BWSls, FX_BWSlet}, |
469 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWSao, FX_BWSao, FX_BWSao, FX_BWSao}, | 469 {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn,
FX_BWSxa, FX_BWSao, FX_BWSao, FX_BWSao, FX_BWSao}, |
470 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSro, FX_BWSro, FX_BWSro, FX_BWSrt}, | 470 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSro, FX_BWSro, FX_BWSro, FX_BWSrt}, |
471 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSro, FX_BWSro, FX_BWSro, FX_BWSrt}, | 471 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSro, FX_BWSro, FX_BWSro, FX_BWSrt}, |
472 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlo, FX_BWSlo, FX_BWSlo, FX_BWSlt}, | 472 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlo, FX_BWSlo, FX_BWSlo, FX_BWSlt}, |
473 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlo, FX_BWSlo, FX_BWSlo, FX_BWSlt}, | 473 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlo, FX_BWSlo, FX_BWSlo, FX_BWSlt}, |
474 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSret, FX_BWSro, FX_BWSro, FX_BWSret}, | 474 {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre,
FX_BWSxa, FX_BWSret, FX_BWSro, FX_BWSro, FX_BWSret}, |
475 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlet, FX_BWSlo, FX_BWSlo, FX_BWSlet}, | 475 {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle,
FX_BWSxa, FX_BWSlet, FX_BWSlo, FX_BWSlo, FX_BWSlet}, |
476 }; | 476 }; |
477 const FX_INT32 gc_FX_BidiWeakActions[][10] = { | 477 const int32_t gc_FX_BidiWeakActions[][10] = { |
478 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, FX_BWAxxR
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN}, | 478 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, FX_BWAxxR
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN}, |
479 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxR
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, | 479 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxR
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, |
480 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxL
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, | 480 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxL
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, |
481 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, FX_BWAxxN
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN}, | 481 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, FX_BWAxxN
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN}, |
482 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxN
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, | 482 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxN
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, |
483 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxN
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, | 483 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxN
, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, |
484 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR, FX_BWAxIx
, FX_BWANxN, FX_BWANxN, FX_BWAxIx}, | 484 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR, FX_BWAxIx
, FX_BWANxN, FX_BWANxN, FX_BWAxIx}, |
485 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR, FX_BWAxIx
, FX_BWANxN, FX_BWANxN, FX_BWAxIx}, | 485 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR, FX_BWAxIx
, FX_BWANxN, FX_BWANxN, FX_BWAxIx}, |
486 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, FX_BWAxxA
, FX_BWAxIx, FX_BWAxxN, FX_BWAxxN}, | 486 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, FX_BWAxxA
, FX_BWAxIx, FX_BWAxxN, FX_BWAxxN}, |
487 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxA
, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx}, | 487 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxA
, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx}, |
488 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxE
, FX_BWAxIx, FX_BWAxIx, FX_BWAxxE}, | 488 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxE
, FX_BWAxIx, FX_BWAxIx, FX_BWAxxE}, |
489 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxA
, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx}, | 489 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxA
, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx}, |
490 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxL
, FX_BWAxIx, FX_BWAxIx, FX_BWAxxL}, | 490 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxL
, FX_BWAxIx, FX_BWAxIx, FX_BWAxxL}, |
491 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWAAxA, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANxN}, | 491 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWAAxA, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANxN}, |
492 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxE, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, | 492 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxE, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, |
493 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, | 493 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, |
494 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxL, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, | 494 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxL, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, |
495 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, | 495 {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR, FX_BWANxN
, FX_BWANxN, FX_BWANxN, FX_BWANIx}, |
496 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxE
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxE}, | 496 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, FX_BWAxxE
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxE}, |
497 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxL
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxL}, | 497 {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, FX_BWAxxL
, FX_BWAxxN, FX_BWAxxN, FX_BWAxxL}, |
498 }; | 498 }; |
499 void FX_BidiResolveWeak(FX_INT32 iBaseLevel, CFX_Int32Array &classes, CFX_Int32A
rray &levels) | 499 void FX_BidiResolveWeak(int32_t iBaseLevel, CFX_Int32Array &classes, CFX_Int32Ar
ray &levels) |
500 { | 500 { |
501 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 501 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
502 FXSYS_assert(classes.GetSize() == levels.GetSize()); | 502 FXSYS_assert(classes.GetSize() == levels.GetSize()); |
503 FX_INT32 iSize = classes.GetSize(); | 503 int32_t iSize = classes.GetSize(); |
504 if (iSize < 1) { | 504 if (iSize < 1) { |
505 return; | 505 return; |
506 } | 506 } |
507 iSize --; | 507 iSize --; |
508 FX_INT32 iLevelCur = iBaseLevel; | 508 int32_t iLevelCur = iBaseLevel; |
509 FX_INT32 iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; | 509 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; |
510 FX_INT32 i = 0, iCount = 0, iClsCur, iClsRun, iClsNew, iAction; | 510 int32_t i = 0, iCount = 0, iClsCur, iClsRun, iClsNew, iAction; |
511 for (; i <= iSize; i ++) { | 511 for (; i <= iSize; i ++) { |
512 iClsCur = classes.GetAt(i); | 512 iClsCur = classes.GetAt(i); |
513 #if 0 | 513 #if 0 |
514 if (iClsCur == FX_BIDICLASS_BN) { | 514 if (iClsCur == FX_BIDICLASS_BN) { |
515 levels.SetAt(i, iLevelCur); | 515 levels.SetAt(i, iLevelCur); |
516 if (i == iSize && iLevelCur != iBaseLevel) { | 516 if (i == iSize && iLevelCur != iBaseLevel) { |
517 iClsCur = FX_BidiDirection(iLevelCur); | 517 iClsCur = FX_BidiDirection(iLevelCur); |
518 classes.SetAt(i, iClsCur); | 518 classes.SetAt(i, iClsCur); |
519 } else if (i < iSize) { | 519 } else if (i < iSize) { |
520 FX_INT32 iLevelNext, iLevelNew; | 520 int32_t iLevelNext, iLevelNew; |
521 iClsNew = classes.GetAt(i + 1); | 521 iClsNew = classes.GetAt(i + 1); |
522 iLevelNext = levels.GetAt(i + 1); | 522 iLevelNext = levels.GetAt(i + 1); |
523 if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { | 523 if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { |
524 iLevelNew = iLevelNext; | 524 iLevelNew = iLevelNext; |
525 if (iLevelCur > iLevelNew) { | 525 if (iLevelCur > iLevelNew) { |
526 iLevelNew = iLevelCur; | 526 iLevelNew = iLevelCur; |
527 } | 527 } |
528 levels.SetAt(i, iLevelNew); | 528 levels.SetAt(i, iLevelNew); |
529 iClsCur = FX_BidiDirection(iLevelNew); | 529 iClsCur = FX_BidiDirection(iLevelNew); |
530 classes.SetAt(i, iClsCur); | 530 classes.SetAt(i, iClsCur); |
(...skipping 27 matching lines...) Expand all Loading... |
558 iCount ++; | 558 iCount ++; |
559 } | 559 } |
560 iState = gc_FX_BidiWeakStates[iState][iClsCur]; | 560 iState = gc_FX_BidiWeakStates[iState][iClsCur]; |
561 } | 561 } |
562 iClsCur = FX_BidiDirection(iLevelCur); | 562 iClsCur = FX_BidiDirection(iLevelCur); |
563 iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]); | 563 iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]); |
564 if (iClsRun != FX_BIDIWEAKACTION_XX && iCount > 0) { | 564 if (iClsRun != FX_BIDIWEAKACTION_XX && iCount > 0) { |
565 FX_BidiSetDeferredRun(classes, i, iCount, iClsRun); | 565 FX_BidiSetDeferredRun(classes, i, iCount, iClsRun); |
566 } | 566 } |
567 } | 567 } |
568 const FX_INT32 gc_FX_BidiNeutralStates[][5] = { | 568 const int32_t gc_FX_BidiNeutralStates[][5] = { |
569 {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr}, | 569 {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr}, |
570 {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, | 570 {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, |
571 {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr}, | 571 {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr}, |
572 {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, | 572 {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, |
573 {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, | 573 {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, |
574 {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, | 574 {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, |
575 }; | 575 }; |
576 const FX_INT32 gc_FX_BidiNeutralActions[][5] = { | 576 const int32_t gc_FX_BidiNeutralActions[][5] = { |
577 {FX_BNAIn, 0, 0, 0,
0 }, | 577 {FX_BNAIn, 0, 0, 0,
0 }, |
578 {FX_BNAIn, 0, 0, 0,
FX_BCL }, | 578 {FX_BNAIn, 0, 0, 0,
FX_BCL }, |
579 {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNARn
}, | 579 {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNARn
}, |
580 {FX_BNAIn, FX_BNALn, FX_BNAEn, FX_BNAEn, FX_BNALnL
}, | 580 {FX_BNAIn, FX_BNALn, FX_BNAEn, FX_BNAEn, FX_BNALnL
}, |
581 {FX_BNAIn, 0, 0, 0,
FX_BCL }, | 581 {FX_BNAIn, 0, 0, 0,
FX_BCL }, |
582 {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNAEn
}, | 582 {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNAEn
}, |
583 }; | 583 }; |
584 FX_INT32 FX_BidiGetDeferredNeutrals(FX_INT32 iAction, FX_INT32 iLevel) | 584 int32_t FX_BidiGetDeferredNeutrals(int32_t iAction, int32_t iLevel) |
585 { | 585 { |
586 iAction = (iAction >> 4) & 0xF; | 586 iAction = (iAction >> 4) & 0xF; |
587 if (iAction == (FX_BIDINEUTRALACTION_En >> 4)) { | 587 if (iAction == (FX_BIDINEUTRALACTION_En >> 4)) { |
588 return FX_BidiDirection(iLevel); | 588 return FX_BidiDirection(iLevel); |
589 } else { | 589 } else { |
590 return iAction; | 590 return iAction; |
591 } | 591 } |
592 } | 592 } |
593 FX_INT32 FX_BidiGetResolvedNeutrals(FX_INT32 iAction) | 593 int32_t FX_BidiGetResolvedNeutrals(int32_t iAction) |
594 { | 594 { |
595 iAction = (iAction & 0xF); | 595 iAction = (iAction & 0xF); |
596 if (iAction == FX_BIDINEUTRALACTION_In) { | 596 if (iAction == FX_BIDINEUTRALACTION_In) { |
597 return 0; | 597 return 0; |
598 } else { | 598 } else { |
599 return iAction; | 599 return iAction; |
600 } | 600 } |
601 } | 601 } |
602 void FX_BidiResolveNeutrals(FX_INT32 iBaseLevel, CFX_Int32Array &classes, const
CFX_Int32Array &levels) | 602 void FX_BidiResolveNeutrals(int32_t iBaseLevel, CFX_Int32Array &classes, const C
FX_Int32Array &levels) |
603 { | 603 { |
604 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 604 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
605 FXSYS_assert(classes.GetSize() == levels.GetSize()); | 605 FXSYS_assert(classes.GetSize() == levels.GetSize()); |
606 FX_INT32 iSize = classes.GetSize(); | 606 int32_t iSize = classes.GetSize(); |
607 if (iSize < 1) { | 607 if (iSize < 1) { |
608 return; | 608 return; |
609 } | 609 } |
610 iSize --; | 610 iSize --; |
611 FX_INT32 iLevel = iBaseLevel; | 611 int32_t iLevel = iBaseLevel; |
612 FX_INT32 iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; | 612 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; |
613 FX_INT32 i = 0, iCount = 0, iClsCur, iClsRun, iClsNew, iAction; | 613 int32_t i = 0, iCount = 0, iClsCur, iClsRun, iClsNew, iAction; |
614 for (; i <= iSize; i ++) { | 614 for (; i <= iSize; i ++) { |
615 iClsCur = classes.GetAt(i); | 615 iClsCur = classes.GetAt(i); |
616 if (iClsCur == FX_BIDICLASS_BN) { | 616 if (iClsCur == FX_BIDICLASS_BN) { |
617 if (iCount) { | 617 if (iCount) { |
618 iCount ++; | 618 iCount ++; |
619 } | 619 } |
620 continue; | 620 continue; |
621 } | 621 } |
622 FXSYS_assert(iClsCur < FX_BIDICLASS_AL); | 622 FXSYS_assert(iClsCur < FX_BIDICLASS_AL); |
623 iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; | 623 iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; |
(...skipping 11 matching lines...) Expand all Loading... |
635 } | 635 } |
636 iState = gc_FX_BidiNeutralStates[iState][iClsCur]; | 636 iState = gc_FX_BidiNeutralStates[iState][iClsCur]; |
637 iLevel = levels.GetAt(i); | 637 iLevel = levels.GetAt(i); |
638 } | 638 } |
639 iClsCur = FX_BidiDirection(iLevel); | 639 iClsCur = FX_BidiDirection(iLevel); |
640 iClsRun = FX_BidiGetDeferredNeutrals(gc_FX_BidiNeutralActions[iState][iClsCu
r], iLevel); | 640 iClsRun = FX_BidiGetDeferredNeutrals(gc_FX_BidiNeutralActions[iState][iClsCu
r], iLevel); |
641 if (iClsRun != FX_BIDICLASS_N && iCount > 0) { | 641 if (iClsRun != FX_BIDICLASS_N && iCount > 0) { |
642 FX_BidiSetDeferredRun(classes, i, iCount, iClsRun); | 642 FX_BidiSetDeferredRun(classes, i, iCount, iClsRun); |
643 } | 643 } |
644 } | 644 } |
645 const FX_INT32 gc_FX_BidiAddLevel[][4] = { | 645 const int32_t gc_FX_BidiAddLevel[][4] = { |
646 {0, 1, 2, 2}, | 646 {0, 1, 2, 2}, |
647 {1, 0, 1, 1}, | 647 {1, 0, 1, 1}, |
648 }; | 648 }; |
649 void FX_BidiResolveImplicit(const CFX_Int32Array &classes, CFX_Int32Array &level
s) | 649 void FX_BidiResolveImplicit(const CFX_Int32Array &classes, CFX_Int32Array &level
s) |
650 { | 650 { |
651 FXSYS_assert(classes.GetSize() == levels.GetSize()); | 651 FXSYS_assert(classes.GetSize() == levels.GetSize()); |
652 FX_INT32 iSize = classes.GetSize(); | 652 int32_t iSize = classes.GetSize(); |
653 if (iSize < 1) { | 653 if (iSize < 1) { |
654 return; | 654 return; |
655 } | 655 } |
656 iSize --; | 656 iSize --; |
657 FX_INT32 iCls, iLevel; | 657 int32_t iCls, iLevel; |
658 for (FX_INT32 i = 0; i <= iSize; i ++) { | 658 for (int32_t i = 0; i <= iSize; i ++) { |
659 iCls = classes.GetAt(i); | 659 iCls = classes.GetAt(i); |
660 if (iCls == FX_BIDICLASS_BN) { | 660 if (iCls == FX_BIDICLASS_BN) { |
661 continue; | 661 continue; |
662 } | 662 } |
663 FXSYS_assert(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); | 663 FXSYS_assert(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); |
664 iLevel = levels.GetAt(i); | 664 iLevel = levels.GetAt(i); |
665 iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; | 665 iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; |
666 levels.SetAt(i, iLevel); | 666 levels.SetAt(i, iLevel); |
667 } | 667 } |
668 } | 668 } |
669 void FX_BidiResolveWhitespace(FX_INT32 iBaseLevel, const CFX_Int32Array &classes
, CFX_Int32Array &levels) | 669 void FX_BidiResolveWhitespace(int32_t iBaseLevel, const CFX_Int32Array &classes,
CFX_Int32Array &levels) |
670 { | 670 { |
671 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 671 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
672 FXSYS_assert(classes.GetSize() == levels.GetSize()); | 672 FXSYS_assert(classes.GetSize() == levels.GetSize()); |
673 FX_INT32 iSize = classes.GetSize(); | 673 int32_t iSize = classes.GetSize(); |
674 if (iSize < 1) { | 674 if (iSize < 1) { |
675 return; | 675 return; |
676 } | 676 } |
677 iSize --; | 677 iSize --; |
678 FX_INT32 iLevel = iBaseLevel; | 678 int32_t iLevel = iBaseLevel; |
679 FX_INT32 i = 0, iCount = 0; | 679 int32_t i = 0, iCount = 0; |
680 for (; i <= iSize; i ++) { | 680 for (; i <= iSize; i ++) { |
681 switch(classes.GetAt(i)) { | 681 switch(classes.GetAt(i)) { |
682 case FX_BIDICLASS_WS: | 682 case FX_BIDICLASS_WS: |
683 iCount ++; | 683 iCount ++; |
684 break; | 684 break; |
685 case FX_BIDICLASS_RLE: | 685 case FX_BIDICLASS_RLE: |
686 case FX_BIDICLASS_LRE: | 686 case FX_BIDICLASS_LRE: |
687 case FX_BIDICLASS_LRO: | 687 case FX_BIDICLASS_LRO: |
688 case FX_BIDICLASS_RLO: | 688 case FX_BIDICLASS_RLO: |
689 case FX_BIDICLASS_PDF: | 689 case FX_BIDICLASS_PDF: |
(...skipping 12 matching lines...) Expand all Loading... |
702 default: | 702 default: |
703 iCount = 0; | 703 iCount = 0; |
704 break; | 704 break; |
705 } | 705 } |
706 iLevel = levels.GetAt(i); | 706 iLevel = levels.GetAt(i); |
707 } | 707 } |
708 if (iCount > 0) { | 708 if (iCount > 0) { |
709 FX_BidiSetDeferredRun(levels, i, iCount, iBaseLevel); | 709 FX_BidiSetDeferredRun(levels, i, iCount, iBaseLevel); |
710 } | 710 } |
711 } | 711 } |
712 FX_INT32 FX_BidiReorderLevel(FX_INT32 iBaseLevel, CFX_WideString &wsText, const
CFX_Int32Array &levels, FX_INT32 iStart, FX_BOOL bReverse) | 712 int32_t FX_BidiReorderLevel(int32_t iBaseLevel, CFX_WideString &wsText, const CF
X_Int32Array &levels, int32_t iStart, FX_BOOL bReverse) |
713 { | 713 { |
714 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 714 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
715 FXSYS_assert(wsText.GetLength() == levels.GetSize()); | 715 FXSYS_assert(wsText.GetLength() == levels.GetSize()); |
716 FXSYS_assert(iStart >= 0 && iStart < wsText.GetLength()); | 716 FXSYS_assert(iStart >= 0 && iStart < wsText.GetLength()); |
717 FX_INT32 iSize = wsText.GetLength(); | 717 int32_t iSize = wsText.GetLength(); |
718 if (iSize < 1) { | 718 if (iSize < 1) { |
719 return 0; | 719 return 0; |
720 } | 720 } |
721 bReverse = bReverse || FX_IsOdd(iBaseLevel); | 721 bReverse = bReverse || FX_IsOdd(iBaseLevel); |
722 FX_INT32 i = iStart, iLevel; | 722 int32_t i = iStart, iLevel; |
723 for (; i < iSize; i ++) { | 723 for (; i < iSize; i ++) { |
724 if ((iLevel = levels.GetAt(i)) == iBaseLevel) { | 724 if ((iLevel = levels.GetAt(i)) == iBaseLevel) { |
725 continue; | 725 continue; |
726 } | 726 } |
727 if (iLevel < iBaseLevel) { | 727 if (iLevel < iBaseLevel) { |
728 break; | 728 break; |
729 } | 729 } |
730 i += FX_BidiReorderLevel(iBaseLevel + 1, wsText, levels, i, bReverse) -
1; | 730 i += FX_BidiReorderLevel(iBaseLevel + 1, wsText, levels, i, bReverse) -
1; |
731 } | 731 } |
732 FX_INT32 iCount = i - iStart; | 732 int32_t iCount = i - iStart; |
733 if (bReverse && iCount > 1) { | 733 if (bReverse && iCount > 1) { |
734 FX_BidiReverseString(wsText, iStart, iCount); | 734 FX_BidiReverseString(wsText, iStart, iCount); |
735 } | 735 } |
736 return iCount; | 736 return iCount; |
737 } | 737 } |
738 void FX_BidiReorder(FX_INT32 iBaseLevel, CFX_WideString &wsText, const CFX_Int32
Array &levels) | 738 void FX_BidiReorder(int32_t iBaseLevel, CFX_WideString &wsText, const CFX_Int32A
rray &levels) |
739 { | 739 { |
740 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 740 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
741 FXSYS_assert(wsText.GetLength() == levels.GetSize()); | 741 FXSYS_assert(wsText.GetLength() == levels.GetSize()); |
742 FX_INT32 iSize = wsText.GetLength(); | 742 int32_t iSize = wsText.GetLength(); |
743 if (iSize < 1) { | 743 if (iSize < 1) { |
744 return; | 744 return; |
745 } | 745 } |
746 FX_INT32 i = 0; | 746 int32_t i = 0; |
747 while (i < iSize) { | 747 while (i < iSize) { |
748 i += FX_BidiReorderLevel(iBaseLevel, wsText, levels, i, FALSE); | 748 i += FX_BidiReorderLevel(iBaseLevel, wsText, levels, i, FALSE); |
749 } | 749 } |
750 } | 750 } |
751 void FX_BidiLine(CFX_WideString &wsText, FX_INT32 iBaseLevel) | 751 void FX_BidiLine(CFX_WideString &wsText, int32_t iBaseLevel) |
752 { | 752 { |
753 FX_INT32 iLength = wsText.GetLength(); | 753 int32_t iLength = wsText.GetLength(); |
754 if (iLength < 2) { | 754 if (iLength < 2) { |
755 return; | 755 return; |
756 } | 756 } |
757 CFX_Int32Array classes, levels; | 757 CFX_Int32Array classes, levels; |
758 classes.SetAtGrow(iLength - 1, 0); | 758 classes.SetAtGrow(iLength - 1, 0); |
759 levels.SetAtGrow(iLength - 1, 0); | 759 levels.SetAtGrow(iLength - 1, 0); |
760 FX_BidiClassify(wsText, classes, FALSE); | 760 FX_BidiClassify(wsText, classes, FALSE); |
761 FX_BidiResolveExplicit(iBaseLevel, FX_BIDICLASS_N, classes, levels, 0, iLeng
th, 0); | 761 FX_BidiResolveExplicit(iBaseLevel, FX_BIDICLASS_N, classes, levels, 0, iLeng
th, 0); |
762 FX_BidiResolveWeak(iBaseLevel, classes, levels); | 762 FX_BidiResolveWeak(iBaseLevel, classes, levels); |
763 FX_BidiResolveNeutrals(iBaseLevel, classes, levels); | 763 FX_BidiResolveNeutrals(iBaseLevel, classes, levels); |
764 FX_BidiResolveImplicit(classes, levels); | 764 FX_BidiResolveImplicit(classes, levels); |
765 FX_BidiClassify(wsText, classes, TRUE); | 765 FX_BidiClassify(wsText, classes, TRUE); |
766 FX_BidiResolveWhitespace(iBaseLevel, classes, levels); | 766 FX_BidiResolveWhitespace(iBaseLevel, classes, levels); |
767 FX_BidiReorder(iBaseLevel, wsText, levels); | 767 FX_BidiReorder(iBaseLevel, wsText, levels); |
768 classes.RemoveAll(); | 768 classes.RemoveAll(); |
769 levels.RemoveAll(); | 769 levels.RemoveAll(); |
770 } | 770 } |
771 template<class baseType> | 771 template<class baseType> |
772 class CFX_BidiLineTemplate | 772 class CFX_BidiLineTemplate |
773 { | 773 { |
774 public: | 774 public: |
775 void FX_BidiReverseString(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iStar
t, FX_INT32 iCount) | 775 void FX_BidiReverseString(CFX_ArrayTemplate<baseType> &chars, int32_t iStart
, int32_t iCount) |
776 { | 776 { |
777 FXSYS_assert(iStart > -1 && iStart < chars.GetSize()); | 777 FXSYS_assert(iStart > -1 && iStart < chars.GetSize()); |
778 FXSYS_assert(iCount >= 0 && iStart + iCount <= chars.GetSize()); | 778 FXSYS_assert(iCount >= 0 && iStart + iCount <= chars.GetSize()); |
779 baseType *pStart, *pEnd; | 779 baseType *pStart, *pEnd; |
780 FX_INT32 iEnd = iStart + iCount - 1, iTemp; | 780 int32_t iEnd = iStart + iCount - 1, iTemp; |
781 while (iStart < iEnd) { | 781 while (iStart < iEnd) { |
782 pStart = chars.GetDataPtr(iStart ++); | 782 pStart = chars.GetDataPtr(iStart ++); |
783 pEnd = chars.GetDataPtr(iEnd --); | 783 pEnd = chars.GetDataPtr(iEnd --); |
784 iTemp = pStart->m_iBidiPos; | 784 iTemp = pStart->m_iBidiPos; |
785 pStart->m_iBidiPos = pEnd->m_iBidiPos; | 785 pStart->m_iBidiPos = pEnd->m_iBidiPos; |
786 pEnd->m_iBidiPos = iTemp; | 786 pEnd->m_iBidiPos = iTemp; |
787 } | 787 } |
788 } | 788 } |
789 void FX_BidiSetDeferredRun(CFX_ArrayTemplate<baseType> &chars, FX_BOOL bClas
s, FX_INT32 iStart, FX_INT32 iCount, FX_INT32 iValue) | 789 void FX_BidiSetDeferredRun(CFX_ArrayTemplate<baseType> &chars, FX_BOOL bClas
s, int32_t iStart, int32_t iCount, int32_t iValue) |
790 { | 790 { |
791 FXSYS_assert(iStart > -1 && iStart <= chars.GetSize()); | 791 FXSYS_assert(iStart > -1 && iStart <= chars.GetSize()); |
792 FXSYS_assert(iStart - iCount > -1); | 792 FXSYS_assert(iStart - iCount > -1); |
793 baseType *pTC; | 793 baseType *pTC; |
794 FX_INT32 iLast = iStart - iCount; | 794 int32_t iLast = iStart - iCount; |
795 if (bClass) { | 795 if (bClass) { |
796 for (FX_INT32 i = iStart - 1; i >= iLast; i --) { | 796 for (int32_t i = iStart - 1; i >= iLast; i --) { |
797 pTC = chars.GetDataPtr(i); | 797 pTC = chars.GetDataPtr(i); |
798 pTC->m_iBidiClass = (FX_INT16)iValue; | 798 pTC->m_iBidiClass = (int16_t)iValue; |
799 } | 799 } |
800 } else { | 800 } else { |
801 for (FX_INT32 i = iStart - 1; i >= iLast; i --) { | 801 for (int32_t i = iStart - 1; i >= iLast; i --) { |
802 pTC = chars.GetDataPtr(i); | 802 pTC = chars.GetDataPtr(i); |
803 pTC->m_iBidiLevel = (FX_INT16)iValue; | 803 pTC->m_iBidiLevel = (int16_t)iValue; |
804 } | 804 } |
805 } | 805 } |
806 } | 806 } |
807 void FX_BidiClassify(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCount, FX
_BOOL bWS) | 807 void FX_BidiClassify(CFX_ArrayTemplate<baseType> &chars, int32_t iCount, FX_
BOOL bWS) |
808 { | 808 { |
809 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 809 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
810 baseType *pTC; | 810 baseType *pTC; |
811 if (bWS) { | 811 if (bWS) { |
812 for (FX_INT32 i = 0; i < iCount; i ++) { | 812 for (int32_t i = 0; i < iCount; i ++) { |
813 pTC = chars.GetDataPtr(i); | 813 pTC = chars.GetDataPtr(i); |
814 pTC->m_iBidiClass = (FX_INT16)(pTC->m_dwCharProps & FX_BIDICLASS
BITSMASK) >> FX_BIDICLASSBITS; | 814 pTC->m_iBidiClass = (int16_t)(pTC->m_dwCharProps & FX_BIDICLASSB
ITSMASK) >> FX_BIDICLASSBITS; |
815 } | 815 } |
816 } else { | 816 } else { |
817 for (FX_INT32 i = 0; i < iCount; i ++) { | 817 for (int32_t i = 0; i < iCount; i ++) { |
818 pTC = chars.GetDataPtr(i); | 818 pTC = chars.GetDataPtr(i); |
819 pTC->m_iBidiClass = (FX_INT16)gc_FX_BidiNTypes[(pTC->m_dwCharPro
ps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS]; | 819 pTC->m_iBidiClass = (int16_t)gc_FX_BidiNTypes[(pTC->m_dwCharProp
s & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS]; |
820 } | 820 } |
821 } | 821 } |
822 } | 822 } |
823 void FX_BidiResolveExplicit(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCo
unt, FX_INT32 iBaseLevel) | 823 void FX_BidiResolveExplicit(CFX_ArrayTemplate<baseType> &chars, int32_t iCou
nt, int32_t iBaseLevel) |
824 { | 824 { |
825 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 825 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
826 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 826 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
827 if (iCount < 1) { | 827 if (iCount < 1) { |
828 return; | 828 return; |
829 } | 829 } |
830 baseType *pTC; | 830 baseType *pTC; |
831 for (FX_INT32 i = 0; i < iCount; i ++) { | 831 for (int32_t i = 0; i < iCount; i ++) { |
832 pTC = chars.GetDataPtr(i); | 832 pTC = chars.GetDataPtr(i); |
833 pTC->m_iBidiLevel = (FX_INT16)iBaseLevel; | 833 pTC->m_iBidiLevel = (int16_t)iBaseLevel; |
834 } | 834 } |
835 } | 835 } |
836 void FX_BidiResolveWeak(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCount,
FX_INT32 iBaseLevel) | 836 void FX_BidiResolveWeak(CFX_ArrayTemplate<baseType> &chars, int32_t iCount,
int32_t iBaseLevel) |
837 { | 837 { |
838 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 838 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
839 iCount --; | 839 iCount --; |
840 if (iCount < 1) { | 840 if (iCount < 1) { |
841 return; | 841 return; |
842 } | 842 } |
843 baseType *pTC, *pTCNext; | 843 baseType *pTC, *pTCNext; |
844 FX_INT32 iLevelCur = iBaseLevel; | 844 int32_t iLevelCur = iBaseLevel; |
845 FX_INT32 iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; | 845 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; |
846 FX_INT32 i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; | 846 int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; |
847 for (; i <= iCount; i ++) { | 847 for (; i <= iCount; i ++) { |
848 pTC = chars.GetDataPtr(i); | 848 pTC = chars.GetDataPtr(i); |
849 iClsCur = pTC->m_iBidiClass; | 849 iClsCur = pTC->m_iBidiClass; |
850 if (iClsCur == FX_BIDICLASS_BN) { | 850 if (iClsCur == FX_BIDICLASS_BN) { |
851 pTC->m_iBidiLevel = (FX_INT16)iLevelCur; | 851 pTC->m_iBidiLevel = (int16_t)iLevelCur; |
852 if (i == iCount && iLevelCur != iBaseLevel) { | 852 if (i == iCount && iLevelCur != iBaseLevel) { |
853 iClsCur = FX_BidiDirection(iLevelCur); | 853 iClsCur = FX_BidiDirection(iLevelCur); |
854 pTC->m_iBidiClass = (FX_INT16)iClsCur; | 854 pTC->m_iBidiClass = (int16_t)iClsCur; |
855 } else if (i < iCount) { | 855 } else if (i < iCount) { |
856 pTCNext = chars.GetDataPtr(i + 1); | 856 pTCNext = chars.GetDataPtr(i + 1); |
857 FX_INT32 iLevelNext, iLevelNew; | 857 int32_t iLevelNext, iLevelNew; |
858 iClsNew = pTCNext->m_iBidiClass; | 858 iClsNew = pTCNext->m_iBidiClass; |
859 iLevelNext = pTCNext->m_iBidiLevel; | 859 iLevelNext = pTCNext->m_iBidiLevel; |
860 if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { | 860 if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { |
861 iLevelNew = iLevelNext; | 861 iLevelNew = iLevelNext; |
862 if (iLevelCur > iLevelNew) { | 862 if (iLevelCur > iLevelNew) { |
863 iLevelNew = iLevelCur; | 863 iLevelNew = iLevelCur; |
864 } | 864 } |
865 pTC->m_iBidiLevel = (FX_INT16)iLevelNew; | 865 pTC->m_iBidiLevel = (int16_t)iLevelNew; |
866 iClsCur = FX_BidiDirection(iLevelNew); | 866 iClsCur = FX_BidiDirection(iLevelNew); |
867 pTC->m_iBidiClass = (FX_INT16)iClsCur; | 867 pTC->m_iBidiClass = (int16_t)iClsCur; |
868 iLevelCur = iLevelNext; | 868 iLevelCur = iLevelNext; |
869 } else { | 869 } else { |
870 if (iNum > 0) { | 870 if (iNum > 0) { |
871 iNum ++; | 871 iNum ++; |
872 } | 872 } |
873 continue; | 873 continue; |
874 } | 874 } |
875 } else { | 875 } else { |
876 if (iNum > 0) { | 876 if (iNum > 0) { |
877 iNum ++; | 877 iNum ++; |
878 } | 878 } |
879 continue; | 879 continue; |
880 } | 880 } |
881 } | 881 } |
882 FXSYS_assert(iClsCur <= FX_BIDICLASS_BN); | 882 FXSYS_assert(iClsCur <= FX_BIDICLASS_BN); |
883 iAction = gc_FX_BidiWeakActions[iState][iClsCur]; | 883 iAction = gc_FX_BidiWeakActions[iState][iClsCur]; |
884 iClsRun = FX_BidiGetDeferredType(iAction); | 884 iClsRun = FX_BidiGetDeferredType(iAction); |
885 if (iClsRun != FX_BIDIWEAKACTION_XX && iNum > 0) { | 885 if (iClsRun != FX_BIDIWEAKACTION_XX && iNum > 0) { |
886 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); | 886 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); |
887 iNum = 0; | 887 iNum = 0; |
888 } | 888 } |
889 iClsNew = FX_BidiGetResolvedType(iAction); | 889 iClsNew = FX_BidiGetResolvedType(iAction); |
890 if (iClsNew != FX_BIDIWEAKACTION_XX) { | 890 if (iClsNew != FX_BIDIWEAKACTION_XX) { |
891 pTC->m_iBidiClass = (FX_INT16)iClsNew; | 891 pTC->m_iBidiClass = (int16_t)iClsNew; |
892 } | 892 } |
893 if (FX_BIDIWEAKACTION_IX & iAction) { | 893 if (FX_BIDIWEAKACTION_IX & iAction) { |
894 iNum ++; | 894 iNum ++; |
895 } | 895 } |
896 iState = gc_FX_BidiWeakStates[iState][iClsCur]; | 896 iState = gc_FX_BidiWeakStates[iState][iClsCur]; |
897 } | 897 } |
898 if (iNum > 0) { | 898 if (iNum > 0) { |
899 iClsCur = FX_BidiDirection(iBaseLevel); | 899 iClsCur = FX_BidiDirection(iBaseLevel); |
900 iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsC
ur]); | 900 iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsC
ur]); |
901 if (iClsRun != FX_BIDIWEAKACTION_XX) { | 901 if (iClsRun != FX_BIDIWEAKACTION_XX) { |
902 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); | 902 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); |
903 } | 903 } |
904 } | 904 } |
905 } | 905 } |
906 void FX_BidiResolveNeutrals(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCo
unt, FX_INT32 iBaseLevel) | 906 void FX_BidiResolveNeutrals(CFX_ArrayTemplate<baseType> &chars, int32_t iCou
nt, int32_t iBaseLevel) |
907 { | 907 { |
908 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 908 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
909 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 909 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
910 iCount --; | 910 iCount --; |
911 if (iCount < 1) { | 911 if (iCount < 1) { |
912 return; | 912 return; |
913 } | 913 } |
914 baseType *pTC; | 914 baseType *pTC; |
915 FX_INT32 iLevel = iBaseLevel; | 915 int32_t iLevel = iBaseLevel; |
916 FX_INT32 iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; | 916 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; |
917 FX_INT32 i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; | 917 int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; |
918 for (; i <= iCount; i ++) { | 918 for (; i <= iCount; i ++) { |
919 pTC = chars.GetDataPtr(i); | 919 pTC = chars.GetDataPtr(i); |
920 iClsCur = pTC->m_iBidiClass; | 920 iClsCur = pTC->m_iBidiClass; |
921 if (iClsCur == FX_BIDICLASS_BN) { | 921 if (iClsCur == FX_BIDICLASS_BN) { |
922 if (iNum) { | 922 if (iNum) { |
923 iNum ++; | 923 iNum ++; |
924 } | 924 } |
925 continue; | 925 continue; |
926 } | 926 } |
927 FXSYS_assert(iClsCur < FX_BIDICLASS_AL); | 927 FXSYS_assert(iClsCur < FX_BIDICLASS_AL); |
928 iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; | 928 iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; |
929 iClsRun = FX_BidiGetDeferredNeutrals(iAction, iLevel); | 929 iClsRun = FX_BidiGetDeferredNeutrals(iAction, iLevel); |
930 if (iClsRun != FX_BIDICLASS_N && iNum > 0) { | 930 if (iClsRun != FX_BIDICLASS_N && iNum > 0) { |
931 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); | 931 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); |
932 iNum = 0; | 932 iNum = 0; |
933 } | 933 } |
934 iClsNew = FX_BidiGetResolvedNeutrals(iAction); | 934 iClsNew = FX_BidiGetResolvedNeutrals(iAction); |
935 if (iClsNew != FX_BIDICLASS_N) { | 935 if (iClsNew != FX_BIDICLASS_N) { |
936 pTC->m_iBidiClass = (FX_INT16)iClsNew; | 936 pTC->m_iBidiClass = (int16_t)iClsNew; |
937 } | 937 } |
938 if (FX_BIDINEUTRALACTION_In & iAction) { | 938 if (FX_BIDINEUTRALACTION_In & iAction) { |
939 iNum ++; | 939 iNum ++; |
940 } | 940 } |
941 iState = gc_FX_BidiNeutralStates[iState][iClsCur]; | 941 iState = gc_FX_BidiNeutralStates[iState][iClsCur]; |
942 iLevel = pTC->m_iBidiLevel; | 942 iLevel = pTC->m_iBidiLevel; |
943 } | 943 } |
944 if (iNum > 0) { | 944 if (iNum > 0) { |
945 iClsCur = FX_BidiDirection(iLevel); | 945 iClsCur = FX_BidiDirection(iLevel); |
946 iClsRun = FX_BidiGetDeferredNeutrals(gc_FX_BidiNeutralActions[iState
][iClsCur], iLevel); | 946 iClsRun = FX_BidiGetDeferredNeutrals(gc_FX_BidiNeutralActions[iState
][iClsCur], iLevel); |
947 if (iClsRun != FX_BIDICLASS_N) { | 947 if (iClsRun != FX_BIDICLASS_N) { |
948 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); | 948 FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun); |
949 } | 949 } |
950 } | 950 } |
951 } | 951 } |
952 void FX_BidiResolveImplicit(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCo
unt) | 952 void FX_BidiResolveImplicit(CFX_ArrayTemplate<baseType> &chars, int32_t iCou
nt) |
953 { | 953 { |
954 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 954 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
955 baseType *pTC; | 955 baseType *pTC; |
956 FX_INT32 iCls, iLevel; | 956 int32_t iCls, iLevel; |
957 for (FX_INT32 i = 0; i < iCount; i ++) { | 957 for (int32_t i = 0; i < iCount; i ++) { |
958 pTC = chars.GetDataPtr(i); | 958 pTC = chars.GetDataPtr(i); |
959 iCls = pTC->m_iBidiClass; | 959 iCls = pTC->m_iBidiClass; |
960 if (iCls == FX_BIDICLASS_BN) { | 960 if (iCls == FX_BIDICLASS_BN) { |
961 continue; | 961 continue; |
962 } | 962 } |
963 FXSYS_assert(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); | 963 FXSYS_assert(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); |
964 iLevel = pTC->m_iBidiLevel; | 964 iLevel = pTC->m_iBidiLevel; |
965 iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; | 965 iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; |
966 pTC->m_iBidiLevel = (FX_INT16)iLevel; | 966 pTC->m_iBidiLevel = (int16_t)iLevel; |
967 } | 967 } |
968 } | 968 } |
969 void FX_BidiResolveWhitespace(CFX_ArrayTemplate<baseType> &chars, FX_INT32 i
Count, FX_INT32 iBaseLevel) | 969 void FX_BidiResolveWhitespace(CFX_ArrayTemplate<baseType> &chars, int32_t iC
ount, int32_t iBaseLevel) |
970 { | 970 { |
971 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 971 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
972 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 972 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
973 if (iCount < 1) { | 973 if (iCount < 1) { |
974 return; | 974 return; |
975 } | 975 } |
976 iCount --; | 976 iCount --; |
977 FX_INT32 iLevel = iBaseLevel; | 977 int32_t iLevel = iBaseLevel; |
978 FX_INT32 i = 0, iNum = 0; | 978 int32_t i = 0, iNum = 0; |
979 baseType *pTC; | 979 baseType *pTC; |
980 for (; i <= iCount; i ++) { | 980 for (; i <= iCount; i ++) { |
981 pTC = chars.GetDataPtr(i); | 981 pTC = chars.GetDataPtr(i); |
982 switch(pTC->m_iBidiClass) { | 982 switch(pTC->m_iBidiClass) { |
983 case FX_BIDICLASS_WS: | 983 case FX_BIDICLASS_WS: |
984 iNum ++; | 984 iNum ++; |
985 break; | 985 break; |
986 case FX_BIDICLASS_RLE: | 986 case FX_BIDICLASS_RLE: |
987 case FX_BIDICLASS_LRE: | 987 case FX_BIDICLASS_LRE: |
988 case FX_BIDICLASS_LRO: | 988 case FX_BIDICLASS_LRO: |
989 case FX_BIDICLASS_RLO: | 989 case FX_BIDICLASS_RLO: |
990 case FX_BIDICLASS_PDF: | 990 case FX_BIDICLASS_PDF: |
991 case FX_BIDICLASS_BN: | 991 case FX_BIDICLASS_BN: |
992 pTC->m_iBidiLevel = (FX_INT16)iLevel; | 992 pTC->m_iBidiLevel = (int16_t)iLevel; |
993 iNum ++; | 993 iNum ++; |
994 break; | 994 break; |
995 case FX_BIDICLASS_S: | 995 case FX_BIDICLASS_S: |
996 case FX_BIDICLASS_B: | 996 case FX_BIDICLASS_B: |
997 if (iNum > 0) { | 997 if (iNum > 0) { |
998 FX_BidiSetDeferredRun(chars, FALSE, i, iNum, iBaseLevel)
; | 998 FX_BidiSetDeferredRun(chars, FALSE, i, iNum, iBaseLevel)
; |
999 } | 999 } |
1000 pTC->m_iBidiLevel = (FX_INT16)iBaseLevel; | 1000 pTC->m_iBidiLevel = (int16_t)iBaseLevel; |
1001 iNum = 0; | 1001 iNum = 0; |
1002 break; | 1002 break; |
1003 default: | 1003 default: |
1004 iNum = 0; | 1004 iNum = 0; |
1005 break; | 1005 break; |
1006 } | 1006 } |
1007 iLevel = pTC->m_iBidiLevel; | 1007 iLevel = pTC->m_iBidiLevel; |
1008 } | 1008 } |
1009 if (iNum > 0) { | 1009 if (iNum > 0) { |
1010 FX_BidiSetDeferredRun(chars, FALSE, i, iNum, iBaseLevel); | 1010 FX_BidiSetDeferredRun(chars, FALSE, i, iNum, iBaseLevel); |
1011 } | 1011 } |
1012 } | 1012 } |
1013 FX_INT32 FX_BidiReorderLevel(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iC
ount, FX_INT32 iBaseLevel, FX_INT32 iStart, FX_BOOL bReverse) | 1013 int32_t FX_BidiReorderLevel(CFX_ArrayTemplate<baseType> &chars, int32_t iCou
nt, int32_t iBaseLevel, int32_t iStart, FX_BOOL bReverse) |
1014 { | 1014 { |
1015 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 1015 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
1016 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 1016 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
1017 FXSYS_assert(iStart >= 0 && iStart < iCount); | 1017 FXSYS_assert(iStart >= 0 && iStart < iCount); |
1018 if (iCount < 1) { | 1018 if (iCount < 1) { |
1019 return 0; | 1019 return 0; |
1020 } | 1020 } |
1021 baseType *pTC; | 1021 baseType *pTC; |
1022 bReverse = bReverse || FX_IsOdd(iBaseLevel); | 1022 bReverse = bReverse || FX_IsOdd(iBaseLevel); |
1023 FX_INT32 i = iStart, iLevel; | 1023 int32_t i = iStart, iLevel; |
1024 for (; i < iCount; i ++) { | 1024 for (; i < iCount; i ++) { |
1025 pTC = chars.GetDataPtr(i); | 1025 pTC = chars.GetDataPtr(i); |
1026 if ((iLevel = pTC->m_iBidiLevel) == iBaseLevel) { | 1026 if ((iLevel = pTC->m_iBidiLevel) == iBaseLevel) { |
1027 continue; | 1027 continue; |
1028 } | 1028 } |
1029 if (iLevel < iBaseLevel) { | 1029 if (iLevel < iBaseLevel) { |
1030 break; | 1030 break; |
1031 } | 1031 } |
1032 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse)
- 1; | 1032 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse)
- 1; |
1033 } | 1033 } |
1034 FX_INT32 iNum = i - iStart; | 1034 int32_t iNum = i - iStart; |
1035 if (bReverse && iNum > 1) { | 1035 if (bReverse && iNum > 1) { |
1036 FX_BidiReverseString(chars, iStart, iNum); | 1036 FX_BidiReverseString(chars, iStart, iNum); |
1037 } | 1037 } |
1038 return iNum; | 1038 return iNum; |
1039 } | 1039 } |
1040 void FX_BidiReorder(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCount, FX_
INT32 iBaseLevel) | 1040 void FX_BidiReorder(CFX_ArrayTemplate<baseType> &chars, int32_t iCount, int3
2_t iBaseLevel) |
1041 { | 1041 { |
1042 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 1042 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
1043 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 1043 FXSYS_assert(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
1044 FX_INT32 i = 0; | 1044 int32_t i = 0; |
1045 while (i < iCount) { | 1045 while (i < iCount) { |
1046 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, FALSE); | 1046 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, FALSE); |
1047 } | 1047 } |
1048 } | 1048 } |
1049 void FX_BidiPosition(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCount) | 1049 void FX_BidiPosition(CFX_ArrayTemplate<baseType> &chars, int32_t iCount) |
1050 { | 1050 { |
1051 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 1051 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
1052 baseType *pTC; | 1052 baseType *pTC; |
1053 FX_INT32 i = 0; | 1053 int32_t i = 0; |
1054 while (i < iCount) { | 1054 while (i < iCount) { |
1055 pTC = chars.GetDataPtr(i); | 1055 pTC = chars.GetDataPtr(i); |
1056 pTC = chars.GetDataPtr(pTC->m_iBidiPos); | 1056 pTC = chars.GetDataPtr(pTC->m_iBidiPos); |
1057 pTC->m_iBidiOrder = i ++; | 1057 pTC->m_iBidiOrder = i ++; |
1058 } | 1058 } |
1059 } | 1059 } |
1060 | 1060 |
1061 void FX_BidiLine(CFX_ArrayTemplate<baseType> &chars, FX_INT32 iCount, FX_INT
32 iBaseLevel) | 1061 void FX_BidiLine(CFX_ArrayTemplate<baseType> &chars, int32_t iCount, int32_t
iBaseLevel) |
1062 { | 1062 { |
1063 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); | 1063 FXSYS_assert(iCount > -1 && iCount <= chars.GetSize()); |
1064 if (iCount < 2) { | 1064 if (iCount < 2) { |
1065 return; | 1065 return; |
1066 } | 1066 } |
1067 FX_BidiClassify(chars, iCount, FALSE); | 1067 FX_BidiClassify(chars, iCount, FALSE); |
1068 FX_BidiResolveExplicit(chars, iCount, iBaseLevel); | 1068 FX_BidiResolveExplicit(chars, iCount, iBaseLevel); |
1069 FX_BidiResolveWeak(chars, iCount, iBaseLevel); | 1069 FX_BidiResolveWeak(chars, iCount, iBaseLevel); |
1070 FX_BidiResolveNeutrals(chars, iCount, iBaseLevel); | 1070 FX_BidiResolveNeutrals(chars, iCount, iBaseLevel); |
1071 FX_BidiResolveImplicit(chars, iCount); | 1071 FX_BidiResolveImplicit(chars, iCount); |
1072 FX_BidiClassify(chars, iCount, TRUE); | 1072 FX_BidiClassify(chars, iCount, TRUE); |
1073 FX_BidiResolveWhitespace(chars, iCount, iBaseLevel); | 1073 FX_BidiResolveWhitespace(chars, iCount, iBaseLevel); |
1074 FX_BidiReorder(chars, iCount, iBaseLevel); | 1074 FX_BidiReorder(chars, iCount, iBaseLevel); |
1075 FX_BidiPosition(chars, iCount); | 1075 FX_BidiPosition(chars, iCount); |
1076 } | 1076 } |
1077 }; | 1077 }; |
1078 void FX_BidiLine(CFX_TxtCharArray &chars, FX_INT32 iCount, FX_INT32 iBaseLevel) | 1078 void FX_BidiLine(CFX_TxtCharArray &chars, int32_t iCount, int32_t iBaseLevel) |
1079 { | 1079 { |
1080 CFX_BidiLineTemplate<CFX_TxtChar> blt; | 1080 CFX_BidiLineTemplate<CFX_TxtChar> blt; |
1081 blt.FX_BidiLine(chars, iCount, iBaseLevel); | 1081 blt.FX_BidiLine(chars, iCount, iBaseLevel); |
1082 } | 1082 } |
1083 void FX_BidiLine(CFX_RTFCharArray &chars, FX_INT32 iCount, FX_INT32 iBaseLevel) | 1083 void FX_BidiLine(CFX_RTFCharArray &chars, int32_t iCount, int32_t iBaseLevel) |
1084 { | 1084 { |
1085 CFX_BidiLineTemplate<CFX_RTFChar> blt; | 1085 CFX_BidiLineTemplate<CFX_RTFChar> blt; |
1086 blt.FX_BidiLine(chars, iCount, iBaseLevel); | 1086 blt.FX_BidiLine(chars, iCount, iBaseLevel); |
1087 } | 1087 } |
1088 IFX_BidiChar* IFX_BidiChar::Create() | 1088 IFX_BidiChar* IFX_BidiChar::Create() |
1089 { | 1089 { |
1090 return FX_NEW CFX_BidiChar; | 1090 return FX_NEW CFX_BidiChar; |
1091 } | 1091 } |
1092 CFX_BidiChar::CFX_BidiChar() | 1092 CFX_BidiChar::CFX_BidiChar() |
1093 : m_bSeparateNeutral(TRUE) | 1093 : m_bSeparateNeutral(TRUE) |
1094 , m_iCurStart(0) | 1094 , m_iCurStart(0) |
1095 , m_iCurCount(0) | 1095 , m_iCurCount(0) |
1096 , m_iCurBidi(0) | 1096 , m_iCurBidi(0) |
1097 , m_iLastBidi(0) | 1097 , m_iLastBidi(0) |
1098 , m_iLastStart(0) | 1098 , m_iLastStart(0) |
1099 , m_iLastCount(0) | 1099 , m_iLastCount(0) |
1100 { | 1100 { |
1101 } | 1101 } |
1102 FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch) | 1102 FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch) |
1103 { | 1103 { |
1104 FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; | 1104 FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; |
1105 FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; | 1105 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; |
1106 FX_INT32 iContext = 0; | 1106 int32_t iContext = 0; |
1107 switch (iBidiCls) { | 1107 switch (iBidiCls) { |
1108 case FX_BIDICLASS_L: | 1108 case FX_BIDICLASS_L: |
1109 case FX_BIDICLASS_AN: | 1109 case FX_BIDICLASS_AN: |
1110 case FX_BIDICLASS_EN: | 1110 case FX_BIDICLASS_EN: |
1111 iContext = 1; | 1111 iContext = 1; |
1112 break; | 1112 break; |
1113 case FX_BIDICLASS_R: | 1113 case FX_BIDICLASS_R: |
1114 case FX_BIDICLASS_AL: | 1114 case FX_BIDICLASS_AL: |
1115 iContext = 2; | 1115 iContext = 2; |
1116 break; | 1116 break; |
(...skipping 23 matching lines...) Expand all Loading... |
1140 return bRet; | 1140 return bRet; |
1141 } | 1141 } |
1142 FX_BOOL CFX_BidiChar::EndChar() | 1142 FX_BOOL CFX_BidiChar::EndChar() |
1143 { | 1143 { |
1144 m_iLastBidi = m_iCurBidi; | 1144 m_iLastBidi = m_iCurBidi; |
1145 m_iLastStart = m_iCurStart; | 1145 m_iLastStart = m_iCurStart; |
1146 m_iCurStart = m_iCurCount; | 1146 m_iCurStart = m_iCurCount; |
1147 m_iLastCount = m_iCurCount - m_iLastStart; | 1147 m_iLastCount = m_iCurCount - m_iLastStart; |
1148 return m_iLastCount > 0; | 1148 return m_iLastCount > 0; |
1149 } | 1149 } |
1150 FX_INT32 CFX_BidiChar::GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) | 1150 int32_t CFX_BidiChar::GetBidiInfo(int32_t &iStart, int32_t &iCount) |
1151 { | 1151 { |
1152 iStart = m_iLastStart; | 1152 iStart = m_iLastStart; |
1153 iCount = m_iLastCount; | 1153 iCount = m_iLastCount; |
1154 return m_iLastBidi; | 1154 return m_iLastBidi; |
1155 } | 1155 } |
1156 void CFX_BidiChar::Reset() | 1156 void CFX_BidiChar::Reset() |
1157 { | 1157 { |
1158 m_iCurStart = 0; | 1158 m_iCurStart = 0; |
1159 m_iCurCount = 0; | 1159 m_iCurCount = 0; |
1160 m_iCurBidi = 0; | 1160 m_iCurBidi = 0; |
1161 m_iLastBidi = 0; | 1161 m_iLastBidi = 0; |
1162 m_iLastStart = 0; | 1162 m_iLastStart = 0; |
1163 m_iLastCount = 0; | 1163 m_iLastCount = 0; |
1164 } | 1164 } |
OLD | NEW |