Make image_Mosaic operate on SDL_Surface

This commit is contained in:
kichikuou
2020-10-04 16:02:10 +09:00
parent b5c8b158c6
commit 9541f3f85a
5 changed files with 38 additions and 99 deletions
+9 -5
View File
@@ -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();
+20 -91
View File
@@ -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);
}
}
}
+1 -2
View File
@@ -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);
+2
View File
@@ -25,6 +25,7 @@
#include "config.h"
#include <sys/types.h>
#include <SDL_surface.h>
#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);
+6 -1
View File
@@ -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);
}