lin
2025-08-14 dae8bad597b6607a449b32bf76c523423f7720ed
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
73
/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
 
#ifndef SkTextToPathIter_DEFINED
#define SkTextToPathIter_DEFINED
 
#include "SkFontPriv.h"
#include "SkPaint.h"
#include "SkStrikeCache.h"
 
class SkTextBaseIter {
public:
    const SkFont&   getFont() const { return fFont; }
    const SkPaint&  getPaint() const { return fPaint; }
    SkScalar        getPathScale() const { return fScale; }
 
protected:
    SkTextBaseIter(const SkGlyphID glyphs[], int count, const SkFont&, const SkPaint*);
 
    SkExclusiveStrikePtr fCache;
    SkFont               fFont;
    SkPaint              fPaint;
    SkScalar             fScale;
    SkScalar             fPrevAdvance;
    const SkGlyphID*     fGlyphs;
    const SkGlyphID*     fStop;
 
    SkScalar        fXPos;      // accumulated xpos, returned in next
};
 
class SkTextInterceptsIter : SkTextBaseIter {
public:
    enum class TextType {
        kText,
        kPosText
    };
 
    SkTextInterceptsIter(const SkGlyphID glyphs[], int count, const SkFont& font,
                         const SkPaint* paint, const SkScalar bounds[2], SkScalar x, SkScalar y,
                         TextType textType)
         : SkTextBaseIter(glyphs, count, font, paint)
    {
        fBoundsBase[0] = bounds[0];
        fBoundsBase[1] = bounds[1];
        this->setPosition(x, y);
    }
 
    /**
     *  Returns false when all of the text has been consumed
     */
    bool next(SkScalar* array, int* count);
 
    void setPosition(SkScalar x, SkScalar y) {
        SkScalar xOffset = 0;
        for (int i = 0; i < (int) SK_ARRAY_COUNT(fBounds); ++i) {
            SkScalar bound = fBoundsBase[i] - y;
            fBounds[i] = bound / fScale;
        }
 
        fXPos = xOffset + x;
        fPrevAdvance = 0;
    }
 
private:
    SkScalar fBounds[2];
    SkScalar fBoundsBase[2];
};
 
#endif