Skip to main contentModule draw_helpers
Source pub use super::clip_path::*;
- BgImgTimer 🔒
- 早期 return が複数あるため、Drop で確実に積む。
- TickTimer 🔒
- 早期 return が複数あるため、Drop で確実に積む。
- BG_IMG_TICKS 🔒
- background-image を要素の box 内に描画する。background-size/repeat/position を反映する。
bg_size が Stretch(未指定時の既定)なら従来どおり 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_TICKS は draw_linear_gradient しか見ていなかった。
- apply_backdrop_filters_to_screen_rect 🔒
- 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)。- 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 扱い)と
thickness(text-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_drop_shadow 🔒
の object-fit / object-position を反映して画像を描画する。
background-image と異なりタイリングはしない(範囲外は透過のまま何も描かない)。
filter 文字列から drop-shadow(ox oy blur color) を抽出し、box-shadow相当のタプルを返す。- sample_box_blur 🔒
img の (src_row, src_col) を中心に半径 radius(source pixel 単位)のボックスブラーを
かけた色を返す。画像端はクランプせず範囲外を単純にスキップする(サンプル数で正規化)。- sample_gradient_stops 🔒
stops(position 昇順ソート済み前提)から、位置 t(0.0-1.0)における補間色を得る。
draw_linear_gradient の同ロジックを N ストップの conic-gradient でも再利用するために
独立関数として切り出した。
計算量: O(S) — S はストップ数(線形走査)。
4 チャンネルの浮動小数補間を伴うため定数倍も小さくない。
毎ピクセルで呼ばないこと(呼び出し側で LUT 化する)。