blob: 0b15ccea3d12b68022f5476e131fbc6857fbf26e [file] [log] [blame]
/*
* 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