diff --git a/api-reports/2_12.txt b/api-reports/2_12.txt index 2914a12e6..b82f3df7f 100644 --- a/api-reports/2_12.txt +++ b/api-reports/2_12.txt @@ -15838,9 +15838,10 @@ ImageBitmap[JT] def width: Double ImageCapture[JC] def grabFrame(): js.Promise[ImageBitmap] ImageCapture[JC] def takePhoto(): js.Promise[Blob] ImageCapture[JC] val track: MediaStreamTrack -ImageData[JC] def data: js.typedarray.Uint8ClampedArray +ImageData[JC] def data: Uint8ClampedArray ImageData[JC] def height: Int ImageData[JC] def width: Int +ImageDataSettings[JT] var colorSpace: js.UndefOr[PredefinedColorSpace] InputEvent[JC] def bubbles: Boolean InputEvent[JC] def cancelBubble: Boolean InputEvent[JC] def cancelable: Boolean @@ -17397,6 +17398,9 @@ PositionError[JT] def message: String PositionOptions[JC] var enableHighAccuracy: Boolean PositionOptions[JC] var maximumAge: Int PositionOptions[JC] var timeout: Int +PredefinedColorSpace[JT] +PredefinedColorSpace[SO] val `display-p3`: PredefinedColorSpace +PredefinedColorSpace[SO] val srgb: PredefinedColorSpace PresentationStyle[JT] PresentationStyle[SO] val attachment: PresentationStyle PresentationStyle[SO] val inline: PresentationStyle diff --git a/api-reports/2_13.txt b/api-reports/2_13.txt index 2914a12e6..b82f3df7f 100644 --- a/api-reports/2_13.txt +++ b/api-reports/2_13.txt @@ -15838,9 +15838,10 @@ ImageBitmap[JT] def width: Double ImageCapture[JC] def grabFrame(): js.Promise[ImageBitmap] ImageCapture[JC] def takePhoto(): js.Promise[Blob] ImageCapture[JC] val track: MediaStreamTrack -ImageData[JC] def data: js.typedarray.Uint8ClampedArray +ImageData[JC] def data: Uint8ClampedArray ImageData[JC] def height: Int ImageData[JC] def width: Int +ImageDataSettings[JT] var colorSpace: js.UndefOr[PredefinedColorSpace] InputEvent[JC] def bubbles: Boolean InputEvent[JC] def cancelBubble: Boolean InputEvent[JC] def cancelable: Boolean @@ -17397,6 +17398,9 @@ PositionError[JT] def message: String PositionOptions[JC] var enableHighAccuracy: Boolean PositionOptions[JC] var maximumAge: Int PositionOptions[JC] var timeout: Int +PredefinedColorSpace[JT] +PredefinedColorSpace[SO] val `display-p3`: PredefinedColorSpace +PredefinedColorSpace[SO] val srgb: PredefinedColorSpace PresentationStyle[JT] PresentationStyle[SO] val attachment: PresentationStyle PresentationStyle[SO] val inline: PresentationStyle diff --git a/dom/src/main/scala-2/org/scalajs/dom/PredefinedColorSpace.scala b/dom/src/main/scala-2/org/scalajs/dom/PredefinedColorSpace.scala new file mode 100644 index 000000000..74eec11ca --- /dev/null +++ b/dom/src/main/scala-2/org/scalajs/dom/PredefinedColorSpace.scala @@ -0,0 +1,12 @@ +package org.scalajs.dom + +import scala.scalajs.js + +@js.native +sealed trait PredefinedColorSpace extends js.Any + +object PredefinedColorSpace { + val srgb: PredefinedColorSpace = "srgb".asInstanceOf[PredefinedColorSpace] + + val `display-p3`: PredefinedColorSpace = "display-p3".asInstanceOf[PredefinedColorSpace] +} diff --git a/dom/src/main/scala-3/org/scalajs/dom/PredefinedColorSpace.scala b/dom/src/main/scala-3/org/scalajs/dom/PredefinedColorSpace.scala new file mode 100644 index 000000000..ef16528b0 --- /dev/null +++ b/dom/src/main/scala-3/org/scalajs/dom/PredefinedColorSpace.scala @@ -0,0 +1,11 @@ +package org.scalajs.dom + +import scala.scalajs.js + +opaque type PredefinedColorSpace <: String = String + +object PredefinedColorSpace { + val srgb: PredefinedColorSpace = "srgb" + + val `display-p3`: PredefinedColorSpace = "display-p3" +} \ No newline at end of file diff --git a/dom/src/main/scala/org/scalajs/dom/ImageData.scala b/dom/src/main/scala/org/scalajs/dom/ImageData.scala index ebf20f1d7..82c1b8635 100644 --- a/dom/src/main/scala/org/scalajs/dom/ImageData.scala +++ b/dom/src/main/scala/org/scalajs/dom/ImageData.scala @@ -8,6 +8,7 @@ package org.scalajs.dom import scala.scalajs.js import scala.scalajs.js.annotation._ +import scala.scalajs.js.typedarray.Uint8ClampedArray /** The ImageData interface represents the underlying pixel data of an area of a <canvas> element. It is created * using creators on the CanvasRenderingContext2D object associated with the canvas createImageData() and @@ -17,14 +18,63 @@ import scala.scalajs.js.annotation._ @JSGlobal class ImageData extends js.Object { + /** Create an ImageData instance from an array of pixel data and a width. + * @param data + * pixel data + * @param width + * width in pixels + */ + def this(data: Uint8ClampedArray, width: Int) = this() + + /** Create an ImageData instance from an array of pixel data, width, and height. + * @param data + * pixel data + * @param width + * width in pixels + * @param height + * height in pixels + */ + def this(data: Uint8ClampedArray, width: Int, height: Int) = this() + + /** Create a blank ImageData instance from specified width and height. + * @param width + * width in pixels + * @param height + * height in pixels + */ + def this(width: Int, height: Int) = this() + + /** Create a blank ImageData instance from specified width, height, and settings object. + * @param width + * width in pixels + * @param height + * height in pixels + * @param settings + * image settings + */ + def this(width: Int, height: Int, settings: ImageDataSettings) = this() + + /** Create a blank ImageData instance from specified pixel data, width, height, and settings object. + * @param data + * pixel data + * @param width + * width in pixels + * @param height + * height in pixels + * @param settings + * image settings + */ + def this(data: Uint8ClampedArray, width: Int, height: Int, settings: ImageDataSettings) = this() + /** Is an unsigned long representing the actual width, in pixels, of the ImageData. */ def width: Int = js.native /** Is a Uint8ClampedArray representing a one-dimensional array containing the data in the RGBA order, with integer * values between 0 and 255 (included). */ - def data: js.typedarray.Uint8ClampedArray = js.native + def data: Uint8ClampedArray = js.native /** Is an unsigned long representing the actual height, in pixels, of the ImageData. */ def height: Int = js.native + } diff --git a/dom/src/main/scala/org/scalajs/dom/ImageDataSettings.scala b/dom/src/main/scala/org/scalajs/dom/ImageDataSettings.scala new file mode 100644 index 000000000..d611dbefb --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/ImageDataSettings.scala @@ -0,0 +1,7 @@ +package org.scalajs.dom + +import scala.scalajs.js + +trait ImageDataSettings extends js.Object { + var colorSpace: js.UndefOr[PredefinedColorSpace] = js.undefined +} diff --git a/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala b/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala index c0e55b4ad..37fb639af 100644 --- a/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala +++ b/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala @@ -128,4 +128,44 @@ trait BrowserTests extends WebCryptoApiTests { _ <- reasonPromise.future.map(assertEquals(expectedReason, _)) } yield () } + + @Test + final def ImageDataTest(): Unit = { + // Test ImageDataConstructors + // from https://developer.mozilla.org/en-US/docs/Web/API/ImageData/ImageData + + import org.scalajs.dom.{ImageData, ImageDataSettings, PredefinedColorSpace} + import PredefinedColorSpace._ + + val width:Int = 200 + val height:Int = 100 + + // new ImageData(width, height) + val imgDat1: ImageData = new ImageData(width, height) + assertEquals(imgDat1.width, width) + assertEquals(imgDat1.height, height) + assertEquals(imgDat1.data.length, width * height * 4) + + // new ImageData(width, height, settings) // Firefox doesn't support this constructor. + // val defaultImageData: ImageData = new ImageData(width, height, new ImageDataSettings { colorSpace = `display-p3` }) + // assertEquals(defaultImageData.width, width) + // assertEquals(defaultImageData.height, height) + + // new ImageData(dataArray, width) + val imgDat2: ImageData = new ImageData(imgDat1.data, width) + assertEquals(imgDat2.width, width) + assertEquals(imgDat2.height, height) + assertEquals(imgDat2.data.length, width * height * 4) + + // new ImageData(dataArray, width, height) + val imgDat3: ImageData = new ImageData(imgDat2.data, width, height) + assertEquals(imgDat3.width, width) + assertEquals(imgDat3.height, height) + assertEquals(imgDat3.data.length, width * height * 4) + + // new ImageData(dataArray, width, height, settings) + val defaultImageData: ImageData = new ImageData(imgDat3.data, width, height, new ImageDataSettings { colorSpace = `display-p3` }) + assertEquals(defaultImageData.width, width) + assertEquals(defaultImageData.height, height) + } }