Handle images whose first frame is smaller than the canvas
This commit is contained in:
parent
3925e18964
commit
cf3a01f502
@ -15,6 +15,7 @@ from typing import (
|
|||||||
Sequence, Tuple, Union
|
Sequence, Tuple, Union
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from kitty.fast_data_types import create_canvas
|
||||||
from kitty.typing import (
|
from kitty.typing import (
|
||||||
CompletedProcess, GRT_a, GRT_d, GRT_f, GRT_m, GRT_o, GRT_t, HandlerType
|
CompletedProcess, GRT_a, GRT_d, GRT_f, GRT_m, GRT_o, GRT_t, HandlerType
|
||||||
)
|
)
|
||||||
@ -145,7 +146,7 @@ def identify(path: str) -> ImageData:
|
|||||||
if f.mode == 'rgba':
|
if f.mode == 'rgba':
|
||||||
mode = 'rgba'
|
mode = 'rgba'
|
||||||
break
|
break
|
||||||
return ImageData(first['fmt'].lower(), frames[0].width, frames[0].height, mode, frames)
|
return ImageData(first['fmt'].lower(), frames[0].canvas_width, frames[0].canvas_height, mode, frames)
|
||||||
|
|
||||||
|
|
||||||
class RenderedImage(ImageData):
|
class RenderedImage(ImageData):
|
||||||
@ -232,6 +233,14 @@ def render_image(
|
|||||||
f.path = output_prefix + f'-{index}.{m.mode}'
|
f.path = output_prefix + f'-{index}.{m.mode}'
|
||||||
os.rename(os.path.join(tdir, x), f.path)
|
os.rename(os.path.join(tdir, x), f.path)
|
||||||
check_resize(f)
|
check_resize(f)
|
||||||
|
f = ans.frames[0]
|
||||||
|
if f.width != ans.width or f.height != ans.height:
|
||||||
|
with open(f.path, 'r+b') as ff:
|
||||||
|
data = ff.read()
|
||||||
|
ff.seek(0)
|
||||||
|
ff.truncate()
|
||||||
|
cd = create_canvas(data, f.width, f.canvas_x, f.canvas_y, ans.width, ans.height, 3 if ans.mode == 'rgb' else 4)
|
||||||
|
ff.write(cd)
|
||||||
if unseen:
|
if unseen:
|
||||||
raise ConvertFailed(path, f'Failed to render {len(unseen)} out of {len(m)} frames of animation')
|
raise ConvertFailed(path, f'Failed to render {len(unseen)} out of {len(m)} frames of animation')
|
||||||
|
|
||||||
|
|||||||
@ -634,6 +634,9 @@ def patch_color_profiles(
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def create_canvas(d: bytes, w: int, x: int, y: int, cw: int, ch: int, bpp: int) -> bytes: ...
|
||||||
|
|
||||||
|
|
||||||
def os_window_font_size(
|
def os_window_font_size(
|
||||||
os_window_id: int, new_sz: float = -1., force: bool = False
|
os_window_id: int, new_sz: float = -1., force: bool = False
|
||||||
) -> float:
|
) -> float:
|
||||||
|
|||||||
@ -1640,9 +1640,35 @@ PyTypeObject GraphicsManager_Type = {
|
|||||||
.tp_members = members,
|
.tp_members = members,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static PyObject*
|
||||||
|
pycreate_canvas(PyObject *self UNUSED, PyObject *args) {
|
||||||
|
unsigned int bytes_per_pixel;
|
||||||
|
unsigned int over_width, width, height, x, y;
|
||||||
|
Py_ssize_t over_sz;
|
||||||
|
const uint8_t *over_data;
|
||||||
|
if (!PyArg_ParseTuple(args, "y#IIIIII", &over_data, &over_sz, &over_width, &x, &y, &width, &height, &bytes_per_pixel)) return NULL;
|
||||||
|
size_t canvas_sz = width * height * bytes_per_pixel;
|
||||||
|
PyObject *ans = PyBytes_FromStringAndSize(NULL, canvas_sz);
|
||||||
|
if (!ans) return NULL;
|
||||||
|
|
||||||
|
uint8_t* canvas = (uint8_t*)PyBytes_AS_STRING(ans);
|
||||||
|
memset(canvas, 0, canvas_sz);
|
||||||
|
ComposeData cd = {
|
||||||
|
.needs_blending = bytes_per_pixel == 4,
|
||||||
|
.over_width = over_width, .over_height = over_sz / (bytes_per_pixel * over_width),
|
||||||
|
.under_width = width, .under_height = height,
|
||||||
|
.over_px_sz = bytes_per_pixel, .under_px_sz = bytes_per_pixel,
|
||||||
|
.over_offset_x = x, .over_offset_y = y
|
||||||
|
};
|
||||||
|
compose(cd, canvas, over_data);
|
||||||
|
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
static PyMethodDef module_methods[] = {
|
static PyMethodDef module_methods[] = {
|
||||||
M(shm_write, METH_VARARGS),
|
M(shm_write, METH_VARARGS),
|
||||||
M(shm_unlink, METH_VARARGS),
|
M(shm_unlink, METH_VARARGS),
|
||||||
|
M(create_canvas, METH_VARARGS),
|
||||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user