Skip to content

Commit 8217226

Browse files
Add CanvasColorType, with unorm8 and float16 support
The default behavior is unorm8, which matches the existing behavior of all user agents. The name unorm8 is chosen to match modern APIs which distinguish between 8-bit unsigned normalized and 8-bit unsigned integer (e.g, VK_FORMAT_R8G8B8A8_UNORM vs VK_FORMAT_R8G8B8A8_UINT in Vulkan, MTLPixelFormatRGBA8Unorm vs MTLPixelFormatRGBA8Unorm in Metal, and "rgba8unorm" vs "rgba8uint" in WebGPU). The use of colorType (instead of pixelFormat) is used to avoid the complexity of selecting channel ordering (BGRA vs RGBA) and interactions with the alpha parameter (RGB, RGBX, or BGRX potentially being required if alpha is false).
1 parent d2148b9 commit 8217226

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

source

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65366,12 +65366,15 @@ typedef (<span>HTMLOrSVGImageElement</span> or
6536665366

6536765367
enum <dfn enum>PredefinedColorSpace</dfn> { "<span data-x="dom-PredefinedColorSpace-srgb">srgb</span>", "<span data-x="dom-PredefinedColorSpace-display-p3">display-p3</span>" };
6536865368

65369+
enum <dfn enum>CanvasColorType</dfn> { "<span data-x="dom-CanvasColorType-unorm8">unorm8</span>", "<span data-x="dom-CanvasColorType-float16">float16</span>" };
65370+
6536965371
enum <dfn enum>CanvasFillRule</dfn> { "<span data-x="dom-context-2d-fillRule-nonzero">nonzero</span>", "<span data-x="dom-context-2d-fillRule-evenodd">evenodd</span>" };
6537065372

6537165373
dictionary <dfn dictionary>CanvasRenderingContext2DSettings</dfn> {
6537265374
boolean <span data-x="dom-CanvasRenderingContext2DSettings-alpha">alpha</span> = true;
6537365375
boolean <span data-x="dom-CanvasRenderingContext2DSettings-desynchronized">desynchronized</span> = false;
6537465376
<span>PredefinedColorSpace</span> <span data-x="dom-CanvasRenderingContext2DSettings-colorSpace">colorSpace</span> = "<span data-x="dom-PredefinedColorSpace-srgb">srgb</span>";
65377+
<span>CanvasColorType</span> <span data-x="dom-CanvasRenderingContext2DSettings-colorType">colorType</span> = "<span data-x="dom-CanvasColorType-unorm8">unorm8</span>";
6537565378
boolean <span data-x="dom-CanvasRenderingContext2DSettings-willReadFrequently">willReadFrequently</span> = false;
6537665379
};
6537765380

@@ -65820,6 +65823,19 @@ context.fillRect(100,0,50,50); // only this square remains</code></pre>
6582065823

6582165824
<hr>
6582265825

65826+
<p>The <code>CanvasColorType</code> enumeration is used to specify the <span
65827+
data-x="concept-canvas-color-type">color type</span> of the canvas's backing store.</p>
65828+
65829+
<p>The "<dfn enum-value for="CanvasColorType"><code
65830+
data-x="dom-CanvasColorType-unorm8">unorm8</code></dfn>" value indicates that the type
65831+
for all color channels is 8-bit unsigned normalized.</p>
65832+
65833+
<p>The "<dfn enum-value for="CanvasColorType"><code
65834+
data-x="dom-CanvasColorType-float16">float16</code></dfn>" value indicates that the type
65835+
for all color channels is 16-bit floating point.</p>
65836+
65837+
<hr>
65838+
6582365839
<p>The <code>CanvasFillRule</code> enumeration is used to select the <dfn>fill rule</dfn>
6582465840
algorithm by which to determine if a point is inside or outside a path.</p>
6582565841

@@ -65962,6 +65978,12 @@ context.fillRect(100,0,50,50); // only this square remains</code></pre>
6596265978
data-x="concept-canvas-color-space">color space</span> indicates the color space for the
6596365979
<span>output bitmap</span>.</p>
6596465980

65981+
<p>The <code>CanvasSettings</code> object also has a <dfn
65982+
data-x="concept-canvas-color-type">color type</dfn> setting of type
65983+
<code>CanvasColorType</code>. The <code>CanvasSettings</code> object's <span
65984+
data-x="concept-canvas-color-type">color type</span> indicates the data type of the
65985+
color and alpha components of the pixels of the <span>output bitmap</span>.</p>
65986+
6596565987
<p>To <dfn data-x="canvas-setting-init-bitmap">initialize a <code>CanvasSettings</code> output
6596665988
bitmap</dfn>, given a <code>CanvasSettings</code> <var>context</var> and a
6596765989
<code>CanvasRenderingContext2DSettings</code> <var>settings</var>:</p>
@@ -65980,6 +66002,10 @@ context.fillRect(100,0,50,50); // only this square remains</code></pre>
6598066002
<var>settings</var>["<dfn dict-member for="CanvasRenderingContext2DSettings"><code
6598166003
data-x="dom-CanvasRenderingContext2DSettings-colorSpace">colorSpace</code></dfn>"].</p></li>
6598266004

66005+
<li><p>Set <var>context</var>'s <span data-x="concept-canvas-color-type">color type</span> to
66006+
<var>settings</var>["<dfn dict-member for="CanvasRenderingContext2DSettings"><code
66007+
data-x="dom-CanvasRenderingContext2DSettings-colorType">colorType</code></dfn>"].</p></li>
66008+
6598366009
<li><p>Set <var>context</var>'s <span data-x="concept-canvas-will-read-frequently">will read
6598466010
frequently</span> to <var>settings</var>["<dfn dict-member
6598566011
for="CanvasRenderingContext2DSettings"><code
@@ -71832,6 +71858,16 @@ interface <dfn interface>OffscreenCanvasRenderingContext2D</dfn> {
7183271858
data-x="dom-canvas-toBlob">toBlob()</code> method to the canvas, given the appropriate dimensions,
7183371859
has no visible effect beyond, at most, clipping colors of the canvas to a more narrow gamut.</p>
7183471860

71861+
<p>For image types that support multiple bit depths, the serialized image must use the bit depth
71862+
that best preserves content of the underlying bitmap.</p>
71863+
71864+
<p class="example">For example, when serializing a 2D context that has
71865+
<span data-x="concept-canvas-color-type">color type</span> of
71866+
<span data-x="dom-CanvasColorType-float16">float16</span> to <var>type</var>
71867+
"<code>image/png</code>", the resulting image would have 16 bits per sample.
71868+
This serialization will still lose significant detail (all values less than 0.5/65535
71869+
would be clamped to 0, and all values greater than 1 would be clamped to 1).</p>
71870+
7183571871
<p>If <var>type</var> is an image format that supports variable quality (such as
7183671872
"<code>image/jpeg</code>"), <var>quality</var> is given, and <var>type</var> is not
7183771873
"<code>image/png</code>", then, if <var>quality</var> <span data-x="js-Number">is a Number</span>
@@ -71971,9 +72007,9 @@ interface <dfn interface>OffscreenCanvasRenderingContext2D</dfn> {
7197172007
<p>As certain colors can only be represented under premultiplied alpha (for instance, additive
7197272008
colors), and others can only be represented under non-premultiplied alpha (for instance,
7197372009
"invisible" colors which hold certain red, green, and blue values even with no opacity); and
71974-
division and multiplication on 8-bit integers (which is how canvas's colors are currently stored)
71975-
entails a loss of precision, converting between premultiplied and non-premultiplied alpha is a
71976-
lossy operation on colors that are not fully opaque.</p>
72010+
division and multiplication using finite precision entails a loss of accuracy, converting between
72011+
premultiplied and non-premultiplied alpha is a lossy operation on colors that are not fully
72012+
opaque.</p>
7197772013

7197872014
<p>A <code>CanvasRenderingContext2D</code>'s <span>output bitmap</span> and an
7197972015
<code>OffscreenCanvasRenderingContext2D</code>'s <span>output bitmap</span> must use premultiplied

0 commit comments

Comments
 (0)