Skip to content

Commit eb479d4

Browse files
committed
perf(core): fast-path in-bounds bilinear sampling
Session-Id: 79d370e4-6659-40e5-94e4-321776e55484
1 parent be171d8 commit eb479d4

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

crates/maple-render-core/src/pixer.rs

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,61 @@ pub fn sample_linear(img: &RgbaImage, x: f64, y: f64) -> Pixer {
143143
let fx = x - xx as f64;
144144
let fy = y - yy as f64;
145145

146-
let p00 = safe_pixel(img, xx, yy);
147-
let p10 = safe_pixel(img, xx + 1, yy);
148-
let p01 = safe_pixel(img, xx, yy + 1);
149-
let p11 = safe_pixel(img, xx + 1, yy + 1);
150-
151146
let w00 = (1.0 - fx) * (1.0 - fy);
152147
let w10 = fx * (1.0 - fy);
153148
let w01 = (1.0 - fx) * fy;
154149
let w11 = fx * fy;
155150

151+
let w = img.width() as i32;
152+
let h = img.height() as i32;
153+
154+
if xx >= 0 && yy >= 0 && xx + 1 < w && yy + 1 < h {
155+
let raw = img.as_raw();
156+
let w_us = w as usize;
157+
let row_stride = w_us * 4;
158+
159+
let row0 = yy as usize * row_stride;
160+
let row1 = row0 + row_stride;
161+
let col = xx as usize * 4;
162+
163+
let i00 = row0 + col;
164+
let i10 = i00 + 4;
165+
let i01 = row1 + col;
166+
let i11 = i01 + 4;
167+
168+
let a00 = raw[i00 + 3] as f64;
169+
let a10 = raw[i10 + 3] as f64;
170+
let a01 = raw[i01 + 3] as f64;
171+
let a11 = raw[i11 + 3] as f64;
172+
173+
let aa = w00 * a00 + w10 * a10 + w01 * a01 + w11 * a11;
174+
let aa_safe = if aa < 0.0001 { 0.0001 } else { aa };
175+
176+
return Pixer {
177+
r: (w00 * raw[i00] as f64 * a00
178+
+ w10 * raw[i10] as f64 * a10
179+
+ w01 * raw[i01] as f64 * a01
180+
+ w11 * raw[i11] as f64 * a11)
181+
/ aa_safe,
182+
g: (w00 * raw[i00 + 1] as f64 * a00
183+
+ w10 * raw[i10 + 1] as f64 * a10
184+
+ w01 * raw[i01 + 1] as f64 * a01
185+
+ w11 * raw[i11 + 1] as f64 * a11)
186+
/ aa_safe,
187+
b: (w00 * raw[i00 + 2] as f64 * a00
188+
+ w10 * raw[i10 + 2] as f64 * a10
189+
+ w01 * raw[i01 + 2] as f64 * a01
190+
+ w11 * raw[i11 + 2] as f64 * a11)
191+
/ aa_safe,
192+
a: aa,
193+
};
194+
}
195+
196+
let p00 = safe_pixel(img, xx, yy);
197+
let p10 = safe_pixel(img, xx + 1, yy);
198+
let p01 = safe_pixel(img, xx, yy + 1);
199+
let p11 = safe_pixel(img, xx + 1, yy + 1);
200+
156201
let a00 = p00[3] as f64;
157202
let a10 = p10[3] as f64;
158203
let a01 = p01[3] as f64;

0 commit comments

Comments
 (0)