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