Skip to main content

Module draw_helpers

Module draw_helpers 

Source

Structs§

BgImgTimer 🔒
早期 return が複数あるため、Drop で確実に積む。
TickTimer 🔒
早期 return が複数あるため、Drop で確実に積む。

Enums§

ClipShape
Parsed clip-path shape in element-relative pixel coordinates.

Statics§

BG_IMG_TICKS 🔒
background-image を要素の box 内に描画する。background-size/repeat/position を反映する。 bg_sizeStretch(未指定時の既定)なら従来どおり box 全面へ引き伸ばす。 layer_override を指定すると、複数レイヤー(background-image: url(a), url(b))の うちこのレイヤーだけの size/repeat-x/repeat-y/pos-x/pos-y を使う(以前は全レイヤーが el 側の単一の値を共有しており、レイヤーごとの background-position/-size/-repeat 指定が無視されるバグがあった)。None なら従来通り el の値をそのまま使う。 【2026-07-31計測】背景画像描画に費やした tick の累積(フレーム毎にリセット)。 paint が 2.7 秒/フレームかかっている内訳を切り分けるため。
BORDER_TICKS 🔒
【2026-07-31計測】ボーダー描画に費やした tick の累積。
GRAD_TICKS 🔒
【2026-07-31計測】グラデーション描画に費やした tick の累積。
IMG_TICKS 🔒
【2026-07-31計測】<img> の拡縮描画に費やした tick の累積。
OTHERFILL_TICKS 🔒
【2026-08-01計測】linear 以外の大面積描画 (radial / conic / 2 色グラデーション / rotate / skew)の累積 tick。 GRAD_TICKSdraw_linear_gradient しか見ていなかった。

Functions§

apply_backdrop_filters_to_screen_rect 🔒
apply_css_filters 🔒
grayscale/brightness/invert/sepia/contrast/saturate を順に適用する(blur/hue-rotate 等の非対応関数は無視)。
apply_css_filters_argb 🔒
0xAARRGGBB 形式の色に apply_css_filters を適用する(alpha は変更しない)。
bg_clip_rect 🔒
background-clip に基づき、背景の描画を制限すべき矩形(border-box 座標系)を返す。 border-box(既定)なら el の外形そのまま。
bg_origin_shift 🔒
background-origin に基づき、draw_background_image() へ渡す (origin_shift_x, origin_shift_y, origin_w, origin_h) を計算する。 origin_shift_* は基準 box の左上が描画 box(eff_w/eff_h の左上)から どれだけ内側にあるか、origin_w/origin_h は基準 box 自体のサイズ。
blend_non_separable 🔒
hue/saturation/color/luminosity(非可分ブレンドモード)。W3C Compositing and Blending Level 1 の Lum/ClipColor/SetLum/Sat/SetSat アルゴリズムをそのまま実装する。 dst = backdrop(Cb)、src = source(Cs)。
blend_pixel 🔒
mix-blend-mode / background-blend-mode: 描画しようとしている色(src)を、 既にフレームバッファ上にある色(dst = 背景)と指定モードで合成する。 対応: normal(そのまま)/multiply/screen/darken/lighten/difference/overlay/ hard-light/soft-light/exclusion/color-dodge/color-burn(チャネルごとの独立計算)と、 hue/saturation/color/luminosity(W3C Compositing 仕様の Lum/Sat/SetLum/SetSat アルゴリズムに基づく非可分モード、3チャネルまとめて計算)。
blur_screen_rect 🔒
画面上の指定矩形領域をボックスブラーする(インプレースではなく一時バッファを使用)。
box_inset 🔒
background-clip"border-box"/"padding-box"/"content-box" を 実際のピクセル差分(border 幅、または border+padding 幅)に変換する。 border-box は無変換(0,0,0,0)。
clip_inside
Returns true if point (ox, oy) in element-local pixels is inside the clip shape. 計算量: O(V) — V は多角形の頂点数(polygon() の場合)。 円・楕円・矩形は O(1)。 毎ピクセル呼ばれるため、多角形クリップは面積 × 頂点数で効く。
clip_len 🔒
clip_pos 🔒
circle()/ellipse()at <cx> <cy> 位置トークンを解決する。%/px/数値に 加え、left/top/right/bottom/center のキーワードにも対応する(以前は clip_len が数値/単位しか扱えず、キーワードは s.parse::<f32>() に失敗して 静かに 0 へフォールバックしていた。circle(50% at right)cx=w ではなく cx=0 になる等、位置が壊れるバグがあった)。
draw_background_image 🔒
計算量: O(Wd×Hd × R) — Wd,Hd は描画先サイズ、R は background-repeat によるタイル数(no-repeat なら 1)。
draw_border
draw_border_with_style 🔒
draw_conic_gradient
conic-gradient(c1, c2, ..., cN) — N色ストップを角度方向へ(12時方向起点、時計回り) 補間して描画する。以前は kernel::draw::Screen::draw_conic_gradient_rect が2色固定 だったため3色目以降が失われていた。ここでは draw_linear_gradient と同じ補間ロジック (sample_gradient_stops)を角度ベースの t に適用する。
draw_dashed_border 🔒
draw_decoration_line 🔒
text-decoration-line(underline/line-through)の水平線を style (solid/dotted/dashed/wavy/double、空文字またはその他は solid 扱い)と thicknesstext-decoration-thickness、px。最低1pxにクランプ)で描画する。
draw_gradation
draw_image_nn_blit 🔒
list-style-image 用の小さな画像を (x0,y0) を左上として dst_w x dst_h へ最近傍スケーリング して描画する。クリップ・object-fit 等は考慮しない簡易実装(マーカーサイズのアイコン用途)。
draw_img_object_fit 🔒
計算量: O(Wd×Hd) — Wd,Hd は描画先サイズ。 1 ピクセルごとに元画像をサンプリングする(sample_bilinear_rgba 使用時は 1 ピクセルあたり 4 点読み出し+補間で定数倍が 4 倍になる)。
draw_individual_borders 🔒
計算量: O(W + H) — 枠線 4 辺の長さに比例(太さは定数倍)。 面積ではないので軽い。実測 0〜1 tick。
draw_linear_gradient
計算量: O(W×H)(LUT 化後)— W,H は塗る矩形のサイズ。
draw_outline 🔒
outline を描画する。border-box の外側に offset だけ離して width px の枠線を引く。 レイアウトに影響しない装飾のため、border とは独立して呼ぶ。
draw_radial_gradient
draw_rotated_rect_filled
CSS transform: rotate(Ndeg) 向け — 回転した塗りつぶし矩形を描く。 cx/cy は回転中心(スクリーン座標)、w/h は元の矩形サイズ、angle_deg は時計回り度数。
draw_skewed_rect_filled
CSS transform: skewX(deg) / skewY(deg) 向け — せん断変形した塗りつぶし矩形を描く。
extract_border_color 🔒
extract_border_style 🔒
parse_blur_radius 🔒
filter 文字列から blur(Npx) の半径を px 単位で抽出する(無ければ 0)。 パフォーマンス上の理由で半径は 1〜8px にクランプする簡略実装(ボックスブラー1回のみ、 実ブラウザのようなガウシアン近似の複数パスは行わない)。
parse_clip_shape
Parse CSS clip-path value into pixel coordinates relative to the element. w and h are the element’s rendered width and height in pixels.
parse_drop_shadow 🔒
filter 文字列から drop-shadow(ox oy blur color) を抽出し、box-shadow相当のタプルを返す。
parse_filter_tokens 🔒
の object-fit / object-position を反映して画像を描画する。 background-image と異なりタイリングはしない(範囲外は透過のまま何も描かない)。 CSS filter の1関数トークン(例 “grayscale(1)”)を (種別文字列, 引数) にパースする。 引数省略時は 1.0(各フィルタの完全適用値)とする。% サフィックスは 0-1 に正規化。
point_in_rounded_rect
(px, py)(要素ローカル座標)が角丸矩形の内側にあるかを返す。 w, h は要素サイズ、r は border-radius(ピクセル)。 計算量: O(1) — 4 隅の楕円判定のみ。
polygon_contains 🔒
even-odd 規則(既定のfill-rule)での内外判定。自己交差の無い多角形では nonzero と同じ結果になるが、自己交差する多角形では領域の解釈が異なる。
polygon_contains_nonzero 🔒
nonzero 規則(clip-path: polygon(nonzero, ...))での内外判定。各辺との交差方向 (上向き/下向き)を winding number として加減算し、合計が0でなければ内側とする (自己交差する多角形で even-odd と異なる結果を返す標準的な winding-number 法)。
sample_bilinear_rgba 🔒
計算量: O(1) — 近傍 4 点の読み出しと 2 段補間。 最近傍サンプリングの約 4 倍の定数倍。毎ピクセル呼ばれる
sample_box_blur 🔒
img の (src_row, src_col) を中心に半径 radius(source pixel 単位)のボックスブラーを かけた色を返す。画像端はクランプせず範囲外を単純にスキップする(サンプル数で正規化)。
sample_gradient_stops 🔒
stopsposition 昇順ソート済み前提)から、位置 t(0.0-1.0)における補間色を得る。 draw_linear_gradient の同ロジックを N ストップの conic-gradient でも再利用するために 独立関数として切り出した。 計算量: O(S) — S はストップ数(線形走査)。 4 チャンネルの浮動小数補間を伴うため定数倍も小さくない。 毎ピクセルで呼ばないこと(呼び出し側で LUT 化する)。