summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/util/u_format.c
diff options
context:
space:
mode:
authorKeith Whitwell <keithw@vmware.com>2010-05-30 13:26:36 +0100
committerKeith Whitwell <keithw@vmware.com>2010-06-07 16:34:55 +0100
commitac7c8f7dd3649507f6a5dc4d5222124dd954cbfd (patch)
tree63937e3da93a2c2ed847972933c821e3b7f245e5 /src/gallium/auxiliary/util/u_format.c
parent69faf5b48fde9d89b554c75fba7b431ddcd591da (diff)
util: allocate larger tmp_row in util_format_translate
The tmp_row storage allocation took into account the format's y block size by allocating y_step rows of data. However, the x block size was not being taken into account when deciding how wide those rows need to be. Now make sure that tmp_row is at least x_step by y_step in size.
Diffstat (limited to 'src/gallium/auxiliary/util/u_format.c')
-rw-r--r--src/gallium/auxiliary/util/u_format.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c
index c50c807eb89..3168a1fab48 100644
--- a/src/gallium/auxiliary/util/u_format.c
+++ b/src/gallium/auxiliary/util/u_format.c
@@ -189,7 +189,7 @@ util_format_translate(enum pipe_format dst_format,
const struct util_format_description *src_format_desc;
uint8_t *dst_row;
const uint8_t *src_row;
- unsigned y_step;
+ unsigned x_step, y_step;
unsigned dst_step;
unsigned src_step;
@@ -221,6 +221,7 @@ util_format_translate(enum pipe_format dst_format,
*/
y_step = MAX2(dst_format_desc->block.height, src_format_desc->block.height);
+ x_step = MAX2(dst_format_desc->block.width, src_format_desc->block.width);
assert(y_step % dst_format_desc->block.height == 0);
assert(y_step % src_format_desc->block.height == 0);
@@ -237,7 +238,7 @@ util_format_translate(enum pipe_format dst_format,
unsigned tmp_stride;
uint8_t *tmp_row;
- tmp_stride = width * 4 * sizeof *tmp_row;
+ tmp_stride = MAX2(width, x_step) * 4 * sizeof *tmp_row;
tmp_row = MALLOC(y_step * tmp_stride);
if (!tmp_row)
return;
@@ -262,7 +263,7 @@ util_format_translate(enum pipe_format dst_format,
unsigned tmp_stride;
float *tmp_row;
- tmp_stride = width * 4 * sizeof *tmp_row;
+ tmp_stride = MAX2(width, x_step) * 4 * sizeof *tmp_row;
tmp_row = MALLOC(y_step * tmp_stride);
if (!tmp_row)
return;