1// Copyright 2018 Google LLC.
2// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3#ifndef SkPDFGlyphUse_DEFINED
4#define SkPDFGlyphUse_DEFINED
5
6#include "include/core/SkTypes.h"
7#include "src/utils/SkBitSet.h"
8
9class SkPDFGlyphUse {
10public:
11 SkPDFGlyphUse() : fBitSet(0) {}
12 SkPDFGlyphUse(SkGlyphID firstNonZero, SkGlyphID lastGlyph)
13 : fBitSet((int)lastGlyph - firstNonZero + 2)
14 , fFirstNonZero(firstNonZero)
15 , fLastGlyph(lastGlyph) { SkASSERT(firstNonZero >= 1); }
16 ~SkPDFGlyphUse() = default;
17 SkPDFGlyphUse(SkPDFGlyphUse&&) = default;
18 SkPDFGlyphUse& operator=(SkPDFGlyphUse&&) = default;
19
20 SkGlyphID firstNonZero() const { return fFirstNonZero; }
21 SkGlyphID lastGlyph() const { return fLastGlyph; }
22 void set(SkGlyphID gid) { fBitSet.set(this->toCode(gid)); }
23 bool has(SkGlyphID gid) const { return fBitSet.has(this->toCode(gid)); }
24
25 template<typename FN>
26 void getSetValues(FN f) const {
27 if (fFirstNonZero == 1) {
28 return fBitSet.getSetValues(std::move(f));
29 }
30 uint16_t offset = fFirstNonZero - 1;
31 fBitSet.getSetValues([&f, offset](unsigned v) { f(v == 0 ? v : v + offset); });
32 }
33
34private:
35 SkBitSet fBitSet;
36 SkGlyphID fFirstNonZero = 0;
37 SkGlyphID fLastGlyph = 0;
38
39 uint16_t toCode(SkGlyphID gid) const {
40 if (gid == 0 || fFirstNonZero == 1) {
41 return gid;
42 }
43 SkASSERT(gid >= fFirstNonZero && gid <= fLastGlyph);
44 return gid - fFirstNonZero + 1;
45 }
46 SkPDFGlyphUse(const SkPDFGlyphUse&) = delete;
47 SkPDFGlyphUse& operator=(const SkPDFGlyphUse&) = delete;
48};
49#endif // SkPDFGlyphUse_DEFINED
50