Mercurial > hg > dmlib
diff dmscaledblit.h @ 0:32250b436bca
Initial re-import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 28 Sep 2012 01:54:23 +0300 |
parents | |
children | d9251dd496ce |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmscaledblit.h Fri Sep 28 01:54:23 2012 +0300 @@ -0,0 +1,80 @@ +/* + * DMLib + * -- Sprite / surface blitting function template + * Programmed and designed by Matti 'ccr' Hamalainen + * (C) Copyright 2011-2012 Tecnic Software productions (TNSP) + */ + +int DM_SCALED_NAME (SDL_Surface *src, + const int x0, const int y0, + const int dwidth, const int dheight, + SDL_Surface *dst) +{ + int yc; + DMFixedPoint32 xv, yv, dx, dy; + DMQValue xr, yr; + +#ifdef DM_SCALED_VARS + DM_SCALED_VARS +#endif + + // Clip coordinates + if (dmClipCoord(&xr, x0, src->w, dwidth, + dst->clip_rect.x, dst->clip_rect.x + dst->clip_rect.w) + || + dmClipCoord(&yr, y0, src->h, dheight, + dst->clip_rect.y, dst->clip_rect.y + dst->clip_rect.h)) + return -1; + +#ifdef DM_SCALED_INIT + DM_SCALED_INIT +#endif + + // Calculate "final" initial source bitmap offsets + FP_CONV(dy, yr.voffs); + FP_MUL_R(yv, dy, yr.vdelta); + + FP_CONV(dx, xr.voffs); + FP_MUL_R(dx, dx, xr.vdelta); + + // Take pitch into account + const int xadd = xr.vadd - dst->clip_rect.w + dst->clip_rect.x + (dst->pitch / DM_SCALED_DST_BYTES); + + // Blit scaled + DM_SCALED_DST_TYPE * dp = ((DM_SCALED_DST_TYPE *) dst->pixels) + (yr.v0 * dst->pitch) / DM_SCALED_DST_BYTES + xr.v0; + for (yc = yr.v0; yc < yr.v1; yc++) + { + const DM_SCALED_SRC_TYPE * sp = ((DM_SCALED_SRC_TYPE *) src->pixels) + (FP_GETH(yv) * src->pitch) / DM_SCALED_SRC_BYTES; + int xc; + +#ifdef DM_SCALED_INNER_INIT + DM_SCALED_INNER_INIT +#endif + + for (xv.dw = dx.dw, xc = xr.v0; xc < xr.v1; xc++) + { + DM_SCALED_INNER + FP_ADD(xv, xr.vdelta); + } + FP_ADD(yv, yr.vdelta); + dp += xadd; + } + +#ifdef DM_SCALED_FINISH + DM_SCALED_FINISH +#endif + + return 0; +} + + +#undef DM_SCALED_NAME +#undef DM_SCALED_SRC_BYTES +#undef DM_SCALED_DST_BYTES +#undef DM_SCALED_SRC_TYPE +#undef DM_SCALED_DST_TYPE +#undef DM_SCALED_VARS +#undef DM_SCALED_INIT +#undef DM_SCALED_INNER_INIT +#undef DM_SCALED_INNER +#undef DM_SCALED_FINISH