2 * SDL_zoom - surface scaling
4 * Copyright (c) 2009 Citrix Systems, Inc.
6 * Derived from: SDL_rotozoom, LGPL (c) A. Schiffler from the SDL_gfx library.
7 * Modifications by Stefano Stabellini.
9 * This work is licensed under the terms of the GNU GPL version 2.
10 * See the COPYING file in the top-level directory.
15 #include "qemu/osdep.h"
19 static int sdl_zoom_rgb16(SDL_Surface
*src
, SDL_Surface
*dst
, int smooth
,
21 static int sdl_zoom_rgb32(SDL_Surface
*src
, SDL_Surface
*dst
, int smooth
,
25 #include "sdl_zoom_template.h"
28 #include "sdl_zoom_template.h"
31 int sdl_zoom_blit(SDL_Surface
*src_sfc
, SDL_Surface
*dst_sfc
, int smooth
,
34 SDL_Rect zoom
, src_rect
;
37 /* Grow the size of the modified rectangle to avoid edge artefacts */
38 src_rect
.x
= (in_rect
->x
> 0) ? (in_rect
->x
- 1) : 0;
39 src_rect
.y
= (in_rect
->y
> 0) ? (in_rect
->y
- 1) : 0;
41 src_rect
.w
= in_rect
->w
+ 1;
42 if (src_rect
.x
+ src_rect
.w
> src_sfc
->w
)
43 src_rect
.w
= src_sfc
->w
- src_rect
.x
;
45 src_rect
.h
= in_rect
->h
+ 1;
46 if (src_rect
.y
+ src_rect
.h
> src_sfc
->h
)
47 src_rect
.h
= src_sfc
->h
- src_rect
.y
;
49 /* (x,y) : round down */
50 zoom
.x
= (int)(((float)(src_rect
.x
* dst_sfc
->w
)) / (float)(src_sfc
->w
));
51 zoom
.y
= (int)(((float)(src_rect
.y
* dst_sfc
->h
)) / (float)(src_sfc
->h
));
53 /* (w,h) : round up */
54 zoom
.w
= (int)( ((double)((src_rect
.w
* dst_sfc
->w
) + (src_sfc
->w
- 1))) /
55 (double)(src_sfc
->w
));
57 zoom
.h
= (int)( ((double)((src_rect
.h
* dst_sfc
->h
) + (src_sfc
->h
- 1))) /
58 (double)(src_sfc
->h
));
60 /* Account for any (x,y) rounding by adding one-source-pixel's worth
61 * of destination pixels and then edge checking.
64 extra
= ((dst_sfc
->w
-1) / src_sfc
->w
) + 1;
66 if ((zoom
.x
+ zoom
.w
) < (dst_sfc
->w
- extra
))
69 zoom
.w
= dst_sfc
->w
- zoom
.x
;
71 extra
= ((dst_sfc
->h
-1) / src_sfc
->h
) + 1;
73 if ((zoom
.y
+ zoom
.h
) < (dst_sfc
->h
- extra
))
76 zoom
.h
= dst_sfc
->h
- zoom
.y
;
78 /* The rectangle (zoom.x, zoom.y, zoom.w, zoom.h) is the area on the
79 * destination surface that needs to be updated.
81 if (src_sfc
->format
->BitsPerPixel
== 32)
82 sdl_zoom_rgb32(src_sfc
, dst_sfc
, smooth
, &zoom
);
83 else if (src_sfc
->format
->BitsPerPixel
== 16)
84 sdl_zoom_rgb16(src_sfc
, dst_sfc
, smooth
, &zoom
);
86 fprintf(stderr
, "pixel format not supported\n");
90 /* Return the rectangle of the update to the caller */