Software nearest scaling: start at the middle of pixel so that it matches opengl GL_NEAREST mode most of the time
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
diff --git a/src/video/SDL_blit_slow.c b/src/video/SDL_blit_slow.c
index 3ef3319..2429028 100644
--- a/src/video/SDL_blit_slow.c
+++ b/src/video/SDL_blit_slow.c
@@ -49,15 +49,15 @@ SDL_Blit_Slow(SDL_BlitInfo * info)
Uint32 rgbmask = ~src_fmt->Amask;
Uint32 ckey = info->colorkey & rgbmask;
- posy = 0;
incy = (info->src_h << 16) / info->dst_h;
incx = (info->src_w << 16) / info->dst_w;
+ posy = incy / 2; /* start at the middle of pixel */
while (info->dst_h--) {
Uint8 *src = 0;
Uint8 *dst = info->dst;
int n = info->dst_w;
- posx = 0;
+ posx = incx / 2; /* start at the middle of pixel */
srcy = posy >> 16;
while (n--) {
srcx = posx >> 16;
diff --git a/src/video/SDL_stretch.c b/src/video/SDL_stretch.c
index a6480e9..79052c7 100644
--- a/src/video/SDL_stretch.c
+++ b/src/video/SDL_stretch.c
@@ -857,13 +857,13 @@ SDL_LowerSoftStretchLinear(SDL_Surface *s, const SDL_Rect *srcrect,
incy = (src_h << 16) / dst_h; \
incx = (src_w << 16) / dst_w; \
dst_gap = dst_pitch - bpp * dst_w; \
- posy = 0; \
+ posy = incy / 2; \
#define SDL_SCALE_NEAREST__HEIGHT \
srcy = (posy >> 16); \
src_h0 = (const Uint32 *)((const Uint8 *)src_ptr + srcy * src_pitch); \
posy += incy; \
- posx = 0; \
+ posx = incx / 2; \
n = dst_w;
diff --git a/src/video/sdlgenblit.pl b/src/video/sdlgenblit.pl
index 63d6dc9..1d04b7c 100755
--- a/src/video/sdlgenblit.pl
+++ b/src/video/sdlgenblit.pl
@@ -458,15 +458,15 @@ __EOF__
print FILE <<__EOF__;
- posy = 0;
incy = (info->src_h << 16) / info->dst_h;
incx = (info->src_w << 16) / info->dst_w;
+ posy = incy / 2;
while (info->dst_h--) {
$format_type{$src} *src = 0;
$format_type{$dst} *dst = ($format_type{$dst} *)info->dst;
int n = info->dst_w;
- posx = 0;
+ posx = incx / 2;
srcy = posy >> 16;
while (n--) {