Fix vertically inverted rendering of PNG

This commit is contained in:
Kovid Goyal 2017-10-04 23:38:36 +05:30
parent 6ad7260871
commit c3ab6ff780
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 6 additions and 5 deletions

View File

@ -266,7 +266,7 @@ inflate_png_inner(struct png_jmp_data *d, uint8_t *buf, size_t bufsz) {
if (d->decompressed == NULL) ABRT(ENOMEM, "Out of memory allocating decompression buffer for PNG"); if (d->decompressed == NULL) ABRT(ENOMEM, "Out of memory allocating decompression buffer for PNG");
d->row_pointers = malloc(d->height * sizeof(png_bytep)); d->row_pointers = malloc(d->height * sizeof(png_bytep));
if (d->row_pointers == NULL) ABRT(ENOMEM, "Out of memory allocating row_pointers buffer for PNG"); if (d->row_pointers == NULL) ABRT(ENOMEM, "Out of memory allocating row_pointers buffer for PNG");
for (int i = 0; i < d->height; i++) d->row_pointers[d->height - 1 - i] = d->decompressed + i * rowbytes; for (int i = 0; i < d->height; i++) d->row_pointers[i] = d->decompressed + i * rowbytes;
png_read_image(png, d->row_pointers); png_read_image(png, d->row_pointers);
d->ok = true; d->ok = true;

View File

@ -131,8 +131,9 @@ class TestGraphics(BaseTest):
def test_load_png(self): def test_load_png(self):
s, g, l, sl = load_helpers(self) s, g, l, sl = load_helpers(self)
w, h = 5, 3 w, h = 5, 3
img = Image.new('RGBA', (w, h), 'red') rgba_data = os.urandom(w * h * 4)
rgba_data = img.tobytes() img = Image.frombytes('RGBA', (w, h), rgba_data)
rgb_data = img.convert('RGB').convert('RGBA').tobytes()
def png(mode='RGBA'): def png(mode='RGBA'):
buf = BytesIO() buf = BytesIO()
@ -142,9 +143,9 @@ class TestGraphics(BaseTest):
i.save(buf, 'PNG') i.save(buf, 'PNG')
return buf.getvalue() return buf.getvalue()
for mode in 'RGBA RGB P'.split(): for mode in 'RGBA P RGB'.split():
data = png(mode) data = png(mode)
sl(data, f=100, expecting_data=rgba_data) sl(data, f=100, expecting_data=rgb_data if mode == 'RGB' else rgba_data)
img = img.convert('L') img = img.convert('L')
rgba_data = img.convert('RGBA').tobytes() rgba_data = img.convert('RGBA').tobytes()