Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Side by Side Diff: Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp

Issue 104813005: Explicitly set text direction for TextRuns (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Patch for landing Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/fonts/harfbuzz/HarfBuzzShaper.h ('k') | Source/platform/text/BidiResolver.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 Google Inc. All rights reserved. 2 * Copyright (c) 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 m_features.append(feature); 535 m_features.append(feature);
536 } 536 }
537 } 537 }
538 538
539 bool HarfBuzzShaper::shape(GlyphBuffer* glyphBuffer) 539 bool HarfBuzzShaper::shape(GlyphBuffer* glyphBuffer)
540 { 540 {
541 if (!collectHarfBuzzRuns()) 541 if (!collectHarfBuzzRuns())
542 return false; 542 return false;
543 543
544 m_totalWidth = 0; 544 m_totalWidth = 0;
545 // WebKit doesn't set direction when calulating widths. Leave the direction setting to 545 if (!shapeHarfBuzzRuns())
546 // HarfBuzz when we are calculating widths (except when directionalOverride( ) is set).
547 if (!shapeHarfBuzzRuns(glyphBuffer || m_run.directionalOverride()))
548 return false; 546 return false;
549 547
550 if (!RuntimeEnabledFeatures::subpixelFontScalingEnabled()) 548 if (!RuntimeEnabledFeatures::subpixelFontScalingEnabled())
551 m_totalWidth = roundf(m_totalWidth); 549 m_totalWidth = roundf(m_totalWidth);
552 550
553 if (glyphBuffer && !fillGlyphBuffer(glyphBuffer)) 551 if (glyphBuffer && !fillGlyphBuffer(glyphBuffer))
554 return false; 552 return false;
555 553
556 return true; 554 return true;
557 } 555 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 625
628 static const uint16_t* toUint16(const UChar* src) 626 static const uint16_t* toUint16(const UChar* src)
629 { 627 {
630 // FIXME: This relies on undefined behavior however it works on the 628 // FIXME: This relies on undefined behavior however it works on the
631 // current versions of all compilers we care about and avoids making 629 // current versions of all compilers we care about and avoids making
632 // a copy of the string. 630 // a copy of the string.
633 COMPILE_ASSERT(sizeof(UChar) == sizeof(uint16_t), UChar_is_the_same_size_as_ uint16_t); 631 COMPILE_ASSERT(sizeof(UChar) == sizeof(uint16_t), UChar_is_the_same_size_as_ uint16_t);
634 return reinterpret_cast<const uint16_t*>(src); 632 return reinterpret_cast<const uint16_t*>(src);
635 } 633 }
636 634
637 bool HarfBuzzShaper::shapeHarfBuzzRuns(bool shouldSetDirection) 635 bool HarfBuzzShaper::shapeHarfBuzzRuns()
638 { 636 {
639 HarfBuzzScopedPtr<hb_buffer_t> harfBuzzBuffer(hb_buffer_create(), hb_buffer_ destroy); 637 HarfBuzzScopedPtr<hb_buffer_t> harfBuzzBuffer(hb_buffer_create(), hb_buffer_ destroy);
640 638
641 hb_buffer_set_unicode_funcs(harfBuzzBuffer.get(), hb_icu_get_unicode_funcs() ); 639 hb_buffer_set_unicode_funcs(harfBuzzBuffer.get(), hb_icu_get_unicode_funcs() );
642 HarfBuzzRunCache& runCache = harfBuzzRunCache(); 640 HarfBuzzRunCache& runCache = harfBuzzRunCache();
643 641
644 for (unsigned i = 0; i < m_harfBuzzRuns.size(); ++i) { 642 for (unsigned i = 0; i < m_harfBuzzRuns.size(); ++i) {
645 unsigned runIndex = m_run.rtl() ? m_harfBuzzRuns.size() - i - 1 : i; 643 unsigned runIndex = m_run.rtl() ? m_harfBuzzRuns.size() - i - 1 : i;
646 HarfBuzzRun* currentRun = m_harfBuzzRuns[runIndex].get(); 644 HarfBuzzRun* currentRun = m_harfBuzzRuns[runIndex].get();
647 const SimpleFontData* currentFontData = currentRun->fontData(); 645 const SimpleFontData* currentFontData = currentRun->fontData();
648 if (currentFontData->isSVGFont()) 646 if (currentFontData->isSVGFont())
649 return false; 647 return false;
650 648
651 FontPlatformData* platformData = const_cast<FontPlatformData*>(&currentF ontData->platformData()); 649 FontPlatformData* platformData = const_cast<FontPlatformData*>(&currentF ontData->platformData());
652 HarfBuzzFace* face = platformData->harfBuzzFace(); 650 HarfBuzzFace* face = platformData->harfBuzzFace();
653 if (!face) 651 if (!face)
654 return false; 652 return false;
655 653
656 hb_buffer_set_script(harfBuzzBuffer.get(), currentRun->script()); 654 hb_buffer_set_script(harfBuzzBuffer.get(), currentRun->script());
657 if (shouldSetDirection) 655 hb_buffer_set_direction(harfBuzzBuffer.get(), currentRun->rtl() ? HB_DIR ECTION_RTL : HB_DIRECTION_LTR);
658 hb_buffer_set_direction(harfBuzzBuffer.get(), currentRun->rtl() ? HB _DIRECTION_RTL : HB_DIRECTION_LTR);
659 else
660 // Leaving direction to HarfBuzz to guess is *really* bad, but will do for now.
661 hb_buffer_guess_segment_properties(harfBuzzBuffer.get());
662 656
663 hb_segment_properties_t props; 657 hb_segment_properties_t props;
664 hb_buffer_get_segment_properties(harfBuzzBuffer.get(), &props); 658 hb_buffer_get_segment_properties(harfBuzzBuffer.get(), &props);
665 659
666 const UChar* src = m_normalizedBuffer.get() + currentRun->startIndex(); 660 const UChar* src = m_normalizedBuffer.get() + currentRun->startIndex();
667 std::wstring key(src, src + currentRun->numCharacters()); 661 std::wstring key(src, src + currentRun->numCharacters());
668 662
669 CachedShapingResults* cachedResults = runCache.find(key); 663 CachedShapingResults* cachedResults = runCache.find(key);
670 if (cachedResults) { 664 if (cachedResults) {
671 if (cachedResults->dir == props.direction && cachedResults->font == *m_font) { 665 if (cachedResults->dir == props.direction && cachedResults->font == *m_font) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 if (!foundToX) 880 if (!foundToX)
887 toX = m_run.rtl() ? 0 : m_totalWidth; 881 toX = m_run.rtl() ? 0 : m_totalWidth;
888 882
889 // Using floorf() and roundf() as the same as mac port. 883 // Using floorf() and roundf() as the same as mac port.
890 if (fromX < toX) 884 if (fromX < toX)
891 return FloatRect(floorf(point.x() + fromX), point.y(), roundf(toX - from X), height); 885 return FloatRect(floorf(point.x() + fromX), point.y(), roundf(toX - from X), height);
892 return FloatRect(floorf(point.x() + toX), point.y(), roundf(fromX - toX), he ight); 886 return FloatRect(floorf(point.x() + toX), point.y(), roundf(fromX - toX), he ight);
893 } 887 }
894 888
895 } // namespace WebCore 889 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/platform/fonts/harfbuzz/HarfBuzzShaper.h ('k') | Source/platform/text/BidiResolver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698