C++程序  |  74行  |  1.87 KB

/*
 * 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