void Matrix::NativeSetSinCos( /* [in] */ Int64 nObj, /* [in] */ Float sinValue, /* [in] */ Float cosValue) { SkMatrix* obj = reinterpret_cast<SkMatrix*>(nObj); obj->setSinCos(sinValue, cosValue); }
static SkMatrix pts_to_unit_matrix(const SkPoint pts[2]) { SkVector vec = pts[1] - pts[0]; SkScalar mag = vec.length(); SkScalar inv = mag ? SkScalarInvert(mag) : 0; vec.scale(inv); SkMatrix matrix; matrix.setSinCos(-vec.fY, vec.fX, pts[0].fX, pts[0].fY); matrix.postTranslate(-pts[0].fX, -pts[0].fY); matrix.postScale(inv, inv); return matrix; }
void draw(SkCanvas* canvas) { SkPaint paint; paint.setColor(SK_ColorGRAY); paint.setAntiAlias(true); SkRect rect = {20, 20, 100, 100}; canvas->drawRect(rect, paint); paint.setColor(SK_ColorRED); SkMatrix matrix; matrix.setSinCos(.25f, .85f); matrix.postTranslate(rect.centerX(), rect.centerY()); canvas->concat(matrix); canvas->translate(-rect.centerX(), -rect.centerY()); canvas->drawRect(rect, paint); }
static void morphpoints(SkPoint dst[], const SkPoint src[], int count, SkPathMeasure& meas, SkScalar dist) { for (int i = 0; i < count; i++) { SkPoint pos; SkVector tangent; SkScalar sx = src[i].fX; SkScalar sy = src[i].fY; meas.getPosTan(dist + sx, &pos, &tangent); SkMatrix matrix; SkPoint pt; pt.set(sx, sy); matrix.setSinCos(tangent.fY, tangent.fX, 0, 0); matrix.preTranslate(-sx, 0); matrix.postTranslate(pos.fX, pos.fY); matrix.mapPoints(&dst[i], &pt, 1); } }
int SkBuildQuadArc(const SkVector& uStart, const SkVector& uStop, SkRotationDirection dir, const SkMatrix* userMatrix, SkPoint quadPoints[]) { // rotate by x,y so that uStart is (1.0) SkScalar x = SkPoint::DotProduct(uStart, uStop); SkScalar y = SkPoint::CrossProduct(uStart, uStop); SkScalar absX = SkScalarAbs(x); SkScalar absY = SkScalarAbs(y); int pointCount; // check for (effectively) coincident vectors // this can happen if our angle is nearly 0 or nearly 180 (y == 0) // ... we use the dot-prod to distinguish between 0 and 180 (x > 0) if (absY <= SK_ScalarNearlyZero && x > 0 && ((y >= 0 && kCW_SkRotationDirection == dir) || (y <= 0 && kCCW_SkRotationDirection == dir))) { // just return the start-point quadPoints[0].set(SK_Scalar1, 0); pointCount = 1; } else { if (dir == kCCW_SkRotationDirection) y = -y; // what octant (quadratic curve) is [xy] in? int oct = 0; bool sameSign = true; if (0 == y) { oct = 4; // 180 SkASSERT(SkScalarAbs(x + SK_Scalar1) <= SK_ScalarNearlyZero); } else if (0 == x) { SkASSERT(absY - SK_Scalar1 <= SK_ScalarNearlyZero); if (y > 0) oct = 2; // 90 else oct = 6; // 270 } else { if (y < 0) oct += 4; if ((x < 0) != (y < 0)) { oct += 2; sameSign = false; } if ((absX < absY) == sameSign) oct += 1; } int wholeCount = oct << 1; memcpy(quadPoints, gQuadCirclePts, (wholeCount + 1) * sizeof(SkPoint)); const SkPoint* arc = &gQuadCirclePts[wholeCount]; if (quad_pt2OffCurve(arc, x, y, &quadPoints[wholeCount + 1])) { quadPoints[wholeCount + 2].set(x, y); wholeCount += 2; } pointCount = wholeCount + 1; } // now handle counter-clockwise and the initial unitStart rotation SkMatrix matrix; matrix.setSinCos(uStart.fY, uStart.fX); if (dir == kCCW_SkRotationDirection) { matrix.preScale(SK_Scalar1, -SK_Scalar1); } if (userMatrix) { matrix.postConcat(*userMatrix); } matrix.mapPoints(quadPoints, pointCount); return pointCount; }
static void setSinCos__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sinValue, jfloat cosValue) { SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); obj->setSinCos(sinValue, cosValue); }