memcpy_pic: kill useless/dangerous optimization

The memcpy_pic() function had a rather dangerous optimization: when the
limit2width flag was not set, it was allowed to overwrite the data
between the last pixel of a line and the first pixel of the next line
(i.e. write over the stride padding). That was also the reason why there
are so many whacky names for this function (memcpy_pic, my_memcpy_pic,
memcpy_pic2).

Kill this optimization, and never overwrite the stride padding. The code
doing this can still be used if there's no stride padding at all,
though.

Also use the name memcpy_pic for the proper function. Now it should be
rather clear that my_memcpy_pic and memcpy_pic2 are compatibility
aliases. They should go away over the time.
This commit is contained in:
wm4 2012-11-25 00:32:47 +01:00
parent 99e178f1e8
commit 2bd7f980ac
1 changed files with 6 additions and 10 deletions

View File

@ -24,21 +24,17 @@
#include <string.h>
#include <stddef.h>
#define memcpy_pic(d, s, b, h, ds, ss) memcpy_pic2(d, s, b, h, ds, ss, 0)
#define my_memcpy_pic(d, s, b, h, ds, ss) memcpy_pic2(d, s, b, h, ds, ss, 1)
#define my_memcpy_pic memcpy_pic
#define memcpy_pic2(d, s, b, h, ds, ss, unused) memcpy_pic(d, s, b, h, ds, ss)
/**
* \param limit2width always skip data between end of line and start of next
* instead of copying the full block when strides are the same
*/
static inline void * memcpy_pic2(void * dst, const void * src,
int bytesPerLine, int height,
int dstStride, int srcStride, int limit2width)
static inline void * memcpy_pic(void * dst, const void * src,
int bytesPerLine, int height,
int dstStride, int srcStride)
{
int i;
void *retval=dst;
if(!limit2width && dstStride == srcStride)
if(bytesPerLine == dstStride && dstStride == srcStride)
{
if (srcStride < 0) {
src = (uint8_t*)src + (height-1)*srcStride;