diff options
author | Brian Salomon <bsalomon@google.com> | 2017-11-19 13:20:13 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-19 18:55:18 +0000 |
commit | cbcb0a12ad0068b820c28178e8aa141166febd1f (patch) | |
tree | 120917b5961b8a043894b95811eec1f8f6379b25 /src/core | |
parent | b07b06e14819c7bfb9da87dd754aca1239045af4 (diff) |
Revert "Revert "Add Atlas Text interface for rendering SDF glyphs.""
This reverts commit 9c2202ffc22b4293b48a4edeafa1b5d2bab8bb83.
Bug: skia:
Change-Id: I482ddf74f8e40d3d0908c840ba5c6ff981ccefbd
Reviewed-on: https://skia-review.googlesource.com/73345
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkArenaAlloc.h | 6 | ||||
-rw-r--r-- | src/core/SkArenaAllocList.h | 79 |
2 files changed, 82 insertions, 3 deletions
diff --git a/src/core/SkArenaAlloc.h b/src/core/SkArenaAlloc.h index 9e971610a6..2f23382ac1 100644 --- a/src/core/SkArenaAlloc.h +++ b/src/core/SkArenaAlloc.h @@ -5,8 +5,8 @@ * found in the LICENSE file. */ -#ifndef SkFixedAlloc_DEFINED -#define SkFixedAlloc_DEFINED +#ifndef SkArenaAlloc_DEFINED +#define SkArenaAlloc_DEFINED #include "SkRefCnt.h" #include "SkTFitsIn.h" @@ -240,4 +240,4 @@ private: using INHERITED = SkArenaAlloc; }; -#endif//SkFixedAlloc_DEFINED +#endif // SkArenaAlloc_DEFINED diff --git a/src/core/SkArenaAllocList.h b/src/core/SkArenaAllocList.h new file mode 100644 index 0000000000..b4e442b0bd --- /dev/null +++ b/src/core/SkArenaAllocList.h @@ -0,0 +1,79 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkArenaAllocList_DEFINED +#define SkArenaAllocList_DEFINED + +#include "SkArenaAlloc.h" + +/** + * A singly linked list of Ts stored in a SkArenaAlloc. The arena rather than the list owns + * the elements. This supports forward iteration and range based for loops. + */ +template <typename T> +class SkArenaAllocList { +private: + struct Node; + +public: + SkArenaAllocList() = default; + + void reset() { fHead = fTail = nullptr; } + + template <typename... Args> + inline T& append(SkArenaAlloc* arena, Args... args); + + class Iter { + public: + Iter() = default; + inline Iter& operator++(); + T& operator*() const { return fCurr->fT; } + T* operator->() const { return &fCurr->fT; } + bool operator==(const Iter& that) const { return fCurr == that.fCurr; } + bool operator!=(const Iter& that) const { return !(*this == that); } + + private: + friend class SkArenaAllocList; + explicit Iter(Node* node) : fCurr(node) {} + Node* fCurr = nullptr; + }; + + Iter begin() { return Iter(fHead); } + Iter end() { return Iter(); } + Iter tail() { return Iter(fTail); } + +private: + struct Node { + template <typename... Args> + Node(Args... args) : fT(std::forward<Args>(args)...) {} + T fT; + Node* fNext = nullptr; + }; + Node* fHead = nullptr; + Node* fTail = nullptr; +}; + +template <typename T> +template <typename... Args> +T& SkArenaAllocList<T>::append(SkArenaAlloc* arena, Args... args) { + SkASSERT(!fHead == !fTail); + auto* n = arena->make<Node>(std::forward<Args>(args)...); + if (!fTail) { + fHead = fTail = n; + } else { + fTail = fTail->fNext = n; + } + return fTail->fT; +} + +template <typename T> +typename SkArenaAllocList<T>::Iter& SkArenaAllocList<T>::Iter::operator++() { + fCurr = fCurr->fNext; + return *this; +} + +#endif |