SACT: Change text canvas from surface_t to SDL_Surface

This commit is contained in:
kichikuou
2025-02-18 22:01:18 +09:00
parent dec1649882
commit 6b646b3857
8 changed files with 52 additions and 97 deletions
+18 -33
View File
@@ -438,50 +438,35 @@ static void hakanim(int i) {
}
void ntmsg_update(sprite_t *sp, MyRectangle *r) {
int sx, sy, w, h, dx, dy;
surface_t update;
// canvas が clean のときはなにもしない
// -> 説明スプライトのように、SetShowされたときに対応できないからだめ
//if (sact.msgbufempty) return;
update.width = r->w;
update.height = r->h;
dx = sp->cur.x - r->x;
dy = sp->cur.y - r->y;
w = sp->cursize.width;
h = sp->cursize.height;
sx = 0; sy = 0;
if (!gr_clip(sp->u.msg.canvas, &sx, &sy, &w, &h, &update, &dx, &dy)) {
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.height};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = sp->cursize.width;
int h = sp->cursize.height;
if (!ags_clipCopyRect(&sp_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
dx += r->x;
dy += r->y;
gre_BlendUseAMap(sf0, dx, dy, sf0, dx, dy, sp->u.msg.canvas, sx, sy, w, h, sp->u.msg.canvas, sx, sy, sp->blendrate);
SDL_SetSurfaceBlendMode(sp->u.msg.canvas, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(sp->u.msg.canvas, sp->blendrate);
SDL_BlitSurface(sp->u.msg.canvas, &(SDL_Rect){sx, sy, w, h}, sf0->sdl_surface, &(SDL_Rect){dx, dy, w, h});
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d",
sp->no, sx, sy, w, h, dx, dy);
}
static void ntmsg_clear(int wNum) {
sprite_t *sp = night.sp[wNum];
surface_t *sf;
sp->u.msg.dspcur.x = 0;
sp->u.msg.dspcur.y = 0;
night.msgbuf[0] = '\0';
// キャンバスのクリア
sf = sp->u.msg.canvas;
memset(sf->pixel, 0, sf->bytes_per_line * sf->height);
memset(sf->alpha, 0, sf->width * sf->height);
// Clear the canvas
SDL_FillRect(sp->u.msg.canvas, NULL, 0);
nt_sp_updateme(sp);
}
+2 -2
View File
@@ -64,7 +64,7 @@ sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height) {
sp->cursize.height = height;
sp->u.msg.dspcur.x = 0;
sp->u.msg.dspcur.y = 0;
sp->u.msg.canvas = sf_create_surface(width, height, sf0->depth);
sp->u.msg.canvas = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_ARGB8888);
sp->update = ntmsg_update;
return sp;
@@ -78,7 +78,7 @@ void nt_sp_free(sprite_t *sp) {
if (sp->cg3) nt_scg_deref(sp->cg3);
if (sp->type == SPRITE_MSG) {
sf_free(sp->u.msg.canvas);
SDL_FreeSurface(sp->u.msg.canvas);
}
free(sp);
+1 -2
View File
@@ -3,7 +3,6 @@
#define __SPRITE_H__
#include "portab.h"
#include "surface.h"
#include "graphics.h"
#define DEFAULT_UPDATE nt_sp_draw
@@ -97,7 +96,7 @@ struct _sprite {
} anime;
struct {
surface_t *canvas;
struct SDL_Surface *canvas;
MyPoint dspcur;
} msg;
} u;
+1 -1
View File
@@ -190,7 +190,7 @@ struct _sprite {
// メッセージスプライト
struct {
SList *buf; // 表示する文字のリスト
surface_t *canvas; // 文字を描画するsurface
struct SDL_Surface *canvas;
MyPoint dspcur; // 現在の表示位置
} msg;
} u;
+5 -5
View File
@@ -216,10 +216,10 @@ void sp_new_msg(int no, int x, int y, int width, int height) {
sp->cursize.height = height;
sp->cur = sp->loc;
sp->u.msg.buf = NULL;
// 文字描画用キャンバス
sp->u.msg.canvas = sf_create_surface(width, height, sf0->depth);
// canvas for drawing text
sp->u.msg.canvas = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_ARGB8888);
// スプライト再描画用コールバック
sp->update = smsg_update;
}
@@ -290,7 +290,7 @@ void sp_free(int no) {
if (sp->type == SPRITE_MSG) {
slist_free(sp->u.msg.buf);
sf_free(sp->u.msg.canvas);
SDL_FreeSurface(sp->u.msg.canvas);
}
sact.updatelist = slist_remove(sact.updatelist, sp);
+16 -34
View File
@@ -352,24 +352,19 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
@param wNum: クリアするスプライト番号
*/
void smsg_clear(int wNum) {
sprite_t *sp;
surface_t *sf;
if (!is_messagesprite(wNum)) return;
// 表示位置の初期化
sp = sact.sp[wNum];
sprite_t *sp = sact.sp[wNum];
sp->u.msg.dspcur.x = 0;
sp->u.msg.dspcur.y = 0;
sact.msgbuf[0] = '\0';
sact.msgbuf2[0] = '\0';
// キャンバスのクリア
sf = sp->u.msg.canvas;
memset(sf->pixel, 0, sf->bytes_per_line * sf->height);
memset(sf->alpha, 0, sf->width * sf->height);
// Clear the canvas
SDL_FillRect(sp->u.msg.canvas, NULL, 0);
sp_updateme(sp);
if (sact.logging) {
@@ -453,32 +448,19 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
@param sp: 再描画するスプライト
*/
void smsg_update(sprite_t *sp) {
int sx, sy, w, h, dx, dy;
surface_t update;
// canvas が clean のときはなにもしない
// -> 説明スプライトのように、SetShowされたときに対応できないからだめ
//if (sact.msgbufempty) return;
update.width = sact.updaterect.w;
update.height = sact.updaterect.h;
dx = sp->cur.x - sact.updaterect.x;
dy = sp->cur.y - sact.updaterect.y;
w = sp->cursize.width;
h = sp->cursize.height;
sx = 0; sy = 0;
if (!gr_clip(sp->u.msg.canvas, &sx, &sy, &w, &h, &update, &dx, &dy)) {
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.height};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = sp->cursize.width;
int h = sp->cursize.height;
if (!ags_clipCopyRect(&sp_rect, &sact.updaterect, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
dx += sact.updaterect.x;
dy += sact.updaterect.y;
gre_BlendUseAMap(sf0, dx, dy, sf0, dx, dy, sp->u.msg.canvas, sx, sy, w, h, sp->u.msg.canvas, sx, sy, sp->blendrate);
SDL_SetSurfaceBlendMode(sp->u.msg.canvas, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(sp->u.msg.canvas, sp->blendrate);
SDL_BlitSurface(sp->u.msg.canvas, &(SDL_Rect){sx, sy, w, h}, sf0->sdl_surface, &(SDL_Rect){dx, dy, w, h});
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d, dx=%d, dy=%d",
sp->no, sx, sy, w, h, dx, dy);
+8 -19
View File
@@ -69,10 +69,10 @@ int dt_drawtext(SDL_Surface *sf, int x, int y, char *buf) {
SDL_Surface *glyph = ags_drawStringToSurface(buf);
if (glyph == NULL) return 0;
SDL_Rect r = {x, y, glyph->w, glyph->h};
SDL_BlitSurface(glyph, NULL, sf, &r);
SDL_Rect rect = {x, y, glyph->w, glyph->h};
SDL_BlitSurface(glyph, NULL, sf, &rect);
SDL_FreeSurface(glyph);
return glyph->w;
return rect.w;
}
/**
@@ -88,24 +88,13 @@ int dt_drawtext(SDL_Surface *sf, int x, int y, char *buf) {
* @param b: 文字色青
* @return: 実際に描画した幅
*/
int dt_drawtext_col(surface_t *sf, int x, int y, char *buf, int r, int g, int b) {
int sx, sy, sw, sh;
int dt_drawtext_col(SDL_Surface *sf, int x, int y, char *buf, int r, int g, int b) {
ags_setFont(ftype, fsize);
SDL_Surface *glyph = ags_drawStringToSurface(buf);
SDL_Surface *glyph = ags_drawStringToRGBASurface(buf, r, g, b);
if (glyph == NULL) return 0;
sx = x; sy = y;
sw = glyph->w;
sh = glyph->h;
if (!gr_clip_xywh(sf, &sx, &sy, &sw, &sh)) return 0;
// alpha map に文字そのものを描く
gr_draw_amap(sf, sx, sy, glyph->pixels, sw, sh, glyph->pitch);
// pixel map には色情報を矩形で描く
gr_fill(sf, sx, sy, sw, sh, r, g, b);
SDL_Rect rect = {x, y, glyph->w, glyph->h};
SDL_BlitSurface(glyph, NULL, sf, &rect);
SDL_FreeSurface(glyph);
return sw;
return rect.w;
}
+1 -1
View File
@@ -30,6 +30,6 @@ struct SDL_Surface;
void dt_setfont(FontType type, int size);
int dt_drawtext(struct SDL_Surface *sf, int x, int y, char *buf);
int dt_drawtext_col(surface_t *sf, int x, int y, char *buf, int r, int g, int b);
int dt_drawtext_col(struct SDL_Surface *sf, int x, int y, char *buf, int r, int g, int b);
#endif /* __DRAWTEXT_H__ */