cloudhead / rx

👾 Modern and minimalist pixel editor
https://discord.gg/xHggPjfsS9
GNU General Public License v3.0
3.1k stars 109 forks source link

Crash when opening a png with no alpha channel #10

Closed vi closed 5 years ago

vi commented 5 years ago
$ RUST_BACKTRACE=1 rxeditor /tmp/screenshot.png 
INTEL-MESA: warning: Ivy Bridge Vulkan support is incomplete
thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `3147264`,
 right: `4196352`: fatal: incorrect length for texel buffer', /home/rust/.cargo/registry/src/github.com-1ecc6299db9ec823/rgx-0.1.1/src/core/mod.rs:581:9
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.35/src/backtrace/libunwind.rs:88
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.35/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:47
   3: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:36
   4: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:200
   5: std::panicking::default_hook
             at src/libstd/panicking.rs:214
   6: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:477
   7: std::panicking::continue_panic_fmt
             at src/libstd/panicking.rs:384
   8: std::panicking::begin_panic_fmt
             at src/libstd/panicking.rs:339
   9: rgx::core::Texture::fill
  10: rgx::core::Renderer::prepare
  11: rx::renderer::Renderer::update_views
  12: rx::init
  13: rx::main
  14: std::rt::lang_start::{{closure}}
  15: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:49
  16: std::panicking::try::do_call
             at src/libstd/panicking.rs:296
  17: __rust_maybe_catch_panic
             at src/libpanic_unwind/lib.rs:80
  18: std::panicking::try
             at src/libstd/panicking.rs:275
  19: std::panic::catch_unwind
             at src/libstd/panic.rs:394
  20: std::rt::lang_start_internal
             at src/libstd/rt.rs:48
  21: main
  22: __libc_start_main
  23: _start
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

$ file /tmp/screenshot.png
/tmp/screenshot.png: PNG image data, 1366 x 768, 8-bit/color RGB, non-interlaced

When downscaled, it does not crash, but still fails to show the image

$ gm convert -scale 10% /tmp/screenshot.png /tmp/screenshots.png
$ RUST_BACKTRACE=1 rxeditor /tmp/screenshots.png 
INTEL-MESA: warning: Ivy Bridge Vulkan support is incomplete
[2019-08-27T17:14:47Z ERROR rx::session] Error loading path(s): invalid pixel buffer size
^C
cloudhead commented 5 years ago

Looking at expect/actual bytes, I think it's actually related to the image not having an alpha channel:

1366 x 768 x 4 (RGBA) = 4196352 1366 x 768 x 3 (RGB) = 3147264

So the problem is likely that rx doesn't support RGB PNGs. I think the easiest thing to do for now would be to fail with a nicer error message, and later figure out what to do if there is no alpha channel.

vi commented 5 years ago

Indeed, ffmpeg -v warning -i /tmp/screenshot.png -pix_fmt rgba -y /tmp/screenshota.png makes the file openable by rx.

cloudhead commented 5 years ago

4434ce4