blob: 5d24d75e7a093af3eff432d88cff960f4f4682d6 [file] [log] [blame]
reed4c21dc52015-06-25 12:32:03 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkNinePatchIter.h"
9#include "SkRect.h"
10
11bool SkNinePatchIter::Valid(int width, int height, const SkIRect& center) {
12 return !center.isEmpty() && SkIRect::MakeWH(width, height).contains(center);
13}
14
15SkNinePatchIter::SkNinePatchIter(int w, int h, const SkIRect& c, const SkRect& dst) {
16 SkASSERT(SkIRect::MakeWH(w, h).contains(c));
17
18 fSrcX[0] = 0;
19 fSrcX[1] = SkIntToScalar(c.fLeft);
20 fSrcX[2] = SkIntToScalar(c.fRight);
21 fSrcX[3] = SkIntToScalar(w);
22
23 fSrcY[0] = 0;
24 fSrcY[1] = SkIntToScalar(c.fTop);
25 fSrcY[2] = SkIntToScalar(c.fBottom);
26 fSrcY[3] = SkIntToScalar(h);
27
28 fDstX[0] = dst.fLeft;
29 fDstX[1] = dst.fLeft + SkIntToScalar(c.fLeft);
30 fDstX[2] = dst.fRight - SkIntToScalar(w - c.fRight);
31 fDstX[3] = dst.fRight;
32
33 fDstY[0] = dst.fTop;
34 fDstY[1] = dst.fTop + SkIntToScalar(c.fTop);
35 fDstY[2] = dst.fBottom - SkIntToScalar(h - c.fBottom);
36 fDstY[3] = dst.fBottom;
37
38 if (fDstX[1] > fDstX[2]) {
39 fDstX[1] = fDstX[0] + (fDstX[3] - fDstX[0]) * c.fLeft / (w - c.width());
40 fDstX[2] = fDstX[1];
41 }
42
43 if (fDstY[1] > fDstY[2]) {
44 fDstY[1] = fDstY[0] + (fDstY[3] - fDstY[0]) * c.fTop / (h - c.height());
45 fDstY[2] = fDstY[1];
46 }
47
48 fCurrX = fCurrY = 0;
49 fDone = false;
50}
51
52bool SkNinePatchIter::next(SkRect* src, SkRect* dst) {
53 if (fDone) {
54 return false;
55 }
56
57 const int x = fCurrX;
58 const int y = fCurrY;
joshualitt3622d412015-11-17 12:11:57 -080059 SkASSERT(x >= 0 && x < 3);
60 SkASSERT(y >= 0 && y < 3);
reed4c21dc52015-06-25 12:32:03 -070061
62 src->set(fSrcX[x], fSrcY[y], fSrcX[x + 1], fSrcY[y + 1]);
63 dst->set(fDstX[x], fDstY[y], fDstX[x + 1], fDstY[y + 1]);
joshualitt3622d412015-11-17 12:11:57 -080064 if (3 == ++fCurrX) {
reed4c21dc52015-06-25 12:32:03 -070065 fCurrX = 0;
66 fCurrY += 1;
joshualitt3622d412015-11-17 12:11:57 -080067 if (fCurrY >= 3) {
reed4c21dc52015-06-25 12:32:03 -070068 fDone = true;
69 }
70 }
71 return true;
72}