@@ -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