imagebitmap: Add 'none' image orientation option (#37634)

The 'none' image orientation option was temporarily deprecated (in 2022)
according to HTML specification with the remark about going to be reused
with
a different meaning in future as the same semantics as CSS 'none'
image-orientation.

https://html.spec.whatwg.org/multipage/#dom-imagebitmapoptions-imageorientation-none
https://www.w3.org/TR/css-images-3/#valdef-image-orientation-none

Official MDN documentation added it back with new meaning (in 2024),
but it wasn't added back to HTML specification (still pending).

https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap#none

At current moment this option is poor supported on all major browsers,
but there are some
existed WPT tests (ImageBitmap/WebGL) which are actively use it in
createImageBitmap() options.

Chromium (supported):
- stable: same as 'from-image' (but with deprecation warning)
- experimental: ignoring any orientation metadata

Firefox (supported as default option):
- stable: ignoring any orientation metadata ('from-image' do the same)

Testing: Improvements and fails (expects 'from-image' behaviour from
'none' option) in the following tests
-
html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html
- webgl/tests/conformance/textures/misc/exif-orientation.html

Fixes (partialy): #34112

Signed-off-by: Andrei Volykhin <andrei.volykhin@gmail.com>
This commit is contained in:
Andrei Volykhin 2025-06-25 10:20:12 +03:00 committed by GitHub
parent 922d4b83de
commit 4ee348a202
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 960 additions and 29 deletions

View file

@ -20,7 +20,7 @@ typedef (CanvasImageSource or
Blob or Blob or
ImageData) ImageBitmapSource; ImageData) ImageBitmapSource;
enum ImageOrientation { "from-image", "flipY" }; enum ImageOrientation { "from-image", "flipY", "none" };
enum PremultiplyAlpha { "none", "premultiply", "default" }; enum PremultiplyAlpha { "none", "premultiply", "default" };
enum ColorSpaceConversion { "none", "default" }; enum ColorSpaceConversion { "none", "default" };
enum ResizeQuality { "pixelated", "low", "medium", "high" }; enum ResizeQuality { "pixelated", "low", "medium", "high" };

View file

@ -1,25 +0,0 @@
[createImageBitmap-exif-orientation_none.html]
expected: ERROR
[createImageBitmap with Orientation 1]
expected: TIMEOUT
[createImageBitmap with Orientation 2]
expected: TIMEOUT
[createImageBitmap with Orientation 3]
expected: TIMEOUT
[createImageBitmap with Orientation 4]
expected: TIMEOUT
[createImageBitmap with Orientation 5]
expected: TIMEOUT
[createImageBitmap with Orientation 6]
expected: TIMEOUT
[createImageBitmap with Orientation 7]
expected: TIMEOUT
[createImageBitmap with Orientation 8]
expected: TIMEOUT

View file

@ -1,4 +1,960 @@
[exif-orientation.html] [exif-orientation.html]
expected: ERROR [WebGL test #65]
[Overall test] expected: FAIL
expected: NOTRUN
[WebGL test #66]
expected: FAIL
[WebGL test #69]
expected: FAIL
[WebGL test #70]
expected: FAIL
[WebGL test #73]
expected: FAIL
[WebGL test #74]
expected: FAIL
[WebGL test #77]
expected: FAIL
[WebGL test #78]
expected: FAIL
[WebGL test #81]
expected: FAIL
[WebGL test #82]
expected: FAIL
[WebGL test #85]
expected: FAIL
[WebGL test #86]
expected: FAIL
[WebGL test #89]
expected: FAIL
[WebGL test #90]
expected: FAIL
[WebGL test #93]
expected: FAIL
[WebGL test #94]
expected: FAIL
[WebGL test #97]
expected: FAIL
[WebGL test #98]
expected: FAIL
[WebGL test #101]
expected: FAIL
[WebGL test #102]
expected: FAIL
[WebGL test #105]
expected: FAIL
[WebGL test #106]
expected: FAIL
[WebGL test #109]
expected: FAIL
[WebGL test #110]
expected: FAIL
[WebGL test #113]
expected: FAIL
[WebGL test #114]
expected: FAIL
[WebGL test #117]
expected: FAIL
[WebGL test #118]
expected: FAIL
[WebGL test #121]
expected: FAIL
[WebGL test #122]
expected: FAIL
[WebGL test #125]
expected: FAIL
[WebGL test #126]
expected: FAIL
[WebGL test #128]
expected: FAIL
[WebGL test #129]
expected: FAIL
[WebGL test #130]
expected: FAIL
[WebGL test #131]
expected: FAIL
[WebGL test #132]
expected: FAIL
[WebGL test #133]
expected: FAIL
[WebGL test #134]
expected: FAIL
[WebGL test #135]
expected: FAIL
[WebGL test #136]
expected: FAIL
[WebGL test #137]
expected: FAIL
[WebGL test #138]
expected: FAIL
[WebGL test #139]
expected: FAIL
[WebGL test #140]
expected: FAIL
[WebGL test #141]
expected: FAIL
[WebGL test #142]
expected: FAIL
[WebGL test #143]
expected: FAIL
[WebGL test #144]
expected: FAIL
[WebGL test #145]
expected: FAIL
[WebGL test #146]
expected: FAIL
[WebGL test #147]
expected: FAIL
[WebGL test #148]
expected: FAIL
[WebGL test #149]
expected: FAIL
[WebGL test #150]
expected: FAIL
[WebGL test #151]
expected: FAIL
[WebGL test #152]
expected: FAIL
[WebGL test #153]
expected: FAIL
[WebGL test #154]
expected: FAIL
[WebGL test #155]
expected: FAIL
[WebGL test #156]
expected: FAIL
[WebGL test #157]
expected: FAIL
[WebGL test #158]
expected: FAIL
[WebGL test #159]
expected: FAIL
[WebGL test #160]
expected: FAIL
[WebGL test #161]
expected: FAIL
[WebGL test #162]
expected: FAIL
[WebGL test #163]
expected: FAIL
[WebGL test #164]
expected: FAIL
[WebGL test #165]
expected: FAIL
[WebGL test #166]
expected: FAIL
[WebGL test #167]
expected: FAIL
[WebGL test #168]
expected: FAIL
[WebGL test #169]
expected: FAIL
[WebGL test #170]
expected: FAIL
[WebGL test #171]
expected: FAIL
[WebGL test #172]
expected: FAIL
[WebGL test #173]
expected: FAIL
[WebGL test #174]
expected: FAIL
[WebGL test #175]
expected: FAIL
[WebGL test #176]
expected: FAIL
[WebGL test #177]
expected: FAIL
[WebGL test #178]
expected: FAIL
[WebGL test #179]
expected: FAIL
[WebGL test #180]
expected: FAIL
[WebGL test #181]
expected: FAIL
[WebGL test #182]
expected: FAIL
[WebGL test #183]
expected: FAIL
[WebGL test #184]
expected: FAIL
[WebGL test #185]
expected: FAIL
[WebGL test #186]
expected: FAIL
[WebGL test #187]
expected: FAIL
[WebGL test #188]
expected: FAIL
[WebGL test #189]
expected: FAIL
[WebGL test #190]
expected: FAIL
[WebGL test #191]
expected: FAIL
[WebGL test #192]
expected: FAIL
[WebGL test #195]
expected: FAIL
[WebGL test #196]
expected: FAIL
[WebGL test #199]
expected: FAIL
[WebGL test #200]
expected: FAIL
[WebGL test #203]
expected: FAIL
[WebGL test #204]
expected: FAIL
[WebGL test #207]
expected: FAIL
[WebGL test #208]
expected: FAIL
[WebGL test #211]
expected: FAIL
[WebGL test #212]
expected: FAIL
[WebGL test #215]
expected: FAIL
[WebGL test #216]
expected: FAIL
[WebGL test #219]
expected: FAIL
[WebGL test #220]
expected: FAIL
[WebGL test #223]
expected: FAIL
[WebGL test #224]
expected: FAIL
[WebGL test #227]
expected: FAIL
[WebGL test #228]
expected: FAIL
[WebGL test #231]
expected: FAIL
[WebGL test #232]
expected: FAIL
[WebGL test #235]
expected: FAIL
[WebGL test #236]
expected: FAIL
[WebGL test #239]
expected: FAIL
[WebGL test #240]
expected: FAIL
[WebGL test #243]
expected: FAIL
[WebGL test #244]
expected: FAIL
[WebGL test #247]
expected: FAIL
[WebGL test #248]
expected: FAIL
[WebGL test #251]
expected: FAIL
[WebGL test #252]
expected: FAIL
[WebGL test #255]
expected: FAIL
[WebGL test #256]
expected: FAIL
[WebGL test #258]
expected: FAIL
[WebGL test #259]
expected: FAIL
[WebGL test #260]
expected: FAIL
[WebGL test #262]
expected: FAIL
[WebGL test #263]
expected: FAIL
[WebGL test #264]
expected: FAIL
[WebGL test #265]
expected: FAIL
[WebGL test #267]
expected: FAIL
[WebGL test #268]
expected: FAIL
[WebGL test #269]
expected: FAIL
[WebGL test #271]
expected: FAIL
[WebGL test #272]
expected: FAIL
[WebGL test #273]
expected: FAIL
[WebGL test #275]
expected: FAIL
[WebGL test #276]
expected: FAIL
[WebGL test #277]
expected: FAIL
[WebGL test #279]
expected: FAIL
[WebGL test #280]
expected: FAIL
[WebGL test #282]
expected: FAIL
[WebGL test #283]
expected: FAIL
[WebGL test #284]
expected: FAIL
[WebGL test #286]
expected: FAIL
[WebGL test #287]
expected: FAIL
[WebGL test #288]
expected: FAIL
[WebGL test #289]
expected: FAIL
[WebGL test #291]
expected: FAIL
[WebGL test #292]
expected: FAIL
[WebGL test #293]
expected: FAIL
[WebGL test #295]
expected: FAIL
[WebGL test #296]
expected: FAIL
[WebGL test #298]
expected: FAIL
[WebGL test #299]
expected: FAIL
[WebGL test #300]
expected: FAIL
[WebGL test #302]
expected: FAIL
[WebGL test #303]
expected: FAIL
[WebGL test #304]
expected: FAIL
[WebGL test #305]
expected: FAIL
[WebGL test #307]
expected: FAIL
[WebGL test #308]
expected: FAIL
[WebGL test #309]
expected: FAIL
[WebGL test #311]
expected: FAIL
[WebGL test #312]
expected: FAIL
[WebGL test #313]
expected: FAIL
[WebGL test #315]
expected: FAIL
[WebGL test #316]
expected: FAIL
[WebGL test #317]
expected: FAIL
[WebGL test #319]
expected: FAIL
[WebGL test #320]
expected: FAIL
[WebGL test #321]
expected: FAIL
[WebGL test #323]
expected: FAIL
[WebGL test #324]
expected: FAIL
[WebGL test #325]
expected: FAIL
[WebGL test #327]
expected: FAIL
[WebGL test #328]
expected: FAIL
[WebGL test #330]
expected: FAIL
[WebGL test #331]
expected: FAIL
[WebGL test #332]
expected: FAIL
[WebGL test #334]
expected: FAIL
[WebGL test #335]
expected: FAIL
[WebGL test #336]
expected: FAIL
[WebGL test #338]
expected: FAIL
[WebGL test #339]
expected: FAIL
[WebGL test #340]
expected: FAIL
[WebGL test #342]
expected: FAIL
[WebGL test #343]
expected: FAIL
[WebGL test #344]
expected: FAIL
[WebGL test #345]
expected: FAIL
[WebGL test #347]
expected: FAIL
[WebGL test #348]
expected: FAIL
[WebGL test #349]
expected: FAIL
[WebGL test #351]
expected: FAIL
[WebGL test #352]
expected: FAIL
[WebGL test #354]
expected: FAIL
[WebGL test #355]
expected: FAIL
[WebGL test #356]
expected: FAIL
[WebGL test #358]
expected: FAIL
[WebGL test #359]
expected: FAIL
[WebGL test #360]
expected: FAIL
[WebGL test #361]
expected: FAIL
[WebGL test #363]
expected: FAIL
[WebGL test #364]
expected: FAIL
[WebGL test #365]
expected: FAIL
[WebGL test #367]
expected: FAIL
[WebGL test #368]
expected: FAIL
[WebGL test #370]
expected: FAIL
[WebGL test #371]
expected: FAIL
[WebGL test #372]
expected: FAIL
[WebGL test #374]
expected: FAIL
[WebGL test #375]
expected: FAIL
[WebGL test #376]
expected: FAIL
[WebGL test #378]
expected: FAIL
[WebGL test #379]
expected: FAIL
[WebGL test #380]
expected: FAIL
[WebGL test #382]
expected: FAIL
[WebGL test #383]
expected: FAIL
[WebGL test #384]
expected: FAIL
[WebGL test #385]
expected: FAIL
[WebGL test #387]
expected: FAIL
[WebGL test #388]
expected: FAIL
[WebGL test #389]
expected: FAIL
[WebGL test #391]
expected: FAIL
[WebGL test #392]
expected: FAIL
[WebGL test #394]
expected: FAIL
[WebGL test #395]
expected: FAIL
[WebGL test #396]
expected: FAIL
[WebGL test #398]
expected: FAIL
[WebGL test #399]
expected: FAIL
[WebGL test #400]
expected: FAIL
[WebGL test #402]
expected: FAIL
[WebGL test #403]
expected: FAIL
[WebGL test #404]
expected: FAIL
[WebGL test #406]
expected: FAIL
[WebGL test #407]
expected: FAIL
[WebGL test #408]
expected: FAIL
[WebGL test #409]
expected: FAIL
[WebGL test #411]
expected: FAIL
[WebGL test #412]
expected: FAIL
[WebGL test #413]
expected: FAIL
[WebGL test #415]
expected: FAIL
[WebGL test #416]
expected: FAIL
[WebGL test #418]
expected: FAIL
[WebGL test #419]
expected: FAIL
[WebGL test #420]
expected: FAIL
[WebGL test #422]
expected: FAIL
[WebGL test #423]
expected: FAIL
[WebGL test #424]
expected: FAIL
[WebGL test #425]
expected: FAIL
[WebGL test #427]
expected: FAIL
[WebGL test #428]
expected: FAIL
[WebGL test #429]
expected: FAIL
[WebGL test #431]
expected: FAIL
[WebGL test #432]
expected: FAIL
[WebGL test #434]
expected: FAIL
[WebGL test #435]
expected: FAIL
[WebGL test #436]
expected: FAIL
[WebGL test #438]
expected: FAIL
[WebGL test #439]
expected: FAIL
[WebGL test #440]
expected: FAIL
[WebGL test #442]
expected: FAIL
[WebGL test #443]
expected: FAIL
[WebGL test #444]
expected: FAIL
[WebGL test #446]
expected: FAIL
[WebGL test #447]
expected: FAIL
[WebGL test #448]
expected: FAIL
[WebGL test #450]
expected: FAIL
[WebGL test #451]
expected: FAIL
[WebGL test #452]
expected: FAIL
[WebGL test #454]
expected: FAIL
[WebGL test #455]
expected: FAIL
[WebGL test #456]
expected: FAIL
[WebGL test #457]
expected: FAIL
[WebGL test #459]
expected: FAIL
[WebGL test #460]
expected: FAIL
[WebGL test #461]
expected: FAIL
[WebGL test #463]
expected: FAIL
[WebGL test #464]
expected: FAIL
[WebGL test #465]
expected: FAIL
[WebGL test #467]
expected: FAIL
[WebGL test #468]
expected: FAIL
[WebGL test #469]
expected: FAIL
[WebGL test #471]
expected: FAIL
[WebGL test #472]
expected: FAIL
[WebGL test #474]
expected: FAIL
[WebGL test #475]
expected: FAIL
[WebGL test #476]
expected: FAIL
[WebGL test #478]
expected: FAIL
[WebGL test #479]
expected: FAIL
[WebGL test #480]
expected: FAIL
[WebGL test #481]
expected: FAIL
[WebGL test #483]
expected: FAIL
[WebGL test #484]
expected: FAIL
[WebGL test #485]
expected: FAIL
[WebGL test #487]
expected: FAIL
[WebGL test #488]
expected: FAIL
[WebGL test #490]
expected: FAIL
[WebGL test #491]
expected: FAIL
[WebGL test #492]
expected: FAIL
[WebGL test #494]
expected: FAIL
[WebGL test #495]
expected: FAIL
[WebGL test #496]
expected: FAIL
[WebGL test #497]
expected: FAIL
[WebGL test #499]
expected: FAIL
[WebGL test #500]
expected: FAIL
[WebGL test #501]
expected: FAIL
[WebGL test #503]
expected: FAIL
[WebGL test #504]
expected: FAIL
[WebGL test #505]
expected: FAIL
[WebGL test #507]
expected: FAIL
[WebGL test #508]
expected: FAIL
[WebGL test #509]
expected: FAIL
[WebGL test #511]
expected: FAIL