diff --git a/src/browser/tests/canvas/canvas_rendering_context_2d.html b/src/browser/tests/canvas/canvas_rendering_context_2d.html index 9b1b1806..66a673ad 100644 --- a/src/browser/tests/canvas/canvas_rendering_context_2d.html +++ b/src/browser/tests/canvas/canvas_rendering_context_2d.html @@ -148,3 +148,13 @@ } + + diff --git a/src/browser/tests/canvas/webgl_rendering_context.html b/src/browser/tests/canvas/webgl_rendering_context.html index 24bad4fd..7c0e8637 100644 --- a/src/browser/tests/canvas/webgl_rendering_context.html +++ b/src/browser/tests/canvas/webgl_rendering_context.html @@ -85,3 +85,13 @@ loseContext.restoreContext(); } + + diff --git a/src/browser/webapi/element/html/Canvas.zig b/src/browser/webapi/element/html/Canvas.zig index 13002f66..70da796b 100644 --- a/src/browser/webapi/element/html/Canvas.zig +++ b/src/browser/webapi/element/html/Canvas.zig @@ -29,6 +29,9 @@ const OffscreenCanvas = @import("../../canvas/OffscreenCanvas.zig"); const Canvas = @This(); _proto: *HtmlElement, +_cached: ?DrawingContext = null, + +const ContextType = enum { none, @"2d", webgl }; pub fn asElement(self: *Canvas) *Element { return self._proto._proto; @@ -68,17 +71,28 @@ const DrawingContext = union(enum) { }; pub fn getContext(self: *Canvas, context_type: []const u8, page: *Page) !?DrawingContext { - if (std.mem.eql(u8, context_type, "2d")) { - const ctx = try page._factory.create(CanvasRenderingContext2D{ ._canvas = self }); - return .{ .@"2d" = ctx }; + if (self._cached) |cached| { + const matches = switch (cached) { + .@"2d" => std.mem.eql(u8, context_type, "2d"), + .webgl => std.mem.eql(u8, context_type, "webgl") or std.mem.eql(u8, context_type, "experimental-webgl"), + }; + return if (matches) cached else null; } - if (std.mem.eql(u8, context_type, "webgl") or std.mem.eql(u8, context_type, "experimental-webgl")) { - const ctx = try page._factory.create(WebGLRenderingContext{}); - return .{ .webgl = ctx }; - } + const drawing_context: DrawingContext = blk: { + if (std.mem.eql(u8, context_type, "2d")) { + const ctx = try page._factory.create(CanvasRenderingContext2D{ ._canvas = self }); + break :blk .{ .@"2d" = ctx }; + } - return null; + if (std.mem.eql(u8, context_type, "webgl") or std.mem.eql(u8, context_type, "experimental-webgl")) { + const ctx = try page._factory.create(WebGLRenderingContext{}); + break :blk .{ .webgl = ctx }; + } + return null; + }; + self._cached = drawing_context; + return drawing_context; } /// Transfers control of the canvas to an OffscreenCanvas.