aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-07-30 05:46:05 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-07-30 05:46:05 -0700
commit6b38eabc16c2c002d982e5ffbd376aa09c1781b7 (patch)
treeb42f6ec3a65cf82ddaa6c71f429c339e4ea8acde
parent6c72d5740231f47c664a8e765a8df05cd124c88c (diff)
add helper to create RSXform w/ anchorPt
-rw-r--r--include/core/SkRSXform.h26
-rw-r--r--samplecode/SampleAtlas.cpp16
2 files changed, 25 insertions, 17 deletions
diff --git a/include/core/SkRSXform.h b/include/core/SkRSXform.h
index 5dffdc25d9..7af6e67c12 100644
--- a/include/core/SkRSXform.h
+++ b/include/core/SkRSXform.h
@@ -18,10 +18,28 @@
* [ 0 0 1 ]
*/
struct SkRSXform {
- SkScalar fSCos;
- SkScalar fSSin;
- SkScalar fTx;
- SkScalar fTy;
+ static SkRSXform Make(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) {
+ SkRSXform xform = { scos, ssin, tx, ty };
+ return xform;
+ }
+
+ /*
+ * Initialize a new xform based on the scale, rotation (in radians), final tx,ty location
+ * and anchor-point ax,ay within the src quad.
+ *
+ * Note: the anchor point is not normalized (e.g. 0...1) but is in pixels of the src image.
+ */
+ static SkRSXform MakeFromRadians(SkScalar scale, SkScalar radians, SkScalar tx, SkScalar ty,
+ SkScalar ax, SkScalar ay) {
+ const SkScalar s = SkScalarSin(radians) * scale;
+ const SkScalar c = SkScalarCos(radians) * scale;
+ return Make(c, s, tx + -c * ax + s * ay, ty + -s * ax - c * ay);
+ }
+
+ SkScalar fSCos;
+ SkScalar fSSin;
+ SkScalar fTx;
+ SkScalar fTy;
bool rectStaysRect() const {
return 0 == fSCos || 0 == fSSin;
diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp
index ed208c3a77..079d679fb8 100644
--- a/samplecode/SampleAtlas.cpp
+++ b/samplecode/SampleAtlas.cpp
@@ -96,18 +96,8 @@ class DrawAtlasDrawable : public SkDrawable {
}
SkRSXform asRSXform() const {
- SkMatrix m;
- m.setTranslate(-8, -8);
- m.postScale(fScale, fScale);
- m.postRotate(SkRadiansToDegrees(fRadian));
- m.postTranslate(fCenter.fX, fCenter.fY);
-
- SkRSXform x;
- x.fSCos = m.getScaleX();
- x.fSSin = m.getSkewY();
- x.fTx = m.getTranslateX();
- x.fTy = m.getTranslateY();
- return x;
+ return SkRSXform::MakeFromRadians(fScale, fRadian, fCenter.x(), fCenter.y(),
+ SkScalarHalf(kCellSize), SkScalarHalf(kCellSize));
}
};
@@ -138,7 +128,7 @@ public:
fRec[i].fVelocity.fX = rand.nextSScalar1() * kMaxSpeed;
fRec[i].fVelocity.fY = rand.nextSScalar1() * kMaxSpeed;
fRec[i].fScale = 1;
- fRec[i].fDScale = rand.nextSScalar1() / 4;
+ fRec[i].fDScale = rand.nextSScalar1() / 16;
fRec[i].fRadian = 0;
fRec[i].fDRadian = rand.nextSScalar1() / 8;
fRec[i].fAlpha = rand.nextUScalar1();