| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
| 5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 * | 21 * |
| 22 */ | 22 */ |
| 23 | 23 |
| 24 #include "config.h" | 24 #include "config.h" |
| 25 #include "core/platform/graphics/Font.h" | 25 #include "core/platform/graphics/Font.h" |
| 26 | 26 |
| 27 #include "core/platform/graphics/FloatRect.h" | 27 #include "core/platform/graphics/FloatRect.h" |
| 28 #include "core/platform/graphics/TextRun.h" | 28 #include "core/platform/graphics/TextRun.h" |
| 29 #include "core/platform/graphics/WidthIterator.h" | 29 #include "core/platform/graphics/WidthIterator.h" |
| 30 #include "core/platform/text/transcoder/FontTranscoder.h" | 30 #include "core/platform/text/transcoder/FontTranscoder.h" |
| 31 #include <wtf/MainThread.h> | 31 #include "wtf/MainThread.h" |
| 32 #include <wtf/MathExtras.h> | 32 #include "wtf/MathExtras.h" |
| 33 #include <wtf/text/StringBuilder.h> | 33 #include "wtf/StdLibExtras.h" |
| 34 #include <wtf/UnusedParam.h> | 34 #include "wtf/UnusedParam.h" |
| 35 #include "wtf/text/StringBuilder.h" |
| 35 | 36 |
| 36 using namespace WTF; | 37 using namespace WTF; |
| 37 using namespace Unicode; | 38 using namespace Unicode; |
| 38 | 39 |
| 39 namespace WTF { | 40 namespace WTF { |
| 40 | 41 |
| 41 // allow compilation of OwnPtr<TextLayout> in source files that don't have acces
s to the TextLayout class definition | 42 // allow compilation of OwnPtr<TextLayout> in source files that don't have acces
s to the TextLayout class definition |
| 42 template <> void deleteOwnedPtr<WebCore::TextLayout>(WebCore::TextLayout* ptr) | 43 template <> void deleteOwnedPtr<WebCore::TextLayout>(WebCore::TextLayout* ptr) |
| 43 { | 44 { |
| 44 WebCore::Font::deleteLayout(ptr); | 45 WebCore::Font::deleteLayout(ptr); |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 if (!run.characterScanForCodePath()) | 347 if (!run.characterScanForCodePath()) |
| 347 return Simple; | 348 return Simple; |
| 348 | 349 |
| 349 if (run.is8Bit()) | 350 if (run.is8Bit()) |
| 350 return Simple; | 351 return Simple; |
| 351 | 352 |
| 352 // Start from 0 since drawing and highlighting also measure the characters b
efore run->from. | 353 // Start from 0 since drawing and highlighting also measure the characters b
efore run->from. |
| 353 return characterRangeCodePath(run.characters16(), run.length()); | 354 return characterRangeCodePath(run.characters16(), run.length()); |
| 354 } | 355 } |
| 355 | 356 |
| 357 static inline UChar keyExtractor(const UChar* value) |
| 358 { |
| 359 return *value; |
| 360 } |
| 361 |
| 356 Font::CodePath Font::characterRangeCodePath(const UChar* characters, unsigned le
n) | 362 Font::CodePath Font::characterRangeCodePath(const UChar* characters, unsigned le
n) |
| 357 { | 363 { |
| 358 // FIXME: Should use a UnicodeSet in ports where ICU is used. Note that we | 364 static UChar complexCodePathRanges[] = { |
| 359 // can't simply use UnicodeCharacter Property/class because some characters | 365 // U+02E5 through U+02E9 (Modifier Letters : Tone letters) |
| 360 // are not 'combining', but still need to go to the complex path. | 366 0x2E5, 0x2E9, |
| 361 // Alternatively, we may as well consider binary search over a sorted | 367 // U+0300 through U+036F Combining diacritical marks |
| 362 // list of ranges. | 368 0x300, 0x36F, |
| 369 // U+0591 through U+05CF excluding U+05BE Hebrew combining marks, ... |
| 370 0x0591, 0x05BD, |
| 371 // ... Hebrew punctuation Paseq, Sof Pasuq and Nun Hafukha |
| 372 0x05BF, 0x05CF, |
| 373 // U+0600 through U+109F Arabic, Syriac, Thaana, NKo, Samaritan, Mandaic
, |
| 374 // Devanagari, Bengali, Gurmukhi, Gujarati, Oriya, Tamil, Telugu, Kannad
a, |
| 375 // Malayalam, Sinhala, Thai, Lao, Tibetan, Myanmar |
| 376 0x0600, 0x109F, |
| 377 // U+1100 through U+11FF Hangul Jamo (only Ancient Korean should be left |
| 378 // here if you precompose; Modern Korean will be precomposed as a result
of step A) |
| 379 0x1100, 0x11FF, |
| 380 // U+135D through U+135F Ethiopic combining marks |
| 381 0x135D, 0x135F, |
| 382 // U+1780 through U+18AF Tagalog, Hanunoo, Buhid, Taghanwa,Khmer, Mongol
ian |
| 383 0x1700, 0x18AF, |
| 384 // U+1900 through U+194F Limbu (Unicode 4.0) |
| 385 0x1900, 0x194F, |
| 386 // U+1980 through U+19DF New Tai Lue |
| 387 0x1980, 0x19DF, |
| 388 // U+1A00 through U+1CFF Buginese, Tai Tham, Balinese, Batak, Lepcha, Ve
dic |
| 389 0x1A00, 0x1CFF, |
| 390 // U+1DC0 through U+1DFF Comining diacritical mark supplement |
| 391 0x1DC0, 0x1DFF, |
| 392 // U+20D0 through U+20FF Combining marks for symbols |
| 393 0x20D0, 0x20FF, |
| 394 // U+2CEF through U+2CF1 Combining marks for Coptic |
| 395 0x2CEF, 0x2CF1, |
| 396 // U+302A through U+302F Ideographic and Hangul Tone marks |
| 397 0x302A, 0x302F, |
| 398 // U+A67C through U+A67D Combining marks for old Cyrillic |
| 399 0xA67C, 0xA67D, |
| 400 // U+A6F0 through U+A6F1 Combining mark for Bamum |
| 401 0xA6F0, 0xA6F1, |
| 402 // U+A800 through U+ABFF Nagri, Phags-pa, Saurashtra, Devanagari Extende
d, |
| 403 // Hangul Jamo Ext. A, Javanese, Myanmar Extended A, Tai Viet, Meetei Ma
yek |
| 404 0xA800, 0xABFF, |
| 405 // U+D7B0 through U+D7FF Hangul Jamo Ext. B |
| 406 0xD7B0, 0xD7FF, |
| 407 // U+FE00 through U+FE0F Unicode variation selectors |
| 408 0xFE00, 0xFE0F, |
| 409 // U+FE20 through U+FE2F Combining half marks |
| 410 0xFE20, 0xFE2F, |
| 411 }; |
| 412 static size_t complexCodePathRangesCount = WTF_ARRAY_LENGTH(complexCodePathR
anges); |
| 413 |
| 363 CodePath result = Simple; | 414 CodePath result = Simple; |
| 364 for (unsigned i = 0; i < len; i++) { | 415 for (unsigned i = 0; i < len; i++) { |
| 365 const UChar c = characters[i]; | 416 const UChar c = characters[i]; |
| 366 if (c < 0x2E5) // U+02E5 through U+02E9 (Modifier Letters : Tone letters
) | 417 |
| 418 // Shortcut for common case |
| 419 if (c < 0x2E5) |
| 367 continue; | 420 continue; |
| 368 if (c <= 0x2E9) | |
| 369 return Complex; | |
| 370 | |
| 371 if (c < 0x300) // U+0300 through U+036F Combining diacritical marks | |
| 372 continue; | |
| 373 if (c <= 0x36F) | |
| 374 return Complex; | |
| 375 | |
| 376 if (c < 0x0591 || c == 0x05BE) // U+0591 through U+05CF excluding U+05BE
Hebrew combining marks, Hebrew punctuation Paseq, Sof Pasuq and Nun Hafukha | |
| 377 continue; | |
| 378 if (c <= 0x05CF) | |
| 379 return Complex; | |
| 380 | |
| 381 // U+0600 through U+109F Arabic, Syriac, Thaana, NKo, Samaritan, Mandaic
, | |
| 382 // Devanagari, Bengali, Gurmukhi, Gujarati, Oriya, Tamil, Telugu, Kannad
a, | |
| 383 // Malayalam, Sinhala, Thai, Lao, Tibetan, Myanmar | |
| 384 if (c < 0x0600) | |
| 385 continue; | |
| 386 if (c <= 0x109F) | |
| 387 return Complex; | |
| 388 | |
| 389 // U+1100 through U+11FF Hangul Jamo (only Ancient Korean should be left
here if you precompose; | |
| 390 // Modern Korean will be precomposed as a result of step A) | |
| 391 if (c < 0x1100) | |
| 392 continue; | |
| 393 if (c <= 0x11FF) | |
| 394 return Complex; | |
| 395 | |
| 396 if (c < 0x135D) // U+135D through U+135F Ethiopic combining marks | |
| 397 continue; | |
| 398 if (c <= 0x135F) | |
| 399 return Complex; | |
| 400 | |
| 401 if (c < 0x1700) // U+1780 through U+18AF Tagalog, Hanunoo, Buhid, Taghan
wa,Khmer, Mongolian | |
| 402 continue; | |
| 403 if (c <= 0x18AF) | |
| 404 return Complex; | |
| 405 | |
| 406 if (c < 0x1900) // U+1900 through U+194F Limbu (Unicode 4.0) | |
| 407 continue; | |
| 408 if (c <= 0x194F) | |
| 409 return Complex; | |
| 410 | |
| 411 if (c < 0x1980) // U+1980 through U+19DF New Tai Lue | |
| 412 continue; | |
| 413 if (c <= 0x19DF) | |
| 414 return Complex; | |
| 415 | |
| 416 if (c < 0x1A00) // U+1A00 through U+1CFF Buginese, Tai Tham, Balinese, B
atak, Lepcha, Vedic | |
| 417 continue; | |
| 418 if (c <= 0x1CFF) | |
| 419 return Complex; | |
| 420 | |
| 421 if (c < 0x1DC0) // U+1DC0 through U+1DFF Comining diacritical mark suppl
ement | |
| 422 continue; | |
| 423 if (c <= 0x1DFF) | |
| 424 return Complex; | |
| 425 | 421 |
| 426 // U+1E00 through U+2000 characters with diacritics and stacked diacriti
cs | 422 // U+1E00 through U+2000 characters with diacritics and stacked diacriti
cs |
| 427 if (c <= 0x2000) { | 423 if (c >= 0x1E00 && c <= 0x2000) { |
| 428 result = SimpleWithGlyphOverflow; | 424 result = SimpleWithGlyphOverflow; |
| 429 continue; | 425 continue; |
| 430 } | 426 } |
| 431 | 427 |
| 432 if (c < 0x20D0) // U+20D0 through U+20FF Combining marks for symbols | 428 // Surrogate pairs |
| 433 continue; | 429 if (c > 0xD7FF && c <= 0xDBFF) { |
| 434 if (c <= 0x20FF) | |
| 435 return Complex; | |
| 436 | |
| 437 if (c < 0x2CEF) // U+2CEF through U+2CF1 Combining marks for Coptic | |
| 438 continue; | |
| 439 if (c <= 0x2CF1) | |
| 440 return Complex; | |
| 441 | |
| 442 if (c < 0x302A) // U+302A through U+302F Ideographic and Hangul Tone mar
ks | |
| 443 continue; | |
| 444 if (c <= 0x302F) | |
| 445 return Complex; | |
| 446 | |
| 447 if (c < 0xA67C) // U+A67C through U+A67D Combining marks for old Cyrilli
c | |
| 448 continue; | |
| 449 if (c <= 0xA67D) | |
| 450 return Complex; | |
| 451 | |
| 452 if (c < 0xA6F0) // U+A6F0 through U+A6F1 Combining mark for Bamum | |
| 453 continue; | |
| 454 if (c <= 0xA6F1) | |
| 455 return Complex; | |
| 456 | |
| 457 // U+A800 through U+ABFF Nagri, Phags-pa, Saurashtra, Devanagari Extended
, | |
| 458 // Hangul Jamo Ext. A, Javanese, Myanmar Extended A, Tai Viet, Meetei May
ek, | |
| 459 if (c < 0xA800) | |
| 460 continue; | |
| 461 if (c <= 0xABFF) | |
| 462 return Complex; | |
| 463 | |
| 464 if (c < 0xD7B0) // U+D7B0 through U+D7FF Hangul Jamo Ext. B | |
| 465 continue; | |
| 466 if (c <= 0xD7FF) | |
| 467 return Complex; | |
| 468 | |
| 469 if (c <= 0xDBFF) { | |
| 470 // High surrogate | |
| 471 | |
| 472 if (i == len - 1) | 430 if (i == len - 1) |
| 473 continue; | 431 continue; |
| 474 | 432 |
| 475 UChar next = characters[++i]; | 433 UChar next = characters[++i]; |
| 476 if (!U16_IS_TRAIL(next)) | 434 if (!U16_IS_TRAIL(next)) |
| 477 continue; | 435 continue; |
| 478 | 436 |
| 479 UChar32 supplementaryCharacter = U16_GET_SUPPLEMENTARY(c, next); | 437 UChar32 supplementaryCharacter = U16_GET_SUPPLEMENTARY(c, next); |
| 480 | 438 |
| 481 if (supplementaryCharacter < 0x1F1E6) // U+1F1E6 through U+1F1FF Reg
ional Indicator Symbols | 439 if (supplementaryCharacter < 0x1F1E6) // U+1F1E6 through U+1F1FF Reg
ional Indicator Symbols |
| 482 continue; | 440 continue; |
| 483 if (supplementaryCharacter <= 0x1F1FF) | 441 if (supplementaryCharacter <= 0x1F1FF) |
| 484 return Complex; | 442 return Complex; |
| 485 | 443 |
| 486 if (supplementaryCharacter < 0xE0100) // U+E0100 through U+E01EF Uni
code variation selectors. | 444 if (supplementaryCharacter < 0xE0100) // U+E0100 through U+E01EF Uni
code variation selectors. |
| 487 continue; | 445 continue; |
| 488 if (supplementaryCharacter <= 0xE01EF) | 446 if (supplementaryCharacter <= 0xE01EF) |
| 489 return Complex; | 447 return Complex; |
| 490 | 448 |
| 491 // FIXME: Check for Brahmi (U+11000 block), Kaithi (U+11080 block) a
nd other complex scripts | 449 // FIXME: Check for Brahmi (U+11000 block), Kaithi (U+11080 block) a
nd other complex scripts |
| 492 // in plane 1 or higher. | 450 // in plane 1 or higher. |
| 493 | 451 |
| 494 continue; | 452 continue; |
| 495 } | 453 } |
| 496 | 454 |
| 497 if (c < 0xFE00) // U+FE00 through U+FE0F Unicode variation selectors | 455 // Search for other Complex cases |
| 456 UChar* boundingCharacter = approximateBinarySearch<UChar, UChar>( |
| 457 (UChar*)complexCodePathRanges, complexCodePathRangesCount, c, keyExt
ractor); |
| 458 // Exact matches are complex |
| 459 if (*boundingCharacter == c) |
| 460 return Complex; |
| 461 bool isEndOfRange = ((boundingCharacter - complexCodePathRanges) % 2); |
| 462 if (*boundingCharacter < c) { |
| 463 // Determine if we are in a range or out |
| 464 if (!isEndOfRange) |
| 465 return Complex; |
| 498 continue; | 466 continue; |
| 499 if (c <= 0xFE0F) | 467 } |
| 500 return Complex; | 468 ASSERT(*boundingCharacter > c); |
| 501 | 469 // Determine if we are in a range or out - opposite condition to above |
| 502 if (c < 0xFE20) // U+FE20 through U+FE2F Combining half marks | 470 if (isEndOfRange) |
| 503 continue; | |
| 504 if (c <= 0xFE2F) | |
| 505 return Complex; | 471 return Complex; |
| 506 } | 472 } |
| 473 |
| 507 return result; | 474 return result; |
| 508 } | 475 } |
| 509 | 476 |
| 510 bool Font::isCJKIdeograph(UChar32 c) | 477 bool Font::isCJKIdeograph(UChar32 c) |
| 511 { | 478 { |
| 512 // The basic CJK Unified Ideographs block. | 479 // The basic CJK Unified Ideographs block. |
| 513 if (c >= 0x4E00 && c <= 0x9FFF) | 480 if (c >= 0x4E00 && c <= 0x9FFF) |
| 514 return true; | 481 return true; |
| 515 | 482 |
| 516 // CJK Unified Ideographs Extension A. | 483 // CJK Unified Ideographs Extension A. |
| 517 if (c >= 0x3400 && c <= 0x4DBF) | 484 if (c >= 0x3400 && c <= 0x4DBF) |
| 518 return true; | 485 return true; |
| 519 | 486 |
| 520 // CJK Radicals Supplement. | 487 // CJK Radicals Supplement and Kangxi Radicals. |
| 521 if (c >= 0x2E80 && c <= 0x2EFF) | 488 if (c >= 0x2E80 && c <= 0x2FDF) |
| 522 return true; | |
| 523 | |
| 524 // Kangxi Radicals. | |
| 525 if (c >= 0x2F00 && c <= 0x2FDF) | |
| 526 return true; | 489 return true; |
| 527 | 490 |
| 528 // CJK Strokes. | 491 // CJK Strokes. |
| 529 if (c >= 0x31C0 && c <= 0x31EF) | 492 if (c >= 0x31C0 && c <= 0x31EF) |
| 530 return true; | 493 return true; |
| 531 | 494 |
| 532 // CJK Compatibility Ideographs. | 495 // CJK Compatibility Ideographs. |
| 533 if (c >= 0xF900 && c <= 0xFAFF) | 496 if (c >= 0xF900 && c <= 0xFAFF) |
| 534 return true; | 497 return true; |
| 535 | 498 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 | 533 |
| 571 if (c >= 0x2156 && c <= 0x215A) | 534 if (c >= 0x2156 && c <= 0x215A) |
| 572 return true; | 535 return true; |
| 573 | 536 |
| 574 if (c >= 0x2160 && c <= 0x216B) | 537 if (c >= 0x2160 && c <= 0x216B) |
| 575 return true; | 538 return true; |
| 576 | 539 |
| 577 if (c >= 0x2170 && c <= 0x217B) | 540 if (c >= 0x2170 && c <= 0x217B) |
| 578 return true; | 541 return true; |
| 579 | 542 |
| 580 if ((c == 0x217F) || (c == 0x2189) || (c == 0x2307) || (c == 0x2312) || (c =
= 0x23BE) || (c == 0x23BF)) | 543 if ((c == 0x217F) || (c == 0x2189) || (c == 0x2307) || (c == 0x2312)) |
| 581 return true; | 544 return true; |
| 582 | 545 |
| 583 if (c >= 0x23C0 && c <= 0x23CC) | 546 if (c >= 0x23BE && c <= 0x23CC) |
| 584 return true; | 547 return true; |
| 585 | 548 |
| 586 if ((c == 0x23CE) || (c == 0x2423)) | 549 if ((c == 0x23CE) || (c == 0x2423)) |
| 587 return true; | 550 return true; |
| 588 | 551 |
| 589 if (c >= 0x2460 && c <= 0x2492) | 552 if (c >= 0x2460 && c <= 0x2492) |
| 590 return true; | 553 return true; |
| 591 | 554 |
| 592 if (c >= 0x249C && c <= 0x24FF) | 555 if (c >= 0x249C && c <= 0x24FF) |
| 593 return true; | 556 return true; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 624 | 587 |
| 625 if ((c == 0x26A0) || (c == 0x26BD) || (c == 0x26BE) || (c == 0x2713) || (c =
= 0x271A) || (c == 0x273F) || (c == 0x2740) || (c == 0x2756)) | 588 if ((c == 0x26A0) || (c == 0x26BD) || (c == 0x26BE) || (c == 0x2713) || (c =
= 0x271A) || (c == 0x273F) || (c == 0x2740) || (c == 0x2756)) |
| 626 return true; | 589 return true; |
| 627 | 590 |
| 628 if (c >= 0x2776 && c <= 0x277F) | 591 if (c >= 0x2776 && c <= 0x277F) |
| 629 return true; | 592 return true; |
| 630 | 593 |
| 631 if (c == 0x2B1A) | 594 if (c == 0x2B1A) |
| 632 return true; | 595 return true; |
| 633 | 596 |
| 634 // Ideographic Description Characters. | 597 // Ideographic Description Characters, with CJK Symbols and Punctuation, exc
luding 0x3030. |
| 635 if (c >= 0x2FF0 && c <= 0x2FFF) | 598 // Then Hiragana 0x3040 .. 0x309F, Katakana 0x30A0 .. 0x30FF, Bopomofo 0x310
0 .. 0x312F |
| 636 return true; | 599 if (c >= 0x2FF0 && c < 0x3030) |
| 637 | |
| 638 // CJK Symbols and Punctuation, excluding 0x3030. | |
| 639 if (c >= 0x3000 && c < 0x3030) | |
| 640 return true; | 600 return true; |
| 641 | 601 |
| 642 if (c > 0x3030 && c <= 0x303F) | 602 if (c > 0x3030 && c <= 0x312F) |
| 643 return true; | 603 return true; |
| 644 | 604 |
| 645 // Hiragana | 605 // More Bopomofo and Bopomofo Extended 0x31A0 .. 0x31BF |
| 646 if (c >= 0x3040 && c <= 0x309F) | 606 if (c >= 0x3190 && c <= 0x31BF) |
| 647 return true; | |
| 648 | |
| 649 // Katakana | |
| 650 if (c >= 0x30A0 && c <= 0x30FF) | |
| 651 return true; | |
| 652 | |
| 653 // Bopomofo | |
| 654 if (c >= 0x3100 && c <= 0x312F) | |
| 655 return true; | |
| 656 | |
| 657 if (c >= 0x3190 && c <= 0x319F) | |
| 658 return true; | |
| 659 | |
| 660 // Bopomofo Extended | |
| 661 if (c >= 0x31A0 && c <= 0x31BF) | |
| 662 return true; | 607 return true; |
| 663 | 608 |
| 664 // Enclosed CJK Letters and Months. | 609 // Enclosed CJK Letters and Months (0x3200 .. 0x32FF). |
| 665 if (c >= 0x3200 && c <= 0x32FF) | 610 // CJK Compatibility (0x3300 .. 0x33FF). |
| 666 return true; | 611 if (c >= 0x3200 && c <= 0x33FF) |
| 667 | |
| 668 // CJK Compatibility. | |
| 669 if (c >= 0x3300 && c <= 0x33FF) | |
| 670 return true; | 612 return true; |
| 671 | 613 |
| 672 if (c >= 0xF860 && c <= 0xF862) | 614 if (c >= 0xF860 && c <= 0xF862) |
| 673 return true; | 615 return true; |
| 674 | 616 |
| 675 // CJK Compatibility Forms. | 617 // CJK Compatibility Forms. |
| 676 if (c >= 0xFE30 && c <= 0xFE4F) | 618 if (c >= 0xFE30 && c <= 0xFE4F) |
| 677 return true; | 619 return true; |
| 678 | 620 |
| 679 if ((c == 0xFE10) || (c == 0xFE11) || (c == 0xFE12) || (c == 0xFE19)) | 621 if ((c == 0xFE10) || (c == 0xFE11) || (c == 0xFE12) || (c == 0xFE19)) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 696 | 638 |
| 697 if (c >= 0x1F130 && c <= 0x1F149) | 639 if (c >= 0x1F130 && c <= 0x1F149) |
| 698 return true; | 640 return true; |
| 699 | 641 |
| 700 if (c >= 0x1F150 && c <= 0x1F169) | 642 if (c >= 0x1F150 && c <= 0x1F169) |
| 701 return true; | 643 return true; |
| 702 | 644 |
| 703 if (c >= 0x1F170 && c <= 0x1F189) | 645 if (c >= 0x1F170 && c <= 0x1F189) |
| 704 return true; | 646 return true; |
| 705 | 647 |
| 706 if (c >= 0x1F200 && c <= 0x1F6F) | 648 if (c >= 0x1F200 && c <= 0x1F6FF) |
| 707 return true; | 649 return true; |
| 708 | 650 |
| 709 return isCJKIdeograph(c); | 651 return isCJKIdeograph(c); |
| 710 } | 652 } |
| 711 | 653 |
| 712 unsigned Font::expansionOpportunityCount(const LChar* characters, size_t length,
TextDirection direction, bool& isAfterExpansion) | 654 unsigned Font::expansionOpportunityCount(const LChar* characters, size_t length,
TextDirection direction, bool& isAfterExpansion) |
| 713 { | 655 { |
| 714 unsigned count = 0; | 656 unsigned count = 0; |
| 715 if (direction == LTR) { | 657 if (direction == LTR) { |
| 716 for (size_t i = 0; i < length; ++i) { | 658 for (size_t i = 0; i < length; ++i) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 732 |
| 791 // Additional word-separator characters listed in CSS Text Level 3 Editor's
Draft 3 November 2010. | 733 // Additional word-separator characters listed in CSS Text Level 3 Editor's
Draft 3 November 2010. |
| 792 if (c == ethiopicWordspace || c == aegeanWordSeparatorLine || c == aegeanWor
dSeparatorDot | 734 if (c == ethiopicWordspace || c == aegeanWordSeparatorLine || c == aegeanWor
dSeparatorDot |
| 793 || c == ugariticWordDivider || c == tibetanMarkIntersyllabicTsheg || c =
= tibetanMarkDelimiterTshegBstar) | 735 || c == ugariticWordDivider || c == tibetanMarkIntersyllabicTsheg || c =
= tibetanMarkDelimiterTshegBstar) |
| 794 return false; | 736 return false; |
| 795 | 737 |
| 796 return true; | 738 return true; |
| 797 } | 739 } |
| 798 | 740 |
| 799 } | 741 } |
| OLD | NEW |