blob: 53d57af8c4c135697e427b8da7d1bd52ff3c63c9 [file] [log] [blame]
/*
* 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"
// A faster set implementation that does not need any initialization, and reading the set items
// is order the number of items, and not the size of the universe.
// This implementation is based on the paper by Briggs and Torczon, "An Efficient Representation
// for Sparse Sets"
class SkGlyphSet {
public:
SkGlyphSet() = default;
uint16_t add(SkGlyphID glyphID);
std::vector<SkGlyphID> uniqueGlyphIDs();
void reuse(uint32_t glyphUniverseSize);
private:
uint32_t fUniverseSize{0};
std::vector<uint16_t> fIndices;
std::vector<SkGlyphID> fUniqueGlyphIDs;
};
class SkGlyphRun {
public:
SkGlyphRun() = default;
SkGlyphRun(SkGlyphRun&&) = default;
static SkGlyphRun MakeFromDrawText(
const SkPaint& paint, const void* bytes, size_t byteLength,
SkPoint origin, SkGlyphSet* glyphSet);
static SkGlyphRun MakeFromDrawPosTextH(
const SkPaint& paint, const void* bytes, size_t byteLength,
const SkScalar xpos[], SkScalar constY, SkGlyphSet* glyphSet);
static SkGlyphRun MakeFromDrawPosText(
const SkPaint& paint, const void* bytes, size_t byteLength,
const SkPoint pos[], SkGlyphSet* glyphSet);
size_t runSize() const { return fRunSize; }
uint16_t uniqueSize() const { return fUniqueGlyphs.size(); }
// 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,
std::vector<SkGlyphID>&& uniqueGlyphIDs);
std::unique_ptr<uint16_t[]> fDenseIndex;
std::unique_ptr<SkPoint[]> fPositions;
std::vector<SkGlyphID> fUniqueGlyphs;
const size_t fRunSize{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