diff --git a/kittens/icat/magick.go b/kittens/icat/magick.go index f5c7af0fc..7b5047cb9 100644 --- a/kittens/icat/magick.go +++ b/kittens/icat/magick.go @@ -5,6 +5,7 @@ package icat import ( "fmt" + "github.com/kovidgoyal/go-parallel" "github.com/kovidgoyal/kitty/tools/tui/graphics" "github.com/kovidgoyal/kitty/tools/utils/images" ) @@ -31,6 +32,11 @@ func Render(path string, ro *images.RenderOptions, frames []images.IdentifyRecor } func render_image_with_magick(imgd *image_data, src *opened_input) (err error) { + defer func() { + if r := recover(); r != nil { + err = parallel.Format_stacktrace_on_panic(r, 1) + } + }() err = src.PutOnFilesystem() if err != nil { return err diff --git a/kittens/icat/native.go b/kittens/icat/native.go index 1a07ac835..7c8788512 100644 --- a/kittens/icat/native.go +++ b/kittens/icat/native.go @@ -4,13 +4,15 @@ package icat import ( "fmt" + "image" + "image/gif" + + "github.com/kovidgoyal/go-parallel" "github.com/kovidgoyal/kitty/tools/tty" "github.com/kovidgoyal/kitty/tools/tui/graphics" "github.com/kovidgoyal/kitty/tools/utils" "github.com/kovidgoyal/kitty/tools/utils/images" "github.com/kovidgoyal/kitty/tools/utils/shm" - "image" - "image/gif" "github.com/kovidgoyal/exiffix" "github.com/kovidgoyal/imaging" @@ -151,6 +153,11 @@ func add_gif_frames(ctx *images.Context, imgd *image_data, gf *gif.GIF) error { } func render_image_with_go(imgd *image_data, src *opened_input) (err error) { + defer func() { + if r := recover(); r != nil { + err = parallel.Format_stacktrace_on_panic(r, 1) + } + }() ctx := images.Context{} switch { case imgd.format_uppercase == "GIF" && opts.Loop != 0: diff --git a/kittens/icat/process_images.go b/kittens/icat/process_images.go index 088e18fdf..e7fcbf9d2 100644 --- a/kittens/icat/process_images.go +++ b/kittens/icat/process_images.go @@ -279,7 +279,7 @@ func process_arg(arg input_arg) { var format string var err error imgd := image_data{source_name: arg.value} - if opts.Engine == "auto" || opts.Engine == "native" { + if opts.Engine == "auto" || opts.Engine == "builtin" { c, format, err = image.DecodeConfig(f.file) f.Rewind() can_use_go = err == nil @@ -299,12 +299,16 @@ func process_arg(arg input_arg) { } err = render_image_with_go(&imgd, &f) if err != nil { - merr := render_image_with_magick(&imgd, &f) - if merr != nil { - report_error(arg.value, "Could not render image to RGB", err) - return + if opts.Engine != "builtin" { + merr := render_image_with_magick(&imgd, &f) + if merr != nil { + report_error(arg.value, "Could not render image to RGB", err) + return + } + err = nil } - err = nil + report_error(arg.value, "could not render", err) + return } } else { err = render_image_with_magick(&imgd, &f) diff --git a/tools/utils/images/to_rgba.go b/tools/utils/images/to_rgba.go index cf03f2af3..46c898c1d 100644 --- a/tools/utils/images/to_rgba.go +++ b/tools/utils/images/to_rgba.go @@ -24,16 +24,17 @@ func (self *Context) run_paste(src imaging.Scanner, background image.Image, pos var pix []uint8 switch v := background.(type) { case *image.NRGBA: - i := background.(*image.NRGBA) - stride = i.Stride - pix = i.Pix + stride = v.Stride + pix = v.Pix case *imaging.NRGB: - i := background.(*imaging.NRGB) - stride = i.Stride - pix = i.Pix + stride = v.Stride + pix = v.Pix default: panic(fmt.Sprintf("Unsupported image type: %v", v)) } + if len(pix) != background.Bounds().Dy()*stride { + panic(fmt.Sprintf("background image has insufficient pixel data. Bounds: %v Stride: %d", background.Bounds(), stride)) + } if err := self.SafeParallel(interRect.Min.Y, interRect.Max.Y, func(ys <-chan int) { for y := range ys { x1 := interRect.Min.X - pasteRect.Min.X