diff options
author | 2015-07-30 05:46:05 -0700 | |
---|---|---|
committer | 2015-07-30 05:46:05 -0700 | |
commit | 6b38eabc16c2c002d982e5ffbd376aa09c1781b7 (patch) | |
tree | b42f6ec3a65cf82ddaa6c71f429c339e4ea8acde | |
parent | 6c72d5740231f47c664a8e765a8df05cd124c88c (diff) |
add helper to create RSXform w/ anchorPt
BUG=skia:
Review URL: https://codereview.chromium.org/1269563006
-rw-r--r-- | include/core/SkRSXform.h | 26 | ||||
-rw-r--r-- | samplecode/SampleAtlas.cpp | 16 |
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(); |