diff --git a/modules/SACT/sprite_eupdate_mosaic.c b/modules/SACT/sprite_eupdate_mosaic.c index 5dba0e2..3158381 100644 --- a/modules/SACT/sprite_eupdate_mosaic.c +++ b/modules/SACT/sprite_eupdate_mosaic.c @@ -5,8 +5,8 @@ static void ec6_cb(surface_t *src, surface_t *dst) { int curstep, maxstep = 32; surface_t *st, *dt; - static int slices[32]={4,8,12,16,20,28,36,40,44,48,56,64,72,80,88,96, - 88,80,72,64,56,48,44,40,36,28,24,20,16,12,8,4}; + static int slices[32]={4,8,12,16,20,28,36,40,44,48,56,64,72,80,88,96, + 88,80,72,64,56,48,44,40,36,28,24,20,16,12,8,4}; curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime); @@ -17,9 +17,13 @@ static void ec6_cb(surface_t *src, surface_t *dst) { st = sf_dup(src); dt = sf_dup(dst); - image_Mosaic(st, 0, 0, st->width, st->height, 0, 0, slices[curstep]); - image_Mosaic(dt, 0, 0, dt->width, dt->height, 0, 0, slices[curstep]); - + SDL_Surface *stt = com2surface(st); + SDL_Surface *dtt = com2surface(dt); + image_Mosaic(stt, 0, 0, stt->w, stt->h, 0, 0, slices[curstep]); + image_Mosaic(dtt, 0, 0, dtt->w, dtt->h, 0, 0, slices[curstep]); + SDL_FreeSurface(stt); + SDL_FreeSurface(dtt); + gre_Blend(sf0, 0, 0, st, 0, 0, dt, 0, 0, st->width, st->height, curstep*8); ags_updateFull(); diff --git a/src/image.c b/src/image.c index 4f20259..8a4154e 100644 --- a/src/image.c +++ b/src/image.c @@ -38,7 +38,6 @@ static const int fadeX[16] = {0,2,2,0,1,3,3,1,1,3,3,1,0,2,2,0}; static const int fadeY[16] = {0,2,0,2,1,3,1,3,0,2,0,2,1,3,1,3}; static void (*draw_line)(agsurface_t*, int, int, int, int, int); -static void (*fill_rectangle)(agsurface_t*, int, int, int, int, int); static void (*copy_from_alpha)(agsurface_t *, BYTE *, BYTE *, int, int, ALPHA_DIB_COPY_TYPE); static void (*copy_to_alpha)(agsurface_t *, BYTE *, BYTE *, int, int, ALPHA_DIB_COPY_TYPE); @@ -124,16 +123,6 @@ static void image_drawLine8(agsurface_t *dib, int x0, int y0, int x1, int y1, in } } -static void image_fillRectangle8(agsurface_t *dib, int x, int y, int w, int h, int col) { - BYTE *dst = GETOFFSET_PIXEL(dib, x, y); - int i; - - for (i = 0; i < h; i++) { - memset(dst, col, w); - dst += dib->bytes_per_line; - } -} - /******************************************************************************/ /* private methods image操作 16bpp */ /******************************************************************************/ @@ -251,22 +240,6 @@ static void image_drawLine16(agsurface_t *dib, int x0, int y0, int x1, int y1, i } } -static void image_fillRectangle16(agsurface_t *dib, int x, int y, int w, int h, int col) { - BYTE *_dst, *dst = GETOFFSET_PIXEL(dib, x, y); - int i; - - _dst = dst; - - for (i = 0; i < w; i++) { - *((WORD *)dst + i) = col; - } - - for (i = 0; i < h -1; i++) { - dst += dib->bytes_per_line; - memcpy(dst, _dst, w * 2); - } -} - static void image_copy_from_alpha16(agsurface_t *dib, BYTE *sdata, BYTE *ddata, int w, int h, ALPHA_DIB_COPY_TYPE flag) { int x, y; BYTE *yls; @@ -542,22 +515,6 @@ static void image_drawLine24(agsurface_t *dib, int x0, int y0, int x1, int y1, i } } -static void image_fillRectangle24(agsurface_t *dib, int x, int y, int w, int h, int col) { - BYTE *_dst, *dst = GETOFFSET_PIXEL(dib, x, y); - int i; - - _dst = dst; - - for (i = 0; i < w; i++) { - *((DWORD *)dst + i) = col; - } - - for (i = 0; i < h -1; i++) { - dst += dib->bytes_per_line; - memcpy(dst, _dst, w * 4); - } -} - static void image_copy_from_alpha24(agsurface_t *dib, BYTE *sdata, BYTE *ddata, int w, int h, ALPHA_DIB_COPY_TYPE flag) { int x, y; BYTE *yls; @@ -689,18 +646,15 @@ void image_setdepth(int depth) { switch(depth) { case 8: draw_line = image_drawLine8; - fill_rectangle = image_fillRectangle8; break; case 16: draw_line = image_drawLine16; - fill_rectangle = image_fillRectangle16; copy_from_alpha = image_copy_from_alpha16; copy_to_alpha = image_copy_to_alpha16; break; case 24: case 32: draw_line = image_drawLine24; - fill_rectangle = image_fillRectangle24; copy_from_alpha = image_copy_from_alpha24; copy_to_alpha = image_copy_to_alpha24; break; @@ -748,13 +702,6 @@ void image_drawLine(agsurface_t *dib, int x0, int y0, int x1, int y1, int col) { draw_line(dib, x0, y0, x1, y1, col); } -/* - * dib に矩形塗りつぶしを描画 - */ -void image_fillRectangle(agsurface_t *dib, int x, int y, int w, int h, int col) { - fill_rectangle(dib, x, y, w, h, col); -} - void image_copy_from_alpha(agsurface_t *dib, int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag) { BYTE *sdata = GETOFFSET_ALPHA(dib, sx, sy); BYTE *ddata = GETOFFSET_PIXEL(dib, dx, dy); @@ -771,44 +718,26 @@ void image_copy_to_alpha(agsurface_t *dib, int sx, int sy, int w, int h, int dx, /* モザイク */ -void image_Mosaic(agsurface_t *dib, int sx, int sy, int w, int h, int dx, int dy, int slice) { -#define m_mozaic(type) { \ - type *p_ss = (type *)GETOFFSET_PIXEL(dib, sx, sy); \ - type *p_src; \ - int l = dib->bytes_per_line / dib->bytes_per_pixel * slice; \ - for (y = 0; y < h; y += slice) { \ - p_src = p_ss; \ - if ((y + slice) > h ) r.height = h - y; \ - r.width = slice; \ - for (x = 0; x < w; x += slice) { \ - cl = *p_src; \ - r.x = dx + x; \ - r.y = dy + y; \ - if ((r.x + slice) > w) r.width = w - x; \ - fill_rectangle(dib, r.x, r.y, r.width, r.height, cl); \ - p_src += slice; \ - } \ - p_ss += l; \ - }} - - int cl; - int x,y; - MyRectangle r; - - r.width=slice; - r.height=slice; - - switch(dib->depth) { - case 8: - m_mozaic(BYTE); - break; - case 16: - m_mozaic(WORD); - break; - case 24: - case 32: - m_mozaic(DWORD); - break; +void image_Mosaic(SDL_Surface *dib, int sx, int sy, int w, int h, int dx, int dy, int slice) { + SDL_Rect r = {.h = slice}; + for (int y = 0; y < h; y += slice) { + if (y + slice > h) + r.h = h - y; + r.w = slice; + for (int x = 0; x < w; x += slice) { + void *src = PIXEL_AT(dib, sx + x, sy + y); + Uint32 color; + switch (dib->format->BytesPerPixel) { + case 1: color = *(BYTE *)src; break; + case 2: color = *(WORD *)src; break; + default: color = *(DWORD *)src; break; + } + r.x = dx + x; + r.y = dy + y; + if (r.x + slice > w) + r.w = w - x; + SDL_FillRect(dib, &r, color); + } } } diff --git a/src/image.h b/src/image.h index c1d0112..e8a05aa 100644 --- a/src/image.h +++ b/src/image.h @@ -32,10 +32,9 @@ extern void image_setdepth(int); extern void image_fadeOut(SDL_Surface *img, int lv, int col); extern void image_fadeIn(SDL_Surface *src, SDL_Surface *dst, int lv); extern void image_drawLine(agsurface_t *dib, int x0, int y0, int x1, int y1, int col); -extern void image_fillRectangle(agsurface_t *dib, int x, int y, int w, int h, int col); extern void image_copy_from_alpha(agsurface_t *dib, int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag); extern void image_copy_to_alpha(agsurface_t *dib, int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag); -extern void image_Mosaic(agsurface_t *dib, int sx, int sy, int w, int h, int dx, int dy, int slice); +extern void image_Mosaic(SDL_Surface *dib, int sx, int sy, int w, int h, int dx, int dy, int slice); extern BYTE *changeImage16AlphaLevel(cgdata *cg); diff --git a/src/sdl_core.h b/src/sdl_core.h index 3e00f33..52d78f6 100644 --- a/src/sdl_core.h +++ b/src/sdl_core.h @@ -25,6 +25,7 @@ #include "config.h" #include +#include #include "portab.h" #include "ags.h" #include "cursor.h" @@ -78,6 +79,7 @@ extern void sdl_restoreRegion(void *src, int x, int y); extern void* sdl_saveRegion(int x, int y, int w, int h); extern void sdl_delRegion(void *src); extern void sdl_maskupdate(int sx, int sy, int w, int h, int dx, int dy, int func, int step); +extern SDL_Surface *com2surface(agsurface_t *s); /* fader */ extern void sdl_fadeIn(int step); diff --git a/src/sdl_draw.c b/src/sdl_draw.c index c66ed6c..58f8da6 100644 --- a/src/sdl_draw.c +++ b/src/sdl_draw.c @@ -294,6 +294,11 @@ void sdl_drawLine(int x1, int y1, int x2, int y2, unsigned long cl) { } +SDL_Surface *com2surface(agsurface_t *s) { + return SDL_CreateRGBSurfaceFrom( + s->pixel, s->width, s->height, s->depth, s->bytes_per_line, 0, 0, 0, 0); +} + int sdl_nearest_color(int r, int g, int b) { int i, col, mind = INT_MAX; for (i = 0; i < 256; i++) { @@ -318,7 +323,7 @@ void sdl_Mosaic(int sx, int sy, int w, int h, int dx, int dy, int slice) { SDL_LockSurface(sdl_dib); - image_Mosaic(sdl_dibinfo, sx, sy, w, h, dx, dy, slice); + image_Mosaic(sdl_dib, sx, sy, w, h, dx, dy, slice); SDL_UnlockSurface(sdl_dib); }