diff options
author | Herb Derby <herb@google.com> | 2018-05-09 16:36:11 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-05 20:11:39 +0000 |
commit | 4225b3220ef4bf50f0d9403f812ea94d50c4ee59 (patch) | |
tree | a03d6ff5708e6c41fdc4b1edb8f5200d08d7dc63 /src/core/SkGlyphRun.h | |
parent | f105dc71e4200db5a57a1e28b8bca2b3689debdb (diff) |
Have draw(Text|PosText|PosTextH) use a single entry on the device
Handle the positioning of drawText at the canvas layer. Simplify
the code by removing similar implementations.
Change-Id: I8b711783435072f560e29fca1dd934fa2e345ed2
Reviewed-on: https://skia-review.googlesource.com/127131
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Diffstat (limited to 'src/core/SkGlyphRun.h')
-rw-r--r-- | src/core/SkGlyphRun.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h new file mode 100644 index 0000000000..17b4297208 --- /dev/null +++ b/src/core/SkGlyphRun.h @@ -0,0 +1,72 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkGlyphRunInfo_DEFINED +#define SkGlyphRunInfo_DEFINED + +#include <memory> +#include <vector> + +#include "SkDescriptor.h" +#include "SkMask.h" +#include "SkPath.h" +#include "SkPoint.h" +#include "SkTypes.h" + +class SkGlyphRun { +public: + SkGlyphRun() = default; + SkGlyphRun(SkGlyphRun&&) = default; + static SkGlyphRun MakeFromDrawText( + const SkPaint& paint, const void* bytes, size_t byteLength, + SkPoint origin); + static SkGlyphRun MakeFromDrawPosTextH( + const SkPaint& paint, const void* bytes, size_t byteLength, + const SkScalar xpos[], SkScalar constY); + static SkGlyphRun MakeFromDrawPosText( + const SkPaint& paint, const void* bytes, size_t byteLength, + const SkPoint pos[]); + + size_t runSize() const { return fRunSize; } + uint16_t uniqueSize() const { return fUniqueSize; } + + // copyGlyphIDs is temporary glue to work with the existing system. Don't use with new code. + std::unique_ptr<SkGlyphID[]> copyGlyphIDs() const; + const SkScalar* getPositions() const { + return reinterpret_cast<const SkScalar*>(fPositions.get()); + } + +private: + SkGlyphRun(size_t runSize, + std::unique_ptr<uint16_t[]>&& denseIndex, + std::unique_ptr<SkPoint[]>&& positions, + uint16_t uniqueSize, + std::unique_ptr<SkGlyphID[]>&& uniqueGlyphIDs); + + std::unique_ptr<uint16_t[]> fDenseIndex; + std::unique_ptr<SkPoint[]> fPositions; + std::unique_ptr<SkGlyphID[]> fUniqueGlyphs; + const size_t fRunSize{0}; + const uint16_t fUniqueSize{0}; +}; + +template <typename T> +class SkSpan { +public: + SkSpan(const T* ptr, size_t size) : fPtr{ptr}, fSize{size} {} + SkSpan(const std::vector<T>& v) : fPtr{v.data()}, fSize{v.size()} {} + const T& operator [] (ptrdiff_t i) const { return fPtr[i]; } + const T* begin() const { return fPtr; } + const T* end() const { return fPtr + fSize; } + ptrdiff_t size() const { return fSize; } + +private: + const T* fPtr; + size_t fSize; +}; + +#endif // SkGlyphRunInfo_DEFINED |