|
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