1. 序論
~CSSの塗り段階は、~boxの[ (~layout段階で生成される)~size【言い換えれば,~sizeの使用~値】, 算出d~style【各種~propの算出d値】 ]に基づく,~boxの[ 背景, 内容, 強調 ]の塗ngを担当する。 ◎ The paint stage of CSS is responsible for painting the background, content and highlight of a box based on that box’s size (as generated by the layout stage) and computed style.
この仕様は、[ 追加的な `image$t 関数で[ ~size/算出d~style ]の各~変化に呼応して,~boxの一部を塗る ]ことを開発者に許容する~APIを述べる。 ◎ This specification describes an API which allows developers to paint a part of a box in response to size / computed style changes with an additional <image> function.
注記: この仕様の将来~versionでは、~boxのある部位に対する(例えば,背景~層に対する)[ 切抜き領域, 大域~alpha, ~filter ]の定義-法の~supportも追加され得る。 ◎ Note: In a future version of the spec, support could be added for defining the clip, global alpha, filter on a portion of a box (for example on the background layers).
2. 塗り~worklet
`paintWorklet$m 属性は、塗ngに関係するすべての~classを担当する `Worklet$I に~accessできるようにする。 ◎ The paintWorklet attribute allows access to the Worklet responsible for all the classes which are related to painting.
`paintWorklet$m の`~worklet大域~scope型$は、 `PaintWorkletGlobalScope$I である。 ◎ The paintWorklet's worklet global scope type is PaintWorkletGlobalScope.
`paintWorklet$m の`~worklet行先~種別$wLは、 `paintworklet^l である。 ◎ The paintWorklet's worklet destination type is "paintworklet".
partial namespace `CSS$I { [`SameObject$] readonly attribute `Worklet$I `paintWorklet@m; };
`PaintWorkletGlobalScope$I は `paintWorklet$m の大域~実行~文脈である。 ◎ A PaintWorkletGlobalScope is a global execution context of the paintWorklet.
各 `PaintWorkletGlobalScope$I は `devicePixelRatio$m ~propを持つ — それは `Window^I 上の `devicePixelRatio^m ~propに一致する。 ◎ A PaintWorkletGlobalScope has a devicePixelRatio property which is identical to the Window.devicePixelRatio property.
[`Global$=(Worklet,PaintWorklet),`Exposed$=PaintWorklet] interface `PaintWorkletGlobalScope@I : `WorkletGlobalScope$I { `undefined$ `registerPaint$m(`DOMString$ %name, `VoidFunction$ %paintCtor); readonly attribute `unrestricted double$ `devicePixelRatio@m; };
`PaintRenderingContext2DSettings$I は、塗り~canvasに結付けられる描画~文脈~用の設定群を包含する。 `PaintRenderingContext2DSettings$I は、~canvas描画~文脈の~2D設定群 【 `CanvasRenderingContext2DSettings$I 】 が~supportするものの下位集合を供する。 将来には、塗り~canvasにおける色~管理も~supportするよう,拡張され得る。 ◎ The PaintRenderingContext2DSettings contains the settings for the rendering context associated with the paint canvas. The PaintRenderingContext2DSettings provides a supported subset of canvas rendering context 2D settings. In the future, it may be extended to support color management in paint canvas.
dictionary `PaintRenderingContext2DSettings@I { `boolean$ `alpha@m = true; };
注記: 当の~classは、次のような~~形をとるベキである: ◎ Note: The shape of the class should be:
class MyPaint {
static get inputProperties() { return ['--foo']; }
static get inputArguments() { return ['<color>']; }
static get contextOptions() { return {alpha: true}; }
paint(%ctx, %size, %styleMap) {
/*
塗り~codeはここに。
◎
Paint code goes here.
*/
}
}
3. 各種~概念
`塗り定義@ は、[ `PaintWorkletGlobalScope$I に必要になる,作者が定義する `image$t についての情報 ]を述べる`構造体$であり( `paint$f 関数により参照され得る),次に挙げるものからなる: ◎ A paint definition is a struct which describes the information needed by the PaintWorkletGlobalScope about the author defined <image> (which can be referenced by the <paint()> function). It consists of:
- `~class構築子@pD ⇒ ~JS `~class構築子$ ◎ class constructor which is the class constructor.
- `塗り関数@pD ⇒ `Function$I 型の `~callback関数$ 【原文の参照先 Function (~CSS関数~記法)は誤りであろう。】 ◎ paint function which is the paint Function callback function type.
- `構築子は妥当か@pD ⇒ 真偽値 ◎ constructor valid flag.
- `入力~prop~list@pD ⇒ 0 個以上の文字列からなる`~list$( ~SeqDS 型の値) ◎ input properties which is a list of DOMStrings.
- `塗り~2D描画~文脈~設定群@pD ⇒ `PaintRenderingContext2DSettings$I ~obj ◎ A PaintRenderingContext2DSettings object.
`文書~塗り定義@ は、[ `文書$に必要になる,作者が定義する `image$t についての情報 ]を述べる`構造体$であり( `paint$f 関数により参照され得る),次に挙げるものからなる: ◎ A document paint definition is a struct which describes the information needed by the document about the author defined <image> function (which can be referenced by the paint function). It consists of:
- `入力~prop~list@dPD ⇒ 0 個以上の文字列からなる`~list$( ~SeqDS 型の値) ◎ A input properties which is a list of DOMStrings.
- `入力~引数~構文@dPD ⇒ `構文~定義$の`~list$ ◎ A input argument syntaxes which is a list of syntax definitions.
- `塗り~2D描画~文脈~設定群@dPD ⇒ `PaintRenderingContext2DSettings$I ~obj ◎ A PaintRenderingContext2DSettings object.
4. ~customな塗りの登録-法
各 `文書$は、 `文書~塗り定義~map@ を持つ。 それは、`有順序~map$であり,初期~時には空とする。 この~mapは、 `registerPaint()$m が~callされたときに拡充される。 ◎ The document has a map of document paint definitions. Initially this map is empty; it is populated when registerPaint(name, paintCtor) is called.
各 `PaintWorkletGlobalScope$I ~objは、次に挙げるものを持つ: ◎ ↓
- `塗り定義~map@
- `有順序~map$であり,初期~時には空とする。 この~mapは、 `registerPaint()$m が~callされたときに拡充される。 ◎ A PaintWorkletGlobalScope has a map of paint definitions. Initially this map is empty; it is populated when registerPaint(name, paintCtor) is called.
- `塗り~class~instance~map@pD
- `有順序~map$であり,初期~時には空とする。 この~mapは、~UAが`塗り関数の画像を描く$を呼出したときに拡充される。 ◎ A PaintWorkletGlobalScope has a map of paint class instances. Initially this map is empty; it is populated when draw a paint image is invoked by the user agent.
- ~UAは、任意の時点に,この~map内の塗り~classの~instanceを `dispose^en する 【別~threadへ移動する?】 か除去してもヨイ。 これは、[ `paint$f 関数がもはや利用されなくなった/~memoryを取戻す必要がある ]ときに行なわれ得る。 ◎ Instances of paint classes in the paint class instances map may be disposed and removed from the map by the user agent at any time. This may be done when a <paint()> function no longer is used, or the user agent needs to reclaim memory.
`registerPaint(name, paintCtor)@m ~method手続きは: ◎ When the registerPaint(name, paintCtor) method is called, the user agent must run the following steps:
- ~IF[ %name ~EQ 空~文字列 ] ⇒ ~THROW `TypeError$E ◎ If the name is an empty string, throw a TypeError and abort all these steps.
- %塗り定義~map ~LET `PaintWorkletGlobalScope$I の`塗り定義~map$ ◎ Let paintDefinitionMap be PaintWorkletGlobalScope's paint definitions map.
- ~IF[ %塗り定義~map[ %name ] ~NEQ ε ] ⇒ ~THROW `InvalidModificationError$E ◎ If paintDefinitionMap[name] exists throw a "InvalidModificationError" DOMException and abort all these steps.
- %入力~prop~list ~LET `Get$jA( %paintCtor, `inputProperties^l ) の結果に応じて ⇒# `undefined^jv ならば空な ~SeqDS / ~ELSE_ `~IDL値に変換する$( 結果, ~SeqDS )(例外投出あり) ◎ Let inputProperties be an empty sequence<DOMString>. ◎ Let inputPropertiesIterable be the result of Get(paintCtor, "inputProperties"). ◎ If inputPropertiesIterable is not undefined, then set inputProperties to the result of converting inputPropertiesIterable to a sequence<DOMString>. If an exception is thrown, rethrow the exception and abort all these steps.
-
%入力~prop~list から[ `~supportされる~CSS~prop$, `~custom~prop$ ]以外の~itemを取り除く ◎ Filter inputProperties so that it only contains supported CSS properties and custom properties.
注記: 入力~prop~list取得子 【 `get inputProperties()^c 】 が供する~CSS~propの~listは、~custom~prop, 略式~propも含めれることに加え、塗り画像~classを前方-互換にするため,~UAにとって現在~妥当でない~prop(例: `margin-nanjasorya-property^p )も含めれる。 ◎ Note: The list of CSS properties provided by the input properties getter can either be custom or native CSS properties. ◎ Note: The list of CSS properties may contain shorthands. ◎ Note: In order for a paint image class to be forwards compatible, the list of CSS properties can also contains currently invalid properties for the user agent. For example margin-bikeshed-property.
- %入力~引数~list ~LET `Get$jA( %paintCtor, `inputArguments^l ) の結果に応じて ⇒# `undefined^jv ならば空な ~SeqDS / ~ELSE_ `~IDL値に変換する$( 結果, ~SeqDS )(例外投出あり) ◎ Let inputArguments be an empty sequence<DOMString>. ◎ Let inputArgumentsIterable be the result of Get(paintCtor, "inputArguments"). ◎ If inputArgumentsIterable is not undefined, then set inputArguments to the result of converting inputArgumentsIterable to a sequence<DOMString>. If an exception is thrown, rethrow the exception and abort all these steps.
- %入力~引数~list構文~list ~LET 新たな`~list$ ◎ Let inputArgumentSyntaxes be an empty list.
-
%入力~引数~list 内の ~EACH( %~item ) に対し: ◎ For each item in inputArguments perform the following substeps:
- %構文解析した構文 ~LET `構文~定義を消費する$( %~item ) ◎ Attempt to consume a syntax definition from item.\
- ~IF[ %構文解析した構文 ~EQ `失敗^i ] ⇒ ~THROW `TypeError$E ◎ If failure was returned, throw a TypeError and abort all these steps. Otherwise, let parsedSyntax be the returned syntax definition.
- %入力~引数~list構文~list に %構文解析した構文 を`付加する$ ◎ Append parsedSyntax to inputArgumentSyntaxes.
-
%塗り~2D描画~文脈~設定群 ~LET `~IDL値に変換する$( `Get$jA( %paintCtor, `contextOptions^l ), `PaintRenderingContext2DSettings$I )(例外投出あり) ◎ Let contextOptionsValue be the result of Get(paintCtor, "contextOptions"). ◎ Let paintRenderingContext2DSettings be the result of converting contextOptionsValue to a PaintRenderingContext2DSettings. If an exception is thrown, rethrow the exception and abort all these steps.
注記: %塗り~2D描画~文脈~設定群 の `alpha$m を ~F に設定した場合、~textに対する “可視性” の最適化を遂行する(例:塗り画像が不透明なときには、その背後にある画像を塗らない)ことに加え,~anti-aliasすることを~UAに許容する。 ◎ Note: Setting paintRenderingContext2DSettings.alpha is false allows user agents to anti-alias text in addition to performing "visibility" optimizations, e.g. not painting an image behind the paint image as the paint image is opaque.
- ~IF[ `IsConstructor$jA( %paintCtor ) ~EQ ~F ] ⇒ ~THROW `TypeError$E ◎ If the result of IsConstructor(paintCtor) is false, throw a TypeError and abort all these steps.
- %~prototype ~LET `Get$jA( %paintCtor, `prototype^l ) ◎ Let prototype be the result of Get(paintCtor, "prototype").
- ~IF[ `Type$jA( %~prototype ) ~NEQ `Object^jC ] ⇒ ~THROW `TypeError$E ◎ If the result of Type(prototype) is not Object, throw a TypeError and abort all these steps.
- %塗り関数 ~LET `~IDL値に変換する$( `Get$jA( %~prototype, `paint^l ), `Function$I )(例外投出あり) ◎ Let paintValue be the result of Get(prototype, "paint"). ◎ Let paint be the result of converting paintValue to the Function callback function type. Rethrow any exceptions from the conversion.
- %定義 ~LET 次のようにされた新たな`塗り定義$ ⇒# `~class構築子$pD ~SET %paintCtor, `塗り関数$pD ~SET %塗り関数, `構築子は妥当か$pD ~SET ~T, `入力~prop~list$pD ~SET %入力~prop~list, `塗り~2D描画~文脈~設定群$pD ~SET %塗り~2D描画~文脈~設定群 ◎ Let definition be a new paint definition with: • class constructor being paintCtor. • paint function being paint. • constructor valid flag being true. • input properties being inputProperties. • PaintRenderingContext2DSettings object being paintRenderingContext2DSettings.
- %塗り定義~map[ %name ] ~SET %定義 ◎ Set paintDefinitionMap[name] to definition.
-
次を走らす`~taskを~queueする$ ◎ Queue a task to run the following steps:
- %文書~塗り定義~map ~LET 結付けられた`文書$【!*】の`文書~塗り定義~map$ ◎ Let documentPaintDefinitionMap be the associated document’s document paint definitions map.
- %文書~塗り定義 ~LET 次のようにされた新たな`文書~塗り定義$ ⇒# `入力~prop~list$dPD ~SET %入力~prop~list, `入力~引数~構文$dPD ~SET %入力~引数~list構文~list, `塗り~2D描画~文脈~設定群$dPD ~SET %塗り~2D描画~文脈~設定群 ◎ Let documentDefinition be a new document paint definition with: • input properties being inputProperties. • input argument syntaxes being inputArgumentSyntaxes. • PaintRenderingContext2DSettings object being paintRenderingContext2DSettings.
-
~IF[ %文書~塗り定義~map[ %name ] ~NEQ ε ]: ◎ If documentPaintDefinitionMap[name] exists, run the following steps:
- %既存の文書~塗り定義 ~LET %文書~塗り定義~map[ %name ] ◎ Let existingDocumentDefinition be the result of get documentPaintDefinitionMap[name].
-
~IF[ %既存の文書~塗り定義 ~NEQ `invalid^l ]~AND[ [ %既存の文書~塗り定義, %文書~塗り定義 ]は等価でない(すなわち,[ `入力~prop~list$dPD, `入力~引数~構文$dPD, `塗り~2D描画~文脈~設定群$dPD ]【のいずれか】が異なる) ]: ◎ If existingDocumentDefinition is "invalid", abort all these steps. ◎ If existingDocumentDefinition and documentDefinition are not equivalent, (that is input properties, input argument syntaxes, and PaintRenderingContext2DSettings object are different), then:
- %文書~塗り定義~map[ %name ] ~SET `invalid^l ◎ Set documentPaintDefinitionMap[name] to "invalid".
- 同じ~classが等価でない`文書~塗り定義$で登録されようとしたことを言明する~errorを,~debug用~consoleに~logする ◎ Log an error to the debugging console stating that the same class was registered with different inputProperties, inputArguments, or paintRenderingContext2DSettings.
- ~ELSE ⇒ %文書~塗り定義~map[ %name ] ~SET %文書~塗り定義 ◎ Otherwise, set documentPaintDefinitionMap[name] to documentDefinition.
注記: 入力~prop~listは、一度だけ検索されるベキである — 当の~classが、その入力~prop~listを動的に変更する機会を得ないよう。 ◎ Note: The list of input properties should only be looked up once, the class doesn’t have the opportunity to dynamically change its input properties.
注記: この仕様の将来~versionにおいては、作者は,異なる型の描画~文脈( `RenderingContext^en )を受取る能を持てるようにされ得る。 特に、~3D効果の描画-用として~WebGL描画~文脈が求まれるであろう。 `PaintSize$I, `StylePropertyMap$I を入力にとるため、~WebGL描画~文脈を設定しておくときに複階性がある。 ◎ Note: In a future version of the spec, the author could have the ability to receive a different type of RenderingContext. In particular the author may want a WebGL rendering context to render 3D effects. There are complexities in setting up a WebGL rendering context to take the PaintSize and StylePropertyMap as inputs.
5. 塗り記法
`paint@f = paint( `ident$t, `declaration-value$t? )
`paint$f 関数は、 `image$t 型が~supportする追加的な記法である。 ◎ The <paint()> function is an additional notation to be supported by the <image> type.
<style> .logo { background-image: paint(company-logo); } .chat-bubble { background-image: paint(chat-bubble, blue); } </style>
`cursor$p ~propに対しては、 `paint$f 関数は`無効な画像$として扱った上で,その次に~supportされる `image$t に~fallbackするベキである。 ◎ For the cursor property, the <paint()> function should be treated as an invalid image and fallback to the next supported <image>.
`paint$f 関数は、`算出d値$の時点では, `registerPaint()$m により登録された文法と照合する`必要はない^em。 合致しない場合、代わりに,`塗り関数の画像を描く$の内側で構文解析が生じるときに`無効な画像$になる。 ◎ At computed value time the <paint()> function does not need to match the grammar registered by registerPaint(). Instead this will result in an invalid image when the parsing occurs inside draw a paint image.
6. ~2D描画~文脈
[`Exposed$=PaintWorklet] interface `PaintRenderingContext2D@I { }; `PaintRenderingContext2D$I includes `CanvasState$I; `PaintRenderingContext2D$I includes `CanvasTransform$I; `PaintRenderingContext2D$I includes `CanvasCompositing$I; `PaintRenderingContext2D$I includes `CanvasImageSmoothing$I; `PaintRenderingContext2D$I includes `CanvasFillStrokeStyles$I; `PaintRenderingContext2D$I includes `CanvasShadowStyles$I; `PaintRenderingContext2D$I includes `CanvasRect$I; `PaintRenderingContext2D$I includes `CanvasDrawPath$I; `PaintRenderingContext2D$I includes `CanvasDrawImage$I; `PaintRenderingContext2D$I includes `CanvasPathDrawingStyles$I; `PaintRenderingContext2D$I includes `CanvasPath$I;
注記: `PaintRenderingContext2D$I は、 `CanvasRenderingContext2D$I ~APIの下位集合を実装する。 特定的には,次に挙げる~APIは実装しない ⇒# `CanvasImageData$I, `CanvasUserInterface$I, `CanvasText$I, `CanvasTextDrawingStyles$I ◎ Note: The PaintRenderingContext2D implements a subset of the CanvasRenderingContext2D API. Specifically it doesn’t implement the CanvasImageData, CanvasUserInterface, CanvasText, or CanvasTextDrawingStyles APIs.
各 `PaintRenderingContext2D$I ~objは、次に挙げるものを持つ: ◎ ↓
- `出力~bitmap@ ⇒ ~objの作成-時に初期化される。 `出力~bitmap$の~sizeは、その描画-先~objの`具象-~obj~size$になる。 ◎ A PaintRenderingContext2D object has a output bitmap. This is initialised when the object is created. The size of the output bitmap is the concrete object size of the object it is rendering to.
- `~alpha~flag@ ⇒ 真偽値 — ~objの作成-時には ~T に設定されるモノトスル。 この~flagが ~F に設定された場合、~objの~alpha~channelはすべての画素に対し 1.0 (全部的に不透明)に固定し、ある画素の~alpha成分を変更しようと試みられたときは,黙って無視するモノトスル。 ◎ A PaintRenderingContext2D object also has an alpha flag, which can be set to true or false. Initially, when the context is created, its alpha flag must be set to true. When a PaintRenderingContext2D object has its alpha flag set to false, then its alpha channel must be fixed to 1.0 (fully opaque) for all pixels, and attempts to change the alpha component of any pixel must be silently ignored.
`出力~bitmap$の~sizeは、~UAが[ 内部的/描画の間 ]に利用することになる実際の~bitmapの~sizeを表現するとは限らない。 例えば,可視域が~zoomされた場合、~UAは,結果の描画が高品質になるよう座標~空間~内の機器~画素~数に対応する~bitmapを内部的に利用してもヨイ。 ◎ The size of the output bitmap does not necessarily represent the size of the actual bitmap that the user agent will use internally or during rendering. For example, if the visual viewport is zoomed the user agent may internally use bitmaps which correspond to the number of device pixels in the coordinate space, so that the resulting rendering is of high quality.
加えて,~UAは、`出力~bitmap$に適用された一連の描法~演算を,後続して機器~bitmap上に正しい解像度で描けるよう記録してもヨイ。 これはまた — 例えば可視域が~zoomされている間に — `出力~bitmap$の同じ出力を繰返し再利用できるようにもする。 ◎ Additionally the user agent may record the sequence of drawing operations which have been applied to the output bitmap such that the user agent can subsequently draw onto a device bitmap at the correct resolution. This also allows user agents to re-use the same output of the output bitmap repeatably while the visual viewport is being zoomed for example.
`PaintRenderingContext2D$I ~APIにて,色として `currentColor^l が利用されたときは、`不透明な黒$として扱われる。 ◎ Whenever "currentColor" is used as a color in the PaintRenderingContext2D API, it is treated as opaque black.
次の~codeは、黒ベタな矩形を生産することになる。 ◎ The code below will produce a solid black rectange.
`registerPaint$m('currentcolor', class { paint(%ctx, %size) { %ctx.fillStyle = 'currentColor'; %ctx.fillRect(0, 0, %size.width, %size.height); } });
`塗り~2D描画~文脈を作成する@ ときは、所与の ( %~size, %塗り~2D描画~文脈~設定群 ) に対し,次の手続きを走らすモノトスル: ◎ When the user agent is to create a PaintRenderingContext2D object for a given width, height, and paintRenderingContext2DSettings, it must run the following steps:
- %文脈 ~LET 新たな `PaintRenderingContext2D$I ◎ Create a new PaintRenderingContext2D.
- %文脈 の`出力~bitmap$用の`~bitmap寸法を設定する$( %~size の横幅, 縦幅を丸めた結果 ) ◎ Set bitmap dimensions for the context’s output bitmap to the rounded values of width and height.
- `PaintRenderingContext2D$I の`~alpha~flag$ ~SET %塗り~2D描画~文脈~設定群 の `alpha$m ◎ Set the PaintRenderingContext2D's alpha flag to paintRenderingContext2DSettings’s alpha.
- ~RET %文脈 ◎ Return the new PaintRenderingContext2D.
注記: 描画~文脈の初期~状態は、`~bitmap寸法を設定する$ ~algoの内側で設定され、それに伴い 描画~文脈を`既定の状態に設定し直す$ことに加え,`出力~bitmap$を【`透明な黒$に】~clearする。 ◎ Note: The initial state of the rendering context is set inside the set bitmap dimensions algorithm, as it invokes reset the rendering context to its default state and clears the output bitmap.
6.1. `CSSImageValue^I の描法
`CanvasImageSource$I ~typedefは、画像~sourceとして利用される `CSSImageValue$I 型も含むよう拡張される。 ◎ The CanvasImageSource typedef is extended to also include the CSSImageValue type to be used as an image source.
`CanvasDrawImage$I ~mixinを利用する~interface用には: ◎ For interfaces which use the CanvasDrawImage mixin:
- `CanvasImageSource$I ~objが,ある `CSSImageValue$I を表現するときは、 — `drawImage()$m の目的においては — ~source画像として,値の下層の画像~algoを呼出した結果を利用するモノトスル。 ◎ When a CanvasImageSource object represents an CSSImageValue, the result of invoking the value’s underlying image algorithm must be used as the source image for the purposes of drawImage.
注記: これは、最終的には~HTML仕様の~canvas節へ移動されるベキである。 `819$issue を見よ。 ◎ Note: This should eventually be moved to the canvas section of the HTML specification. See Issue 819.
7. 画像の描法
`~box$用の `paint$f 関数~画像【の描画-先】が可視域の中にある場合、~UAは,`塗り関数の画像を描く$を呼出した結果の画像~出力を表示するモノトスル。 ◎ If a <paint()> function image for a box is within the visual viewport, the user agent must display an image output from an invocation of the draw a paint image algorithm.
注記: ~UAは、可視域の中で `paint$f 関数~用に各~frameごとに`塗り関数の画像を描く$を走らす必要はない。 ~cacheした結果で,正しい画像~出力を表示できる(必要なら追加的な無効~化~手続きも利用して)。 ◎ Note: The user agent doesn’t have to run draw a paint image each frame for a <paint()> function within the visual viewport. It can cache results, (potentially using additional invalidation steps) to display the correct image output.
注記: ~UAは、可視域の外側にある画像に対しては,任意選択で描くのを先送りできる。 ◎ Note: The user agent can optionally defer drawing images which are outside the visual viewport.
作者が `requestAnimationFrame()^m の内側で~styleを更新した場合の例: ◎ If an author updates a style inside a requestAnimationFrame, e.g.
requestAnimationFrame(function() { %element.styleMap.set('--custom-prop-invalidates-paint', 42); });
%element が可視域の内側にある場合、~UAには次が要求される ⇒# `塗り関数の画像を描く$, 現在の~frame用の結果を表示する ◎ And the element is inside the visual viewport, the user agent is required to draw a paint image and display the result for the current frame.
`塗り関数の画像を描く$は、`~obj~size折衝~algo$の間に~UAにより呼出される。 それは、通例的には`~box$の`具象-~obj~size$と同じ~sizeとして定義される, `その時点の具象-~obj~size@ による `image$t の描画を担当する。 しかしながら,~UAは、画素~境界を塗るようこの~sizeを調整してもヨイ。 そうする場合、元の~sizeの縦横比を保つように,`その時点の具象-~obj~size$を調整するベキである — それに則って `paint$f 関数が描法を調整できるよう。 ◎ The draw a paint image function is invoked by the user agent during the object size negotiation algorithm which is responsible for rendering an <image>, with snappedConcreteObjectSize defined as follows. Let concreteObjectSize be the concrete object size of the box. The snappedConcreteObjectSize is usually the same as the concreteObjectSize. However, the user agent may adjust the size such that it paints to pixel boundaries. If it does, the user agent should adjust the snappedConcreteObjectSize by the proportional change from its original size such that the <paint()> function can adjust the drawing accordingly.
`~obj~size折衝~algo$の目的においては、塗り画像には`生来な寸法$は無い。 ◎ For the purposes of the object size negotiation algorithm, the paint image has no natural dimensions.
注記: この仕様の将来~versionでは、作者には,塗り画像の`生来な寸法$を指定する能も与えられ得る。 これはおそらく,作者に次を許容するような~callbackとして公開されることになる ⇒ 静的な`生来な寸法$を定義する/ 算出d~style, ~sizeの各~変化に基づいて`生来な寸法$を動的に更新する ◎ Note: In a future version of the spec, the author could have the ability to specify the natural dimensions of the paint image. This will probably be exposed as a callback allowing the author to define static natural dimensions or dynamically updating the natural dimensions based on computed style and size changes.
`PaintSize$I ~objは、作者が描くベキ画像の~sizeを表現する。 これは、~UAが与える`その時点の具象-~obj~size$を表す。 ◎ The PaintSize object represents the size of the image that the author should draw. This is the snappedConcreteObjectSize given by the user agent.
注記: `具象-~obj~size$がどう計算されるかの例は、 § ~CSS~obj~sizingの例 を見よ。 ◎ Note: See CSS Images 3 §4.4 Examples of CSS Object Sizing for examples on how the concrete object size is calculated.
~UAは、`塗り関数の画像を描く$を任意の時点に任意の`その時点の具象-~obj~size$で投機的に呼出せる。 結果の画像は表示されない。 ◎ The draw a paint image function may be speculatively invoked by the user agent at any point, with any snappedConcreteObjectSize. The resulting image is not displayed.
注記: ~UAは、経験則を利用して,未来の`その時点の具象-~obj~size$用にアリな値を投機してもヨイ — 例えば,~sizeは不変であり続けることを投機するなど。 ◎ Note: User agents may use any heuristic to speculate a possible future value for snappedConcreteObjectSize, for example speculating that the size remains unchanged.
注記: 画像は、表示されなくとも~cacheしてヨイ — 後続な `paint$f の呼出nは~cacheした画像を利用してヨイ。 ◎ Note: Although the image is not displayed, it may still be cached, and subsequent invocations of <paint()> may use the cached image.
[`Exposed$=PaintWorklet] interface `PaintSize@I { readonly attribute `double$ `width@m; readonly attribute `double$ `height@m; };
~UAは, `塗り関数の画像を描く@ ときは、所与の ( %~box, `その時点の具象-~obj~size$ %具象-~obj~size ) に対し,次の手続きを走らせて生産される画像~出力を[ %~box 用に適切な積層~level( %~box の~CSS~propにより定義される)の中へ描く ]モノトスル: ◎ When the user agent wants to draw a paint image of a <paint()> function for a box into its appropriate stacking level (as defined by the property the CSS property its associated with), given snappedConcreteObjectSize it must run the following steps:
- %塗り関数 ~LET %~box 上の `paint$f 関数 ◎ Let paintFunction be the <paint()> function on the box which the user agent wants to draw.
- %名前 ~LET %塗り関数 の最初の引数 ◎ Let name be the first argument of the paintFunction.
- %文書~塗り定義~map ~LET 結付けられた`文書$【 %~box が生成される文書】の`文書~塗り定義~map$ ◎ Let documentPaintDefinitionMap be the associated document’s document paint definitions map.
- ~IF[ %文書~塗り定義~map[ %名前 ] ~EQ ε ] ⇒# 画像~出力は`無効な画像$; ~RET ◎ If documentPaintDefinitionMap[name] does not exist, let the image output be an invalid image and abort all these steps.
- %文書~塗り定義 ~LET %文書~塗り定義~map[ %名前 ] ◎ Let documentDefinition be the result of get documentPaintDefinitionMap[name].
- ~IF[ %文書~塗り定義 ~EQ `invalid^l ] ⇒# 画像~出力は`無効な画像$; ~RET ◎ If documentDefinition is "invalid", let the image output be an invalid image and abort all these steps.
- %入力~引数~list構文~list ~LET %文書~塗り定義 の`入力~引数~構文$dPD ◎ Let inputArgumentSyntaxes be documentDefinition’s input argument syntaxes.
- %入力~引数~list ~LET %塗り関数 の `declaration-value$t 引数を成す成分たちからなる`~list$ ◎ Let inputArguments be the list of all the paintFunction arguments after the "paint name" argument.
-
~IF[ %入力~引数~list は %入力~引数~list構文~list に与えられた登録-済み文法に合致しない ] ⇒# 画像~出力は`無効な画像$; ~RET ◎ If inputArguments do not match the registered grammar given by inputArgumentSyntaxes, let the image output be an invalid image and abort all these steps.
この段は、次の事例では失敗し得る: ◎ This step may fail in the following cases:
// paint.js `registerPaint$m('failing-argument-syntax', class { static get inputArguments() { return ['<length>']; } paint(%ctx, %size, %styleMap, %args) { /* paint code here. */ } });
<style> .example-1 { background-image: paint(failing-argument-syntax, red); } .example-2 { background-image: paint(failing-argument-syntax, 1px, 2px); } </style> <div class=example-1></div> <div class=example-2></div> <script> CSS.`paintWorklet$m.`addModule$m('paint.js'); </script>
`example-1^c は`無効な画像$を生産する — `red^l は登録-済み文法に合致しないので。 ◎ example-1 produces an invalid image as "red" does not match the registered grammar.
`example-2^c は`無効な画像$を生産する — 関数の引数が多過ぎるので。 ◎ example-2 produces an invalid image as there are too many function arguments.
-
%~worklet大域~scope ~LET § 大域~scopeの選定に定義される規則に従って, 塗り `Worklet$I の`大域~scope~list$wLから選んだ `PaintWorkletGlobalScope$I ~obj ◎ Let workletGlobalScope be a PaintWorkletGlobalScope from the paint Worklet's global scopes, following the rules defined in § 7.1 Global Scope Selection.
~UAは、この時点で次を行っても`ヨイ^em ⇒ `~worklet大域~scopeを作成する$( 塗り `Worklet$I【!*】 ) ◎ The user agent may also create a worklet global scope at this time, given the paint Worklet.
-
この段は、任意選択で`並列的$に, または同期的に走らす ⇒ `塗り~callbackを呼出す$( %名前, %入力~引数~list, %具象-~obj~size, %~worklet大域~scope ) ◎ Run invoke a paint callback given name, inputArguments, snappedConcreteObjectSize, workletGlobalScope optionally in parallel.
注記: `並列的$な~thread内で`塗り~callbackを呼出す$場合、~UAは,その~thread上で利用できる塗り~worklet大域~scopeを選定するベキである。 ◎ Note: If the user agent runs invoke a paint callback on a thread in parallel, it should select a paint worklet global scope which can be used on that thread.
`塗り~callbackを呼出す@ ときは、所与の ( %名前, %入力~引数~list, %具象-~obj~size, %~worklet大域~scope ) に対し,次の手続きを走らすモノトスル: ◎ When the user agent wants to invoke a paint callback given name, inputArguments, snappedConcreteObjectSize, and workletGlobalScope, it must run the following steps:
- %塗り定義~map ~LET %~worklet大域~scope の`塗り定義~map$ ◎ Let paintDefinitionMap be workletGlobalScope’s paint definitions map.
- %定義 ~LET %塗り定義~map[ %名前 ] ◎ ↓
-
~IF[ %定義 ~EQ ε ]: ◎ If paintDefinitionMap[name] does not exist, run the following steps:
-
次を走らす`~taskを~queueする$: ◎ Queue a task to run the following steps:
- %文書~塗り定義~map ~LET 結付けられた`文書$【!*】の`文書~塗り定義~map$ ◎ Let documentPaintDefinitionMap be the associated document's document paint definitions map.
- %文書~塗り定義~map[ %名前 ] ~SET `invalid^l ◎ Set documentPaintDefinitionMap[name] to "invalid".
- ~UAは、~debug用~consoleに次を~logする`ベキ^emである ⇒ どの `PaintWorkletGlobalScope$I にも~classは登録されていないことを言明する~error ◎ The user agent should log an error to the debugging console stating that a class wasn’t registered in all PaintWorkletGlobalScopes.
- 画像~出力は`無効な画像$ ◎ Let the image output be an invalid image and\
- ~RET ◎ abort all these steps.
注記: 塗り~worklet大域~scopeには、 %名前 用の `registerPaint()$m を受取らなかったものもある(しかしながら,受取った大域~scopeもある)かもしれない — これは、そのような事例を取扱う。 他の大域~scope上で呼出された塗り~callbackは成功したとしても、後続な~frameでは,`塗り関数の画像を描く$が~callされても成功しないことになる。 ◎ Note: This handles the case where there could be a paint worklet global scope which didn’t receive the registerPaint(name, paintCtor) for name (however another global scope did). A paint callback which is invoked on the other global scope could succeed, but wont succeed on a subsequent frame when draw a paint image is called.
-
- %塗り~class~instance~map ~LET %~worklet大域~scope の`塗り~class~instance~map$pD ◎ ↑Let definition be the result of get paintDefinitionMap[name]. ◎ Let paintClassInstanceMap be workletGlobalScope’s paint class instances map.
- %塗り~instance ~LET %塗り~class~instance~map[ %名前 ] ◎ Let paintInstance be the result of get paintClassInstanceMap[|name]|.\
-
~IF[ %塗り~instance ~EQ ε ]: ◎ If paintInstance is null, run the following steps:
- ~IF[ %定義 の`構築子は妥当か$pD ~EQ ~F ] ⇒# 画像~出力は`無効な画像$; ~RET ◎ If the constructor valid flag on definition is false, let the image output be an invalid image and abort all these steps.
- %塗り構築子 ~LET %定義 上の`~class構築子$pD ◎ Let paintCtor be the class constructor on definition.
- %塗り~instance ~SET `Construct$jA( %塗り構築子 ) ◎ Let paintInstance be the result of Construct(paintCtor).
- ~IF[ 前~段にて例外が投出された ] ⇒# %定義 の`構築子は妥当か$pD ~SET ~F; 画像~出力は`無効な画像$; ~RET ◎ If construct throws an exception, set the definition’s constructor valid flag to false, let the image output be an invalid image and abort all these steps.
- %塗り~class~instance~map[ %名前 ] ~SET %塗り~instance ◎ Set paintClassInstanceMap[name] to paintInstance.
- %入力~prop~list ~LET %定義 の`入力~prop~list$pD ◎ Let inputProperties be definition’s input properties.
- %~style~map ~LET 新たな `StylePropertyMapReadOnly$I ◎ Let styleMap be a new StylePropertyMapReadOnly\
- %~style~map の `declarations$sl 内部~slot を[ %入力~prop~list 内に~listされた~prop用の`算出d値$ ]`のみ^emで拡充する ◎ populated with only the computed value's for properties listed in inputProperties.
-
%描画~文脈 ~LET `塗り~2D描画~文脈を作成する$( %具象-~obj~size, %定義 の`塗り~2D描画~文脈~設定群$pD ): ◎ Let renderingContext be the result of create a PaintRenderingContext2D object given: • "width" - The width given by snappedConcreteObjectSize. • "height" - The height given by snappedConcreteObjectSize. • "paintRenderingContext2DSettings" - The PaintRenderingContext2DSettings object given by definition.
注記: %描画~文脈 は、塗りの各~呼出nの間で再利用されることはない。 これは、各~呼出nの間では %描画~文脈 上に格納-済みな~dataや状態は無いことを暗黙的に意味する。 例えば, %描画~文脈 上で `clip()$m により切抜き領域を設定しておいても、次回に塗り~methodが~callされるとき同じ切抜き領域が適用されることは,期待できない。 ◎ Note: The renderingContext is not be re-used between invocations of paint. Implicitly this means that there is no stored data, or state on the renderingContext between invocations. For example you can’t setup a clip on the context, and expect the same clip to be applied next time the paint method is called.
注記: これは、[ %描画~文脈 は実質的に塗り~methodが完了した後に “無力化される” ]ことを暗黙的に意味する。 作者~codeは %描画~文脈 への参照を保持して,それに対し~methodを呼出すこともできるが、[ 現在の画像/後続な画像 ]に対する効果は無い。 ◎ Note: Implicitly this also means that renderingContext is effectively "neutered" after a paint method is complete. The author code may hold a reference to renderingContext and invoke methods on it, but this will have no effect on the current image, or subsequent images.
- %塗り~size ~LET 次のように初期化された新たな `PaintSize$I ~obj ⇒# `width$m ~SET %具象-~obj~size の横幅, `height$m ~SET %具象-~obj~size の縦幅 ◎ Let paintSize be a new PaintSize initialized to the width and height defined by snappedConcreteObjectSize.
-
~UAは、この段階で以前の呼出nからの画像を再利用してもヨイ — [ %塗り~size, %~style~map, %入力~引数~list ]は以前の呼出nに等価であるならば — その場合 ⇒# 画像~出力はその~cache済み画像; ~RET ◎ At this stage the user agent may re-use an image from a previous invocation if paintSize, styleMap, inputArguments are equivalent to that previous invocation. If so let the image output be that cached image and abort all these steps.
下の例では, `div-1^css, `div-2^css の両者とも等価な~JS引数~listをとる塗り関数を持つ。 ~UAは、ある回の呼出nの結果を~cacheして,それを両~要素~用に利用できる。 ◎ In the example below, both div-1 and div-2 have paint functions which have equivalent javascript arguments. A user-agent can cache the result of one invocation and use it for both elements.
// paint.js `registerPaint$m('simple', class { paint(%ctx, %size) { %ctx.fillStyle = 'green'; %ctx.fillRect(0, 0, %size.width, %size.height); } });
<style> .div-1 { width: 50px; height: 50px; background-image: paint(simple); } .div-2 { width: 100px; height: 100px; background-size: 50% 50%; background-image: paint(simple); } </style> <div class=div-1></div> <div class=div-2></div> <script> CSS.`paintWorklet$m.`addModule$m('paint.js'); </script>
- %塗り関数~callback ~LET %定義 の`塗り関数$pD ◎ Let paintFunctionCallback be definition’s paint function.
-
`~callback関数を呼出す$( %塗り関数~callback, 次に与える~list, %塗り~instance ) ⇒ « %描画~文脈, %塗り~size, %~style~map, %入力~引数~list » ◎ Invoke paintFunctionCallback with arguments «renderingContext, paintSize, styleMap, inputArguments», and with paintInstance as the callback this value.
-
~IF[ %塗り関数~callback は (~UAが決定する)受容-可能な時間~内に完了しなかった(すなわち, “~scriptは長い間~走っている”) ] ⇒# ~UAは~scriptを終了しても`ヨイ^em; 画像~出力は`無効な画像$; ~RET ◎ If paintFunctionCallback does not complete within an acceptable time (as determined by the user agent, i.e. it is a "long running script") the user agent may terminate the script, let the image output be an invalid image, and abort all these steps.
注記: ~UAは、自身の~debug用~toolの中で,それらの塗り~classがどう高価か作者に示す~~仕掛けを供することもできる。 この事例では,~UAは、適切になるならば, “~scriptは応答-不能である” 様子を~dialogに示すこともできる。 ◎ Note: User agents could provide tooling within their debugging tools to show authors how expensive their paint classes are. User agents could also how an "unresponsive script" dialog in this case if appropriate.
- ~IF[ %塗り関数~callback から例外が投出された ] ⇒# 画像~出力は`無効な画像$; ~RET ◎ ↓
-
- 画像~出力は前~段により %描画~文脈 から生産されたそれ ◎ The image output is to be produced from the renderingContext given to the method. ◎ If an exception is thrown the let the image output be an invalid image.
注記: 結果の画像の内容は、~access可能になるものと設計されていない。 作者は、有用な情報があれば,標準な~accessibility~APIを通して通信できる。 ◎ Note: The contents of the resulting image are not designed to be accessible. Authors can communicate any useful information through the standard accessibility APIs.
7.1. 大域~scopeの選定
~UAは、塗り `Worklet$I の`大域~scope~list$wLから `PaintWorkletGlobalScope$I を選定する必要があるときは,次に従うモノトスル: ◎ When the user agent needs to select a PaintWorkletGlobalScope from the paint Worklet's global scopes list it must:
- `2 個~以上の^em `PaintWorkletGlobalScope$I を選定する — ~UAの~memoryが拘束されていない限り。 ◎ Select from at least two PaintWorkletGlobalScopes, unless the user agent is under memory constraints.
-
同じ `PaintWorkletGlobalScope$I を続けて再利用するのは、 `1000 回まで^emにすること。 ◎ Not re-use the same PaintWorkletGlobalScope more than 1000 times in a row.
注記: 上限の 1000 回は、最も高い~~見積もりであり,時を経れば下方へ改善され得る。 ◎ Note: The 1000 limit was picked as a high upper bound, this limit may improve (downwards) over time.
注記: これらの規則は、[ 状態を大域~obj上に格納できる / 生成し直せない状態を~class上に格納できる ]ことに作者が依拠しないことを確保するために存在する。 ~worklet仕様~内の § ~codeの冪等性 についての論点を見よ。 ◎ Note: These rules exist to ensure that authors do not rely on being able to store state on the global object or non-regeneratable state on the class. See the discussion in the worklets specification about code idempotence.
8. 例
8.1. 色~付きの真円
下の例は、 `paint$f 関数は~animate可能である事実を用立てる。 例えば `textarea^e が~focusされたとき、 `--circle-color^p ~propは, `deepskyblue^v から `purple^v へ遷移することになる。 ◎ The example below makes use of the fact that <paint()> functions are able to be animated. E.g. when the textarea is focused in the example below, the --circle-color property will transition from deepskyblue to purple.
この能は、遷移のみならず,~CSS~animationや~WebAnimations~APIにも適用される。 ◎ This ability isn’t limited to just transitions, it also applies to CSS animations, and the Web Animations API.
<!DOCTYPE html> <style> #example { --circle-color: deepskyblue; background-image: paint(circle); font-family: sans-serif; font-size: 36px; transition: --circle-color 1s; } #example:focus { --circle-color: purple; } </style> <textarea id="example"> CSS is awesome. </textarea> <script> CSS.`registerProperty$m({ name: '--circle-color', syntax: '<color>', initialValue: 'black', inherits: false }); CSS.`paintWorklet$m.`addModule$m('circle.js'); </script>
// circle.js `registerPaint$m('circle', class { static get inputProperties() { return ['--circle-color']; } paint(%ctx, %geom, %properties) { /* ~fill色を変更する。 ◎ Change the fill color. */ const %color = %properties.get('--circle-color'); %ctx.fillStyle = %color.cssText; /* 中心点と半径を決定する。 ◎ Determine the center point and radius. */ const %x = %geom.width / 2; const %y = %geom.height / 2; const %radius = Math.min(%x, %y); /* 真円を描く ◎ Draw the circle \o/ */ %ctx.beginPath(); %ctx.arc(%x, %y, %radius, 0, 2 * Math.PI, false); %ctx.fill(); } });
8.2. ~~仮の画像
作者は、画像が読込n中にある間,~~仮の画像を描く塗りを利用することもアリである。 ◎ It is possible for an author to use paint to draw a placeholder image while an image is being loaded.
<!DOCTYPE html> <style> #example { --image: url('#someUrlWhichIsLoading'); background-image: paint(image-with-placeholder); } </style> <div id="example"></div> <script> CSS.`registerProperty$m({ name: '--image', syntax: '<image> | none', initialValue: 'none', }); CSS.`paintWorklet$m.`addModule$m('image-placeholder.js'); </script>
// image-placeholder.js `registerPaint$m('image-with-placeholder', class { static get inputProperties() { return ['--image']; } paint(%ctx, %geom, %properties) { const %img = %properties.get('--image'); switch (%img.state) { case 'ready': /* 読込まれた画像を描く。 ◎ The image is loaded! Draw the image. */ %ctx.drawImage(%img, 0, 0, %geom.width, %geom.height); break; case 'pending': /* 画像は読込n中。 何か山を描く ◎ The image is loading, draw some mountains. */ drawMountains(%ctx); break; case 'invalid': default: /* 無効な画像(例:読込まれなかった)。 残念顔を描く。 ◎ The image is invalid (e.g. it didn’t load), draw a sad face. */ drawSadFace(%ctx); break; } } });
8.3. 円弧
<!DOCTYPE html> <style> #example { width: 200px; height: 200px; background-image: paint(arc, purple, 0.4turn, 0.8turn, 40px, 15px), paint(arc, blue, -20deg, 170deg, 30px, 20px), paint(arc, red, 45deg, 220deg, 50px, 10px); } </style> <div id="example"></div> <script> CSS.`paintWorklet$m.`addModule$m('arc.js'); </script>
// arc.js `registerPaint$m('arc', class { static get inputArguments() { return [ '<color>', '<angle>', // 始端~角度 '<angle>', // 終端~角度 '<length>', // 半径 '<length>', // 線幅 ]; } paint(%ctx, %geom, _, %args) { %ctx.strokeStyle = %args[0].cssText; /* 中心点を決定する。 ◎ Determine the center point. */ const %x = %geom.width / 2; const %y = %geom.height / 2; /* 始端~角度, 終端~角度 を `rad^css 単位に換算する ◎ Convert the start and end angles to radians. */ const %startAngle = this.convertAngle(%args[1]) - Math.PI / 2; const %endAngle = this.convertAngle(%args[2]) - Math.PI / 2; /* 半径と線幅を `px^css 単位に換算する ◎ Convert the radius and lineWidth to px. */ const %radius = this.convertLength(%args[3]); const %lineWidth = this.convertLength(%args[4]); %ctx.lineWidth = lineWidth; %ctx.beginPath(); %ctx.arc(%x, %y, %radius, %startAngle, %endAngle, false); %ctx.stroke(); } convertAngle(%angle) { switch (%angle.unit) { case 'deg': return %angle.value * Math.PI / 180; case 'rad': return %angle.value; case 'grad': return %angle.value * Math.PI / 200; case 'turn': return %angle.value * Math.PI / 0.5; default: throw Error(``^未知な角度~単位: ${%angle.unit}``^); } } convertLength(%length) { switch (%length.type) { case 'px': return %length.value; default: throw Error(``^未知な長さ型: ${%length.type}``^); } } });
8.4. 色を(~sizeに応じて)違える
<h1> Heading 1 </h1> <h1> Another heading </h1> <style> h1 { background-image: paint(heading-color); } </style> <script> CSS.`paintWorklet$m.`addModule$m('heading-color.js'); </script>
// heading-color.js `registerPaint$m('heading-color', class { static get inputProperties() { return []; } paint(%ctx, %geom, %properties) { /* 画像の~sizeに基づいて色を選定する。 ◎ Select a color based on the width and height of the image. */ const %width = %geom.width; const %height = %geom.height; const %color = colorArray[(%width * %height) % colorArray.length]; /* ベタな画像を描く。 ◎ Draw just a solid image. */ %ctx.fillStyle = color; %ctx.fillRect(0, 0, %width, %height); } });
8.5. 要素の区画の外側への描法
`border-image$p ~propを利用すれば、要素の区画の外側に描くこともアリである。 ◎ It is possible to draw outside an element’s area by using the border-image property.
<style> #overdraw { --border-width: 10; border-style: solid; border-width: calc(var(--border-width) * 1px); border-image-source: paint(overdraw); border-image-slice: 0 fill; border-image-outset: calc(var(--border-width) * 1px); width: 200px; height: 200px; } </style> <div id="overdraw"></div> <script> CSS.`paintWorklet$m.`addModule$m('overdraw.js'); </script>
// overdraw.js `registerPaint$m('overdraw', class { static get inputProperties() { return ['--border-width']; } paint(%ctx, %geom, %properties) { const %borderWidth = parseInt(%properties.get('--border-width')); %ctx.shadowColor = 'rgba(0,0,0,0.25)'; %ctx.shadowBlur = %borderWidth; %ctx.fillStyle = 'rgba(255, 255, 255, 1)'; %ctx.fillRect(%borderWidth, %borderWidth, %geom.width - 2 * %borderWidth, %geom.height - 2 * %borderWidth); } });
9. ~securityの考慮点
これらの特能により導入される既知な~securityの課題は無い。 ◎ There are no known security issues introduced by these features.
10. ~privacyの考慮点
塗り~callbackの計時は、~linkに対する “訪問-済み” 状態を検出するための高-帯域幅な~channelとして利用し得る(詳細は `791$issue に)。 これは,根本的には新たな~privacy漏洩ではないが(訪問-済み状態は多くのヤリトリから漏洩するので)、更なる軽減策が無い下では,情報を成す 特に高-帯域幅な~channelになる。 ◎ The timing of paint callbacks can be used as a high-bandwidth channel for detecting "visited" state for links. (details) This is not a fundamentally new privacy leak, as visited state leaks from many interactions, but absent any further mitigations, this is a particularly high-bandwidth channel of the information.
現時点で計画されている公式的な軽減策は無い。 この~privacy漏洩は、そのような~channelすべてを修正することへ向けて,もっと直に取組まれる必要があるので。 ◎ No official mitigations are planned at this time, as this privacy leak needs to be addressed more directly to fix all such channels.
11. 変更点
2018年 8月 9日 勧告候補 からの変更点は: ◎ Changes since the 9 August 2018 CR publication:
- 塗り~workletへの入力~prop~listを[ 既知/~custom ]な~propに絞り込むようにした。 ◎ Filtered the list of input properties to a paint worklet to be only known or custom properties.
- 描画~面に対し[ 不透明に強制するか透明度を許容するか ]を制御するためとして、 `PaintRenderingContext2D$I に`~alpha~flag$を追加した。 ◎ Added alpha flag to PaintRenderingContext2D to control whether the rendering surface is forced opaque or allows transparency.
- 出力~bitmapの~size用の定義を修正した。 ◎ Fix definition for the size of the output bitmap: ◎ (引用文は略) The size of the output bitmap is the + concrete object size of the object it is rendering to - size of the fragment it is rendering .