From 10b427ae47d4a5198180afb0c48f391b00d54c55 Mon Sep 17 00:00:00 2001 From: Dan <127094811+geonhwi-jung@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:09:42 +0900 Subject: [PATCH 1/4] fix: add stop method with gradient --- packages/layout/src/canvas/measureCanvas.js | 1 + .../render/src/primitives/renderCanvas.js | 21 +++++++++++-------- packages/render/tests/ctx.js | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/layout/src/canvas/measureCanvas.js b/packages/layout/src/canvas/measureCanvas.js index 669cfbeb6..5c2c6ed3f 100644 --- a/packages/layout/src/canvas/measureCanvas.js +++ b/packages/layout/src/canvas/measureCanvas.js @@ -85,6 +85,7 @@ const measureCtx = () => { ctx.strokeOpacity = nil; ctx.linearGradient = nil; ctx.radialGradient = nil; + ctx.stop = nil; ctx.getWidth = () => getMax(points.map((p) => p[0])); ctx.getHeight = () => getMax(points.map((p) => p[1])); diff --git a/packages/render/src/primitives/renderCanvas.js b/packages/render/src/primitives/renderCanvas.js index 599910bb7..64a0d3c95 100644 --- a/packages/render/src/primitives/renderCanvas.js +++ b/packages/render/src/primitives/renderCanvas.js @@ -33,20 +33,23 @@ const availableMethods = [ 'quadraticCurveTo', 'linearGradient', 'radialGradient', + // 'stop', ]; +const gradientMethods = ['linearGradient', 'radialGradient']; + const painter = (ctx) => { - const p = availableMethods.reduce( - (acc, prop) => ({ - ...acc, - [prop]: (...args) => { + const p = {}; + availableMethods.forEach((prop) => { + if (gradientMethods.includes(prop)) { + p[prop] = (...args) => ctx[prop](...args); + } else { + p[prop] = (...args) => { ctx[prop](...args); return p; - }, - }), - {}, - ); - + }; + } + }); return p; }; diff --git a/packages/render/tests/ctx.js b/packages/render/tests/ctx.js index 9796e5264..b1a88e8fd 100644 --- a/packages/render/tests/ctx.js +++ b/packages/render/tests/ctx.js @@ -51,6 +51,7 @@ const createCTX = () => { instance._root = { data: { AcroForm: {} } }; instance.textInput = vi.fn().mockReturnValue(instance); instance.formField = vi.fn().mockReturnValue(instance); + instance.stop = vi.fn().mockReturnValue(instance); return instance; }; From 49f0eaf555b1930ef73be16bee645bb70ea20178 Mon Sep 17 00:00:00 2001 From: Dan <127094811+geonhwi-jung@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:10:26 +0900 Subject: [PATCH 2/4] fix: add stop method test --- packages/render/tests/primitives/renderCanvas.test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/render/tests/primitives/renderCanvas.test.js b/packages/render/tests/primitives/renderCanvas.test.js index e6eac9c02..b33fea3ff 100644 --- a/packages/render/tests/primitives/renderCanvas.test.js +++ b/packages/render/tests/primitives/renderCanvas.test.js @@ -68,3 +68,12 @@ describe('primitive renderCanvas', () => { renderCanvas(ctx, node); }); }); +test('should be scoped operation - gradient', () => { + const ctx = createCTX(); + const box = { top: 20, left: 40, width: 140, height: 200 }; + const node = { type: P.Canvas, box, props: {} }; + ctx.radialGradient(1, 2, 3, 4, 5, 6); + ctx.stop(); + renderCanvas(ctx, node); + expect(ctx.stop.mock.calls).toHaveLength(1); +}); From dfb08872090145c30dc8bd321664e5c0bae75054 Mon Sep 17 00:00:00 2001 From: Dan <127094811+geonhwi-jung@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:44:03 +0900 Subject: [PATCH 3/4] fix: remove unused variable --- packages/render/src/primitives/renderCanvas.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/render/src/primitives/renderCanvas.js b/packages/render/src/primitives/renderCanvas.js index 64a0d3c95..0b9e6fd7d 100644 --- a/packages/render/src/primitives/renderCanvas.js +++ b/packages/render/src/primitives/renderCanvas.js @@ -33,7 +33,6 @@ const availableMethods = [ 'quadraticCurveTo', 'linearGradient', 'radialGradient', - // 'stop', ]; const gradientMethods = ['linearGradient', 'radialGradient']; From bd81e092fdf4d96e68935d52e08132e1e303be68 Mon Sep 17 00:00:00 2001 From: Dan <44767362+geonhwiii@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:57:42 +0900 Subject: [PATCH 4/4] fix: edit stop method test code --- .../tests/primitives/renderCanvas.test.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/render/tests/primitives/renderCanvas.test.js b/packages/render/tests/primitives/renderCanvas.test.js index b33fea3ff..d28e7139f 100644 --- a/packages/render/tests/primitives/renderCanvas.test.js +++ b/packages/render/tests/primitives/renderCanvas.test.js @@ -1,4 +1,4 @@ -import { describe, expect, test } from 'vitest'; +import { describe, expect, test, vi } from 'vitest'; import * as P from '@react-pdf/primitives'; @@ -67,13 +67,14 @@ describe('primitive renderCanvas', () => { renderCanvas(ctx, node); }); -}); -test('should be scoped operation - gradient', () => { - const ctx = createCTX(); - const box = { top: 20, left: 40, width: 140, height: 200 }; - const node = { type: P.Canvas, box, props: {} }; - ctx.radialGradient(1, 2, 3, 4, 5, 6); - ctx.stop(); - renderCanvas(ctx, node); - expect(ctx.stop.mock.calls).toHaveLength(1); + test('should execute gradient.stop method correctly', () => { + const ctx = createCTX(); + const stopSpy = vi.spyOn(ctx, 'stop'); + const gradient = ctx.radialGradient(1, 2, 3, 4, 5, 6); + gradient.stop(0, 'red', 1); + gradient.stop(0, 'blue', 1); + expect(stopSpy).toHaveBeenCalledTimes(2); + expect(stopSpy).toHaveBeenCalledWith(0, 'red', 1); + expect(stopSpy).toHaveBeenCalledWith(0, 'blue', 1); + }); });