|
4810 | 4810 |
|
4811 | 4811 | When invoked, run these steps:
|
4812 | 4812 | 1. If |init| is not [=valid ImageDecoderInit=], throw a {{TypeError}}.
|
4813 |
| - 2. Let |d| be a new {{ImageDecoder}} object. In the steps below, all |
| 4813 | + 2. If |init|.{{ImageDecoderInit/transfer}} contains more than one reference |
| 4814 | + to the same {{ArrayBuffer}}, then throw a {{DataCloneError}} {{DOMException}}. |
| 4815 | + 3. For each |transferable| in |init|.{{ImageDecoderInit/transfer}}: |
| 4816 | + 1. If {{platform object/[[Detached]]}} internal slot is `true`, |
| 4817 | + then throw a {{DataCloneError}} {{DOMException}}. |
| 4818 | + 4. Let |d| be a new {{ImageDecoder}} object. In the steps below, all |
4814 | 4819 | mentions of {{ImageDecoder}} members apply to |d| unless stated
|
4815 | 4820 | otherwise.
|
4816 |
| - 3. Assign a new [=queue=] to {{ImageDecoder/[[control message queue]]}}. |
4817 |
| - 4. Assign `false` to {{ImageDecoder/[[message queue blocked]]}}. |
4818 |
| - 5. Assign the result of starting a new [=parallel queue=] to |
| 4821 | + 5. Assign a new [=queue=] to {{ImageDecoder/[[control message queue]]}}. |
| 4822 | + 6. Assign `false` to {{ImageDecoder/[[message queue blocked]]}}. |
| 4823 | + 7. Assign the result of starting a new [=parallel queue=] to |
4819 | 4824 | {{ImageDecoder/[[codec work queue]]}}.
|
4820 |
| - 6. Assign {{ImageDecoder/[[ImageTrackList]]}} a new {{ImageTrackList}} |
| 4825 | + 8. Assign {{ImageDecoder/[[ImageTrackList]]}} a new {{ImageTrackList}} |
4821 | 4826 | initialized as follows:
|
4822 | 4827 | 1. Assign a new [=list=] to {{ImageTrackList/[[track list]]}}.
|
4823 | 4828 | 2. Assign `-1` to {{ImageTrackList/[[selected index]]}}.
|
4824 |
| - 7. Assign {{ImageDecoderInit/type}} to {{ImageDecoder/[[type]]}}. |
4825 |
| - 8. Assign `null` to {{ImageDecoder/[[codec implementation]]}}. |
4826 |
| - 9. If `init.preferAnimation` [=map/exists=], assign `init.preferAnimation` |
| 4829 | + 9. Assign {{ImageDecoderInit/type}} to {{ImageDecoder/[[type]]}}. |
| 4830 | + 10. Assign `null` to {{ImageDecoder/[[codec implementation]]}}. |
| 4831 | + 11. If `init.preferAnimation` [=map/exists=], assign `init.preferAnimation` |
4827 | 4832 | to the {{ImageDecoder/[[prefer animation]]}} internal slot. Otherwise,
|
4828 | 4833 | assign 'null' to {{ImageDecoder/[[prefer animation]]}} internal slot.
|
4829 |
| - 10. Assign a new [=list=] to {{ImageDecoder/[[pending decode promises]]}}. |
4830 |
| - 11. Assign `-1` to {{ImageDecoder/[[internal selected track index]]}}. |
4831 |
| - 12. Assign `false` to {{ImageDecoder/[[tracks established]]}}. |
4832 |
| - 13. Assign `false` to {{ImageDecoder/[[closed]]}}. |
4833 |
| - 14. Assign a new [=map=] to {{ImageDecoder/[[progressive frame |
| 4834 | + 12. Assign a new [=list=] to {{ImageDecoder/[[pending decode promises]]}}. |
| 4835 | + 13. Assign `-1` to {{ImageDecoder/[[internal selected track index]]}}. |
| 4836 | + 14. Assign `false` to {{ImageDecoder/[[tracks established]]}}. |
| 4837 | + 15. Assign `false` to {{ImageDecoder/[[closed]]}}. |
| 4838 | + 16. Assign a new [=map=] to {{ImageDecoder/[[progressive frame |
4834 | 4839 | generations]]}}.
|
4835 |
| - 15. If |init|'s {{ImageDecoderInit/data}} member is of type |
| 4840 | + 17. If |init|'s {{ImageDecoderInit/data}} member is of type |
4836 | 4841 | {{ReadableStream}}:
|
4837 | 4842 | 1. Assign a new [=list=] to {{ImageDecoder/[[encoded data]]}}.
|
4838 | 4843 | 2. Assign `false` to {{ImageDecoder/[[complete]]}}
|
|
4843 | 4848 | {{ImageDecoderInit/data}}.
|
4844 | 4849 | 6. In parallel, perform the [=Fetch Stream Data Loop=] on |d| with
|
4845 | 4850 | |reader|.
|
4846 |
| - 16. Otherwise: |
| 4851 | + 18. Otherwise: |
4847 | 4852 | 1. Assert that `init.data` is of type {{BufferSource}}.
|
4848 |
| - 2. Assign a copy of `init.data` to {{ImageDecoder/[[encoded data]]}}. |
4849 |
| - 3. Assign `true` to {{ImageDecoder/[[complete]]}}. |
4850 |
| - 4. Reslove {{ImageDecoder/[[completed promise]]}}. |
4851 |
| - 5. Queue a control message to [=configure the image decoder=] with |
| 4853 | + 2. If |init|.{{ImageDecoderInit/transfer}} contains an {{ArrayBuffer}} |
| 4854 | + referenced by |init|.{{ImageDecoderInit/data}} the User Agent |
| 4855 | + <em class="rfc2119">MAY</em> choose to: |
| 4856 | + 1. Let {{ImageDecoder/[[encoded data]]}} reference bytes in |data| |
| 4857 | + representing an encoded image. |
| 4858 | + 3. Otherwise: |
| 4859 | + 1. Assign a copy of `init.data` to {{ImageDecoder/[[encoded data]]}}. |
| 4860 | + 4. Assign `true` to {{ImageDecoder/[[complete]]}}. |
| 4861 | + 5. Resolve {{ImageDecoder/[[completed promise]]}}. |
| 4862 | + 6. Queue a control message to [=configure the image decoder=] with |
4852 | 4863 | |init|.
|
4853 |
| - 6. Queue a control message to [=decode track metadata=]. |
4854 |
| - 7. [=Process the control message queue=]. |
4855 |
| - 17. return |d|. |
| 4864 | + 7. Queue a control message to [=decode track metadata=]. |
| 4865 | + 8. [=Process the control message queue=]. |
| 4866 | + 19. For each |transferable| in |init|.{{ImageDecoderInit/transfer}}: |
| 4867 | + 1. Perform [DetachArrayBuffer](https://tc39.es/ecma262/#sec-detacharraybuffer) |
| 4868 | + on |transferable| |
| 4869 | + 20. return |d|. |
4856 | 4870 |
|
4857 | 4871 | [=Running a control message=] to <dfn>configure the image decoder</dfn>
|
4858 | 4872 | means running these steps:
|
|
5278 | 5292 | [EnforceRange] unsigned long desiredWidth;
|
5279 | 5293 | [EnforceRange] unsigned long desiredHeight;
|
5280 | 5294 | boolean preferAnimation;
|
| 5295 | + sequence<ArrayBuffer> transfer = []; |
5281 | 5296 | };
|
5282 | 5297 | </xmp>
|
5283 | 5298 | </pre>
|
|
0 commit comments