code: func Convolve(dst draw.Image, src image.Image, k Kernel) (err error) {
  	if dst == nil || src == nil || k == nil {
  		return nil
  	}
  
  	b := dst.Bounds()
  	dstRgba, ok := dst.(*image.RGBA)
  	if !ok {
  		dstRgba = image.NewRGBA(b)
  	}
  
  	switch k := k.(type) {
  	case *SeparableKernel:
  		err = convolveRGBASep(dstRgba, src, k)
  	default:
  		err = convolveRGBA(dstRgba, src, k)
  	}
  
  	if err != nil {
  		return err
  	}
  
  	if !ok {
  		draw.Draw(dst, b, dstRgba, b.Min, draw.Src)
  	}
  	return nil
  }
docs: // Convolve produces dst by applying the convolution kernel k to src.