void Path2D::Arc(const v8::FunctionCallbackInfo<Value>& args) { if (args.Length() != 5 && args.Length() != 6) { args.GetIsolate()->ThrowException( v8::String::NewFromUtf8( args.GetIsolate(), "Error: 5 or 6 args required.")); return; } double x = args[0]->NumberValue(); double y = args[1]->NumberValue(); double radius = args[2]->NumberValue(); double startAngle = args[3]->NumberValue(); double endAngle = args[4]->NumberValue(); bool antiClockwise = false; if (args.Length() == 6) { antiClockwise = args[5]->BooleanValue(); } double sweepAngle; if (!antiClockwise) { sweepAngle = endAngle - startAngle; } else { sweepAngle = startAngle - endAngle; startAngle = endAngle; } Path2D* path = Unwrap(args); SkRect rect = { SkDoubleToScalar(x-radius), SkDoubleToScalar(y-radius), SkDoubleToScalar(x+radius), SkDoubleToScalar(y+radius) }; path->fSkPath.addArc(rect, SkRadiansToDegrees(startAngle), SkRadiansToDegrees(sweepAngle)); }
void onDrawContent(SkCanvas* canvas) override { SkPaint paint; paint.setTypeface(fTypeface); paint.setAntiAlias(true); paint.setFilterQuality(kMedium_SkFilterQuality); paint.setTextSize(50); // rough center of each glyph static constexpr auto kMidX = 35; static constexpr auto kMidY = 50; canvas->clear(SK_ColorWHITE); for (int i = 0; i < kNumChars; ++i) { canvas->save(); double rot = SkScalarInterp(fChars[i].fStartRotation, fChars[i].fEndRotation, fCurrTime/kDuration); canvas->translate(fChars[i].fPosition.fX + kMidX, fChars[i].fPosition.fY - kMidY); canvas->rotate(SkRadiansToDegrees(rot)); canvas->translate(-35,+50); canvas->drawString(fChars[i].fChar, 0, 0, paint); canvas->restore(); } }
void sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) { AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians)); }