OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkFindAndPositionGlyph_DEFINED | 8 #ifndef SkFindAndPositionGlyph_DEFINED |
9 #define SkFindAndPositionGlyph_DEFINED | 9 #define SkFindAndPositionGlyph_DEFINED |
10 | 10 |
11 #include "SkAutoKern.h" | 11 #include "SkAutoKern.h" |
12 #include "SkGlyph.h" | 12 #include "SkGlyph.h" |
13 #include "SkGlyphCache.h" | 13 #include "SkGlyphCache.h" |
14 #include "SkPaint.h" | 14 #include "SkPaint.h" |
15 #include "SkTemplates.h" | 15 #include "SkTemplates.h" |
16 #include "SkUtils.h" | 16 #include "SkUtils.h" |
| 17 #include <utility> |
17 | 18 |
18 // Calculate a type with the same size as the max of all the Ts. | 19 // Calculate a type with the same size as the max of all the Ts. |
19 // This must be top level because the is no specialization of inner classes. | 20 // This must be top level because the is no specialization of inner classes. |
20 template<typename... Ts> struct SkMaxSizeOf; | 21 template<typename... Ts> struct SkMaxSizeOf; |
21 | 22 |
22 template<> | 23 template<> |
23 struct SkMaxSizeOf<> { | 24 struct SkMaxSizeOf<> { |
24 static const size_t value = 0; | 25 static const size_t value = 0; |
25 }; | 26 }; |
26 | 27 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 UntaggedVariant(UntaggedVariant&&) = delete; | 85 UntaggedVariant(UntaggedVariant&&) = delete; |
85 UntaggedVariant& operator=(UntaggedVariant&&) = delete; | 86 UntaggedVariant& operator=(UntaggedVariant&&) = delete; |
86 | 87 |
87 template<typename Variant, typename... Args> | 88 template<typename Variant, typename... Args> |
88 void initialize(Args&&... args) { | 89 void initialize(Args&&... args) { |
89 SkASSERT(sizeof(Variant) <= sizeof(fSpace)); | 90 SkASSERT(sizeof(Variant) <= sizeof(fSpace)); |
90 #if defined(_MSC_VER) && _MSC_VER < 1900 | 91 #if defined(_MSC_VER) && _MSC_VER < 1900 |
91 #define alignof __alignof | 92 #define alignof __alignof |
92 #endif | 93 #endif |
93 SkASSERT(alignof(Variant) <= alignof(Space)); | 94 SkASSERT(alignof(Variant) <= alignof(Space)); |
94 new(&fSpace) Variant(skstd::forward<Args>(args)...); | 95 new(&fSpace) Variant(std::forward<Args>(args)...); |
95 } | 96 } |
96 | 97 |
97 private: | 98 private: |
98 typedef SkAlignedSStorage<SkMaxSizeOf<Ts...>::value> Space; | 99 typedef SkAlignedSStorage<SkMaxSizeOf<Ts...>::value> Space; |
99 Space fSpace; | 100 Space fSpace; |
100 }; | 101 }; |
101 | 102 |
102 // PolymorphicVariant holds subclasses of Base without slicing. Ts must be s
ubclasses of Base. | 103 // PolymorphicVariant holds subclasses of Base without slicing. Ts must be s
ubclasses of Base. |
103 template<typename Base, typename... Ts> | 104 template<typename Base, typename... Ts> |
104 class PolymorphicVariant { | 105 class PolymorphicVariant { |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 ProcessOneGlyph, SkPaint::kLeft_Align, kX_SkAxisAlignment> Positione
r; | 603 ProcessOneGlyph, SkPaint::kLeft_Align, kX_SkAxisAlignment> Positione
r; |
603 HorizontalPositions positions{pos}; | 604 HorizontalPositions positions{pos}; |
604 TranslationMapper mapper{matrix, offset}; | 605 TranslationMapper mapper{matrix, offset}; |
605 Positioner positioner(glyphFinder); | 606 Positioner positioner(glyphFinder); |
606 const char* cursor = text; | 607 const char* cursor = text; |
607 const char* stop = text + byteLength; | 608 const char* stop = text + byteLength; |
608 while (cursor < stop) { | 609 while (cursor < stop) { |
609 SkPoint mappedPoint = mapper.TranslationMapper::map( | 610 SkPoint mappedPoint = mapper.TranslationMapper::map( |
610 positions.HorizontalPositions::nextPoint()); | 611 positions.HorizontalPositions::nextPoint()); |
611 positioner.Positioner::findAndPositionGlyph( | 612 positioner.Positioner::findAndPositionGlyph( |
612 &cursor, mappedPoint, skstd::forward<ProcessOneGlyph>(processOne
Glyph)); | 613 &cursor, mappedPoint, std::forward<ProcessOneGlyph>(processOneGl
yph)); |
613 } | 614 } |
614 return; | 615 return; |
615 } | 616 } |
616 | 617 |
617 PositionReader positionReader{ | 618 PositionReader positionReader{ |
618 [&](PositionReader::Variants* to_init) { | 619 [&](PositionReader::Variants* to_init) { |
619 if (2 == scalarsPerPosition) { | 620 if (2 == scalarsPerPosition) { |
620 to_init->initialize<ArbitraryPositions>(pos); | 621 to_init->initialize<ArbitraryPositions>(pos); |
621 } else { | 622 } else { |
622 to_init->initialize<HorizontalPositions>(pos); | 623 to_init->initialize<HorizontalPositions>(pos); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 break; | 675 break; |
675 } | 676 } |
676 } | 677 } |
677 } | 678 } |
678 }; | 679 }; |
679 | 680 |
680 const char* stop = text + byteLength; | 681 const char* stop = text + byteLength; |
681 while (text < stop) { | 682 while (text < stop) { |
682 SkPoint mappedPoint = mapper->map(positionReader->nextPoint()); | 683 SkPoint mappedPoint = mapper->map(positionReader->nextPoint()); |
683 findAndPosition->findAndPositionGlyph( | 684 findAndPosition->findAndPositionGlyph( |
684 &text, mappedPoint, skstd::forward<ProcessOneGlyph>(processOneGlyph)
); | 685 &text, mappedPoint, std::forward<ProcessOneGlyph>(processOneGlyph)); |
685 } | 686 } |
686 } | 687 } |
687 | 688 |
688 template<typename ProcessOneGlyph> | 689 template<typename ProcessOneGlyph> |
689 inline void SkFindAndPlaceGlyph::ProcessText( | 690 inline void SkFindAndPlaceGlyph::ProcessText( |
690 SkPaint::TextEncoding textEncoding, const char text[], size_t byteLength, | 691 SkPaint::TextEncoding textEncoding, const char text[], size_t byteLength, |
691 SkPoint offset, const SkMatrix& matrix, SkPaint::Align textAlignment, | 692 SkPoint offset, const SkMatrix& matrix, SkPaint::Align textAlignment, |
692 SkGlyphCache* cache, ProcessOneGlyph&& processOneGlyph) { | 693 SkGlyphCache* cache, ProcessOneGlyph&& processOneGlyph) { |
693 | 694 |
694 // transform the starting point | 695 // transform the starting point |
(...skipping 23 matching lines...) Expand all Loading... |
718 ProcessOneGlyph, SkPaint::kLeft_Align, kUseKerning>>(gly
phFinder); | 719 ProcessOneGlyph, SkPaint::kLeft_Align, kUseKerning>>(gly
phFinder); |
719 } | 720 } |
720 } | 721 } |
721 }; | 722 }; |
722 | 723 |
723 const char* stop = text + byteLength; | 724 const char* stop = text + byteLength; |
724 SkPoint current = offset; | 725 SkPoint current = offset; |
725 while (text < stop) { | 726 while (text < stop) { |
726 current = | 727 current = |
727 findAndPosition->findAndPositionGlyph( | 728 findAndPosition->findAndPositionGlyph( |
728 &text, current, skstd::forward<ProcessOneGlyph>(processOneGlyph)
); | 729 &text, current, std::forward<ProcessOneGlyph>(processOneGlyph)); |
729 | 730 |
730 } | 731 } |
731 } | 732 } |
732 | 733 |
733 #endif // SkFindAndPositionGlyph_DEFINED | 734 #endif // SkFindAndPositionGlyph_DEFINED |
OLD | NEW |