diff --git a/src/browser/tests/canvas/canvas_rendering_context_2d.html b/src/browser/tests/canvas/canvas_rendering_context_2d.html index a6765d88..e065b81f 100644 --- a/src/browser/tests/canvas/canvas_rendering_context_2d.html +++ b/src/browser/tests/canvas/canvas_rendering_context_2d.html @@ -89,6 +89,41 @@ } + + + + + + diff --git a/src/browser/webapi/ImageData.zig b/src/browser/webapi/ImageData.zig index abb5abd5..e25e2dd6 100644 --- a/src/browser/webapi/ImageData.zig +++ b/src/browser/webapi/ImageData.zig @@ -52,7 +52,7 @@ pub const ConstructorSettings = struct { /// ``` /// /// We currently support only the first 2. -pub fn constructor( +pub fn init( width: u32, height: u32, maybe_settings: ?ConstructorSettings, @@ -106,7 +106,7 @@ pub const JsApi = struct { pub var class_id: bridge.ClassId = undefined; }; - pub const constructor = bridge.constructor(ImageData.constructor, .{ .dom_exception = true }); + pub const constructor = bridge.constructor(ImageData.init, .{ .dom_exception = true }); pub const colorSpace = bridge.property("srgb", .{ .template = false, .readonly = true }); pub const pixelFormat = bridge.property("rgba-unorm8", .{ .template = false, .readonly = true }); diff --git a/src/browser/webapi/canvas/CanvasRenderingContext2D.zig b/src/browser/webapi/canvas/CanvasRenderingContext2D.zig index 056100ee..a2127e5b 100644 --- a/src/browser/webapi/canvas/CanvasRenderingContext2D.zig +++ b/src/browser/webapi/canvas/CanvasRenderingContext2D.zig @@ -64,15 +64,30 @@ pub fn createImageData( switch (width_or_image_data) { .width => |width| { const height = maybe_height orelse return error.TypeError; - return ImageData.constructor(width, height, maybe_settings, page); + return ImageData.init(width, height, maybe_settings, page); }, .image_data => |image_data| { - return ImageData.constructor(image_data._width, image_data._height, null, page); + return ImageData.init(image_data._width, image_data._height, null, page); }, } } pub fn putImageData(_: *const CanvasRenderingContext2D, _: *ImageData, _: f64, _: f64, _: ?f64, _: ?f64, _: ?f64, _: ?f64) void {} + +pub fn getImageData( + _: *const CanvasRenderingContext2D, + _: i32, // sx + _: i32, // sy + sw: i32, + sh: i32, + page: *Page, +) !*ImageData { + if (sw <= 0 or sh <= 0) { + return error.IndexSizeError; + } + return ImageData.init(@intCast(sw), @intCast(sh), null, page); +} + pub fn save(_: *CanvasRenderingContext2D) void {} pub fn restore(_: *CanvasRenderingContext2D) void {} pub fn scale(_: *CanvasRenderingContext2D, _: f64, _: f64) void {} @@ -125,6 +140,7 @@ pub const JsApi = struct { pub const createImageData = bridge.function(CanvasRenderingContext2D.createImageData, .{ .dom_exception = true }); pub const putImageData = bridge.function(CanvasRenderingContext2D.putImageData, .{ .noop = true }); + pub const getImageData = bridge.function(CanvasRenderingContext2D.getImageData, .{ .dom_exception = true }); pub const save = bridge.function(CanvasRenderingContext2D.save, .{ .noop = true }); pub const restore = bridge.function(CanvasRenderingContext2D.restore, .{ .noop = true }); pub const scale = bridge.function(CanvasRenderingContext2D.scale, .{ .noop = true }); diff --git a/src/browser/webapi/canvas/OffscreenCanvasRenderingContext2D.zig b/src/browser/webapi/canvas/OffscreenCanvasRenderingContext2D.zig index 1a11bd68..faea97f0 100644 --- a/src/browser/webapi/canvas/OffscreenCanvasRenderingContext2D.zig +++ b/src/browser/webapi/canvas/OffscreenCanvasRenderingContext2D.zig @@ -63,15 +63,30 @@ pub fn createImageData( switch (width_or_image_data) { .width => |width| { const height = maybe_height orelse return error.TypeError; - return ImageData.constructor(width, height, maybe_settings, page); + return ImageData.init(width, height, maybe_settings, page); }, .image_data => |image_data| { - return ImageData.constructor(image_data._width, image_data._height, null, page); + return ImageData.init(image_data._width, image_data._height, null, page); }, } } pub fn putImageData(_: *const OffscreenCanvasRenderingContext2D, _: *ImageData, _: f64, _: f64, _: ?f64, _: ?f64, _: ?f64, _: ?f64) void {} + +pub fn getImageData( + _: *const OffscreenCanvasRenderingContext2D, + _: i32, // sx + _: i32, // sy + sw: i32, + sh: i32, + page: *Page, +) !*ImageData { + if (sw <= 0 or sh <= 0) { + return error.IndexSizeError; + } + return ImageData.init(@intCast(sw), @intCast(sh), null, page); +} + pub fn save(_: *OffscreenCanvasRenderingContext2D) void {} pub fn restore(_: *OffscreenCanvasRenderingContext2D) void {} pub fn scale(_: *OffscreenCanvasRenderingContext2D, _: f64, _: f64) void {} @@ -124,6 +139,7 @@ pub const JsApi = struct { pub const createImageData = bridge.function(OffscreenCanvasRenderingContext2D.createImageData, .{ .dom_exception = true }); pub const putImageData = bridge.function(OffscreenCanvasRenderingContext2D.putImageData, .{ .noop = true }); + pub const getImageData = bridge.function(OffscreenCanvasRenderingContext2D.getImageData, .{ .dom_exception = true }); pub const save = bridge.function(OffscreenCanvasRenderingContext2D.save, .{ .noop = true }); pub const restore = bridge.function(OffscreenCanvasRenderingContext2D.restore, .{ .noop = true }); pub const scale = bridge.function(OffscreenCanvasRenderingContext2D.scale, .{ .noop = true });