OLD | NEW |
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 27 matching lines...) Expand all Loading... |
38 #include "platform/fonts/UTF16TextIterator.h" | 38 #include "platform/fonts/UTF16TextIterator.h" |
39 #include "platform/fonts/opentype/OpenTypeCapsSupport.h" | 39 #include "platform/fonts/opentype/OpenTypeCapsSupport.h" |
40 #include "platform/fonts/shaping/CaseMappingHarfBuzzBufferFiller.h" | 40 #include "platform/fonts/shaping/CaseMappingHarfBuzzBufferFiller.h" |
41 #include "platform/fonts/shaping/HarfBuzzFace.h" | 41 #include "platform/fonts/shaping/HarfBuzzFace.h" |
42 #include "platform/fonts/shaping/RunSegmenter.h" | 42 #include "platform/fonts/shaping/RunSegmenter.h" |
43 #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" | 43 #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" |
44 #include "platform/text/Character.h" | 44 #include "platform/text/Character.h" |
45 #include "platform/text/TextBreakIterator.h" | 45 #include "platform/text/TextBreakIterator.h" |
46 #include "wtf/Compiler.h" | 46 #include "wtf/Compiler.h" |
47 #include "wtf/MathExtras.h" | 47 #include "wtf/MathExtras.h" |
48 #include "wtf/PtrUtil.h" | |
49 #include "wtf/text/Unicode.h" | 48 #include "wtf/text/Unicode.h" |
| 49 |
50 #include <algorithm> | 50 #include <algorithm> |
51 #include <hb.h> | 51 #include <hb.h> |
52 #include <memory> | |
53 #include <unicode/uchar.h> | 52 #include <unicode/uchar.h> |
54 #include <unicode/uscript.h> | 53 #include <unicode/uscript.h> |
55 | 54 |
56 namespace blink { | 55 namespace blink { |
57 | 56 |
58 template<typename T> | 57 template<typename T> |
59 class HarfBuzzScopedPtr { | 58 class HarfBuzzScopedPtr { |
60 STACK_ALLOCATED(); | 59 STACK_ALLOCATED(); |
61 WTF_MAKE_NONCOPYABLE(HarfBuzzScopedPtr); | 60 WTF_MAKE_NONCOPYABLE(HarfBuzzScopedPtr); |
62 public: | 61 public: |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 | 107 |
109 U16_APPEND(destination, *destinationLength, length, character, error); | 108 U16_APPEND(destination, *destinationLength, length, character, error); |
110 ASSERT_UNUSED(error, !error); | 109 ASSERT_UNUSED(error, !error); |
111 } | 110 } |
112 } | 111 } |
113 | 112 |
114 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run) | 113 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run) |
115 : Shaper(font, run) | 114 : Shaper(font, run) |
116 , m_normalizedBufferLength(0) | 115 , m_normalizedBufferLength(0) |
117 { | 116 { |
118 m_normalizedBuffer = wrapArrayUnique(new UChar[m_textRun.length() + 1]); | 117 m_normalizedBuffer = adoptArrayPtr(new UChar[m_textRun.length() + 1]); |
119 normalizeCharacters(m_textRun, m_textRun.length(), m_normalizedBuffer.get(),
&m_normalizedBufferLength); | 118 normalizeCharacters(m_textRun, m_textRun.length(), m_normalizedBuffer.get(),
&m_normalizedBufferLength); |
120 setFontFeatures(); | 119 setFontFeatures(); |
121 } | 120 } |
122 | 121 |
123 static inline hb_feature_t createFeature(uint8_t c1, uint8_t c2, uint8_t c3, uin
t8_t c4, uint32_t value = 0) | 122 static inline hb_feature_t createFeature(uint8_t c1, uint8_t c2, uint8_t c3, uin
t8_t c4, uint32_t value = 0) |
124 { | 123 { |
125 return { HB_TAG(c1, c2, c3, c4), value, 0 /* start */, static_cast<unsigned>
(-1) /* end */ }; | 124 return { HB_TAG(c1, c2, c3, c4), value, 0 /* start */, static_cast<unsigned>
(-1) /* end */ }; |
126 } | 125 } |
127 | 126 |
128 void HarfBuzzShaper::setFontFeatures() | 127 void HarfBuzzShaper::setFontFeatures() |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 // When we're getting here with the last resort font, we have no other | 460 // When we're getting here with the last resort font, we have no other |
462 // choice than adding boxes to the ShapeResult. | 461 // choice than adding boxes to the ShapeResult. |
463 if ((currentClusterResult == NotDef && numCharacters) || isLastResort) { | 462 if ((currentClusterResult == NotDef && numCharacters) || isLastResort) { |
464 hb_direction_t direction = TextDirectionToHBDirection( | 463 hb_direction_t direction = TextDirectionToHBDirection( |
465 m_textRun.direction(), | 464 m_textRun.direction(), |
466 m_font->getFontDescription().orientation(), currentFont); | 465 m_font->getFontDescription().orientation(), currentFont); |
467 // Here we need to specify glyph positions. | 466 // Here we need to specify glyph positions. |
468 ShapeResult::RunInfo* run = new ShapeResult::RunInfo(currentFont, | 467 ShapeResult::RunInfo* run = new ShapeResult::RunInfo(currentFont, |
469 direction, ICUScriptToHBScript(currentRunScript), | 468 direction, ICUScriptToHBScript(currentRunScript), |
470 startIndex, numGlyphsToInsert, numCharacters); | 469 startIndex, numGlyphsToInsert, numCharacters); |
471 shapeResult->insertRun(wrapUnique(run), lastChangePosition, | 470 shapeResult->insertRun(adoptPtr(run), lastChangePosition, |
472 numGlyphsToInsert, | 471 numGlyphsToInsert, |
473 harfBuzzBuffer); | 472 harfBuzzBuffer); |
474 } | 473 } |
475 lastChangePosition = glyphIndex; | 474 lastChangePosition = glyphIndex; |
476 } | 475 } |
477 return true; | 476 return true; |
478 } | 477 } |
479 | 478 |
480 static inline const SimpleFontData* fontDataAdjustedForOrientation(const SimpleF
ontData* originalFont, | 479 static inline const SimpleFontData* fontDataAdjustedForOrientation(const SimpleF
ontData* originalFont, |
481 FontOrientation runOrientation, | 480 FontOrientation runOrientation, |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 hb_buffer_reset(harfBuzzBuffer.get()); | 674 hb_buffer_reset(harfBuzzBuffer.get()); |
676 } | 675 } |
677 } | 676 } |
678 return result.release(); | 677 return result.release(); |
679 } | 678 } |
680 | 679 |
681 PassRefPtr<ShapeResult> ShapeResult::createForTabulationCharacters(const Font* f
ont, | 680 PassRefPtr<ShapeResult> ShapeResult::createForTabulationCharacters(const Font* f
ont, |
682 const TextRun& textRun, float positionOffset, unsigned count) | 681 const TextRun& textRun, float positionOffset, unsigned count) |
683 { | 682 { |
684 const SimpleFontData* fontData = font->primaryFont(); | 683 const SimpleFontData* fontData = font->primaryFont(); |
685 std::unique_ptr<ShapeResult::RunInfo> run = wrapUnique(new ShapeResult::RunI
nfo(fontData, | 684 OwnPtr<ShapeResult::RunInfo> run = adoptPtr(new ShapeResult::RunInfo(fontDat
a, |
686 // Tab characters are always LTR or RTL, not TTB, even when isVerticalAn
yUpright(). | 685 // Tab characters are always LTR or RTL, not TTB, even when isVerticalAn
yUpright(). |
687 textRun.rtl() ? HB_DIRECTION_RTL : HB_DIRECTION_LTR, | 686 textRun.rtl() ? HB_DIRECTION_RTL : HB_DIRECTION_LTR, |
688 HB_SCRIPT_COMMON, 0, count, count)); | 687 HB_SCRIPT_COMMON, 0, count, count)); |
689 float position = textRun.xPos() + positionOffset; | 688 float position = textRun.xPos() + positionOffset; |
690 float startPosition = position; | 689 float startPosition = position; |
691 for (unsigned i = 0; i < count; i++) { | 690 for (unsigned i = 0; i < count; i++) { |
692 float advance = font->tabWidth(*fontData, textRun.getTabSize(), position
); | 691 float advance = font->tabWidth(*fontData, textRun.getTabSize(), position
); |
693 run->m_glyphData[i].characterIndex = i; | 692 run->m_glyphData[i].characterIndex = i; |
694 run->setGlyphAndPositions(i, fontData->spaceGlyph(), advance, 0, 0); | 693 run->setGlyphAndPositions(i, fontData->spaceGlyph(), advance, 0, 0); |
695 position += advance; | 694 position += advance; |
696 } | 695 } |
697 run->m_width = position - startPosition; | 696 run->m_width = position - startPosition; |
698 | 697 |
699 RefPtr<ShapeResult> result = ShapeResult::create(font, count, textRun.direct
ion()); | 698 RefPtr<ShapeResult> result = ShapeResult::create(font, count, textRun.direct
ion()); |
700 result->m_width = run->m_width; | 699 result->m_width = run->m_width; |
701 result->m_numGlyphs = count; | 700 result->m_numGlyphs = count; |
702 ASSERT(result->m_numGlyphs == count); // no overflow | 701 ASSERT(result->m_numGlyphs == count); // no overflow |
703 result->m_hasVerticalOffsets = fontData->platformData().isVerticalAnyUpright
(); | 702 result->m_hasVerticalOffsets = fontData->platformData().isVerticalAnyUpright
(); |
704 result->m_runs.append(std::move(run)); | 703 result->m_runs.append(std::move(run)); |
705 return result.release(); | 704 return result.release(); |
706 } | 705 } |
707 | 706 |
708 | 707 |
709 } // namespace blink | 708 } // namespace blink |
OLD | NEW |