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"
20 static void sdl_zoom_rgb16(SDL_Surface
*src
, SDL_Surface
*dst
, int smooth
,
22 static void sdl_zoom_rgb32(SDL_Surface
*src
, SDL_Surface
*dst
, int smooth
,
26 #include "sdl_zoom_template.h"
29 #include "sdl_zoom_template.h"
32 int sdl_zoom_blit(SDL_Surface
*src_sfc
, SDL_Surface
*dst_sfc
, int smooth
,
35 SDL_Rect zoom
, src_rect
;
38 /* Grow the size of the modified rectangle to avoid edge artefacts */
39 src_rect
.x
= (in_rect
->x
> 0) ? (in_rect
->x
- 1) : 0;
40 src_rect
.y
= (in_rect
->y
> 0) ? (in_rect
->y
- 1) : 0;
42 src_rect
.w
= in_rect
->w
+ 1;
43 if (src_rect
.x
+ src_rect
.w
> src_sfc
->w
)
44 src_rect
.w
= src_sfc
->w
- src_rect
.x
;
46 src_rect
.h
= in_rect
->h
+ 1;
47 if (src_rect
.y
+ src_rect
.h
> src_sfc
->h
)
48 src_rect
.h
= src_sfc
->h
- src_rect
.y
;
50 /* (x,y) : round down */
51 zoom
.x
= (int)(((float)(src_rect
.x
* dst_sfc
->w
)) / (float)(src_sfc
->w
));
52 zoom
.y
= (int)(((float)(src_rect
.y
* dst_sfc
->h
)) / (float)(src_sfc
->h
));
54 /* (w,h) : round up */
55 zoom
.w
= (int)( ((double)((src_rect
.w
* dst_sfc
->w
) + (src_sfc
->w
- 1))) /
56 (double)(src_sfc
->w
));
58 zoom
.h
= (int)( ((double)((src_rect
.h
* dst_sfc
->h
) + (src_sfc
->h
- 1))) /
59 (double)(src_sfc
->h
));
61 /* Account for any (x,y) rounding by adding one-source-pixel's worth
62 * of destination pixels and then edge checking.
65 extra
= ((dst_sfc
->w
-1) / src_sfc
->w
) + 1;
67 if ((zoom
.x
+ zoom
.w
) < (dst_sfc
->w
- extra
))
70 zoom
.w
= dst_sfc
->w
- zoom
.x
;
72 extra
= ((dst_sfc
->h
-1) / src_sfc
->h
) + 1;
74 if ((zoom
.y
+ zoom
.h
) < (dst_sfc
->h
- extra
))
77 zoom
.h
= dst_sfc
->h
- zoom
.y
;
79 /* The rectangle (zoom.x, zoom.y, zoom.w, zoom.h) is the area on the
80 * destination surface that needs to be updated.
82 if (src_sfc
->format
->BitsPerPixel
== 32)
83 sdl_zoom_rgb32(src_sfc
, dst_sfc
, smooth
, &zoom
);
84 else if (src_sfc
->format
->BitsPerPixel
== 16)
85 sdl_zoom_rgb16(src_sfc
, dst_sfc
, smooth
, &zoom
);
87 fprintf(stderr
, "pixel format not supported\n");
91 /* Return the rectangle of the update to the caller */