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