blob: 5ee76e8349ac737d54799dd5bdecbc49f17f0a46 [file] [log] [blame]
// Copyright 2018 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#ifndef SkPDFGlyphUse_DEFINED
#define SkPDFGlyphUse_DEFINED
#include "SkBitSet.h"
#include "SkTypes.h"
class SkPDFGlyphUse {
public:
SkPDFGlyphUse() : fBitSet(0) {}
SkPDFGlyphUse(SkGlyphID firstNonZero, SkGlyphID lastGlyph)
: fBitSet((int)lastGlyph - firstNonZero + 2)
, fFirstNonZero(firstNonZero)
, fLastGlyph(lastGlyph) { SkASSERT(firstNonZero >= 1); }
~SkPDFGlyphUse() = default;
SkPDFGlyphUse(SkPDFGlyphUse&&) = default;
SkPDFGlyphUse& operator=(SkPDFGlyphUse&&) = default;
SkGlyphID firstNonZero() const { return fFirstNonZero; }
SkGlyphID lastGlyph() const { return fLastGlyph; }
void set(SkGlyphID gid) { fBitSet.set(this->toCode(gid)); }
bool has(SkGlyphID gid) const { return fBitSet.has(this->toCode(gid)); }
template<typename FN>
void getSetValues(FN f) const {
if (fFirstNonZero == 1) {
return fBitSet.getSetValues(std::move(f));
}
uint16_t offset = fFirstNonZero - 1;
fBitSet.getSetValues([&f, offset](unsigned v) { f(v == 0 ? v : v + offset); });
}
private:
SkBitSet fBitSet;
SkGlyphID fFirstNonZero = 0;
SkGlyphID fLastGlyph = 0;
uint16_t toCode(SkGlyphID gid) const {
if (gid == 0 || fFirstNonZero == 1) {
return gid;
}
SkASSERT(gid >= fFirstNonZero && gid <= fLastGlyph);
return gid - fFirstNonZero + 1;
}
SkPDFGlyphUse(const SkPDFGlyphUse&) = delete;
SkPDFGlyphUse& operator=(const SkPDFGlyphUse&) = delete;
};
#endif // SkPDFGlyphUse_DEFINED