From efcde935516e31fb0c707bddff67f4accfe4fb54 Mon Sep 17 00:00:00 2001 From: Fred Cox Date: Fri, 27 Sep 2024 09:22:49 +0300 Subject: [PATCH] Fix class properties should have defaults as standard js classes would have Changed PNG consts to static properties --- CHANGELOG.md | 2 + index.d.ts | 14 ++-- index.test-d.ts | 2 +- src/Canvas.cc | 34 ++++----- src/CanvasGradient.cc | 2 +- src/CanvasPattern.cc | 2 +- src/CanvasRenderingContext2d.cc | 126 ++++++++++++++++---------------- src/Image.cc | 16 ++-- src/ImageData.cc | 4 +- test/canvas.test.js | 5 ++ 10 files changed, 107 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 349e1c6f7..0ca6def96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ This release notably changes to using N-API. 🎉 * Remove unused private field `backend` in the `Backend` class. (#2229) * Add Node.js v20 to CI. (#2237) * Replaced `dtslint` with `tsd` (#2313) +* Changed PNG consts to static properties of Canvas class ### Added * Added string tags to support class detection ### Fixed @@ -41,6 +42,7 @@ This release notably changes to using N-API. 🎉 * RGB functions should support real numbers now instead of just integers. (#2339) * Allow alternate or properly escaped quotes *within* font-family names * Fix TextMetrics type to include alphabeticBaseline, emHeightAscent, and emHeightDescent properties +* Fix class properties should have defaults as standard js classes (#2390) 2.11.2 ================== diff --git a/index.d.ts b/index.d.ts index 49636f396..97fe03962 100644 --- a/index.d.ts +++ b/index.d.ts @@ -63,19 +63,19 @@ export class Canvas { readonly stride: number; /** Constant used in PNG encoding methods. */ - readonly PNG_NO_FILTERS: number + static readonly PNG_NO_FILTERS: number /** Constant used in PNG encoding methods. */ - readonly PNG_ALL_FILTERS: number + static readonly PNG_ALL_FILTERS: number /** Constant used in PNG encoding methods. */ - readonly PNG_FILTER_NONE: number + static readonly PNG_FILTER_NONE: number /** Constant used in PNG encoding methods. */ - readonly PNG_FILTER_SUB: number + static readonly PNG_FILTER_SUB: number /** Constant used in PNG encoding methods. */ - readonly PNG_FILTER_UP: number + static readonly PNG_FILTER_UP: number /** Constant used in PNG encoding methods. */ - readonly PNG_FILTER_AVG: number + static readonly PNG_FILTER_AVG: number /** Constant used in PNG encoding methods. */ - readonly PNG_FILTER_PAETH: number + static readonly PNG_FILTER_PAETH: number constructor(width: number, height: number, type?: 'image'|'pdf'|'svg') diff --git a/index.test-d.ts b/index.test-d.ts index 86e8dfc28..f898f2d58 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -33,7 +33,7 @@ expectType(dm.a) expectType(canv.toBuffer()) expectType(canv.toBuffer('application/pdf')) -canv.toBuffer((err, data) => {}, 'image/png') +canv.toBuffer((err, data) => {}, 'image/png', {filters: Canvas.Canvas.PNG_ALL_FILTERS}) expectAssignable(canv.createJPEGStream({ quality: 0.5 })) expectAssignable(canv.createPDFStream({ author: 'octocat' })) canv.toDataURL() diff --git a/src/Canvas.cc b/src/Canvas.cc index 2555605f9..ee79915be 100644 --- a/src/Canvas.cc +++ b/src/Canvas.cc @@ -50,25 +50,25 @@ Canvas::Initialize(Napi::Env& env, Napi::Object& exports) { // Constructor Napi::Function ctor = DefineClass(env, "Canvas", { - InstanceMethod<&Canvas::ToBuffer>("toBuffer"), - InstanceMethod<&Canvas::StreamPNGSync>("streamPNGSync"), - InstanceMethod<&Canvas::StreamPDFSync>("streamPDFSync"), + InstanceMethod<&Canvas::ToBuffer>("toBuffer", napi_default_method), + InstanceMethod<&Canvas::StreamPNGSync>("streamPNGSync", napi_default_method), + InstanceMethod<&Canvas::StreamPDFSync>("streamPDFSync", napi_default_method), #ifdef HAVE_JPEG - InstanceMethod<&Canvas::StreamJPEGSync>("streamJPEGSync"), + InstanceMethod<&Canvas::StreamJPEGSync>("streamJPEGSync", napi_default_method), #endif - InstanceAccessor<&Canvas::GetType>("type"), - InstanceAccessor<&Canvas::GetStride>("stride"), - InstanceAccessor<&Canvas::GetWidth, &Canvas::SetWidth>("width"), - InstanceAccessor<&Canvas::GetHeight, &Canvas::SetHeight>("height"), - InstanceValue("PNG_NO_FILTERS", Napi::Number::New(env, PNG_NO_FILTERS)), - InstanceValue("PNG_FILTER_NONE", Napi::Number::New(env, PNG_FILTER_NONE)), - InstanceValue("PNG_FILTER_SUB", Napi::Number::New(env, PNG_FILTER_SUB)), - InstanceValue("PNG_FILTER_UP", Napi::Number::New(env, PNG_FILTER_UP)), - InstanceValue("PNG_FILTER_AVG", Napi::Number::New(env, PNG_FILTER_AVG)), - InstanceValue("PNG_FILTER_PAETH", Napi::Number::New(env, PNG_FILTER_PAETH)), - InstanceValue("PNG_ALL_FILTERS", Napi::Number::New(env, PNG_ALL_FILTERS)), - StaticMethod<&Canvas::RegisterFont>("_registerFont"), - StaticMethod<&Canvas::DeregisterAllFonts>("_deregisterAllFonts") + InstanceAccessor<&Canvas::GetType>("type", napi_default_jsproperty), + InstanceAccessor<&Canvas::GetStride>("stride", napi_default_jsproperty), + InstanceAccessor<&Canvas::GetWidth, &Canvas::SetWidth>("width", napi_default_jsproperty), + InstanceAccessor<&Canvas::GetHeight, &Canvas::SetHeight>("height", napi_default_jsproperty), + StaticValue("PNG_NO_FILTERS", Napi::Number::New(env, PNG_NO_FILTERS), napi_default_jsproperty), + StaticValue("PNG_FILTER_NONE", Napi::Number::New(env, PNG_FILTER_NONE), napi_default_jsproperty), + StaticValue("PNG_FILTER_SUB", Napi::Number::New(env, PNG_FILTER_SUB), napi_default_jsproperty), + StaticValue("PNG_FILTER_UP", Napi::Number::New(env, PNG_FILTER_UP), napi_default_jsproperty), + StaticValue("PNG_FILTER_AVG", Napi::Number::New(env, PNG_FILTER_AVG), napi_default_jsproperty), + StaticValue("PNG_FILTER_PAETH", Napi::Number::New(env, PNG_FILTER_PAETH), napi_default_jsproperty), + StaticValue("PNG_ALL_FILTERS", Napi::Number::New(env, PNG_ALL_FILTERS), napi_default_jsproperty), + StaticMethod<&Canvas::RegisterFont>("_registerFont", napi_default_method), + StaticMethod<&Canvas::DeregisterAllFonts>("_deregisterAllFonts", napi_default_method) }); data->CanvasCtor = Napi::Persistent(ctor); diff --git a/src/CanvasGradient.cc b/src/CanvasGradient.cc index 9c2d42360..ceb0e5054 100644 --- a/src/CanvasGradient.cc +++ b/src/CanvasGradient.cc @@ -18,7 +18,7 @@ Gradient::Initialize(Napi::Env& env, Napi::Object& exports) { InstanceData* data = env.GetInstanceData(); Napi::Function ctor = DefineClass(env, "CanvasGradient", { - InstanceMethod<&Gradient::AddColorStop>("addColorStop") + InstanceMethod<&Gradient::AddColorStop>("addColorStop", napi_default_method) }); exports.Set("CanvasGradient", ctor); diff --git a/src/CanvasPattern.cc b/src/CanvasPattern.cc index 55b8bb7fb..ec30b6f09 100644 --- a/src/CanvasPattern.cc +++ b/src/CanvasPattern.cc @@ -21,7 +21,7 @@ Pattern::Initialize(Napi::Env& env, Napi::Object& exports) { // Constructor Napi::Function ctor = DefineClass(env, "CanvasPattern", { - InstanceMethod<&Pattern::setTransform>("setTransform") + InstanceMethod<&Pattern::setTransform>("setTransform", napi_default_method) }); // Prototype diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index 9c4f6af9c..d0966e299 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -94,69 +94,69 @@ Context2d::Initialize(Napi::Env& env, Napi::Object& exports) { InstanceData* data = env.GetInstanceData(); Napi::Function ctor = DefineClass(env, "CanvasRenderingContext2D", { - InstanceMethod<&Context2d::DrawImage>("drawImage"), - InstanceMethod<&Context2d::PutImageData>("putImageData"), - InstanceMethod<&Context2d::GetImageData>("getImageData"), - InstanceMethod<&Context2d::CreateImageData>("createImageData"), - InstanceMethod<&Context2d::AddPage>("addPage"), - InstanceMethod<&Context2d::Save>("save"), - InstanceMethod<&Context2d::Restore>("restore"), - InstanceMethod<&Context2d::Rotate>("rotate"), - InstanceMethod<&Context2d::Translate>("translate"), - InstanceMethod<&Context2d::Transform>("transform"), - InstanceMethod<&Context2d::GetTransform>("getTransform"), - InstanceMethod<&Context2d::ResetTransform>("resetTransform"), - InstanceMethod<&Context2d::SetTransform>("setTransform"), - InstanceMethod<&Context2d::IsPointInPath>("isPointInPath"), - InstanceMethod<&Context2d::Scale>("scale"), - InstanceMethod<&Context2d::Clip>("clip"), - InstanceMethod<&Context2d::Fill>("fill"), - InstanceMethod<&Context2d::Stroke>("stroke"), - InstanceMethod<&Context2d::FillText>("fillText"), - InstanceMethod<&Context2d::StrokeText>("strokeText"), - InstanceMethod<&Context2d::FillRect>("fillRect"), - InstanceMethod<&Context2d::StrokeRect>("strokeRect"), - InstanceMethod<&Context2d::ClearRect>("clearRect"), - InstanceMethod<&Context2d::Rect>("rect"), - InstanceMethod<&Context2d::RoundRect>("roundRect"), - InstanceMethod<&Context2d::MeasureText>("measureText"), - InstanceMethod<&Context2d::MoveTo>("moveTo"), - InstanceMethod<&Context2d::LineTo>("lineTo"), - InstanceMethod<&Context2d::BezierCurveTo>("bezierCurveTo"), - InstanceMethod<&Context2d::QuadraticCurveTo>("quadraticCurveTo"), - InstanceMethod<&Context2d::BeginPath>("beginPath"), - InstanceMethod<&Context2d::ClosePath>("closePath"), - InstanceMethod<&Context2d::Arc>("arc"), - InstanceMethod<&Context2d::ArcTo>("arcTo"), - InstanceMethod<&Context2d::Ellipse>("ellipse"), - InstanceMethod<&Context2d::SetLineDash>("setLineDash"), - InstanceMethod<&Context2d::GetLineDash>("getLineDash"), - InstanceMethod<&Context2d::CreatePattern>("createPattern"), - InstanceMethod<&Context2d::CreateLinearGradient>("createLinearGradient"), - InstanceMethod<&Context2d::CreateRadialGradient>("createRadialGradient"), - InstanceAccessor<&Context2d::GetFormat>("pixelFormat"), - InstanceAccessor<&Context2d::GetPatternQuality, &Context2d::SetPatternQuality>("patternQuality"), - InstanceAccessor<&Context2d::GetImageSmoothingEnabled, &Context2d::SetImageSmoothingEnabled>("imageSmoothingEnabled"), - InstanceAccessor<&Context2d::GetGlobalCompositeOperation, &Context2d::SetGlobalCompositeOperation>("globalCompositeOperation"), - InstanceAccessor<&Context2d::GetGlobalAlpha, &Context2d::SetGlobalAlpha>("globalAlpha"), - InstanceAccessor<&Context2d::GetShadowColor, &Context2d::SetShadowColor>("shadowColor"), - InstanceAccessor<&Context2d::GetMiterLimit, &Context2d::SetMiterLimit>("miterLimit"), - InstanceAccessor<&Context2d::GetLineWidth, &Context2d::SetLineWidth>("lineWidth"), - InstanceAccessor<&Context2d::GetLineCap, &Context2d::SetLineCap>("lineCap"), - InstanceAccessor<&Context2d::GetLineJoin, &Context2d::SetLineJoin>("lineJoin"), - InstanceAccessor<&Context2d::GetLineDashOffset, &Context2d::SetLineDashOffset>("lineDashOffset"), - InstanceAccessor<&Context2d::GetShadowOffsetX, &Context2d::SetShadowOffsetX>("shadowOffsetX"), - InstanceAccessor<&Context2d::GetShadowOffsetY, &Context2d::SetShadowOffsetY>("shadowOffsetY"), - InstanceAccessor<&Context2d::GetShadowBlur, &Context2d::SetShadowBlur>("shadowBlur"), - InstanceAccessor<&Context2d::GetAntiAlias, &Context2d::SetAntiAlias>("antialias"), - InstanceAccessor<&Context2d::GetTextDrawingMode, &Context2d::SetTextDrawingMode>("textDrawingMode"), - InstanceAccessor<&Context2d::GetQuality, &Context2d::SetQuality>("quality"), - InstanceAccessor<&Context2d::GetCurrentTransform, &Context2d::SetCurrentTransform>("currentTransform"), - InstanceAccessor<&Context2d::GetFillStyle, &Context2d::SetFillStyle>("fillStyle"), - InstanceAccessor<&Context2d::GetStrokeStyle, &Context2d::SetStrokeStyle>("strokeStyle"), - InstanceAccessor<&Context2d::GetFont, &Context2d::SetFont>("font"), - InstanceAccessor<&Context2d::GetTextBaseline, &Context2d::SetTextBaseline>("textBaseline"), - InstanceAccessor<&Context2d::GetTextAlign, &Context2d::SetTextAlign>("textAlign") + InstanceMethod<&Context2d::DrawImage>("drawImage", napi_default_method), + InstanceMethod<&Context2d::PutImageData>("putImageData", napi_default_method), + InstanceMethod<&Context2d::GetImageData>("getImageData", napi_default_method), + InstanceMethod<&Context2d::CreateImageData>("createImageData", napi_default_method), + InstanceMethod<&Context2d::AddPage>("addPage", napi_default_method), + InstanceMethod<&Context2d::Save>("save", napi_default_method), + InstanceMethod<&Context2d::Restore>("restore", napi_default_method), + InstanceMethod<&Context2d::Rotate>("rotate", napi_default_method), + InstanceMethod<&Context2d::Translate>("translate", napi_default_method), + InstanceMethod<&Context2d::Transform>("transform", napi_default_method), + InstanceMethod<&Context2d::GetTransform>("getTransform", napi_default_method), + InstanceMethod<&Context2d::ResetTransform>("resetTransform", napi_default_method), + InstanceMethod<&Context2d::SetTransform>("setTransform", napi_default_method), + InstanceMethod<&Context2d::IsPointInPath>("isPointInPath", napi_default_method), + InstanceMethod<&Context2d::Scale>("scale", napi_default_method), + InstanceMethod<&Context2d::Clip>("clip", napi_default_method), + InstanceMethod<&Context2d::Fill>("fill", napi_default_method), + InstanceMethod<&Context2d::Stroke>("stroke", napi_default_method), + InstanceMethod<&Context2d::FillText>("fillText", napi_default_method), + InstanceMethod<&Context2d::StrokeText>("strokeText", napi_default_method), + InstanceMethod<&Context2d::FillRect>("fillRect", napi_default_method), + InstanceMethod<&Context2d::StrokeRect>("strokeRect", napi_default_method), + InstanceMethod<&Context2d::ClearRect>("clearRect", napi_default_method), + InstanceMethod<&Context2d::Rect>("rect", napi_default_method), + InstanceMethod<&Context2d::RoundRect>("roundRect", napi_default_method), + InstanceMethod<&Context2d::MeasureText>("measureText", napi_default_method), + InstanceMethod<&Context2d::MoveTo>("moveTo", napi_default_method), + InstanceMethod<&Context2d::LineTo>("lineTo", napi_default_method), + InstanceMethod<&Context2d::BezierCurveTo>("bezierCurveTo", napi_default_method), + InstanceMethod<&Context2d::QuadraticCurveTo>("quadraticCurveTo", napi_default_method), + InstanceMethod<&Context2d::BeginPath>("beginPath", napi_default_method), + InstanceMethod<&Context2d::ClosePath>("closePath", napi_default_method), + InstanceMethod<&Context2d::Arc>("arc", napi_default_method), + InstanceMethod<&Context2d::ArcTo>("arcTo", napi_default_method), + InstanceMethod<&Context2d::Ellipse>("ellipse", napi_default_method), + InstanceMethod<&Context2d::SetLineDash>("setLineDash", napi_default_method), + InstanceMethod<&Context2d::GetLineDash>("getLineDash", napi_default_method), + InstanceMethod<&Context2d::CreatePattern>("createPattern", napi_default_method), + InstanceMethod<&Context2d::CreateLinearGradient>("createLinearGradient", napi_default_method), + InstanceMethod<&Context2d::CreateRadialGradient>("createRadialGradient", napi_default_method), + InstanceAccessor<&Context2d::GetFormat>("pixelFormat", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetPatternQuality, &Context2d::SetPatternQuality>("patternQuality", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetImageSmoothingEnabled, &Context2d::SetImageSmoothingEnabled>("imageSmoothingEnabled", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetGlobalCompositeOperation, &Context2d::SetGlobalCompositeOperation>("globalCompositeOperation", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetGlobalAlpha, &Context2d::SetGlobalAlpha>("globalAlpha", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetShadowColor, &Context2d::SetShadowColor>("shadowColor", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetMiterLimit, &Context2d::SetMiterLimit>("miterLimit", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetLineWidth, &Context2d::SetLineWidth>("lineWidth", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetLineCap, &Context2d::SetLineCap>("lineCap", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetLineJoin, &Context2d::SetLineJoin>("lineJoin", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetLineDashOffset, &Context2d::SetLineDashOffset>("lineDashOffset", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetShadowOffsetX, &Context2d::SetShadowOffsetX>("shadowOffsetX", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetShadowOffsetY, &Context2d::SetShadowOffsetY>("shadowOffsetY", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetShadowBlur, &Context2d::SetShadowBlur>("shadowBlur", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetAntiAlias, &Context2d::SetAntiAlias>("antialias", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetTextDrawingMode, &Context2d::SetTextDrawingMode>("textDrawingMode", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetQuality, &Context2d::SetQuality>("quality", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetCurrentTransform, &Context2d::SetCurrentTransform>("currentTransform", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetFillStyle, &Context2d::SetFillStyle>("fillStyle", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetStrokeStyle, &Context2d::SetStrokeStyle>("strokeStyle", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetFont, &Context2d::SetFont>("font", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetTextBaseline, &Context2d::SetTextBaseline>("textBaseline", napi_default_jsproperty), + InstanceAccessor<&Context2d::GetTextAlign, &Context2d::SetTextAlign>("textAlign", napi_default_jsproperty) }); exports.Set("CanvasRenderingContext2d", ctor); diff --git a/src/Image.cc b/src/Image.cc index 7a4831ae0..fcf4b3add 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -53,14 +53,14 @@ Image::Initialize(Napi::Env& env, Napi::Object& exports) { Napi::HandleScope scope(env); Napi::Function ctor = DefineClass(env, "Image", { - InstanceAccessor<&Image::GetComplete>("complete"), - InstanceAccessor<&Image::GetWidth, &Image::SetWidth>("width"), - InstanceAccessor<&Image::GetHeight, &Image::SetHeight>("height"), - InstanceAccessor<&Image::GetNaturalWidth>("naturalWidth"), - InstanceAccessor<&Image::GetNaturalHeight>("naturalHeight"), - InstanceAccessor<&Image::GetDataMode, &Image::SetDataMode>("dataMode"), - StaticValue("MODE_IMAGE", Napi::Number::New(env, DATA_IMAGE)), - StaticValue("MODE_MIME", Napi::Number::New(env, DATA_MIME)) + InstanceAccessor<&Image::GetComplete>("complete", napi_default_jsproperty), + InstanceAccessor<&Image::GetWidth, &Image::SetWidth>("width", napi_default_jsproperty), + InstanceAccessor<&Image::GetHeight, &Image::SetHeight>("height", napi_default_jsproperty), + InstanceAccessor<&Image::GetNaturalWidth>("naturalWidth", napi_default_jsproperty), + InstanceAccessor<&Image::GetNaturalHeight>("naturalHeight", napi_default_jsproperty), + InstanceAccessor<&Image::GetDataMode, &Image::SetDataMode>("dataMode", napi_default_jsproperty), + StaticValue("MODE_IMAGE", Napi::Number::New(env, DATA_IMAGE), napi_default_jsproperty), + StaticValue("MODE_MIME", Napi::Number::New(env, DATA_MIME), napi_default_jsproperty) }); // Used internally in lib/image.js diff --git a/src/ImageData.cc b/src/ImageData.cc index b9f556bb3..d334ca894 100644 --- a/src/ImageData.cc +++ b/src/ImageData.cc @@ -14,8 +14,8 @@ ImageData::Initialize(Napi::Env& env, Napi::Object& exports) { InstanceData *data = env.GetInstanceData(); Napi::Function ctor = DefineClass(env, "ImageData", { - InstanceAccessor<&ImageData::GetWidth>("width"), - InstanceAccessor<&ImageData::GetHeight>("height") + InstanceAccessor<&ImageData::GetWidth>("width", napi_default_jsproperty), + InstanceAccessor<&ImageData::GetHeight>("height", napi_default_jsproperty) }); exports.Set("ImageData", ctor); diff --git a/test/canvas.test.js b/test/canvas.test.js index d0feff0d1..1a75ac031 100644 --- a/test/canvas.test.js +++ b/test/canvas.test.js @@ -694,6 +694,11 @@ describe('Canvas', function () { assert.equal('PNG', buf.slice(1, 4).toString()) }) + it('Canvas#toBuffer("image/png", {filters: PNG_ALL_FILTERS})', function () { + const buf = createCanvas(200, 200).toBuffer('image/png', { filters: Canvas.PNG_ALL_FILTERS }) + assert.equal('PNG', buf.slice(1, 4).toString()) + }) + it('Canvas#toBuffer("image/jpeg")', function () { const buf = createCanvas(200, 200).toBuffer('image/jpeg') assert.equal(buf[0], 0xff)