Skip to content

Commit c166443

Browse files
Tirondzozbjornson
authored andcommittedApr 20, 2021
Add ctx2d.setTransform(mat) overload
Based on currentTransform setter
1 parent 2f84eee commit c166443

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed
 

‎src/CanvasRenderingContext2d.cc

+35-10
Original file line numberDiff line numberDiff line change
@@ -1775,6 +1775,22 @@ get_current_transform(Context2d *context) {
17751775
return Nan::NewInstance(context->_DOMMatrix.Get(iso), argc, argv).ToLocalChecked();
17761776
}
17771777

1778+
/*
1779+
* Helper for get/set transform.
1780+
*/
1781+
1782+
void parse_matrix_from_object(cairo_matrix_t &matrix, Local<Object> mat) {
1783+
cairo_matrix_init(&matrix,
1784+
Nan::To<double>(Nan::Get(mat, Nan::New("a").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1785+
Nan::To<double>(Nan::Get(mat, Nan::New("b").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1786+
Nan::To<double>(Nan::Get(mat, Nan::New("c").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1787+
Nan::To<double>(Nan::Get(mat, Nan::New("d").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1788+
Nan::To<double>(Nan::Get(mat, Nan::New("e").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1789+
Nan::To<double>(Nan::Get(mat, Nan::New("f").ToLocalChecked()).ToLocalChecked()).FromMaybe(0)
1790+
);
1791+
}
1792+
1793+
17781794
/*
17791795
* Get current transform.
17801796
*/
@@ -1802,14 +1818,7 @@ NAN_SETTER(Context2d::SetCurrentTransform) {
18021818
#endif
18031819

18041820
cairo_matrix_t matrix;
1805-
cairo_matrix_init(&matrix,
1806-
Nan::To<double>(Nan::Get(mat, Nan::New("a").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1807-
Nan::To<double>(Nan::Get(mat, Nan::New("b").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1808-
Nan::To<double>(Nan::Get(mat, Nan::New("c").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1809-
Nan::To<double>(Nan::Get(mat, Nan::New("d").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1810-
Nan::To<double>(Nan::Get(mat, Nan::New("e").ToLocalChecked()).ToLocalChecked()).FromMaybe(0),
1811-
Nan::To<double>(Nan::Get(mat, Nan::New("f").ToLocalChecked()).ToLocalChecked()).FromMaybe(0)
1812-
);
1821+
parse_matrix_from_object(matrix, mat);
18131822

18141823
cairo_transform(context->context(), &matrix);
18151824
}
@@ -2279,8 +2288,24 @@ NAN_METHOD(Context2d::ResetTransform) {
22792288

22802289
NAN_METHOD(Context2d::SetTransform) {
22812290
Context2d *context = Nan::ObjectWrap::Unwrap<Context2d>(info.This());
2282-
cairo_identity_matrix(context->context());
2283-
Context2d::Transform(info);
2291+
if (info.Length() == 1) {
2292+
Local<Object> mat = Nan::To<Object>(info[0]).ToLocalChecked();
2293+
2294+
#if NODE_MAJOR_VERSION >= 8
2295+
Local<Context> ctx = Nan::GetCurrentContext();
2296+
if (!mat->InstanceOf(ctx, _DOMMatrix.Get(Isolate::GetCurrent())).ToChecked()) {
2297+
return Nan::ThrowTypeError("Expected DOMMatrix");
2298+
}
2299+
#endif
2300+
2301+
cairo_matrix_t matrix;
2302+
parse_matrix_from_object(matrix, mat);
2303+
2304+
cairo_set_matrix(context->context(), &matrix);
2305+
} else {
2306+
cairo_identity_matrix(context->context());
2307+
Context2d::Transform(info);
2308+
}
22842309
}
22852310

22862311
/*

‎test/canvas.test.js

+6
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,12 @@ describe('Canvas', function () {
993993
assert.equal(mat3.d, 0.3);
994994

995995
assert.deepEqual(ctx.currentTransform, ctx.getTransform());
996+
997+
ctx.setTransform(ctx.getTransform());
998+
assert.deepEqual(mat3, ctx.getTransform());
999+
1000+
ctx.setTransform(mat3.a, mat3.b, mat3.c, mat3.d, mat3.e, mat3.f);
1001+
assert.deepEqual(mat3, ctx.getTransform());
9961002
});
9971003

9981004
it('Context2d#createImageData(ImageData)', function () {

0 commit comments

Comments
 (0)
Please sign in to comment.