| /* |
| * Copyright 2019 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkottieShaper_DEFINED |
| #define SkottieShaper_DEFINED |
| |
| #include "SkPoint.h" |
| #include "SkTextUtils.h" |
| |
| class SkTextBlob; |
| |
| namespace skottie { |
| |
| // Helper implementing After Effects text shaping semantics on top of SkShaper. |
| |
| class Shaper final { |
| public: |
| struct Result { |
| // For now, shaping produces a single text blob. This will eventually |
| // evolve into an array of <blob,pos> tuples to support animating |
| // per-character properties. |
| sk_sp<SkTextBlob> fBlob; |
| SkPoint fPos; |
| |
| SkRect computeBounds() const; |
| }; |
| |
| enum class VAlign : uint8_t { |
| // Align the first line visual top with the text box top. |
| kTop, |
| // Align the first line baseline with the text box top. |
| kTopBaseline, |
| // Align the center of the shaped text bounds with the center of the text box. |
| kCenter, |
| }; |
| |
| struct TextDesc { |
| const sk_sp<SkTypeface>& fTypeface; |
| SkScalar fTextSize; |
| SkTextUtils::Align fHAlign; |
| VAlign fVAlign; |
| }; |
| |
| // Performs text layout along an infinite horizontal line, starting at |textPoint|. |
| // Only explicit line breaks (\r) are observed. |
| static Result Shape(const SkString& text, const TextDesc& desc, const SkPoint& textPoint); |
| |
| // Performs text layout within |textBox|, injecting line breaks as needed to ensure |
| // horizontal fitting. The result is *not* guaranteed to fit vertically (it may extend |
| // below the box bottom). |
| static Result Shape(const SkString& text, const TextDesc& desc, const SkRect& textBox); |
| |
| private: |
| Shaper() = delete; |
| }; |
| |
| } // namespace skottie |
| |
| #endif // SkottieShaper_DEFINED |