revert reverse order of blocks associated with the image

take alignment into account when calculating lines_per_block
This commit is contained in:
Alexander 2017-09-23 06:07:47 +03:00
parent 385963928f
commit 9db1b760e5

View File

@ -398,7 +398,7 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size)
} }
aligned_linesize = (im->linesize + arena->alignment - 1) & -arena->alignment; aligned_linesize = (im->linesize + arena->alignment - 1) & -arena->alignment;
lines_per_block = block_size / aligned_linesize; lines_per_block = (block_size - (arena->alignment - 1)) / aligned_linesize;
if (lines_per_block == 0) if (lines_per_block == 0)
lines_per_block = 1; lines_per_block = 1;
blocks_count = (im->ysize + lines_per_block - 1) / lines_per_block; blocks_count = (im->ysize + lines_per_block - 1) / lines_per_block;
@ -413,23 +413,22 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size)
/* Allocate image as an array of lines */ /* Allocate image as an array of lines */
line_in_block = 0; line_in_block = 0;
/* Return blocks in reverse order to reduce reallocations */ current_block = 0;
current_block = blocks_count - 1;
for (y = 0; y < im->ysize; y++) { for (y = 0; y < im->ysize; y++) {
if (line_in_block == 0) { if (line_in_block == 0) {
int block_size; int required;
int lines_remained = lines_per_block; int lines_remained = lines_per_block;
if (lines_remained > im->ysize - y) { if (lines_remained > im->ysize - y) {
lines_remained = im->ysize - y; lines_remained = im->ysize - y;
} }
block_size = lines_remained * aligned_linesize + arena->alignment - 1; required = lines_remained * aligned_linesize + arena->alignment - 1;
block = memory_get_block(arena, block_size, dirty); block = memory_get_block(arena, required, dirty);
if ( ! block.ptr) { if ( ! block.ptr) {
ImagingDestroyArray(im); ImagingDestroyArray(im);
return (Imaging) ImagingError_MemoryError(); return (Imaging) ImagingError_MemoryError();
} }
im->blocks[current_block] = block; im->blocks[current_block] = block;
/* This is copied from libc _int_memalign */ /* Bulletproof code from libc _int_memalign */
aligned_ptr = (char *)( aligned_ptr = (char *)(
((unsigned long) (block.ptr + arena->alignment - 1)) & ((unsigned long) (block.ptr + arena->alignment - 1)) &
-((signed long) arena->alignment)); -((signed long) arena->alignment));
@ -441,7 +440,7 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size)
if (line_in_block >= lines_per_block) { if (line_in_block >= lines_per_block) {
/* Reset counter and start new block */ /* Reset counter and start new block */
line_in_block = 0; line_in_block = 0;
current_block -= 1; current_block += 1;
} }
} }