/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkLatticeIter_DEFINED #define SkLatticeIter_DEFINED #include "SkCanvas.h" #include "SkScalar.h" #include "SkTArray.h" struct SkIRect; struct SkRect; /** * Disect a lattice request into an sequence of src-rect / dst-rect pairs */ class SK_API SkLatticeIter { public: static bool Valid(int imageWidth, int imageHeight, const SkCanvas::Lattice& lattice); SkLatticeIter(const SkCanvas::Lattice& lattice, const SkRect& dst); static bool Valid(int imageWidth, int imageHeight, const SkIRect& center); SkLatticeIter(int imageWidth, int imageHeight, const SkIRect& center, const SkRect& dst); /** * While it returns true, use src/dst to draw the image/bitmap. Optional parameters * isFixedColor and fixedColor specify if the rectangle is filled with a fixed color. * If (*isFixedColor) is true, then (*fixedColor) contains the rectangle color. */ bool next(SkIRect* src, SkRect* dst, bool* isFixedColor = nullptr, SkColor* fixedColor = nullptr); /** Version of above that converts the integer src rect to a scalar rect. */ bool next(SkRect* src, SkRect* dst, bool* isFixedColor = nullptr, SkColor* fixedColor = nullptr) { SkIRect isrcR; if (this->next(&isrcR, dst, isFixedColor, fixedColor)) { *src = SkRect::Make(isrcR); return true; } return false; } /** * Apply a matrix to the dst points. */ void mapDstScaleTranslate(const SkMatrix& matrix); /** * Returns the number of rects that will actually be drawn. */ int numRectsToDraw() const { return fNumRectsToDraw; } private: SkTArray<int> fSrcX; SkTArray<int> fSrcY; SkTArray<SkScalar> fDstX; SkTArray<SkScalar> fDstY; SkTArray<SkCanvas::Lattice::RectType> fRectTypes; SkTArray<SkColor> fColors; int fCurrX; int fCurrY; int fNumRectsInLattice; int fNumRectsToDraw; }; #endif