mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-09-22 22:48:08 +03:00
Make image_Mosaic operate on SDL_Surface
This commit is contained in:
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user