aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkGlyphRun.h
blob: 17b4297208dd1267997d82af978b80268668d825 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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