Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 537702 Details for
Bug 659460
dev-python/pillow-4.3.0: SIGBUS on sparc when building it's own documentation
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
alignment patch for sparc
0001-fix-unaligned-accesses-when-unpacking-images.patch (text/plain), 58.01 KB, created by
Rolf Eike Beer
on 2018-06-29 14:39:52 UTC
(
hide
)
Description:
alignment patch for sparc
Filename:
MIME Type:
Creator:
Rolf Eike Beer
Created:
2018-06-29 14:39:52 UTC
Size:
58.01 KB
patch
obsolete
>From cf0c1d02c27c2bdb0d93c13c7f36a2aeeb2b3b46 Mon Sep 17 00:00:00 2001 >From: Rolf Eike Beer <eike@sf-mail.de> >Date: Thu, 28 Jun 2018 22:22:44 +0200 >Subject: [PATCH] fix unaligned accesses when unpacking images > >--- > _imaging.c | 39 ++++++----- > libImaging/Access.c | 31 +++++---- > libImaging/Bands.c | 30 ++++++--- > libImaging/Convert.c | 165 ++++++++++++++++++++++++++-------------------- > libImaging/Draw.c | 3 +- > libImaging/Filter.c | 38 +++++++---- > libImaging/Geometry.c | 20 ++++-- > libImaging/GetBBox.c | 28 ++++---- > libImaging/Histo.c | 8 +-- > libImaging/Pack.c | 13 ++-- > libImaging/Point.c | 16 +++-- > libImaging/Resample.c | 30 +++++---- > libImaging/SgiRleDecode.c | 39 +++++------ > libImaging/Unpack.c | 153 +++++++++++++++++++++--------------------- > 14 files changed, 345 insertions(+), 268 deletions(-) > >diff --git a/_imaging.c b/_imaging.c >index ee2c3e89..aced0c6f 100644 >--- a/_imaging.c >+++ b/_imaging.c >@@ -375,6 +375,7 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) > Py_ssize_t i, n; > int itemp; > double dtemp; >+ FLOAT32 ftemp; > void* list; > PyObject* seq; > PyObject* op; >@@ -414,15 +415,15 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) > break; > case TYPE_INT32: > itemp = PyInt_AsLong(op); >- ((INT32*)list)[i] = itemp; >+ memcpy(list + i * sizeof(INT32), &itemp, sizeof(itemp)); > break; > case TYPE_FLOAT32: >- dtemp = PyFloat_AsDouble(op); >- ((FLOAT32*)list)[i] = (FLOAT32) dtemp; >+ ftemp = PyFloat_AsDouble(op); >+ memcpy(list + i * sizeof(ftemp), &ftemp, sizeof(ftemp)); > break; > case TYPE_DOUBLE: > dtemp = PyFloat_AsDouble(op); >- ((double*)list)[i] = (double) dtemp; >+ memcpy(list + i * sizeof(dtemp), &dtemp, sizeof(dtemp)); > break; > } > } >@@ -491,6 +492,8 @@ getink(PyObject* color, Imaging im, char* ink) > to return it into a 32 bit C long > */ > PY_LONG_LONG r = 0; >+ INT32 rtmp; >+ FLOAT32 ftmp; > > /* fill ink buffer (four bytes) with something that can > be cast to either UINT8 or INT32 */ >@@ -556,14 +559,16 @@ getink(PyObject* color, Imaging im, char* ink) > /* signed integer */ > if (rIsInt != 1) > return NULL; >- *(INT32*) ink = r; >+ rtmp = r; >+ memcpy(ink, &rtmp, sizeof(rtmp)); > return ink; > case IMAGING_TYPE_FLOAT32: > /* floating point */ > f = PyFloat_AsDouble(color); > if (f == -1.0 && PyErr_Occurred()) > return NULL; >- *(FLOAT32*) ink = (FLOAT32) f; >+ ftmp = (FLOAT32) f; >+ memcpy(ink, &ftmp, sizeof(ftmp)); > return ink; > case IMAGING_TYPE_SPECIAL: > if (strncmp(im->mode, "I;16", 4) == 0) { >@@ -1499,11 +1504,11 @@ _resize(ImagingObject* self, PyObject* args) > int xsize, ysize; > int filter = IMAGING_TRANSFORM_NEAREST; > float box[4] = {0, 0, 0, 0}; >- >+ > imIn = self->image; > box[2] = imIn->xsize; > box[3] = imIn->ysize; >- >+ > if (!PyArg_ParseTuple(args, "(ii)|i(ffff)", &xsize, &ysize, &filter, > &box[0], &box[1], &box[2], &box[3])) > return NULL; >@@ -2235,7 +2240,7 @@ void _font_text_asBytes(PyObject* encoded_string, unsigned char** text){ > } > return; > } >- >+ > #endif > } > >@@ -3355,7 +3360,7 @@ _reset_stats(PyObject* self, PyObject* args) > > if (!PyArg_ParseTuple(args, ":reset_stats")) > return NULL; >- >+ > arena->stats_new_count = 0; > arena->stats_allocated_blocks = 0; > arena->stats_reused_blocks = 0; >@@ -3371,7 +3376,7 @@ _get_alignment(PyObject* self, PyObject* args) > { > if (!PyArg_ParseTuple(args, ":get_alignment")) > return NULL; >- >+ > return PyInt_FromLong(ImagingDefaultArena.alignment); > } > >@@ -3380,7 +3385,7 @@ _get_block_size(PyObject* self, PyObject* args) > { > if (!PyArg_ParseTuple(args, ":get_block_size")) > return NULL; >- >+ > return PyInt_FromLong(ImagingDefaultArena.block_size); > } > >@@ -3389,7 +3394,7 @@ _get_blocks_max(PyObject* self, PyObject* args) > { > if (!PyArg_ParseTuple(args, ":get_blocks_max")) > return NULL; >- >+ > return PyInt_FromLong(ImagingDefaultArena.blocks_max); > } > >@@ -3399,7 +3404,7 @@ _set_alignment(PyObject* self, PyObject* args) > int alignment; > if (!PyArg_ParseTuple(args, "i:set_alignment", &alignment)) > return NULL; >- >+ > if (alignment < 1 || alignment > 128) { > PyErr_SetString(PyExc_ValueError, "alignment should be from 1 to 128"); > return NULL; >@@ -3422,7 +3427,7 @@ _set_block_size(PyObject* self, PyObject* args) > int block_size; > if (!PyArg_ParseTuple(args, "i:set_block_size", &block_size)) > return NULL; >- >+ > if (block_size <= 0) { > PyErr_SetString(PyExc_ValueError, > "block_size should be greater than 0"); >@@ -3447,7 +3452,7 @@ _set_blocks_max(PyObject* self, PyObject* args) > int blocks_max; > if (!PyArg_ParseTuple(args, "i:set_blocks_max", &blocks_max)) > return NULL; >- >+ > if (blocks_max < 0) { > PyErr_SetString(PyExc_ValueError, > "blocks_max should be greater than 0"); >@@ -3470,7 +3475,7 @@ _clear_cache(PyObject* self, PyObject* args) > > if (!PyArg_ParseTuple(args, "|i:clear_cache", &i)) > return NULL; >- >+ > ImagingMemoryClearCache(&ImagingDefaultArena, i); > > Py_INCREF(Py_None); >diff --git a/libImaging/Access.c b/libImaging/Access.c >index 292968f1..654c2028 100644 >--- a/libImaging/Access.c >+++ b/libImaging/Access.c >@@ -94,11 +94,11 @@ static void > get_pixel_16L(Imaging im, int x, int y, void* color) > { > UINT8* in = (UINT8*) &im->image[y][x+x]; >- UINT16* out = color; > #ifdef WORDS_BIGENDIAN >- out[0] = in[0] + (in[1]<<8); >+ UINT16 v = in[0] + (in[1]<<8); >+ memcpy(color, &v, sizeof(v)); > #else >- out[0] = *(UINT16*) in; >+ memcpy(color, in, sizeof(UINT16)); > #endif > } > >@@ -106,30 +106,29 @@ static void > get_pixel_16B(Imaging im, int x, int y, void* color) > { > UINT8* in = (UINT8*) &im->image[y][x+x]; >- UINT16* out = color; > #ifdef WORDS_BIGENDIAN >- out[0] = *(UINT16*) in; >+ memcpy(color, in, sizeof(UINT16)); > #else >- out[0] = in[1] + (in[0]<<8); >+ UINT16 v = in[1] + (in[0]<<8); >+ memcpy(color, &v, sizeof(v)); > #endif > } > > static void > get_pixel_32(Imaging im, int x, int y, void* color) > { >- INT32* out = color; >- out[0] = im->image32[y][x]; >+ memcpy(color, &im->image32[y][x], sizeof(INT32)); > } > > static void > get_pixel_32L(Imaging im, int x, int y, void* color) > { > UINT8* in = (UINT8*) &im->image[y][x*4]; >- INT32* out = color; > #ifdef WORDS_BIGENDIAN >- out[0] = in[0] + (in[1]<<8) + (in[2]<<16) + (in[3]<<24); >+ INT32 v = in[0] + (in[1]<<8) + (in[2]<<16) + (in[3]<<24); >+ memcpy(color, &v, sizeof(v)); > #else >- out[0] = *(INT32*) in; >+ memcpy(color, in, sizeof(INT32)); > #endif > } > >@@ -137,11 +136,11 @@ static void > get_pixel_32B(Imaging im, int x, int y, void* color) > { > UINT8* in = (UINT8*) &im->image[y][x*4]; >- INT32* out = color; > #ifdef WORDS_BIGENDIAN >- out[0] = *(INT32*) in; >+ memcpy(color, in, sizeof(INT32)); > #else >- out[0] = in[3] + (in[2]<<8) + (in[1]<<16) + (in[0]<<24); >+ INT32 v = in[3] + (in[2]<<8) + (in[1]<<16) + (in[0]<<24); >+ memcpy(color, &v, sizeof(v)); > #endif > } > >@@ -153,7 +152,7 @@ put_pixel(Imaging im, int x, int y, const void* color) > if (im->image8) > im->image8[y][x] = *((UINT8*) color); > else >- im->image32[y][x] = *((INT32*) color); >+ memcpy(&im->image32[y][x], color, sizeof(INT32)); > } > > static void >@@ -205,7 +204,7 @@ put_pixel_32B(Imaging im, int x, int y, const void* color) > static void > put_pixel_32(Imaging im, int x, int y, const void* color) > { >- im->image32[y][x] = *((INT32*) color); >+ memcpy(&im->image32[y][x], color, sizeof(INT32)); > } > > void >diff --git a/libImaging/Bands.c b/libImaging/Bands.c >index 7f86d497..5ab3839e 100644 >--- a/libImaging/Bands.c >+++ b/libImaging/Bands.c >@@ -53,7 +53,8 @@ ImagingGetBand(Imaging imIn, int band) > UINT8* out = imOut->image8[y]; > x = 0; > for (; x < imIn->xsize - 3; x += 4) { >- *((UINT32*) (out + x)) = MAKE_UINT32(in[0], in[4], in[8], in[12]); >+ UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); >+ memcpy(out + x, &v, sizeof(v)); > in += 16; > } > for (; x < imIn->xsize; x++) { >@@ -101,8 +102,10 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) > UINT8* out1 = bands[1]->image8[y]; > x = 0; > for (; x < imIn->xsize - 3; x += 4) { >- *((UINT32*) (out0 + x)) = MAKE_UINT32(in[0], in[4], in[8], in[12]); >- *((UINT32*) (out1 + x)) = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); >+ UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); >+ memcpy(out0 + x, &v, sizeof(v)); >+ v = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); >+ memcpy(out1 + x, &v, sizeof(v)); > in += 16; > } > for (; x < imIn->xsize; x++) { >@@ -119,9 +122,12 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) > UINT8* out2 = bands[2]->image8[y]; > x = 0; > for (; x < imIn->xsize - 3; x += 4) { >- *((UINT32*) (out0 + x)) = MAKE_UINT32(in[0], in[4], in[8], in[12]); >- *((UINT32*) (out1 + x)) = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); >- *((UINT32*) (out2 + x)) = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); >+ UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); >+ memcpy(out0 + x, &v, sizeof(v)); >+ v = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); >+ memcpy(out1 + x, &v, sizeof(v)); >+ v = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); >+ memcpy(out2 + x, &v, sizeof(v)); > in += 16; > } > for (; x < imIn->xsize; x++) { >@@ -140,10 +146,14 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) > UINT8* out3 = bands[3]->image8[y]; > x = 0; > for (; x < imIn->xsize - 3; x += 4) { >- *((UINT32*) (out0 + x)) = MAKE_UINT32(in[0], in[4], in[8], in[12]); >- *((UINT32*) (out1 + x)) = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); >- *((UINT32*) (out2 + x)) = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); >- *((UINT32*) (out3 + x)) = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); >+ UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); >+ memcpy(out0 + x, &v, sizeof(v)); >+ v = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); >+ memcpy(out1 + x, &v, sizeof(v)); >+ v = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); >+ memcpy(out2 + x, &v, sizeof(v)); >+ v = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); >+ memcpy(out3 + x, &v, sizeof(v)); > in += 16; > } > for (; x < imIn->xsize; x++) { >diff --git a/libImaging/Convert.c b/libImaging/Convert.c >index b3e48e52..874bf896 100644 >--- a/libImaging/Convert.c >+++ b/libImaging/Convert.c >@@ -230,42 +230,46 @@ static void > rgb2i(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++, in += 4) >- *out++ = L24(in) >> 16; >+ for (x = 0; x < xsize; x++, in += 4) { >+ INT32 v = L24(in) >> 16; >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > rgb2f(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++, in += 4) >- *out++ = (float) L(in) / 1000.0F; >+ for (x = 0; x < xsize; x++, in += 4) { >+ FLOAT32 v = (float) L(in) / 1000.0F; >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > rgb2bgr15(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- UINT16* out = (UINT16*) out_; >- for (x = 0; x < xsize; x++, in += 4) >- *out++ = >+ for (x = 0; x < xsize; x++, in += 4) { >+ UINT16 v = > ((((UINT16)in[0])<<7)&0x7c00) + > ((((UINT16)in[1])<<2)&0x03e0) + > ((((UINT16)in[2])>>3)&0x001f); >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > rgb2bgr16(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- UINT16* out = (UINT16*) out_; >- for (x = 0; x < xsize; x++, in += 4) >- *out++ = >+ for (x = 0; x < xsize; x++, in += 4) { >+ UINT16 v = > ((((UINT16)in[0])<<8)&0xf800) + > ((((UINT16)in[1])<<3)&0x07e0) + > ((((UINT16)in[2])>>3)&0x001f); >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void >@@ -491,12 +495,13 @@ rgbT2rgba(UINT8* out, int xsize, int r, int g, int b) > UINT32 repl = trns & 0x00ffffff; > #endif > >- UINT32* tmp = (UINT32 *)out; > int i; > >- for (i=0; i < xsize; i++ ,tmp++) { >- if (tmp[0]==trns) { >- tmp[0]=repl; >+ for (i=0; i < xsize; i++ ,out += sizeof(trns)) { >+ UINT32 v; >+ memcpy(&v, out, sizeof(v)); >+ if (v==trns) { >+ memcpy(out, &repl, sizeof(repl)); > } > } > } >@@ -554,32 +559,35 @@ static void > bit2i(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (*in++ != 0) ? 255 : 0; >+ for (x = 0; x < xsize; x++) { >+ INT32 v = (*in++ != 0) ? 255 : 0; >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > l2i(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (INT32) *in++; >+ for (x = 0; x < xsize; x++) { >+ INT32 v = *in++; >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > i2l(UINT8* out, const UINT8* in_, int xsize) > { > int x; >- INT32* in = (INT32*) in_; >- for (x = 0; x < xsize; x++, in++, out++) { >- if (*in <= 0) >+ for (x = 0; x < xsize; x++, out++) { >+ INT32 v; >+ memcpy(&v, in_ + x * sizeof(v), sizeof(v)); >+ if (v <= 0) > *out = 0; >- else if (*in >= 255) >+ else if (v >= 255) > *out = 255; > else >- *out = (UINT8) *in; >+ *out = (UINT8) v; > } > } > >@@ -587,10 +595,13 @@ static void > i2f(UINT8* out_, const UINT8* in_, int xsize) > { > int x; >- INT32* in = (INT32*) in_; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (FLOAT32) *in++; >+ for (x = 0; x < xsize; x++) { >+ INT32 i; >+ FLOAT32 f; >+ memcpy(&i, in_ + x * sizeof(i), sizeof(i)); >+ f = i; >+ memcpy(out_ + x * sizeof(f), &f, sizeof(f)); >+ } > } > > /* ------------- */ >@@ -601,32 +612,35 @@ static void > bit2f(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (*in++ != 0) ? 255.0F : 0.0F; >+ for (x = 0; x < xsize; x++) { >+ FLOAT32 f = (*in++ != 0) ? 255.0F : 0.0F; >+ memcpy(out_ + x * sizeof(f), &f, sizeof(f)); >+ } > } > > static void > l2f(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (FLOAT32) *in++; >+ for (x = 0; x < xsize; x++) { >+ FLOAT32 f = (FLOAT32) *in++; >+ memcpy(out_ + x * sizeof(f), &f, sizeof(f)); >+ } > } > > static void > f2l(UINT8* out, const UINT8* in_, int xsize) > { > int x; >- FLOAT32* in = (FLOAT32*) in_; >- for (x = 0; x < xsize; x++, in++, out++) { >- if (*in <= 0.0) >+ for (x = 0; x < xsize; x++, out++) { >+ FLOAT32 v; >+ memcpy(&v, in_ + x * sizeof(v), sizeof(v)); >+ if (v <= 0.0) > *out = 0; >- else if (*in >= 255.0) >+ else if (v >= 255.0) > *out = 255; > else >- *out = (UINT8) *in; >+ *out = (UINT8) v; > } > } > >@@ -634,10 +648,13 @@ static void > f2i(UINT8* out_, const UINT8* in_, int xsize) > { > int x; >- FLOAT32* in = (FLOAT32*) in_; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (INT32) *in++; >+ for (x = 0; x < xsize; x++) { >+ FLOAT32 f; >+ INT32 i; >+ memcpy(&f, in_ + x * sizeof(f), sizeof(f)); >+ i = f; >+ memcpy(out_ + x * sizeof(f), &i, sizeof(i)); >+ } > } > > /* ----------------- */ >@@ -674,9 +691,10 @@ static void > I_I16L(UINT8* out, const UINT8* in_, int xsize) > { > int x, v; >- INT32* in = (INT32*) in_; >- for (x = 0; x < xsize; x++, in++) { >- v = CLIP16(*in); >+ for (x = 0; x < xsize; x++) { >+ INT32 i; >+ memcpy(&i, in_ + x * sizeof(i), sizeof(i)); >+ v = CLIP16(i); > *out++ = (UINT8) v; > *out++ = (UINT8) (v >> 8); > } >@@ -686,9 +704,10 @@ static void > I_I16B(UINT8* out, const UINT8* in_, int xsize) > { > int x, v; >- INT32* in = (INT32*) in_; >- for (x = 0; x < xsize; x++, in++) { >- v = CLIP16(*in); >+ for (x = 0; x < xsize; x++) { >+ INT32 i; >+ memcpy(&i, in_ + x * sizeof(i), sizeof(i)); >+ v = CLIP16(i); > *out++ = (UINT8) (v >> 8); > *out++ = (UINT8) v; > } >@@ -699,9 +718,10 @@ static void > I16L_I(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++, in += 2) >- *out++ = in[0] + ((int) in[1] << 8); >+ for (x = 0; x < xsize; x++, in += 2) { >+ INT32 v = in[0] + ((int) in[1] << 8); >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > >@@ -709,18 +729,20 @@ static void > I16B_I(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++, in += 2) >- *out++ = in[1] + ((int) in[0] << 8); >+ for (x = 0; x < xsize; x++, in += 2) { >+ INT32 v = in[1] + ((int) in[0] << 8); >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > I16L_F(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++, in += 2) >- *out++ = (FLOAT32) (in[0] + ((int) in[1] << 8)); >+ for (x = 0; x < xsize; x++, in += 2) { >+ FLOAT32 v = in[0] + ((int) in[1] << 8); >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > >@@ -728,9 +750,10 @@ static void > I16B_F(UINT8* out_, const UINT8* in, int xsize) > { > int x; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++, in += 2) >- *out++ = (FLOAT32) (in[1] + ((int) in[0] << 8)); >+ for (x = 0; x < xsize; x++, in += 2) { >+ FLOAT32 v = in[1] + ((int) in[0] << 8); >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void >@@ -931,18 +954,20 @@ static void > p2i(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) > { > int x; >- INT32* out = (INT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = L(&palette[in[x]*4]) / 1000; >+ for (x = 0; x < xsize; x++, in += 2) { >+ INT32 v = L(&palette[in[x]*4]) / 1000; >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void > p2f(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) > { > int x; >- FLOAT32* out = (FLOAT32*) out_; >- for (x = 0; x < xsize; x++) >- *out++ = (float) L(&palette[in[x]*4]) / 1000.0F; >+ for (x = 0; x < xsize; x++, in += 2) { >+ FLOAT32 v = L(&palette[in[x]*4]) / 1000.0F; >+ memcpy(out_ + x * sizeof(v), &v, sizeof(v)); >+ } > } > > static void >diff --git a/libImaging/Draw.c b/libImaging/Draw.c >index 3fae3d93..d2a64f10 100644 >--- a/libImaging/Draw.c >+++ b/libImaging/Draw.c >@@ -40,7 +40,6 @@ > #define FLOOR(v) ((v) >= 0.0 ? (int) (v) : (int) floor(v)) > > #define INK8(ink) (*(UINT8*)ink) >-#define INK32(ink) (*(INT32*)ink) > > /* > * Rounds around zero (up=away from zero, down=torwards zero) >@@ -555,7 +554,7 @@ DRAW draw32rgba = { point32rgba, hline32rgba, line32rgba, polygon32rgba }; > ink = INK8(ink_);\ > } else {\ > draw = (op) ? &draw32rgba : &draw32; \ >- ink = INK32(ink_);\ >+ memcpy(&ink, ink_, sizeof(ink)); \ > } > > int >diff --git a/libImaging/Filter.c b/libImaging/Filter.c >index 6e4a0050..b033abf6 100644 >--- a/libImaging/Filter.c >+++ b/libImaging/Filter.c >@@ -122,26 +122,29 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, > UINT8* in_1 = (UINT8*) im->image[y-1]; > UINT8* in0 = (UINT8*) im->image[y]; > UINT8* in1 = (UINT8*) im->image[y+1]; >- UINT32* out = (UINT32*) imOut->image[y]; >+ UINT8* out = (UINT8*) imOut->image[y]; > >- out[0] = ((UINT32*) in0)[0]; >+ memcpy(out, in0, sizeof(UINT32)); > if (im->bands == 2) { > for (x = 1; x < im->xsize-1; x++) { > float ss0 = offset; > float ss3 = offset; >+ UINT32 v; > ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); > ss3 += KERNEL1x3(in1, x*4+3, &kernel[0], 4); > ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); > ss3 += KERNEL1x3(in0, x*4+3, &kernel[3], 4); > ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); > ss3 += KERNEL1x3(in_1, x*4+3, &kernel[6], 4); >- out[x] = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); >+ v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); >+ memcpy(out + x * sizeof(v), &v, sizeof(v)); > } > } else if (im->bands == 3) { > for (x = 1; x < im->xsize-1; x++) { > float ss0 = offset; > float ss1 = offset; > float ss2 = offset; >+ UINT32 v; > ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); > ss1 += KERNEL1x3(in1, x*4+1, &kernel[0], 4); > ss2 += KERNEL1x3(in1, x*4+2, &kernel[0], 4); >@@ -151,8 +154,9 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, > ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); > ss1 += KERNEL1x3(in_1, x*4+1, &kernel[6], 4); > ss2 += KERNEL1x3(in_1, x*4+2, &kernel[6], 4); >- out[x] = MAKE_UINT32( >+ v = MAKE_UINT32( > clip8(ss0), clip8(ss1), clip8(ss2), 0); >+ memcpy(out + x * sizeof(v), &v, sizeof(v)); > } > } else if (im->bands == 4) { > for (x = 1; x < im->xsize-1; x++) { >@@ -160,6 +164,7 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, > float ss1 = offset; > float ss2 = offset; > float ss3 = offset; >+ UINT32 v; > ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); > ss1 += KERNEL1x3(in1, x*4+1, &kernel[0], 4); > ss2 += KERNEL1x3(in1, x*4+2, &kernel[0], 4); >@@ -172,11 +177,12 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, > ss1 += KERNEL1x3(in_1, x*4+1, &kernel[6], 4); > ss2 += KERNEL1x3(in_1, x*4+2, &kernel[6], 4); > ss3 += KERNEL1x3(in_1, x*4+3, &kernel[6], 4); >- out[x] = MAKE_UINT32( >+ v = MAKE_UINT32( > clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); >+ memcpy(out + x * sizeof(v), &v, sizeof(v)); > } > } >- out[x] = ((UINT32*) in0)[x]; >+ memcpy(out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32)); > } > } > memcpy(imOut->image[y], im->image[y], im->linesize); >@@ -232,14 +238,14 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, > UINT8* in0 = (UINT8*) im->image[y]; > UINT8* in1 = (UINT8*) im->image[y+1]; > UINT8* in2 = (UINT8*) im->image[y+2]; >- UINT32* out = (UINT32*) imOut->image[y]; >+ UINT8* out = (UINT8*) imOut->image[y]; > >- out[0] = ((UINT32*) in0)[0]; >- out[1] = ((UINT32*) in0)[1]; >+ memcpy(out, in0, sizeof(UINT32) * 2); > if (im->bands == 2) { > for (x = 2; x < im->xsize-2; x++) { > float ss0 = offset; > float ss3 = offset; >+ UINT32 v; > ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); > ss3 += KERNEL1x5(in2, x*4+3, &kernel[0], 4); > ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); >@@ -250,13 +256,15 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, > ss3 += KERNEL1x5(in_1, x*4+3, &kernel[15], 4); > ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); > ss3 += KERNEL1x5(in_2, x*4+3, &kernel[20], 4); >- out[x] = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); >+ v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); >+ memcpy(out + x * sizeof(v), &v, sizeof(v)); > } > } else if (im->bands == 3) { > for (x = 2; x < im->xsize-2; x++) { > float ss0 = offset; > float ss1 = offset; > float ss2 = offset; >+ UINT32 v; > ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); > ss1 += KERNEL1x5(in2, x*4+1, &kernel[0], 4); > ss2 += KERNEL1x5(in2, x*4+2, &kernel[0], 4); >@@ -272,8 +280,9 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, > ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); > ss1 += KERNEL1x5(in_2, x*4+1, &kernel[20], 4); > ss2 += KERNEL1x5(in_2, x*4+2, &kernel[20], 4); >- out[x] = MAKE_UINT32( >+ v = MAKE_UINT32( > clip8(ss0), clip8(ss1), clip8(ss2), 0); >+ memcpy(out + x * sizeof(v), &v, sizeof(v)); > } > } else if (im->bands == 4) { > for (x = 2; x < im->xsize-2; x++) { >@@ -281,6 +290,7 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, > float ss1 = offset; > float ss2 = offset; > float ss3 = offset; >+ UINT32 v; > ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); > ss1 += KERNEL1x5(in2, x*4+1, &kernel[0], 4); > ss2 += KERNEL1x5(in2, x*4+2, &kernel[0], 4); >@@ -301,12 +311,12 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, > ss1 += KERNEL1x5(in_2, x*4+1, &kernel[20], 4); > ss2 += KERNEL1x5(in_2, x*4+2, &kernel[20], 4); > ss3 += KERNEL1x5(in_2, x*4+3, &kernel[20], 4); >- out[x] = MAKE_UINT32( >+ v = MAKE_UINT32( > clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); >+ memcpy(out + x * sizeof(v), &v, sizeof(v)); > } > } >- out[x] = ((UINT32*) in0)[x]; >- out[x+1] = ((UINT32*) in0)[x+1]; >+ memcpy(out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32) * 2); > } > } > memcpy(imOut->image[y], im->image[y], im->linesize); >diff --git a/libImaging/Geometry.c b/libImaging/Geometry.c >index 1d08728d..cd647632 100644 >--- a/libImaging/Geometry.c >+++ b/libImaging/Geometry.c >@@ -396,7 +396,7 @@ nearest_filter16(void* out, Imaging im, double xin, double yin) > int y = COORD(yin); > if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) > return 0; >- ((INT16*)out)[0] = ((INT16*)(im->image8[y]))[x]; >+ memcpy(out, im->image8[y] + x * sizeof(INT16), sizeof(INT16)); > return 1; > } > >@@ -407,7 +407,7 @@ nearest_filter32(void* out, Imaging im, double xin, double yin) > int y = COORD(yin); > if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) > return 0; >- ((INT32*)out)[0] = im->image32[y][x]; >+ memcpy(out, &im->image32[y][x], sizeof(INT32)); > return 1; > } > >@@ -457,18 +457,22 @@ bilinear_filter8(void* out, Imaging im, double xin, double yin) > static int > bilinear_filter32I(void* out, Imaging im, double xin, double yin) > { >+ INT32 k; > BILINEAR_HEAD(INT32); > BILINEAR_BODY(INT32, im->image32, 1, 0); >- ((INT32*)out)[0] = (INT32) v1; >+ k = v1; >+ memcpy(out, &k, sizeof(k)); > return 1; > } > > static int > bilinear_filter32F(void* out, Imaging im, double xin, double yin) > { >+ FLOAT32 k; > BILINEAR_HEAD(FLOAT32); > BILINEAR_BODY(FLOAT32, im->image32, 1, 0); >- ((FLOAT32*)out)[0] = (FLOAT32) v1; >+ k = v1; >+ memcpy(out, &k, sizeof(k)); > return 1; > } > >@@ -569,18 +573,22 @@ bicubic_filter8(void* out, Imaging im, double xin, double yin) > static int > bicubic_filter32I(void* out, Imaging im, double xin, double yin) > { >+ INT32 k; > BICUBIC_HEAD(INT32); > BICUBIC_BODY(INT32, im->image32, 1, 0); >- ((INT32*)out)[0] = (INT32) v1; >+ k = v1; >+ memcpy(out, &k, sizeof(k)); > return 1; > } > > static int > bicubic_filter32F(void* out, Imaging im, double xin, double yin) > { >+ FLOAT32 k; > BICUBIC_HEAD(FLOAT32); > BICUBIC_BODY(FLOAT32, im->image32, 1, 0); >- ((FLOAT32*)out)[0] = (FLOAT32) v1; >+ k = v1; >+ memcpy(out, &k, sizeof(k)); > return 1; > } > >diff --git a/libImaging/GetBBox.c b/libImaging/GetBBox.c >index 3cfa42c4..ba5da2a5 100644 >--- a/libImaging/GetBBox.c >+++ b/libImaging/GetBBox.c >@@ -146,8 +146,8 @@ ImagingGetExtrema(Imaging im, void *extrema) > imax = in[x]; > } > } >- ((INT32*) extrema)[0] = imin; >- ((INT32*) extrema)[1] = imax; >+ memcpy(extrema, &imin, sizeof(imin)); >+ memcpy(((char*)extrema) + sizeof(imin), &imax, sizeof(imax)); > break; > case IMAGING_TYPE_FLOAT32: > fmin = fmax = ((FLOAT32*) im->image32[0])[0]; >@@ -160,23 +160,27 @@ ImagingGetExtrema(Imaging im, void *extrema) > fmax = in[x]; > } > } >- ((FLOAT32*) extrema)[0] = fmin; >- ((FLOAT32*) extrema)[1] = fmax; >+ memcpy(extrema, &fmin, sizeof(fmin)); >+ memcpy(((char*)extrema) + sizeof(fmin), &fmax, sizeof(fmax)); > break; > case IMAGING_TYPE_SPECIAL: > if (strcmp(im->mode, "I;16") == 0) { >- imin = imax = ((UINT16*) im->image8[0])[0]; >+ UINT16 v; >+ memcpy(&v, im->image8, sizeof(v)); >+ imin = imax = v; > for (y = 0; y < im->ysize; y++) { >- UINT16* in = (UINT16 *) im->image[y]; > for (x = 0; x < im->xsize; x++) { >- if (imin > in[x]) >- imin = in[x]; >- else if (imax < in[x]) >- imax = in[x]; >+ memcpy(&v, im->image[y] + x * sizeof(v), sizeof(v)); >+ if (imin > v) >+ imin = v; >+ else if (imax < v) >+ imax = v; > } > } >- ((UINT16*) extrema)[0] = (UINT16) imin; >- ((UINT16*) extrema)[1] = (UINT16) imax; >+ v = (UINT16) imin; >+ memcpy(extrema, &v, sizeof(v)); >+ v = (UINT16) imax; >+ memcpy(((char*)extrema) + sizeof(v), &v, sizeof(v)); > break; > } > /* FALL THROUGH */ >diff --git a/libImaging/Histo.c b/libImaging/Histo.c >index 0bfc8dfe..fb992e33 100644 >--- a/libImaging/Histo.c >+++ b/libImaging/Histo.c >@@ -124,8 +124,8 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) > return ImagingError_ValueError("min/max not given"); > if (!im->xsize || !im->ysize) > break; >- imin = ((INT32*) minmax)[0]; >- imax = ((INT32*) minmax)[1]; >+ memcpy(&imin, minmax, sizeof(imin)); >+ memcpy(&imax, ((char*)minmax) + sizeof(imin), sizeof(imax)); > if (imin >= imax) > break; > ImagingSectionEnter(&cookie); >@@ -145,8 +145,8 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) > return ImagingError_ValueError("min/max not given"); > if (!im->xsize || !im->ysize) > break; >- fmin = ((FLOAT32*) minmax)[0]; >- fmax = ((FLOAT32*) minmax)[1]; >+ memcpy(&fmin, minmax, sizeof(fmin)); >+ memcpy(&fmax, ((char*)minmax) + sizeof(fmin), sizeof(fmax)); > if (fmin >= fmax) > break; > ImagingSectionEnter(&cookie); >diff --git a/libImaging/Pack.c b/libImaging/Pack.c >index 5c298c6c..d18f31cb 100644 >--- a/libImaging/Pack.c >+++ b/libImaging/Pack.c >@@ -252,7 +252,7 @@ ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) > int i = 0; > /* RGB triplets */ > for (; i < pixels-1; i++) { >- ((UINT32*)out)[0] = ((UINT32*)in)[i]; >+ memcpy(out, in + i * 4, 4); > out += 3; > } > for (; i < pixels; i++) { >@@ -392,18 +392,19 @@ static void > packI16B(UINT8* out, const UINT8* in_, int pixels) > { > int i; >- INT32* in = (INT32*) in_; > UINT16 tmp_; > UINT8* tmp = (UINT8*) &tmp_; > for (i = 0; i < pixels; i++) { >- if (in[0] <= 0) >+ INT32 in; >+ memcpy(&in, in_, sizeof(in)); >+ if (in <= 0) > tmp_ = 0; >- else if (in[0] > 65535) >+ else if (in > 65535) > tmp_ = 65535; > else >- tmp_ = in[0]; >+ tmp_ = in; > C16B; >- out += 2; in++; >+ out += 2; in_ += sizeof(in); > } > } > >diff --git a/libImaging/Point.c b/libImaging/Point.c >index 426c410c..9b4bf6b7 100644 >--- a/libImaging/Point.c >+++ b/libImaging/Point.c >@@ -99,12 +99,12 @@ im_point_8_32(Imaging imOut, Imaging imIn, im_point_context* context) > { > int x, y; > /* 8-bit source, 32-bit destination */ >- INT32* table = (INT32*) context->table; >+ char* table = (char*) context->table; > for (y = 0; y < imIn->ysize; y++) { > UINT8* in = imIn->image8[y]; > INT32* out = imOut->image32[y]; > for (x = 0; x < imIn->xsize; x++) >- out[x] = table[in[x]]; >+ memcpy(out + x, table + in[x] * sizeof(INT32), sizeof(INT32)); > } > } > >@@ -242,11 +242,15 @@ ImagingPointTransform(Imaging imIn, double scale, double offset) > if (strcmp(imIn->mode,"I;16") == 0) { > ImagingSectionEnter(&cookie); > for (y = 0; y < imIn->ysize; y++) { >- UINT16* in = (UINT16 *)imIn->image[y]; >- UINT16* out = (UINT16 *)imOut->image[y]; >+ char* in = (char*)imIn->image[y]; >+ char* out = (char*)imOut->image[y]; > /* FIXME: add clipping? */ >- for (x = 0; x < imIn->xsize; x++) >- out[x] = in[x] * scale + offset; >+ for (x = 0; x < imIn->xsize; x++) { >+ UINT16 v; >+ memcpy(&v, in + x * sizeof(v), sizeof(v)); >+ v = v * scale + offset; >+ memcpy(out + x * sizeof(UINT16), &v, sizeof(v)); >+ } > } > ImagingSectionLeave(&cookie); > break; >diff --git a/libImaging/Resample.c b/libImaging/Resample.c >index 877f25a9..79b340f3 100644 >--- a/libImaging/Resample.c >+++ b/libImaging/Resample.c >@@ -256,6 +256,7 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, > if (imIn->bands == 2) { > for (yy = 0; yy < imOut->ysize; yy++) { > for (xx = 0; xx < imOut->xsize; xx++) { >+ UINT32 v; > xmin = bounds[xx * 2 + 0]; > xmax = bounds[xx * 2 + 1]; > k = &kk[xx * ksize]; >@@ -264,13 +265,14 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, > ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; > ss3 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 3]) * k[x]; > } >- ((UINT32 *) imOut->image[yy])[xx] = MAKE_UINT32( >- clip8(ss0), 0, 0, clip8(ss3)); >+ v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); >+ memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); > } > } > } else if (imIn->bands == 3) { > for (yy = 0; yy < imOut->ysize; yy++) { > for (xx = 0; xx < imOut->xsize; xx++) { >+ UINT32 v; > xmin = bounds[xx * 2 + 0]; > xmax = bounds[xx * 2 + 1]; > k = &kk[xx * ksize]; >@@ -280,13 +282,14 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, > ss1 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 1]) * k[x]; > ss2 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 2]) * k[x]; > } >- ((UINT32 *) imOut->image[yy])[xx] = MAKE_UINT32( >- clip8(ss0), clip8(ss1), clip8(ss2), 0); >+ v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); >+ memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); > } > } > } else { > for (yy = 0; yy < imOut->ysize; yy++) { > for (xx = 0; xx < imOut->xsize; xx++) { >+ UINT32 v; > xmin = bounds[xx * 2 + 0]; > xmax = bounds[xx * 2 + 1]; > k = &kk[xx * ksize]; >@@ -297,8 +300,8 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, > ss2 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 2]) * k[x]; > ss3 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 3]) * k[x]; > } >- ((UINT32 *) imOut->image[yy])[xx] = MAKE_UINT32( >- clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); >+ v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); >+ memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); > } > } > } >@@ -340,13 +343,14 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, > ymin = bounds[yy * 2 + 0]; > ymax = bounds[yy * 2 + 1]; > for (xx = 0; xx < imOut->xsize; xx++) { >+ UINT32 v; > ss0 = ss3 = 1 << (PRECISION_BITS -1); > for (y = 0; y < ymax; y++) { > ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; > ss3 += ((UINT8) imIn->image[y + ymin][xx*4 + 3]) * k[y]; > } >- ((UINT32 *) imOut->image[yy])[xx] = MAKE_UINT32( >- clip8(ss0), 0, 0, clip8(ss3)); >+ v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); >+ memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); > } > } > } else if (imIn->bands == 3) { >@@ -355,14 +359,15 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, > ymin = bounds[yy * 2 + 0]; > ymax = bounds[yy * 2 + 1]; > for (xx = 0; xx < imOut->xsize; xx++) { >+ UINT32 v; > ss0 = ss1 = ss2 = 1 << (PRECISION_BITS -1); > for (y = 0; y < ymax; y++) { > ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; > ss1 += ((UINT8) imIn->image[y + ymin][xx*4 + 1]) * k[y]; > ss2 += ((UINT8) imIn->image[y + ymin][xx*4 + 2]) * k[y]; > } >- ((UINT32 *) imOut->image[yy])[xx] = MAKE_UINT32( >- clip8(ss0), clip8(ss1), clip8(ss2), 0); >+ v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); >+ memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); > } > } > } else { >@@ -371,6 +376,7 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, > ymin = bounds[yy * 2 + 0]; > ymax = bounds[yy * 2 + 1]; > for (xx = 0; xx < imOut->xsize; xx++) { >+ UINT32 v; > ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS -1); > for (y = 0; y < ymax; y++) { > ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; >@@ -378,8 +384,8 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, > ss2 += ((UINT8) imIn->image[y + ymin][xx*4 + 2]) * k[y]; > ss3 += ((UINT8) imIn->image[y + ymin][xx*4 + 3]) * k[y]; > } >- ((UINT32 *) imOut->image[yy])[xx] = MAKE_UINT32( >- clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); >+ v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); >+ memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); > } > } > } >diff --git a/libImaging/SgiRleDecode.c b/libImaging/SgiRleDecode.c >index 1d41437f..d4f6e6fb 100644 >--- a/libImaging/SgiRleDecode.c >+++ b/libImaging/SgiRleDecode.c >@@ -28,7 +28,7 @@ static void read4B(UINT32* dest, UINT8* buf) > static int expandrow(UINT8* dest, UINT8* src, int n, int z) > { > UINT8 pixel, count; >- >+ > for (;n > 0; n--) > { > pixel = *src++; >@@ -42,7 +42,7 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z) > *dest = *src++; > dest += z; > } >- >+ > } > else { > pixel = *src++; >@@ -51,20 +51,20 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z) > dest += z; > } > } >- >+ > } > return 0; > } > >-static int expandrow2(UINT16* dest, UINT16* src, int n, int z) >+static int expandrow2(UINT8* dest, const UINT8* src, int n, int z) > { > UINT8 pixel, count; > >- >+ > for (;n > 0; n--) > { >- pixel = ((UINT8*)src)[1]; >- ++src; >+ pixel = src[1]; >+ src+=2; > if (n == 1 && pixel != 0) > return n; > count = pixel & RLE_MAX_RUN; >@@ -72,16 +72,17 @@ static int expandrow2(UINT16* dest, UINT16* src, int n, int z) > return count; > if (pixel & RLE_COPY_FLAG) { > while(count--) { >- *dest = *src++; >- dest += z; >+ memcpy(dest, src, 2); >+ src += 2; >+ dest += z * 2; > } > } > else { > while (count--) { >- *dest = *src; >- dest += z; >+ memcpy(dest, src, 2); >+ dest += z * 2; > } >- ++src; >+ src+=2; > } > } > return 0; >@@ -96,7 +97,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, > SGISTATE *c; > int err = 0; > >- /* Get all data from File descriptor */ >+ /* Get all data from File descriptor */ > c = (SGISTATE*)state->context; > _imaging_seek_pyFd(state->fd, 0L, SEEK_END); > c->bufsize = _imaging_tell_pyFd(state->fd); >@@ -155,29 +156,29 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, > c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; > c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; > c->rleoffset -= SGI_HEADER_SIZE; >- >+ > /* row decompression */ > if (c->bpc ==1) { > if(expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands)) > goto sgi_finish_decode; > } > else { >- if(expandrow2((UINT16*)&state->buffer[c->channo * 2], (UINT16*)&ptr[c->rleoffset], c->rlelength, im->bands)) >+ if(expandrow2(&state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands)) > goto sgi_finish_decode; > } >- >+ > state->count += c->rlelength; > } >- >+ > /* store decompressed data in image */ > state->shuffle((UINT8*)im->image[state->y], state->buffer, im->xsize); >- >+ > } > > c->bufsize++; > > sgi_finish_decode: ; >- >+ > free(c->starttab); > free(c->lengthtab); > free(ptr); >diff --git a/libImaging/Unpack.c b/libImaging/Unpack.c >index c7b9a606..696b5513 100644 >--- a/libImaging/Unpack.c >+++ b/libImaging/Unpack.c >@@ -32,7 +32,6 @@ > > #include "Imaging.h" > >- > #define R 0 > #define G 1 > #define B 2 >@@ -188,7 +187,7 @@ unpack1IR(UINT8* out, const UINT8* in, int pixels) > static void > unpack18(UINT8* out, const UINT8* in, int pixels) > { >- /* Unpack a '|b1' image, which is a numpy boolean. >+ /* Unpack a '|b1' image, which is a numpy boolean. > 1 == true, 0==false, in bytes */ > > int i; >@@ -329,10 +328,10 @@ static void > unpackLA(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* LA, pixel interleaved */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[0], in[0], in[0], in[1]); >+ UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[1]); >+ memcpy(_out + i + sizeof(iv), &iv, sizeof(iv)); > in += 2; > } > } >@@ -341,10 +340,10 @@ static void > unpackLAL(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* LA, line interleaved */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[i], in[i], in[i], in[i+pixels]); >+ UINT32 iv = MAKE_UINT32(in[i], in[i], in[i], in[i+pixels]); >+ memcpy(_out + i + sizeof(iv), &iv, sizeof(iv)); > } > } > >@@ -482,14 +481,17 @@ void > ImagingUnpackRGB(UINT8* _out, const UINT8* in, int pixels) > { > int i = 0; >- UINT32* out = (UINT32*) _out; > /* RGB triplets */ > for (; i < pixels-1; i++) { >- out[i] = MASK_UINT32_CHANNEL_3 | *(UINT32*)&in[0]; >+ UINT32 iv; >+ memcpy(&iv, in, sizeof(iv)); >+ iv |= MASK_UINT32_CHANNEL_3; >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 3; > } > for (; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[0], in[1], in[2], 255); >+ UINT32 iv = MAKE_UINT32(in[0], in[1], in[2], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 3; > } > } >@@ -498,10 +500,10 @@ void > unpackRGB16L(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* 16-bit RGB triplets, little-endian order */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[1], in[3], in[5], 255); >+ UINT32 iv = MAKE_UINT32(in[1], in[3], in[5], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 6; > } > } >@@ -510,10 +512,10 @@ void > unpackRGB16B(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* 16-bit RGB triplets, big-endian order */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[0], in[2], in[4], 255); >+ UINT32 iv = MAKE_UINT32(in[0], in[2], in[4], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 6; > } > } >@@ -522,10 +524,10 @@ static void > unpackRGBL(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGB, line interleaved */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], 255); >+ UINT32 iv = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > } > } > >@@ -533,11 +535,11 @@ static void > unpackRGBR(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGB, bit reversed */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(BITFLIP[in[0]], BITFLIP[in[1]], >- BITFLIP[in[2]], 255); >+ UINT32 iv = MAKE_UINT32(BITFLIP[in[0]], BITFLIP[in[1]], >+ BITFLIP[in[2]], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 3; > } > } >@@ -546,10 +548,10 @@ void > ImagingUnpackBGR(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGB, reversed bytes */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[2], in[1], in[0], 255); >+ UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 3; > } > } >@@ -678,10 +680,10 @@ static void > ImagingUnpackBGRX(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGB, reversed bytes with padding */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[2], in[1], in[0], 255); >+ UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -690,10 +692,10 @@ static void > ImagingUnpackXRGB(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGB, leading pad */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[1], in[2], in[3], 255); >+ UINT32 iv = MAKE_UINT32(in[1], in[2], in[3], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -702,10 +704,10 @@ static void > ImagingUnpackXBGR(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGB, reversed bytes, leading pad */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[3], in[2], in[1], 255); >+ UINT32 iv = MAKE_UINT32(in[3], in[2], in[1], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -716,10 +718,10 @@ static void > unpackRGBALA(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* greyscale with alpha */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[0], in[0], in[0], in[1]); >+ UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], 255); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 2; > } > } >@@ -728,10 +730,10 @@ static void > unpackRGBALA16B(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* 16-bit greyscale with alpha, big-endian */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[0], in[0], in[0], in[2]); >+ UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[2]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -740,19 +742,20 @@ static void > unpackRGBa16L(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* premultiplied 16-bit RGBA, little-endian */ > for (i = 0; i < pixels; i++) { > int a = in[7]; >+ UINT32 iv; > if ( ! a) { >- out[i] = 0; >+ iv = 0; > } else if (a == 255) { >- out[i] = MAKE_UINT32(in[1], in[3], in[5], a); >+ iv = MAKE_UINT32(in[1], in[3], in[5], a); > } else { >- out[i] = MAKE_UINT32(CLIP(in[1] * 255 / a), >- CLIP(in[3] * 255 / a), >- CLIP(in[5] * 255 / a), a); >+ iv = MAKE_UINT32(CLIP(in[1] * 255 / a), >+ CLIP(in[3] * 255 / a), >+ CLIP(in[5] * 255 / a), a); > } >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 8; > } > } >@@ -761,19 +764,20 @@ static void > unpackRGBa16B(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* premultiplied 16-bit RGBA, big-endian */ > for (i = 0; i < pixels; i++) { > int a = in[6]; >+ UINT32 iv; > if ( ! a) { >- out[i] = 0; >+ iv = 0; > } else if (a == 255) { >- out[i] = MAKE_UINT32(in[0], in[2], in[4], a); >+ iv = MAKE_UINT32(in[0], in[2], in[4], a); > } else { >- out[i] = MAKE_UINT32(CLIP(in[0] * 255 / a), >- CLIP(in[2] * 255 / a), >- CLIP(in[4] * 255 / a), a); >+ iv = MAKE_UINT32(CLIP(in[0] * 255 / a), >+ CLIP(in[2] * 255 / a), >+ CLIP(in[4] * 255 / a), a); > } >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 8; > } > } >@@ -782,19 +786,20 @@ static void > unpackRGBa(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* premultiplied RGBA */ > for (i = 0; i < pixels; i++) { > int a = in[3]; >+ UINT32 iv; > if ( ! a) { >- out[i] = 0; >+ iv = 0; > } else if (a == 255) { >- out[i] = MAKE_UINT32(in[0], in[1], in[2], a); >+ iv = MAKE_UINT32(in[0], in[1], in[2], a); > } else { >- out[i] = MAKE_UINT32(CLIP(in[0] * 255 / a), >- CLIP(in[1] * 255 / a), >- CLIP(in[2] * 255 / a), a); >+ iv = MAKE_UINT32(CLIP(in[0] * 255 / a), >+ CLIP(in[1] * 255 / a), >+ CLIP(in[2] * 255 / a), a); > } >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -803,19 +808,20 @@ static void > unpackBGRa(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* premultiplied BGRA */ > for (i = 0; i < pixels; i++) { > int a = in[3]; >+ UINT32 iv; > if ( ! a) { >- out[i] = 0; >+ iv = 0; > } else if (a == 255) { >- out[i] = MAKE_UINT32(in[2], in[1], in[0], a); >+ iv = MAKE_UINT32(in[2], in[1], in[0], a); > } else { >- out[i] = MAKE_UINT32(CLIP(in[2] * 255 / a), >- CLIP(in[1] * 255 / a), >- CLIP(in[0] * 255 / a), a); >+ iv = MAKE_UINT32(CLIP(in[2] * 255 / a), >+ CLIP(in[1] * 255 / a), >+ CLIP(in[0] * 255 / a), a); > } >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -838,11 +844,11 @@ static void > unpackRGBAL(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGBA, line interleaved */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], >- in[i+pixels+pixels+pixels]); >+ UINT32 iv = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], >+ in[i+pixels+pixels+pixels]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > } > } > >@@ -850,10 +856,10 @@ void > unpackRGBA16L(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* 16-bit RGBA, little-endian order */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[1], in[3], in[5], in[7]); >+ UINT32 iv = MAKE_UINT32(in[1], in[3], in[5], in[7]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 8; > } > } >@@ -862,10 +868,10 @@ void > unpackRGBA16B(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* 16-bit RGBA, big-endian order */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[0], in[2], in[4], in[6]); >+ UINT32 iv = MAKE_UINT32(in[0], in[2], in[4], in[6]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 8; > } > } >@@ -874,10 +880,10 @@ static void > unpackARGB(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGBA, leading pad */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[1], in[2], in[3], in[0]); >+ UINT32 iv = MAKE_UINT32(in[1], in[2], in[3], in[0]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -886,10 +892,10 @@ static void > unpackABGR(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGBA, reversed bytes */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[3], in[2], in[1], in[0]); >+ UINT32 iv = MAKE_UINT32(in[3], in[2], in[1], in[0]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -898,10 +904,10 @@ static void > unpackBGRA(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* RGBA, reversed bytes */ > for (i = 0; i < pixels; i++) { >- out[i] = MAKE_UINT32(in[2], in[1], in[0], in[3]); >+ UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], in[3]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -913,10 +919,10 @@ static void > unpackCMYKI(UINT8* _out, const UINT8* in, int pixels) > { > int i; >- UINT32* out = (UINT32*) _out; > /* CMYK, inverted bytes (Photoshop 2.5) */ > for (i = 0; i < pixels; i++) { >- out[i] = ~MAKE_UINT32(in[0], in[1], in[2], in[3]); >+ UINT32 iv = ~MAKE_UINT32(in[0], in[1], in[2], in[3]); >+ memcpy(_out + i * sizeof(iv), &iv, sizeof(iv)); > in += 4; > } > } >@@ -991,30 +997,29 @@ unpackI12_I16(UINT8* out, const UINT8* in, int pixels){ > #ifdef WORDS_BIGENDIAN > UINT8* tmp = (UINT8 *)&pixel; > #endif >- UINT16* out16 = (UINT16 *)out; > for (i = 0; i < pixels-1; i+=2) { > pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); > #ifdef WORDS_BIGENDIAN > out[0] = tmp[1]; out[1] = tmp[0]; > #else >- out16[0] = pixel; >+ memcpy(out, &pixel, sizeof(pixel)); > #endif > > pixel = (((UINT16) (in[1] & 0x0F)) << 8) + in[2]; > #ifdef WORDS_BIGENDIAN > out[2] = tmp[1]; out[3] = tmp[0]; > #else >- out16[1] = pixel; >+ memcpy(out + sizeof(pixel), &pixel, sizeof(pixel)); > #endif > >- in += 3; out16 += 2; out+=4; >+ in += 3; out+=4; > } > if (i == pixels-1) { > pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); > #ifdef WORDS_BIGENDIAN > out[0] = tmp[1]; out[1] = tmp[0]; > #else >- out16[0] = pixel; >+ memcpy(out, &pixel, sizeof(pixel)); > #endif > } > } >-- >2.16.4 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 659460
: 537702