RazrFalcon / tiny-skia

A tiny Skia subset ported to Rust
BSD 3-Clause "New" or "Revised" License
1.05k stars 67 forks source link

Most integration tests fail on big-endian systems #68

Closed jamessan closed 1 year ago

jamessan commented 1 year ago

Most of the failures don't provide any useful information, since the difference is in the data field. However, the png tests show that byte-swapping is at least part of the problem.

---- png::decode_grayscale stdout ----
thread 'png::decode_grayscale' panicked at 'assertion failed: `(left == right)`
  left: `PremultipliedColorU8 { r: 255, g: 0, b: 0, a: 0 }`,
 right: `PremultipliedColorU8 { r: 0, g: 0, b: 0, a: 255 }`', tests/integration/png.rs:7:5

---- png::decode_grayscale_alpha stdout ----
thread 'png::decode_grayscale_alpha' panicked at 'assertion failed: `(left == right)`
  left: `PremultipliedColorU8 { r: 255, g: 0, b: 0, a: 0 }`,
 right: `PremultipliedColorU8 { r: 0, g: 0, b: 0, a: 255 }`', tests/integration/png.rs:14:5

---- png::decode_rgb stdout ----
thread 'png::decode_rgb' panicked at 'assertion failed: `(left == right)`
  left: `PremultipliedColorU8 { r: 255, g: 49, b: 191, a: 36 }`,
 right: `PremultipliedColorU8 { r: 36, g: 191, b: 49, a: 255 }`', tests/integration/png.rs:21:5
Full failure list ``` failures: ---- clip::circle_bottom_right_aa stdout ---- thread 'clip::circle_bottom_right_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:72:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- clip::ignore_memset stdout ---- thread 'clip::ignore_memset' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:174:5 ---- clip::ignore_source stdout ---- thread 'clip::ignore_source' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:198:5 ---- clip::rect stdout ---- thread 'clip::rect' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:17:5 ---- clip::rect_aa stdout ---- thread 'clip::rect_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:34:5 ---- clip::intersect_aa stdout ---- thread 'clip::intersect_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/clip.rs:152:5 ---- clip::rect_ts stdout ---- thread 'clip::rect_ts' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:54:5 ---- clip::stroke stdout ---- thread 'clip::stroke' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:93:5 ---- clip::skip_dest stdout ---- thread 'clip::skip_dest' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/clip.rs:128:5 ---- dash::closed stdout ---- thread 'dash::closed' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/dash.rs:166:5 ---- dash::cubic stdout ---- thread 'dash::cubic' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/dash.rs:63:5 ---- dash::hairline stdout ---- thread 'dash::hairline' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/dash.rs:85:5 ---- dash::complex stdout ---- thread 'dash::complex' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/dash.rs:113:5 ---- dash::line stdout ---- thread 'dash::line' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/dash.rs:21:5 ---- dash::quad stdout ---- thread 'dash::quad' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/dash.rs:42:5 ---- fill::clear_aa stdout ---- thread 'fill::clear_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:554:5 ---- fill::clip_cubic_1 stdout ---- thread 'fill::clip_cubic_1' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:499:5 ---- dash::multi_subpaths stdout ---- thread 'dash::multi_subpaths' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/dash.rs:142:5 ---- fill::clip_line_1 stdout ---- thread 'fill::clip_line_1' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:443:5 ---- fill::clip_cubic_2 stdout ---- thread 'fill::clip_cubic_2' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:517:5 ---- fill::clip_quad stdout ---- thread 'fill::clip_quad' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:481:5 ---- fill::clip_line_2 stdout ---- thread 'fill::clip_line_2' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:464:5 ---- fill::cubic_curve stdout ---- thread 'fill::cubic_curve' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:356:5 ---- fill::closed_polygon stdout ---- thread 'fill::closed_polygon' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:282:5 ---- fill::even_odd_star stdout ---- thread 'fill::even_odd_star' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:322:5 ---- fill::fill_aa stdout ---- thread 'fill::fill_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:408:5 ---- fill::fill_rect stdout ---- thread 'fill::fill_rect' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:614:5 ---- fill::float_rect_aa stdout ---- thread 'fill::float_rect_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:109:5 ---- fill::float_rect stdout ---- thread 'fill::float_rect' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:79:5 ---- fill::float_rect_clip_bottom_right_aa stdout ---- thread 'fill::float_rect_clip_bottom_right_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:226:5 ---- fill::float_rect_clip_top_left_aa stdout ---- thread 'fill::float_rect_clip_top_left_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:196:5 ---- fill::float_rect_clip_top_right_aa stdout ---- thread 'fill::float_rect_clip_top_right_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:211:5 ---- fill::float_rect_aa_highp stdout ---- thread 'fill::float_rect_aa_highp' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:125:5 ---- fill::int_rect stdout ---- thread 'fill::int_rect' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:65:5 ---- fill::int_rect_with_ts_clip_right stdout ---- thread 'fill::int_rect_with_ts_clip_right' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:240:5 ---- fill::int_rect_aa stdout ---- thread 'fill::int_rect_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:94:5 ---- fill::memset2d stdout ---- thread 'fill::memset2d' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:370:5 ---- fill::open_polygon stdout ---- thread 'fill::open_polygon' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:260:5 ---- fill::memset2d_out_of_bounds stdout ---- thread 'fill::memset2d_out_of_bounds' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:385:5 ---- fill::quad_curve stdout ---- thread 'fill::quad_curve' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:339:5 ---- fill::vertical_lines_merging_bug stdout ---- thread 'fill::vertical_lines_merging_bug' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:596:5 ---- fill::winding_star stdout ---- thread 'fill::winding_star' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/fill.rs:302:5 ---- gradients::conical_greater_radial stdout ---- thread 'gradients::conical_greater_radial' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:316:5 ---- gradients::focal_on_circle_radial stdout ---- thread 'gradients::focal_on_circle_radial' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:292:5 ---- gradients::global_opacity stdout ---- thread 'gradients::global_opacity' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:417:5 ---- gradients::simple_radial_lq stdout ---- thread 'gradients::simple_radial_lq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:340:5 ---- gradients::simple_radial_hq stdout ---- thread 'gradients::simple_radial_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:365:5 ---- gradients::three_stops_evenly_spaced_hq stdout ---- thread 'gradients::three_stops_evenly_spaced_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:216:5 ---- gradients::three_stops_evenly_spaced_lq stdout ---- thread 'gradients::three_stops_evenly_spaced_lq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:94:5 ---- gradients::simple_radial_with_ts_hq stdout ---- thread 'gradients::simple_radial_with_ts_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:390:5 ---- gradients::two_stops_linear_pad_lq stdout ---- thread 'gradients::two_stops_linear_pad_lq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:23:5 ---- gradients::two_stops_linear_pad_hq stdout ---- thread 'gradients::two_stops_linear_pad_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:142:5 ---- gradients::two_stops_linear_reflect_lq stdout ---- thread 'gradients::two_stops_linear_reflect_lq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:69:5 ---- gradients::two_stops_linear_reflect_hq stdout ---- thread 'gradients::two_stops_linear_reflect_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:190:5 ---- gradients::two_stops_linear_repeat_hq stdout ---- thread 'gradients::two_stops_linear_repeat_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:166:5 ---- gradients::two_stops_linear_repeat_lq stdout ---- thread 'gradients::two_stops_linear_repeat_lq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:46:5 ---- gradients::two_stops_unevenly_spaced_lq stdout ---- thread 'gradients::two_stops_unevenly_spaced_lq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:118:5 ---- gradients::two_stops_unevenly_spaced_hq stdout ---- thread 'gradients::two_stops_unevenly_spaced_hq' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:241:5 ---- hairline::chop_cubic_01 stdout ---- thread 'hairline::chop_cubic_01' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:226:5 ---- hairline::clip_cubic_00 stdout ---- thread 'hairline::clip_cubic_00' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:238:5 ---- hairline::clip_cubic_05_aa stdout ---- thread 'hairline::clip_cubic_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:232:5 ---- hairline::clip_hline_bottom_aa stdout ---- thread 'hairline::clip_hline_bottom_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:113:5 ---- hairline::clip_hline_top_aa stdout ---- thread 'hairline::clip_hline_top_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:107:5 ---- hairline::clip_line_00 stdout ---- thread 'hairline::clip_line_00' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:80:5 ---- gradients::well_behaved_radial stdout ---- thread 'gradients::well_behaved_radial' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/gradients.rs:268:5 ---- hairline::clip_line_05_aa stdout ---- thread 'hairline::clip_line_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:74:5 ---- hairline::clip_vline_left_aa stdout ---- thread 'hairline::clip_vline_left_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:119:5 ---- hairline::clip_vline_right_aa stdout ---- thread 'hairline::clip_vline_right_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:125:5 ---- hairline::clipped_circle_aa stdout ---- thread 'hairline::clipped_circle_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:256:5 ---- hairline::cubic_width_00 stdout ---- thread 'hairline::cubic_width_00' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:207:5 ---- hairline::cubic_width_00_aa stdout ---- thread 'hairline::cubic_width_00_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:201:5 ---- hairline::cubic_width_00_round stdout ---- thread 'hairline::cubic_width_00_round' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:219:5 ---- hairline::clip_line_00_v2 stdout ---- thread 'hairline::clip_line_00_v2' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 512, height: 512 }`, right: `Pixmap { data: "...", width: 512, height: 512 }`', tests/integration/hairline.rs:101:5 ---- hairline::cubic_width_05_aa_round stdout ---- thread 'hairline::cubic_width_05_aa_round' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:213:5 ---- hairline::cubic_width_05_aa stdout ---- thread 'hairline::cubic_width_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:195:5 ---- hairline::cubic_width_10_aa stdout ---- thread 'hairline::cubic_width_10_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:189:5 ---- hairline::hline_05_aa_round stdout ---- thread 'hairline::hline_05_aa_round' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:38:5 ---- hairline::hline_05_aa stdout ---- thread 'hairline::hline_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:32:5 ---- hairline::horish_05_aa stdout ---- thread 'hairline::horish_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:62:5 ---- hairline::quad_width_00 stdout ---- thread 'hairline::quad_width_00' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:163:5 ---- hairline::quad_width_05_aa_round stdout ---- thread 'hairline::quad_width_05_aa_round' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:157:5 ---- hairline::quad_width_05_aa stdout ---- thread 'hairline::quad_width_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 100 }`, right: `Pixmap { data: "...", width: 200, height: 100 }`', tests/integration/hairline.rs:151:5 ---- hairline::vertish_05_aa stdout ---- thread 'hairline::vertish_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:68:5 ---- hairline::vline_05_aa stdout ---- thread 'hairline::vline_05_aa' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:50:5 ---- hairline::vline_05_aa_round stdout ---- thread 'hairline::vline_05_aa_round' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/hairline.rs:56:5 ---- pattern::filter_bilinear stdout ---- thread 'pattern::filter_bilinear' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:220:5 ---- pattern::filter_nearest stdout ---- thread 'pattern::filter_nearest' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:198:5 ---- pattern::filter_bicubic stdout ---- thread 'pattern::filter_bicubic' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:242:5 ---- pattern::filter_nearest_no_ts stdout ---- thread 'pattern::filter_nearest_no_ts' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:176:5 ---- pattern::pad_nearest stdout ---- thread 'pattern::pad_nearest' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:39:5 ---- pattern::pad_bicubic stdout ---- thread 'pattern::pad_bicubic' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:108:5 ---- pattern::reflect_nearest stdout ---- thread 'pattern::reflect_nearest' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:83:5 ---- pattern::reflect_bicubic stdout ---- thread 'pattern::reflect_bicubic' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:154:5 ---- pattern::repeat_nearest stdout ---- thread 'pattern::repeat_nearest' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:61:5 ---- pixmap::clone_rect_1 stdout ---- thread 'pixmap::clone_rect_1' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 80, height: 90 }`, right: `Pixmap { data: "...", width: 80, height: 90 }`', tests/integration/pixmap.rs:21:5 ---- pixmap::clone_rect_2 stdout ---- thread 'pixmap::clone_rect_2' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 70, height: 80 }`, right: `Pixmap { data: "...", width: 70, height: 80 }`', tests/integration/pixmap.rs:43:5 ---- pixmap::draw_pixmap stdout ---- thread 'pixmap::draw_pixmap' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pixmap.rs:99:5 ---- pattern::repeat_bicubic stdout ---- thread 'pattern::repeat_bicubic' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pattern.rs:131:5 ---- pixmap::draw_pixmap_opacity stdout ---- thread 'pixmap::draw_pixmap_opacity' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pixmap.rs:170:5 ---- png::decode_grayscale stdout ---- thread 'png::decode_grayscale' panicked at 'assertion failed: `(left == right)` left: `PremultipliedColorU8 { r: 255, g: 0, b: 0, a: 0 }`, right: `PremultipliedColorU8 { r: 0, g: 0, b: 0, a: 255 }`', tests/integration/png.rs:7:5 ---- png::decode_grayscale_alpha stdout ---- thread 'png::decode_grayscale_alpha' panicked at 'assertion failed: `(left == right)` left: `PremultipliedColorU8 { r: 255, g: 0, b: 0, a: 0 }`, right: `PremultipliedColorU8 { r: 0, g: 0, b: 0, a: 255 }`', tests/integration/png.rs:14:5 ---- png::decode_rgb stdout ---- thread 'png::decode_rgb' panicked at 'assertion failed: `(left == right)` left: `PremultipliedColorU8 { r: 255, g: 49, b: 191, a: 36 }`, right: `PremultipliedColorU8 { r: 36, g: 191, b: 49, a: 255 }`', tests/integration/png.rs:21:5 ---- pixmap::draw_pixmap_ts stdout ---- thread 'pixmap::draw_pixmap_ts' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/pixmap.rs:134:5 ---- png::decode_rgba stdout ---- thread 'png::decode_rgba' panicked at 'assertion failed: `(left == right)` left: `PremultipliedColorU8 { r: 108, g: 70, b: 96, a: 68 }`, right: `PremultipliedColorU8 { r: 68, g: 96, b: 70, a: 108 }`', tests/integration/png.rs:28:5 ---- stroke::circle stdout ---- thread 'stroke::circle' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/stroke.rs:43:5 ---- stroke::round_cap_join stdout ---- thread 'stroke::round_cap_join' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/stroke.rs:133:5 ---- stroke::zero_len_subpath_round_cap stdout ---- thread 'stroke::zero_len_subpath_round_cap' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/stroke.rs:87:5 ---- stroke::zero_len_subpath_square_cap stdout ---- thread 'stroke::zero_len_subpath_square_cap' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 100, height: 100 }`, right: `Pixmap { data: "...", width: 100, height: 100 }`', tests/integration/stroke.rs:109:5 ---- stroke::round_caps_and_large_scale stdout ---- thread 'stroke::round_caps_and_large_scale' panicked at 'assertion failed: `(left == right)` left: `Pixmap { data: "...", width: 200, height: 200 }`, right: `Pixmap { data: "...", width: 200, height: 200 }`', tests/integration/stroke.rs:26:5 failures: clip::circle_bottom_right_aa clip::ignore_memset clip::ignore_source clip::intersect_aa clip::rect clip::rect_aa clip::rect_ts clip::skip_dest clip::stroke dash::closed dash::complex dash::cubic dash::hairline dash::line dash::multi_subpaths dash::quad fill::clear_aa fill::clip_cubic_1 fill::clip_cubic_2 fill::clip_line_1 fill::clip_line_2 fill::clip_quad fill::closed_polygon fill::cubic_curve fill::even_odd_star fill::fill_aa fill::fill_rect fill::float_rect fill::float_rect_aa fill::float_rect_aa_highp fill::float_rect_clip_bottom_right_aa fill::float_rect_clip_top_left_aa fill::float_rect_clip_top_right_aa fill::int_rect fill::int_rect_aa fill::int_rect_with_ts_clip_right fill::memset2d fill::memset2d_out_of_bounds fill::open_polygon fill::quad_curve fill::vertical_lines_merging_bug fill::winding_star gradients::conical_greater_radial gradients::focal_on_circle_radial gradients::global_opacity gradients::simple_radial_hq gradients::simple_radial_lq gradients::simple_radial_with_ts_hq gradients::three_stops_evenly_spaced_hq gradients::three_stops_evenly_spaced_lq gradients::two_stops_linear_pad_hq gradients::two_stops_linear_pad_lq gradients::two_stops_linear_reflect_hq gradients::two_stops_linear_reflect_lq gradients::two_stops_linear_repeat_hq gradients::two_stops_linear_repeat_lq gradients::two_stops_unevenly_spaced_hq gradients::two_stops_unevenly_spaced_lq gradients::well_behaved_radial hairline::chop_cubic_01 hairline::clip_cubic_00 hairline::clip_cubic_05_aa hairline::clip_hline_bottom_aa hairline::clip_hline_top_aa hairline::clip_line_00 hairline::clip_line_00_v2 hairline::clip_line_05_aa hairline::clip_vline_left_aa hairline::clip_vline_right_aa hairline::clipped_circle_aa hairline::cubic_width_00 hairline::cubic_width_00_aa hairline::cubic_width_00_round hairline::cubic_width_05_aa hairline::cubic_width_05_aa_round hairline::cubic_width_10_aa hairline::hline_05_aa hairline::hline_05_aa_round hairline::horish_05_aa hairline::quad_width_00 hairline::quad_width_05_aa hairline::quad_width_05_aa_round hairline::vertish_05_aa hairline::vline_05_aa hairline::vline_05_aa_round pattern::filter_bicubic pattern::filter_bilinear pattern::filter_nearest pattern::filter_nearest_no_ts pattern::pad_bicubic pattern::pad_nearest pattern::reflect_bicubic pattern::reflect_nearest pattern::repeat_bicubic pattern::repeat_nearest pixmap::clone_rect_1 pixmap::clone_rect_2 pixmap::draw_pixmap pixmap::draw_pixmap_opacity pixmap::draw_pixmap_ts png::decode_grayscale png::decode_grayscale_alpha png::decode_rgb png::decode_rgba stroke::circle stroke::round_cap_join stroke::round_caps_and_large_scale stroke::zero_len_subpath_round_cap stroke::zero_len_subpath_square_cap test result: FAILED. 36 passed; 109 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.58s ```
RazrFalcon commented 1 year ago

What systems do use big-endian and how can I reproduce it locally?

Such kind of bugs are expected, because I have no way of testing big-endian targets.

CryZe commented 1 year ago

The easiest way is to use the cross tool, which uses docker images with everything set up to compile for and run executables on various Rust targets. mips and powerpc have big endian targets in Rust. Either should work to replicate this.

RazrFalcon commented 1 year ago

Does cross works on macos ARM? I heard that docker on mac is meh.

RazrFalcon commented 1 year ago

By the way, are those arches do support SIMD to begin with? Afaik they do no. Therefore there is no point in supporting them.

I will have to update the readme... tiny-skia is x86/aarch64 only library. And wasm, sort of.

jamessan commented 1 year ago

Depends on what you mean by SIMD. PPC64 has AltiVec. Sparc64 has VIS.

notgull commented 1 year ago

I will have to update the readme... tiny-skia is x86/aarch64 only library. And wasm, sort of.

Is there anything I can do to help support operating systems outside of this? I have interest in using tiny-skia on big endian systems, and I personally think this issue can be resolved via some byte swapping.

RazrFalcon commented 1 year ago

@notgull The current solution would be to forbid everything except x86, aarch64 and wasm32. Sure, there is probably an easy fix to endianness, but I still have to support it and make sure I would not break anything in the future. It's an additional burden I cannot take at the moment.

Also, tiny-skia without SIMD is useless. I have plans on removing scalar code completely. So it would not compile on unsupported targets to begin with.

RazrFalcon commented 1 year ago

Or, we could wait for std::simd and make it their problem. But looks like it would not be stable anytime soon.

ids1024 commented 1 year ago

Also, tiny-skia without SIMD is useless. I have plans on removing scalar code completely.

It seems somewhat limiting for a software drawing library to only support a few architectures. A lot of software wants to target things other than x86_64, aarch64 and wasm32, and would then need to use tiny-skia only on those targets and something else elsewhere.

I expect this would be a concern for various projects that currently depend on tiny-skia.

RazrFalcon commented 1 year ago

@ids1024 Can you name such a target? Not a hypothetical one. I'm genuinely curious.

If you're talking about embed, then tiny-skia is already an overkill because how heavy it is.

Also, this exact issue is a good illustration of why I want to limit the scope. I simply cannot test it against all possible targets. I barely have time to support x86 and aarch64.

CryZe commented 1 year ago

I would also be interested in some of the more obscure targets and my code is optimized to the point where I get like 10k fps or so out of tiny-skia, meaning that it probably runs just fine without SIMD in my case too. If you don't have time to support those targets, I'm willing to help you out. I'll try to look into the big endian problems soon. (Also I have it running on CI against many of these targets, so it's at least indirectly being tested all the time)

RazrFalcon commented 1 year ago

I did some experiments and I was able to shave around 300 LOC. Not much improvement...

Yes, I would say as long as we can setup working CI for all the "supported" targets it should be fine. As of now, I don't really have an access even to x86.

Also, it seems like dropping some SSE2 code should be fine. AVX is 12 years old now. We can easily fallback to scalar for such old CPUs.

ids1024 commented 1 year ago

Unless there are more issues that aren't revealed by the tests, this seems to be pretty straightforward: https://github.com/RazrFalcon/tiny-skia/pull/69.