Compare commits

...
62 Commits
Author SHA1 Message Date
kichikuou c9fd1dcfd0 Version 2.14.2 2025-03-09 13:44:58 +09:00
kichikuou c1018d9e0f Replace Color struct with SDL_Color 2025-03-09 13:16:02 +09:00
kichikuou cb8a48cdec Introduce sdl_palette
It replaces the sdl_col array and is set as the palette of main_surface.
2025-03-09 10:42:32 +09:00
kichikuou 6bf6a5c86a Delay mouse button state changes caused by touch events
This fixes #64 where a touch operation is recognized as a click in the
wrong position in Mamatoto.

This is the same problem that occured in xsystem4 and was addressed in
https://github.com/nunuhara/xsystem4/commit/5e80c9658787b118920f850ae4cbc883e6fceb1e,
and the fix is also the same.
2025-03-08 08:33:24 +09:00
kichikuou 790aa07130 Android: Upgrade AGP to 8.7.3 and bump minSdkVersion to 21
So that it builds with latest Android Studio.
2025-03-07 14:49:17 +09:00
kichikuou fa74a4744c Fix ags_scaledCopyArea() for 8-bit DIB
This fixes special move animation in Mamatoto.
2025-03-07 11:21:14 +09:00
kichikuou fb68b03a4f debugger: Update screen before entering REPL 2025-03-07 09:47:46 +09:00
kichikuou 75228cc4c8 Android: Back button to exit the game
Fixes #50.
2025-03-06 08:00:50 +09:00
kichikuou 8c13361164 emscripten: Use System3.9 compatible save format by default 2025-02-25 21:45:11 +09:00
kichikuou d05dc83e67 emscripten: Fix unused-function warning 2025-02-22 14:37:15 +09:00
kichikuou c9f21c4547 sactamask: Use sdl_effect framework 2025-02-21 09:14:05 +09:00
kichikuou f053f25397 Make webp_extract() return SDL_Surface instead of cgdata
This eliminates unnecessary RGBA -> RGB + alpha plane -> RGBA
conversion.
2025-02-21 09:14:02 +09:00
kichikuou f673708a3f Remove depth field from surface_t 2025-02-21 09:12:07 +09:00
kichikuou aab63adac2 Refactor image drawing functions 2025-02-21 09:10:55 +09:00
kichikuou 6f09a999d2 Gpx, ShGraph: Remove unused 16bpp surface support 2025-02-19 15:59:39 +09:00
kichikuou 2ed44dab6d Move surface and graphic functions from modules/lib to modules/Gpx
Except for gr_blend_alpha_map(), which is used by oujimisc.
2025-02-19 14:57:40 +09:00
kichikuou a8f46453d8 Remove redundant fields from surface_t 2025-02-19 14:03:01 +09:00
kichikuou baa4a3158f ags: Add ALPHA_AT macro 2025-02-19 13:39:20 +09:00
kichikuou 8328b93227 Rename agsurface_t to surface_t 2025-02-19 13:24:56 +09:00
kichikuou 6665416683 Refactor NightDemonDemo and tDemo to use SDL_Surface 2025-02-19 13:21:17 +09:00
kichikuou cf5e899632 Remove unused includes from NIGHTDLL/ and SACT/ 2025-02-19 12:38:47 +09:00
kichikuou 51954c6bd4 Move load_cg_to_sdlsurface() to src/cg.c
And rename it to cg_load_as_sdlsurface().
2025-02-19 12:30:13 +09:00
kichikuou f282c02376 Replace sf0 with main_surface 2025-02-19 12:15:10 +09:00
kichikuou e2c75fbd9d Rename sdl_dib to main_surface and move it to ags.h 2025-02-19 12:15:06 +09:00
kichikuou b28e3ef2fd Do not use gr_* functions from SACT/ and NIGHTDLL/ 2025-02-19 12:14:58 +09:00
kichikuou 215de5511e Simplify gre_BlendUseAMap() 2025-02-19 10:20:38 +09:00
kichikuou f669804573 Refactor sactamask.c to use SDL_Surface 2025-02-19 09:59:31 +09:00
kichikuou 9c6423bf99 drawtext: Remove 8-bit text rendering function 2025-02-19 09:59:22 +09:00
kichikuou 4f3b73c1ac Refactor sactlog.c 2025-02-19 08:21:50 +09:00
kichikuou 8ee53accf9 SACT: Change depth map from surface_t to SDL_Surface 2025-02-18 22:01:20 +09:00
kichikuou 6b646b3857 SACT: Change text canvas from surface_t to SDL_Surface 2025-02-18 22:01:18 +09:00
kichikuou dec1649882 SACT: Make sprites have SDL_Surface instead of surface_t 2025-02-18 21:58:06 +09:00
kichikuou 6b9c3475a0 Simplify sdl_scaledCopyArea() 2025-02-17 08:16:09 +09:00
kichikuou 1335a12065 Remove sp_draw2 2025-02-16 22:52:20 +09:00
kichikuou 93bd8ca737 sprite_sel.c: Remove unnecessary variable 2025-02-16 22:39:09 +09:00
kichikuou 5bae0c16c5 Simplify gr_ functions using SDL surface operations 2025-02-16 21:03:59 +09:00
kichikuou d551cdbb70 Refactor text rendering functions in modules/ 2025-02-16 13:13:16 +09:00
kichikuou e711d5786e Make agsurface_t backed by SDL_Surface
This adds `sdl_surface` field to agsurface_t. `agsurface->pixel` is now
set to `agsurfae->sdl_surface->pixels`.

Note that the `sdl_surface` field does not have alpha; transparent
surfaces have a separate alpha plane in `agsurface->alpha`.
2025-02-16 13:13:13 +09:00
kichikuou 64abb3c582 screenshot: Save only view area, not entire sdl_dib 2025-02-11 13:46:20 +09:00
kichikuou bf26f1b0c0 Refactor clipping functions 2025-02-11 12:36:21 +09:00
kichikuou f4f1a99372 Fix mathClip command 2025-02-11 12:36:18 +09:00
kichikuou 53f0a5ce2a sdl_effect: Fix palette issue when texture is created from sdl_dib 2025-02-11 10:30:25 +09:00
kichikuou c621a5dddb Remove intermediate screen buffer
Pixels are now copied directly from sdl_dib to sdl_texture.
2025-02-11 08:37:47 +09:00
kichikuou 42faf38a47 emscripten: Replace sdl_getDisplaySurface with save_screenshot function 2025-02-10 07:47:48 +09:00
kichikuou c50a563e80 Version 2.14.1 2025-02-07 12:39:05 +09:00
kichikuou 996f63f55f Android: Upgrade SDL to 2.30.12 2025-02-07 12:34:43 +09:00
kichikuou fb77b229ea Apply text decoration to selection menus too 2025-02-07 10:52:58 +09:00
kichikuou 886d55057a ZZ13 command should also affect menu font
This fixes the problem of menus always being displayed in Gothic font.
The font type at the time the `]` command is executed should be used.
2025-02-07 09:29:30 +09:00
kichikuou 7f645d6bd1 Refactor function return types in modules/ 2025-02-03 09:24:45 +09:00
kichikuou f8d59e5fc0 Refactor savedata, s39ain, s39ini interfaces 2025-02-02 22:33:56 +09:00
kichikuou 78ebbf40f4 Refactor mus_* interfaces 2025-02-02 22:19:43 +09:00
kichikuou dccd75113b emscripten: Make load_mincho_font() return bool 2025-02-02 14:25:36 +09:00
kichikuou d063655b25 Refactor muspcm_* interface 2025-02-02 13:52:54 +09:00
kichikuou 5e0844e9ea Refactor musbgm_* interface 2025-02-02 13:08:04 +09:00
kichikuou 386c3c0fcd Refactor cdromdevice_t interface 2025-02-02 12:50:15 +09:00
kichikuou 2857c13e15 Refactor mididevice_t interface 2025-02-02 12:49:39 +09:00
kichikuou d14b42c146 Replace boolean/TRUE/FALSE with bool/true/false 2025-02-02 10:02:08 +09:00
kichikuou 29988d0d6c Simplify boolean expressions 2025-02-02 09:36:20 +09:00
kichikuou bc5d72b6fe Refactor cali.c 2025-02-02 09:00:24 +09:00
kichikuou 03f9b36ff0 Fix palette issue in DALK intro
The intro screen of DALK works as follows:

1. load CG 304 to (0,0)-(639, 399) using palette 16-31
2. load CG 305 to (0,400)-(639,799) using palette 16-31
3. CE (copy with effect) from (0,400)-(639,799) to (0,0)-(639, 399)

Step 2 destroys the palette range of CG 304, so before the copy the
pixels in (0,0)-(639,399) have incorrect colors when displayed with the
latest palette.

To avoid this problem, we need create the "old texture" of sdl_effect
from sdl_display instead of sdl_dib.
2025-01-23 14:35:00 +09:00
kichikuou afb9f96a1a Improve midi.portmidi.c
One MIDI thread now handles multiple playbacks.
2025-01-15 11:10:09 +09:00
kichikuou 28e685818c Remove gre_Blend() and gre_BlendScreen() 2025-01-10 09:23:08 +09:00
240 changed files with 3797 additions and 6024 deletions
+8
View File
@@ -1,5 +1,13 @@
# Changelog
## 2.14.2 - 2024-03-09
- Android: Back button to exit the game (#50)
- Improved touch input usability in ママトト (#64)
## 2.14.1 - 2024-02-07
- Fixed font selection and text decoration not working in selection menus.
- Fixed a graphic issue in DALK intro.
## 2.14.0 - 2024-01-09
- New supported games: 俺の下であがけ and 楽園行.
- Windows: On Windows 10 version 1903 or above, now xsystem35 can handle
+1 -1
View File
@@ -10,7 +10,7 @@ set(CMAKE_C_STANDARD 99)
enable_testing()
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
set(XSYSTEM35_VERSION "2.14.0")
set(XSYSTEM35_VERSION "2.14.2")
include(CheckSymbolExists)
include(FetchContent)
+4 -5
View File
@@ -1,13 +1,12 @@
# xsystem35 for Android
Minimum supported Android version: 5.0
## Download
You can download prebuilt APKs
[here](https://github.com/kichikuou/xsystem35-sdl2/releases).
## Build
Prerequisites:
- Android SDK >=28
- Android NDK >=r15c
### Using Android Studio
Open this directory as an Android Studio project.
@@ -23,8 +22,8 @@ sudo apt install git wget unzip default-jdk-headless ninja-build
# Install Android SDK / NDK
export ANDROID_SDK_ROOT=$HOME/android-sdk
mkdir -p $ANDROID_SDK_ROOT/cmdline-tools
wget https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip
unzip commandlinetools-linux-10406996_latest.zip -d $ANDROID_SDK_ROOT/cmdline-tools
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
unzip commandlinetools-linux-11076708_latest.zip -d $ANDROID_SDK_ROOT/cmdline-tools
mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools
yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses
$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager ndk-bundle 'cmake;3.22.1'
+3 -3
View File
@@ -14,10 +14,10 @@ android {
}
compileSdkVersion 34
defaultConfig {
minSdkVersion 19
minSdkVersion 21
targetSdkVersion 34
versionCode 29
versionName "2.14.0" + gitRevision()
versionCode 31
versionName "2.14.2" + gitRevision()
externalNativeBuild {
cmake {
arguments "-DANDROID_APP_PLATFORM=android-19", "-DANDROID_STL=c++_static"
+2 -2
View File
@@ -7,8 +7,8 @@ set(PROJECT_ROOT_DIR ../../..)
include(FetchContent)
FetchContent_Declare(
SDL
URL https://github.com/libsdl-org/SDL/releases/download/release-2.30.9/SDL2-2.30.9.tar.gz
URL_HASH SHA1=9403df0573d47f62f2de074b582b87576bb4abbc
URL https://github.com/libsdl-org/SDL/releases/download/release-2.30.12/SDL2-2.30.12.tar.gz
URL_HASH SHA1=36d48b045209dcd3576250c1571795ad0cd4d5a9
)
FetchContent_Declare(
SDL_ttf
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
private static final String TAG = "SDL";
private static final int SDL_MAJOR_VERSION = 2;
private static final int SDL_MINOR_VERSION = 30;
private static final int SDL_MICRO_VERSION = 9;
private static final int SDL_MICRO_VERSION = 12;
/*
// Display InputType.SOURCE/CLASS of events and devices
//
+1 -1
View File
@@ -7,7 +7,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.1'
classpath 'com.android.tools.build:gradle:8.7.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
+1 -1
View File
@@ -1,6 +1,6 @@
#Thu Nov 11 18:20:34 PST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
+5 -19
View File
@@ -5,7 +5,12 @@ add_library(modules STATIC
AliceLogo/AliceLogo.c
Confirm/Confirm.c
Gpx/Gpx.c
Gpx/cg.c
Gpx/effectcopy.c
Gpx/graph_copy_amap.c
Gpx/graph_fillrect_amap.c
Gpx/graph.c
Gpx/surface.c
Math/Math.c
MsgSkip/MsgSkip.c
NIGHTDLL/NIGHTDLL.c
@@ -61,27 +66,8 @@ add_library(modules STATIC
eeDemo/eeDemo.c
lib/alk.c
lib/drawtext.c
lib/graph.c
lib/list.c
lib/surface.c
lib/cg.c
lib/graph_expandcolor_blend.c
lib/graph_fillrect.c
lib/graph_fillrect_amap.c
lib/graph_fillrect_acolor.c
lib/graph_rect.c
lib/graph_copy.c
lib/graph_copy_amap.c
lib/graph_copy_bright.c
lib/graph_blend_amap.c
lib/graph_blend_screen.c
lib/graph_saturadd_amap.c
lib/graph_draw_amap.c
lib/graph_stretch.c
lib/graph_cg.c
lib/gre_blend_useamap.c
lib/gre_blend.c
lib/gre_blend_screen.c
nDEMO/nDEMO.c
nDEMOE/nDEMOE.c
oDEMO/oDEMO.c
+15 -37
View File
@@ -42,7 +42,7 @@
// #include "alpha_plane.h"
#include "surface.h"
#include "graph.h"
// #include "graph2.h"
#include "graph_blend_amap.h"
#include "effectcopy.h"
#include "ngraph.h"
@@ -68,37 +68,19 @@ static int find_null_surface() {
return 0;
}
static int sf_free_one(int no) {
surface_t *s;
if (no == 0) return NG;
s = suf[no];
if (s == NULL) return NG;
if (s->pixel) free(s->pixel);
if (s->alpha) free(s->alpha);
free(s);
static void sf_free_one(int no) {
if (no == 0 || !suf[no]) return;
sf_free(suf[no]);
suf[no] = NULL;
pre_freesurfno = no;
return OK;
}
static int sf_free_all() {
int i;
surface_t *s;
for (i = 1; i < MAX_SURFACE; i++) {
if (suf[i] == NULL) continue;
s = suf[i];
if (s->pixel) free(s->pixel);
if (s->alpha) free(s->alpha);
free(s);
static void sf_free_all() {
for (int i = 1; i < MAX_SURFACE; i++) {
sf_free(suf[i]);
suf[i] = NULL;
}
pre_freesurfno = 1;
return OK;
}
static surface_t *sf_get(int no) {
@@ -151,18 +133,15 @@ static void Create() {
作成に失敗した場合は 0 を返す
width : surface の幅
height: surface の高さ
bpp : surface の深さ(オリジナルでは24bppのみサポート,
xsystem35 では display の depth と同じ)
bpp : surface の深さ(24bppのみサポート)
*/
int *var = getCaliVariable();
int width = getCaliValue();
int height = getCaliValue();
int bpp = getCaliValue();
surface_t *s;
//get_surface0();
s = sf_create_surface(width, height, sf_get(0)->depth);
surface_t *s = sf_create_surface(width, height);
if (s == NULL) {
*var = 0;
} else {
@@ -187,10 +166,9 @@ static void CreatePixelOnly() {
int width = getCaliValue();
int height = getCaliValue();
int bpp = getCaliValue();
surface_t *s;
s = sf_create_pixel(width, height, sf_get(0)->depth);
surface_t *s = sf_create_pixel(width, height);
if (s == NULL) {
*var = 0;
} else {
@@ -259,7 +237,7 @@ static void IsPixel() {
if (s == NULL) {
*var = 0;
} else {
*var = s->pixel ? 1 : 0;
*var = s->sdl_surface ? 1 : 0;
}
TRACE("Gpx.IsPixel %d,%p:", p1, var);
+20 -53
View File
@@ -33,9 +33,7 @@
#include "ags.h"
#include "pms.h"
#include "qnt.h"
#ifdef HAVE_WEBP
#include "webp.h"
#endif
#include "sdl_core.h"
#include "ngraph.h"
#include "dri.h"
#include "ald_manager.h"
@@ -53,10 +51,6 @@ static CG_TYPE check_cgformat(uint8_t *data) {
return ALCG_PMS8;
} else if (pms64k_checkfmt(data)) {
return ALCG_PMS16;
#ifdef HAVE_WEBP
} else if (webp_checkfmt(data)) {
return ALCG_WEBP;
#endif
}
return ALCG_UNKNOWN;
}
@@ -68,65 +62,38 @@ static CG_TYPE check_cgformat(uint8_t *data) {
* @return CG surface
* NULL
*/
surface_t *sf_getcg(void *b, size_t size) {
surface_t *sf = NULL;
int type;
cgdata *cg = NULL;
type = check_cgformat(b);
switch(type) {
static surface_t *sf_getcg(void *b, size_t size) {
surface_t *sf;
cgdata *cg;
switch(check_cgformat(b)) {
case ALCG_PMS8:
// Load as an alpha map
cg = pms256_extract(b);
cg->alpha = cg->pic;
cg->pic = NULL;
sf = sf_create_alpha(cg->width, cg->height);
sdl_drawImageAlphaMap(cg, sf, 0, 0);
break;
case ALCG_PMS16:
cg = pms64k_extract(b);
sf = cg->alpha
? sf_create_surface(cg->width, cg->height)
: sf_create_pixel(cg->width, cg->height);
sdl_drawImage16(cg, sf, 0, 0, 255, false);
break;
case ALCG_QNT:
cg = qnt_extract(b);
sf = cg->alpha
? sf_create_surface(cg->width, cg->height)
: sf_create_pixel(cg->width, cg->height);
sdl_drawImage24(cg, sf, 0, 0, 255);
break;
#ifdef HAVE_WEBP
case ALCG_WEBP:
cg = webp_extract(b, size);
break;
#endif
default:
break;
}
if (cg == NULL) {
WARNING("Unknown Cg Type");
return NULL;
}
switch(type) {
case ALCG_PMS8:
sf = sf_create_alpha(cg->width, cg->height);
gr_draw_amap(sf, cg->x, cg->y, cg->pic, cg->width, cg->height, cg->width);
break;
case ALCG_PMS16:
if (cg->alpha) {
sf = sf_create_surface(cg->width, cg->height, sf0->depth);
gr_drawimage16(sf, cg, cg->x, cg->y);
gr_draw_amap(sf, cg->x, cg->y, cg->alpha, cg->width, cg->height, cg->width);
} else {
sf = sf_create_pixel(cg->width, cg->height, sf0->depth);
gr_drawimage16(sf, cg, cg->x, cg->y);
}
break;
case ALCG_QNT:
case ALCG_WEBP:
if (cg->alpha) {
sf = sf_create_surface(cg->width, cg->height, sf0->depth);
gr_drawimage24(sf, cg, cg->x, cg->y);
gr_draw_amap(sf, cg->x, cg->y, cg->alpha, cg->width, cg->height, cg->width);
} else {
sf = sf_create_pixel(cg->width, cg->height, sf0->depth);
gr_drawimage24(sf, cg, cg->x, cg->y);
}
break;
}
cgdata_free(cg);
return sf;
}
+1 -1
View File
@@ -33,7 +33,7 @@ void gpx_effect(int no,
struct sdl_effect *eff = sdl_effect_init(&rect, dst, dx, dy, src, sx, sy, type);
if (!time)
time = (no == SACT_EFFECT_CROSSFADE_DOWN || no == SACT_EFFECT_CROSSFADE_UP) ? 1150 : 2700;
ags_runEffect(time, FALSE, (ags_EffectStepFunc)sdl_effect_step, eff);
ags_runEffect(time, false, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
switch (no) {
+89 -177
View File
@@ -3,25 +3,15 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "surface.h"
#include "graph.h"
#include "ngraph.h"
#include "nact.h"
/*
gr_xxxx
gre_xxxx
*/
#undef WARNING
#define WARNING(...)
#undef NOTICE
#define NOTICE(...)
#include "ags.h"
#include "sdl_core.h"
/**
* surface surface surface
@@ -36,80 +26,16 @@
* @param ds: surface
* @param dx:
* @param dy:
* @return TRUE ->
* FALSE->
* @return true ->
* false->
* surfaceの範囲外になり
*
*/
boolean gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds, int *dx, int *dy) {
int w, h;
if (ss == NULL) {
WARNING("ss surface is null");
return FALSE;
}
if (ss == NULL) {
WARNING("ss surface is null");
return FALSE;
}
if (*sx > ss->width) {
WARNING("sx is too large (sx=%d,width=%d)", *sx, ss->width);
return FALSE;
}
if (*sy > ss->height) {
WARNING("sy is too large (sy=%d,height=%d)", *sy, ss->height);
return FALSE;
}
if (*sx < 0) {
WARNING("sx is too small (sx=%d)", *sx);
return FALSE;
}
if (*sy < 0) {
WARNING("sy is too small (sy=%d)", *sy);
return FALSE;
}
if (*dx > ds->width) {
WARNING("dx is too large (dx=%d,width=%d)", *dx, ds->width);
return FALSE;
}
if (*dy > ds->height) {
WARNING("dy is too large (dy=%d,height=%d)", *dy, ds->height);
return FALSE;
}
w = *sw;
h = *sh;
if (*dx < 0) {
*sx -= *dx; *sw += *dx; *dx = 0;
}
if (*dy < 0) {
*sy -= *dy; *sh += *dy; *dy = 0;
}
*sw = min(ss->width - *sx, min(ds->width - *dx, *sw));
*sh = min(ss->height - *sy, min(ds->height - *dy, *sh));
if (*sw <= 0) {
WARNING("sw become <=0");
return FALSE;
}
if (*sh <= 0) {
WARNING("sh become <=0");
return FALSE;
}
if (*sw != w) {
NOTICE("width change %d -> %d", w, *sw);
}
if (*sh != h) {
NOTICE("height change %d -> %d", h, *sh);
}
return TRUE;
bool gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds, int *dx, int *dy) {
if (!ss || !ds) return false;
MyRectangle src_window = { 0, 0, ss->width, ss->height };
MyRectangle dst_window = { 0, 0, ds->width, ds->height };
return ags_clipCopyRect(&src_window, &dst_window, sx, sy, dx, dy, sw, sh);
}
/**
@@ -120,67 +46,75 @@ boolean gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds
* @param sy:
* @param sw:
* @param sh:
* @return TRUE ->
* FALSE->
* @return true ->
* false->
* surfaceの範囲外になり
*
*/
boolean gr_clip_xywh(surface_t *ss, int *sx, int *sy, int *sw, int *sh) {
int w, h;
if (ss == NULL) {
WARNING("ss surface is null");
return FALSE;
}
if (*sx > ss->width) {
WARNING("sx is too large (sx=%d,width=%d)", *sx, ss->width);
return FALSE;
}
if (*sy > ss->height) {
WARNING("sy is too large (sy=%d,height=%d)", *sy, ss->height);
return FALSE;
}
w = *sw;
h = *sh;
if (*sx < 0) {
*sw += *sx; *sx = 0;
}
if (*sy < 0) {
*sh += *sy; *sy = 0;
}
*sw = min(ss->width - *sx, *sw);
*sh = min(ss->height - *sy, *sh);
if (*sw <= 0) {
WARNING("sw become <=0");
return FALSE;
}
if (*sh <= 0) {
WARNING("sh become <=0");
return FALSE;
}
if (*sw != w) {
NOTICE("width change %d -> %d", w, *sw);
}
if (*sh != h) {
NOTICE("height change %d -> %d", h, *sh);
}
return TRUE;
bool gr_clip_xywh(surface_t *ss, int *sx, int *sy, int *sw, int *sh) {
if (!ss) return false;
SDL_Rect rect = {*sx, *sy, *sw, *sh};
if (!SDL_IntersectRect(&rect, &(SDL_Rect){ 0, 0, ss->width, ss->height }, &rect))
return false;
*sx = rect.x;
*sy = rect.y;
*sw = rect.w;
*sh = rect.h;
return true;
}
void gr_init() {
}
void gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
if (!dst->sdl_surface || !src->sdl_surface) return;
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return;
SDL_Rect src_rect = {sx, sy, sw, sh};
SDL_Rect dst_rect = {dx, dy, sw, sh};
if (dst == src) {
SDL_Rect r;
if (SDL_IntersectRect(&src_rect, &dst_rect, &r)) {
SDL_Surface *view = sdl_createSurfaceView(src->sdl_surface, sx, sy, sw, sh);
SDL_Surface *tmp = SDL_ConvertSurface(view, dst->sdl_surface->format, 0);
src_rect.x = 0;
src_rect.y = 0;
SDL_LowerBlit(tmp, &src_rect, dst->sdl_surface, &dst_rect);
SDL_FreeSurface(tmp);
SDL_FreeSurface(view);
return;
}
}
SDL_LowerBlit(src->sdl_surface, &src_rect, dst->sdl_surface, &dst_rect);
}
// Copy the specified surface area with brightness lv/255 times
void gr_copy_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
SDL_Rect src_rect = {sx, sy, width, height};
SDL_Rect dst_rect = {dx, dy, width, height};
SDL_SetSurfaceColorMod(src->sdl_surface, lv, lv, lv);
SDL_BlitSurface(src->sdl_surface, &src_rect, dst->sdl_surface, &dst_rect);
SDL_SetSurfaceColorMod(src->sdl_surface, 255, 255, 255);
}
void gr_fill(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b) {
SDL_Rect rect = {dx, dy, dw, dh};
uint32_t color = SDL_MapRGB(dst->sdl_surface->format, r, g, b);
SDL_FillRect(dst->sdl_surface, &rect, color);
}
void gr_copy_stretch(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh) {
SDL_Rect srcrect = {sx, sy, sw, sh};
SDL_Rect dstrect = {dx, dy, dw, dh};
SDL_BlitScaled(src->sdl_surface, &srcrect, dst->sdl_surface, &dstrect);
}
void gr_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
if (!gr_clip(src, &sx, &sy, &width, &height, dst, &dx, &dy)) return;
gre_Blend(dst, dx, dy, dst, dx, dy, src, sx, sy, width, height, lv);
SDL_SetSurfaceBlendMode(src->sdl_surface, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(src->sdl_surface, lv);
SDL_BlitSurface(src->sdl_surface, &(SDL_Rect){sx, sy, width, height}, dst->sdl_surface, &(SDL_Rect){dx, dy, width, height});
SDL_SetSurfaceAlphaMod(src->sdl_surface, 255);
SDL_SetSurfaceBlendMode(src->sdl_surface, SDL_BLENDMODE_NONE);
}
void gr_blend_src_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int alpha, int rate) {
@@ -271,56 +205,34 @@ void gr_copy_stretch_blend_alpha_map(surface_t *dst, int dx, int dy, int dw, int
row[x] = xd; xd += a1;
}
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld;
uint8_t *yla;
for (y = 0; y < dh; y++) {
yls = (uint16_t *)(sp + *(y + col) * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
yla = (uint8_t *)(sa + *(y + col) * src->width);
for (x = 0; x < dw; x++) {
*(yld + x) = ALPHABLEND16(*(yls+ *(row + x)), *(yld+x), *(yla+*(row+x)));
}
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
yld += dst->width;
for (x = 0; x < dw; x++) {
*(yld + x) = ALPHABLEND16(*(yls+ *(row+x)), *(yld+x), *(yla+*(row+x)));
}
y++;
}
for (y = 0; y < dh; y++) {
uint32_t *yls = (uint32_t *)(sp + *(y + col) * src->sdl_surface->pitch);
uint32_t *yld = (uint32_t *)(dp + y * dst->sdl_surface->pitch);
uint8_t *yla = (uint8_t *)(sa + *(y + col) * src->width);
for (x = 0; x < dw; x++) {
*(yld + x) = ALPHABLEND24(*(yls+ *(row + x)), *(yld+x), *(yla+*(row+x)));
}
break;
}
case 24:
case 32:
{
uint32_t *yls, *yld;
uint8_t *yla;
for (y = 0; y < dh; y++) {
yls = (uint32_t *)(sp + *(y + col) * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
yla = (uint8_t *)(sa + *(y + col) * src->width);
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
yld += dst->width;
for (x = 0; x < dw; x++) {
*(yld + x) = ALPHABLEND24(*(yls+ *(row + x)), *(yld+x), *(yla+*(row+x)));
}
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
yld += dst->width;
for (x = 0; x < dw; x++) {
*(yld + x) = ALPHABLEND24(*(yls+ *(row+x)), *(yld+x), *(yla+*(row+x)));
}
y++;
*(yld + x) = ALPHABLEND24(*(yls+ *(row+x)), *(yld+x), *(yla+*(row+x)));
}
y++;
}
break;
}
}
free(row);
free(col);
}
// Fill the rectangle with the specified color (rgb) and blend rate (lv)
void gr_fill_alpha_color(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b, int lv) {
SDL_Surface *src = SDL_CreateRGBSurfaceWithFormat(0, dw, dh, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_FillRect(src, NULL, SDL_MapRGBA(src->format, r, g, b, lv));
SDL_SetSurfaceBlendMode(src, SDL_BLENDMODE_BLEND);
SDL_Rect dstrect = {dx, dy, dw, dh};
SDL_BlitSurface(src, NULL, dst->sdl_surface, &dstrect);
SDL_FreeSurface(src);
}
#include "graph2.c"
+23
View File
@@ -0,0 +1,23 @@
#ifndef __GRAPH_H__
#define __GRAPH_H__
#include "config.h"
#include "surface.h"
void gr_init();
void gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh);
void gr_copy_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv);
void gr_fill(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b);
void gr_copy_stretch(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh);
void gr_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv);
void gr_copy_stretch_blend_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh);
void gr_fill_alpha_color(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b, int lv);
void gr_fill_alpha_overborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
void gr_fill_alpha_underborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh, int cl);
void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
#endif /* __GRAPH_H__ */
+9 -38
View File
@@ -75,7 +75,7 @@ void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, in
}
void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy) {
surface_t *t = sf_create_surface(sw * 2, sh * 2, dst->depth);
surface_t *t = sf_create_surface(sw * 2, sh * 2);
gr_copy_stretch(t, 0, 0, sw * 2, sh * 2, src2, sx2, sy2, sw, sh);
gr_blend_alpha_wds(t, 0, 0, src1, sx1, sy1, sw * 2, sh * 2, dst, dx, dy);
@@ -93,45 +93,16 @@ void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int
sa = GETOFFSET_ALPHA(src1, sx1, sy1);
dp = GETOFFSET_PIXEL(dst, dx, dy);
switch(dst->depth) {
case 16:
{
uint16_t *yls1, *yls2, *yld;
uint8_t *yla;
for (y = 0; y < sh; y++) {
yls1 = (uint16_t *)(sp1 + y * src1->bytes_per_line);
yls2 = (uint16_t *)(sp2 + y * src2->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
yla = (uint8_t *)(sa + y * src1->width);
for (x = 0; x < sw; x++) {
*yld = SUTURADD16(*yls1, ALPHABLEND16(*yls1, *yls2, *yla));
//*yld = SUTURADD16(*yls1, ALPHALEVEL16(*yls2, *yla));
yls1++; yls2++; yld++; yla++;
}
}
}
break;
case 24:
case 32:
{
uint32_t *yls1, *yls2, *yld;
uint8_t *yla;
for (y = 0; y < sh; y++) {
uint32_t *yls1 = (uint32_t *)(sp1 + y * src1->sdl_surface->pitch);
uint32_t *yls2 = (uint32_t *)(sp2 + y * src2->sdl_surface->pitch);
uint32_t *yld = (uint32_t *)(dp + y * dst->sdl_surface->pitch);
uint8_t *yla = (uint8_t *)(sa + y * src1->width);
for (y = 0; y < sh; y++) {
yls1 = (uint32_t *)(sp1 + y * src1->bytes_per_line);
yls2 = (uint32_t *)(sp2 + y * src2->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
yla = (uint8_t *)(sa + y * src1->width);
for (x = 0; x < sw; x++) {
*yld = SUTURADD24(*yls1, ALPHABLEND24(*yls1, *yls2, *yla));
yls1++; yls2++; yld++; yla++;
}
for (x = 0; x < sw; x++) {
*yld = SUTURADD24(*yls1, ALPHABLEND24(*yls1, *yls2, *yla));
yls1++; yls2++; yld++; yla++;
}
break;
}
}
}
@@ -41,22 +41,22 @@
* @param sw:
* @param sh:
*/
int gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
void gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
uint8_t *sp, *dp;
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return NG;
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return;
sp = GETOFFSET_ALPHA(src, sx, sy);
dp = GETOFFSET_ALPHA(dst, dx, dy);
if (sp == NULL) {
WARNING("src alpha NULL");
return NG;
return;
}
if (dp == NULL) {
WARNING("dst alpha NULL");
return NG;
return;
}
if (src == dst) {
@@ -82,6 +82,4 @@ int gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, in
dp += dst->width;
}
}
return OK;
}
@@ -6,11 +6,11 @@
#include "ngraph.h"
#include "ags.h"
int gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv) {
void gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv) {
uint8_t *a;
if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) {
return NG;
return;
}
a = GETOFFSET_ALPHA(dst, dx, dy);
@@ -19,6 +19,4 @@ int gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv) {
memset(a, lv, dw);
a += dst->width;
}
return OK;
}
+33
View File
@@ -0,0 +1,33 @@
#ifndef __NGRAPH_H__
#define __NGRAPH_H__
#include "portab.h"
#include "nact.h"
#include "ags.h"
#include "surface.h"
#include "graph.h"
#define sf0 nact->ags.dib
struct SDL_Surface;
// DLL 用 graphic 関連関数
/* in graph.c */
bool gr_clip(surface_t *ss, int *sx, int *sy, int *sw, int *sh, surface_t *ds, int *dx, int *dy);
bool gr_clip_xywh(surface_t *ss, int *sx, int *sy, int *sw, int *sh);
/* in graph_fillrect_amap.c */
void gr_fill_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, int lv);
/* in graph_copy_amap.c */
void gr_copy_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh);
// /* in graph_bright_dst_only.c */
#define gr_bright_dst_only(dst,dx,dy,w,h,lv) gr_copy_bright(dst,dx,dy,dst,dx,dy,w,h,lv)
// void gr_bright_dst_only(surface_t *dst, int dx, int dy, int w, int h, int lv);
/* defined in cg.c */
surface_t *sf_loadcg_no(int no);
#endif /* __GRAPH_H__ */
+80
View File
@@ -0,0 +1,80 @@
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "surface.h"
#include "system.h"
static surface_t *create(int width, int height, bool has_pixel, bool has_alpha) {
surface_t *s = calloc(1, sizeof(surface_t));
s->width = width;
s->height = height;
if (has_pixel) {
s->sdl_surface = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGB888);
}
if (has_alpha) {
s->alpha = calloc(width * (height +1), sizeof(uint8_t));
}
return s;
}
// Create a surface with pixel and alpha data
surface_t *sf_create_surface(int width, int height) {
return create(width, height, true, true);
}
// Create a surface with alpha data only
surface_t *sf_create_alpha(int width, int height) {
return create(width, height, false, true);
}
// Create a surface with pixel data only
surface_t *sf_create_pixel(int width, int height) {
return create(width, height, true, false);
}
/**
* surfaceオブジェクトの開放
* @param s: 開放するオブジェクト
* @return: なし
*/
void sf_free(surface_t *s) {
if (s == NULL) return;
if (s->sdl_surface) SDL_FreeSurface(s->sdl_surface);
if (s->alpha) free(s->alpha);
free(s);
}
/**
* surface の複製を作成(dupulicate)
* @param in: 複製もと
* @return : 複製したsurface
*/
surface_t *sf_dup(surface_t *in) {
surface_t *sf;
int len;
if (in == NULL) return NULL;
sf = malloc(sizeof(surface_t));
memcpy(sf, in, sizeof(surface_t));
if (in->sdl_surface) {
sf->sdl_surface = SDL_ConvertSurface(in->sdl_surface, in->sdl_surface->format, 0);
}
if (in->alpha) {
len = sf->width * sf->height;
sf->alpha = malloc(sizeof(uint8_t) * (len + sf->width));
memcpy(sf->alpha, in->alpha, len);
}
return sf;
}
+13
View File
@@ -0,0 +1,13 @@
#ifndef __SURFACE_H__
#define __SURFACE_H__
#include "portab.h"
#include "ags.h"
extern surface_t *sf_create_surface(int width, int height);
extern surface_t *sf_create_alpha(int width, int height);
extern surface_t *sf_create_pixel(int width, int height);
extern void sf_free(surface_t *s);
extern surface_t *sf_dup(surface_t *in);
#endif /* __SURFACE_H__ */
+1 -1
View File
@@ -13,7 +13,7 @@
#include "msgskip.h"
#include "utfsjis.h"
static boolean valid;
static bool valid;
static int action;
static void Init() {
+3 -3
View File
@@ -51,7 +51,7 @@ static void NIGHTDLL_reset(void) {
}
static void InitGame() { /* 1 */
ags_setAntialiasedStringMode(TRUE);
ags_setAntialiasedStringMode(true);
sys_setHankakuMode(2);
nact->msgout = ntmsg_add;
@@ -400,7 +400,7 @@ static void CDStop(void) { /* 39 */
static void CDMute(void) { /* 40 */
int p1 = getCaliValue(); // 0: mute off, 1: mute on
nt_cd_mute(p1 == 0 ? FALSE : TRUE);
nt_cd_mute(p1 != 0);
TRACE_UNIMPLEMENTED("NIGHTDLL.CDMute %d:", p1);
}
@@ -440,7 +440,7 @@ static void SoundEffectSetSyncFlag(void) { /* 44 */
int p1 = getCaliValue(); // ch
int p2 = getCaliValue(); // 0: 終るまで待たない, 1: 待つ
nt_snd_waitend(p1, p2 == 0 ? FALSE : TRUE);
nt_snd_waitend(p1, p2 != 0);
TRACE_UNIMPLEMENTED("NIGHTDLL.SoundEffectSetSyncFlag %d,%d:", p1, p2);
}
+2 -3
View File
@@ -4,7 +4,6 @@
#include "config.h"
#include "portab.h"
#include "graphics.h"
#include "surface.h"
#include "ags.h"
#include "sprite.h"
@@ -45,7 +44,7 @@ struct _night {
MyRectangle updaterect;
int fonttype;
FontType fonttype;
int fontsize;
sprite_t *sp[SPRITEMAX];
@@ -55,7 +54,7 @@ struct _night {
// msg
char msgbuf[MSGBUFMAX];
boolean zhiding;
bool zhiding;
struct {
void (* cbmove)(agsevent_t *);
void (* cbrelease)(agsevent_t *);
+12 -19
View File
@@ -1,11 +1,10 @@
#include <stdio.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "cg.h"
#include "ags.h"
#include "surface.h"
#include "ngraph.h"
#include "night.h"
#include "sprite.h"
#include "nt_scenario.h"
@@ -54,8 +53,8 @@ void nt_gr_set_wallpaper(int no) {
sp = nt_sp_new(SPNO_WALL, no, 0, 0, SPRITE_WP);
nt_sp_add_updatelist(sp);
if (no == 0) {
sp->cursize.width = sf0->width;
sp->cursize.height = sf0->height;
sp->cursize.width = main_surface->w;
sp->cursize.height = main_surface->h;
sp->update = nt_sp_draw_wall;
}
@@ -178,28 +177,22 @@ void nt_gr_draw(int effectno) {
// 全消し
break;
case 1:
nt_sp_update_all(TRUE);
nt_sp_update_all(true);
break;
default:
if (night.waitskiplv > 1) {
nt_sp_update_all(TRUE);
nt_sp_update_all(true);
break;
}
//nt_sp_eupdate(effectno, effecttime, TRUE);
nt_sp_eupdate(effectno, 1000, TRUE);
//nt_sp_eupdate(effectno, effecttime, true);
nt_sp_eupdate(effectno, 1000, true);
}
}
void nt_gr_screencg(int no, int x, int y) {
surface_t *sf;
sf = sf_loadcg_no(no -1);
gre_BlendScreen(sf0, x, y, sf0, x, y, sf, 0, 0, sf->width, sf->height);
ags_updateArea(x, y, sf->width, sf->height);
sf_free(sf);
SDL_Surface *sf = cg_load_as_sdlsurface(no - 1);
SDL_SetSurfaceBlendMode(sf, SDL_BLENDMODE_ADD);
SDL_BlitSurface(sf, NULL, main_surface, &(SDL_Rect){x, y, sf->w, sf->h});
ags_updateArea(x, y, sf->w, sf->h);
SDL_FreeSurface(sf);
}
+69 -91
View File
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
@@ -11,7 +12,6 @@
#include "ags.h"
#include "nact.h"
#include "input.h"
#include "ngraph.h"
#include "drawtext.h"
#include "night.h"
#include "nt_msg.h"
@@ -25,23 +25,29 @@ extern int ntsel_dosel(void);
#define SNAME_RYO "亮    "
#define SNAME_RYO_DEF "亮"
// 通常メッセージ表示位置と大きさ
#define MSGFRAME_0_X 6
#define MSGFRAME_0_Y 347
#define MSGFRAME_0_WIDTH 628
#define MSGFRAME_0_HEIGHT 125
// Normal message window
static const SDL_Rect msgframe_0 = {
.x = 6,
.y = 347,
.w = 628,
.h = 125
};
// 画面全体メッセージ表示位置と大きさ
#define MSGFRAME_1_X 0
#define MSGFRAME_1_Y 0
#define MSGFRAME_1_WIDTH 640
#define MSGFRAME_1_HEIGHT 480
// Full screen message window
static const SDL_Rect msgframe_1 = {
.x = 0,
.y = 0,
.w = 640,
.h = 480
};
// 通常メッセージ(顔つき)表示位置と大きさ
#define MSGFRAME_2_X (6+160)
#define MSGFRAME_2_Y 347
#define MSGFRAME_2_WIDTH (628-160)
#define MSGFRAME_2_HEIGHT 125
// Normal message (with face) window
static const SDL_Rect msgframe_2 = {
.x = 6 + 160,
.y = 347,
.w = 628 - 160,
.h = 125
};
// キー入力アニメーション位置
#define HAKANIM_LOC_X 620
@@ -69,7 +75,7 @@ void ntmsg_init() {
sprite_t *sp;
// メッセージスプライト
sp = night.sp[SPNO_MSGFRAME_FG] = nt_sp_msg_new(SPNO_MSGFRAME_FG, 0, 0, sf0->width, sf0->height);
sp = night.sp[SPNO_MSGFRAME_FG] = nt_sp_msg_new(SPNO_MSGFRAME_FG, 0, 0, main_surface->w, main_surface->h);
nt_sp_add_updatelist(sp);
// メッセージ背景用CG
@@ -78,7 +84,7 @@ void ntmsg_init() {
// 文字背景CG作成
nt_scg_create(CGNO_MSGFR_BG,
sf0->width, sf0->height,
main_surface->w, main_surface->h,
0, 0, 0, 255);
// night.cg[CGNO_MSGFR_BG]->refcnt++;
@@ -95,7 +101,7 @@ void ntmsg_init() {
sp->u.anime.interval = HAKANIM_INTERVAL;
nt_sp_add_updatelist(sp);
nt_sp_set_loc(sp, HAKANIM_LOC_X, HAKANIM_LOC_Y);
nt_sp_set_show(sp, FALSE);
nt_sp_set_show(sp, false);
sp->update = nt_sp_draw_scg;
@@ -121,45 +127,34 @@ void ntmsg_init() {
// type=1 枠あり
// type=2 中央
void ntmsg_set_frame(int type) {
surface_t *sf;
night.msgframe = type;
sf = night.sp[SPNO_MSGBG]->curcg->sf;
memset(sf->pixel, 0, sf->bytes_per_line * sf->height);
memset(sf->alpha, 0, sf->width * sf->height);
SDL_Surface *sf = night.sp[SPNO_MSGBG]->curcg->sf;
SDL_FillRect(sf, NULL, 0);
switch(type) {
case 0:
nt_sp_set_show(night.sp[SPNO_MSGBG], FALSE);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], FALSE);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], FALSE);
nt_sp_set_show(night.sp[SPNO_MSGBG], false);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], false);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], false);
break;
case 1:
nt_sp_set_show(night.sp[SPNO_MSGBG], TRUE);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], TRUE);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], TRUE);
nt_sp_set_show(night.sp[SPNO_MSGBG], true);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], true);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], true);
gr_fill(sf, MSGFRAME_0_X, MSGFRAME_0_Y,
MSGFRAME_0_WIDTH, MSGFRAME_0_HEIGHT,
16, 32, 64);
gr_fill_alpha_map(sf, MSGFRAME_0_X, MSGFRAME_0_Y,
MSGFRAME_0_WIDTH, MSGFRAME_0_HEIGHT, 192);
SDL_FillRect(sf, &msgframe_0, SDL_MapRGBA(sf->format, 16, 32, 64, 192));
ntmsg_clear(SPNO_MSGFRAME_FG);
nt_sp_update_all(TRUE);
nt_sp_update_all(true);
break;
case 2:
nt_sp_set_show(night.sp[SPNO_MSGBG], TRUE);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], FALSE);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], TRUE);
nt_sp_set_show(night.sp[SPNO_MSGBG], true);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_BG], false);
nt_sp_set_show(night.sp[SPNO_MSGFRAME_FG], true);
gr_fill(sf, MSGFRAME_1_X, MSGFRAME_1_Y,
MSGFRAME_1_WIDTH, MSGFRAME_1_HEIGHT,
32, 32, 32);
gr_fill_alpha_map(sf, MSGFRAME_1_X, MSGFRAME_1_Y,
MSGFRAME_1_WIDTH, MSGFRAME_1_HEIGHT, 128);
SDL_FillRect(sf, &msgframe_1, SDL_MapRGBA(sf->format, 32, 32, 32, 128));
ntmsg_clear(SPNO_MSGFRAME_FG);
nt_sp_update_all(TRUE);
nt_sp_update_all(true);
break;
}
@@ -221,7 +216,7 @@ int ntmsg_ana(void) {
static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wFont, int wSpeed, int wLineSpace) {
char *msg;
sprite_t *sp;
boolean needupdate = FALSE;
bool needupdate = false;
MyRectangle uparea = {0,0,0,0};
int savex;
@@ -260,7 +255,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
mbuf,
wColorR, wColorG, wColorB);
needupdate = TRUE;
needupdate = true;
if (wSpeed > 0) {
nt_sp_updateme_part(sp,
@@ -269,7 +264,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
cw,
wSize);
nt_sp_update_clipped();
needupdate = FALSE;
needupdate = false;
// keywait
delta = sdl_getTicks() - wcnt;
@@ -337,8 +332,8 @@ static void set_align(char *msg, sprite_t *sp, int wSize) {
switch(night.msgplace) {
case 0:
sp->u.msg.dspcur.x = MSGFRAME_0_X;
sp->u.msg.dspcur.y = MSGFRAME_0_Y + 8;
sp->u.msg.dspcur.x = msgframe_0.x;
sp->u.msg.dspcur.y = msgframe_0.y + 8;
break;
case 1:
@@ -364,8 +359,8 @@ static void set_align(char *msg, sprite_t *sp, int wSize) {
sp->u.msg.dspcur.y = (sp->cursize.height - (line * (wSize+2))) /2;
break;
case 2:
sp->u.msg.dspcur.x = MSGFRAME_2_X;
sp->u.msg.dspcur.y = MSGFRAME_2_Y + 8;
sp->u.msg.dspcur.x = msgframe_2.x;
sp->u.msg.dspcur.y = msgframe_2.y + 8;
break;
}
@@ -424,7 +419,7 @@ static void setup_hakanim() {
// メッセージ表示時のキー入力を促すアニメーション
static void hakanim(int i) {
sprite_t *sp;
boolean show;
bool show;
sp = night.sp[SPNO_MSG_KEYANIM];
if (sp == NULL) return;
@@ -434,60 +429,43 @@ static void hakanim(int i) {
} else {
sp->curcg = sp->cg2;
}
sp->show = TRUE;
sp->show = true;
nt_sp_updateme(sp);
nt_sp_update_clipped();
sp->show = show;
}
int ntmsg_update(sprite_t *sp, MyRectangle *r) {
int sx, sy, w, h, dx, dy;
surface_t update;
// canvas が clean のときはなにもしない
// -> 説明スプライトのように、SetShowされたときに対応できないからだめ
//if (sact.msgbufempty) return OK;
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)) {
return NG;
void ntmsg_update(sprite_t *sp, MyRectangle *r) {
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}, main_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);
return OK;
}
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);
}
+7 -7
View File
@@ -1,12 +1,12 @@
#ifndef __NT_MSG_H__
#define __NT_MSG_H__
extern void ntmsg_init();
extern void ntmsg_set_frame(int type);
extern void ntmsg_set_place(int type);
extern void ntmsg_newline();
extern void ntmsg_add(const char *msg);
extern int ntmsg_ana(void);
extern int ntmsg_update(sprite_t *sp, MyRectangle *r);
void ntmsg_init();
void ntmsg_set_frame(int type);
void ntmsg_set_place(int type);
void ntmsg_newline();
void ntmsg_add(const char *msg);
int ntmsg_ana(void);
void ntmsg_update(sprite_t *sp, MyRectangle *r);
#endif /* __NT_MSG_H__ */
+4 -4
View File
@@ -107,9 +107,9 @@ void nt_sco_callevent(int ev) {
}
boolean nt_sco_is_natsu() {
if (night.Month < 6 || night.Month > 9) return FALSE;
if (night.Month == 6 && night.Day < 11) return FALSE;
return TRUE;
bool nt_sco_is_natsu() {
if (night.Month < 6 || night.Month > 9) return false;
if (night.Month == 6 && night.Day < 11) return false;
return true;
}
+1 -1
View File
@@ -3,7 +3,7 @@
extern void nt_sco_init();
extern int nt_sco_main(int mode);
extern boolean nt_sco_is_natsu();
extern bool nt_sco_is_natsu();
extern void nt_sco_callevent(int ev);
#endif /* __NT_SCENARIO_H__ */
+8 -8
View File
@@ -10,7 +10,7 @@ struct _ntsnd {
int no;
int vol;
int loop;
boolean waitend;
bool waitend;
};
static struct _ntsnd ntsnd[10];
@@ -27,14 +27,14 @@ void nt_cd_play(int no) {
}
void nt_cd_stop(int msec) {
mus_mixer_fadeout_start(MIX_CD, msec, 0, TRUE);
mus_mixer_fadeout_start(MIX_CD, msec, 0, true);
}
void nt_cd_mute(boolean mute) {
void nt_cd_mute(bool mute) {
if (mute) {
mus_mixer_fadeout_start(MIX_CD, 0, 0, FALSE);
mus_mixer_fadeout_start(MIX_CD, 0, 0, false);
} else {
mus_mixer_fadeout_start(MIX_CD, 0, 100, FALSE);
mus_mixer_fadeout_start(MIX_CD, 0, 100, false);
}
}
@@ -56,7 +56,7 @@ void nt_snd_setvol(int ch, int vol) {
ntsnd[ch -1].vol = vol;
}
void nt_snd_waitend(int ch, boolean waitend) {
void nt_snd_waitend(int ch, bool waitend) {
if (ch < 1) return;
ntsnd[ch -1].waitend = waitend;
@@ -74,13 +74,13 @@ void nt_snd_play(int ch) {
void nt_snd_stop(int ch, int msec) {
if (ch < 1) return;
mus_wav_fadeout_start(ch, msec, 0, TRUE);
mus_wav_fadeout_start(ch, msec, 0, true);
}
void nt_snd_stopall(int msec) {
int i;
for (i = 1; i <= 10; i++) {
mus_wav_fadeout_start(i, msec, 0, TRUE);
mus_wav_fadeout_start(i, msec, 0, true);
}
}
+2 -2
View File
@@ -6,11 +6,11 @@
extern void nt_voice_set(int no);
extern void nt_cd_play(int no);
extern void nt_cd_stop(int msec);
extern void nt_cd_mute(boolean mute);
extern void nt_cd_mute(bool mute);
extern void nt_snd_setwave(int ch, int no);
extern void nt_snd_setloop(int ch, int num);
extern void nt_snd_setvol(int ch, int vol);
extern void nt_snd_waitend(int ch, boolean waitend);
extern void nt_snd_waitend(int ch, bool waitend);
extern void nt_snd_play(int ch);
extern void nt_snd_stop(int ch, int msec);
extern void nt_snd_stopall(int msec);
+21 -220
View File
@@ -26,29 +26,25 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "nact.h"
#include "system.h"
#include "ags.h"
#include "surface.h"
#include "ngraph.h"
#include "cg.h"
#include "sactcg.h"
#define CGMAX 65536
static cginfo_t *cgs[CGMAX];
#include "sactcg_stretch.c"
#include "sactcg_blend.c"
#define spcg_assert_no(no) \
#define SPCG_ASSERT_NO(no) \
if ((no) > (CGMAX -1)) { \
WARNING("no is too large (should be %d < %d)", (no), CGMAX); \
return NG; \
return; \
} \
static cginfo_t *nt_scg_new(enum cgtype type, int no, surface_t *sf) {
static cginfo_t *nt_scg_new(enum cgtype type, int no, SDL_Surface *sf) {
cginfo_t *info = calloc(1, sizeof(cginfo_t));
info->type = type;
info->no = no;
@@ -78,7 +74,7 @@ static cginfo_t *nt_scg_get(int no) {
if (cgs[no] != NULL)
return cgs[no];
surface_t *sf = sf_loadcg_no(no - 1);
SDL_Surface *sf = cg_load_as_sdlsurface(no - 1);
if (!sf) {
WARNING("load fail (%d)", no -1);
return NULL;
@@ -98,248 +94,53 @@ void nt_scg_deref(cginfo_t *cg) {
return;
if (cg->sf)
sf_free(cg->sf);
SDL_FreeSurface(cg->sf);
free(cg);
}
// 指定の大きさ、色の矩形の CG を作成
int nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
spcg_assert_no(wNumCG);
void nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
SPCG_ASSERT_NO(wNumCG);
surface_t *sf = sf_create_surface(wWidth, wHeight, sf0->depth);
gr_fill(sf, 0, 0, wWidth, wHeight, wR, wG, wB);
gr_fill_alpha_map(sf, 0, 0, wWidth, wHeight, wBlendRate);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_FillRect(sf, NULL, SDL_MapRGBA(sf->format, wR, wG, wB, wBlendRate));
nt_scg_new(CG_SET, wNumCG, sf);
return OK;
}
// 指定のCGを反転させたCGを作成
int nt_scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY) {
spcg_assert_no(wNumCG);
spcg_assert_no(wNumSrcCG);
cginfo_t *src = nt_scg_get(wNumSrcCG);
if (!src)
return NG;
surface_t *sf = stretch(src->sf, src->sf->width, src->sf->height, (wReverseX << 1) | wReverseY);
nt_scg_new(CG_REVERSE, wNumCG, sf);
return OK;
}
// 指定のCGを拡大/縮小したCGを作成
int nt_scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG) {
spcg_assert_no(wNumCG);
spcg_assert_no(wNumSrcCG);
cginfo_t *src = nt_scg_get(wNumSrcCG);
if (!src)
return NG;
surface_t *sf = stretch(src->sf, wWidth, wHeight, 0);
nt_scg_new(CG_STRETCH, wNumCG, sf);
return OK;
}
// ベースCGの上にブレンドCGを重ねた CG を作成
int nt_scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumBaseCG);
spcg_assert_no(wNumBlendCG);
cginfo_t *basecg = nt_scg_get(wNumBaseCG);
cginfo_t *blendcg = nt_scg_get(wNumBlendCG);
if (!basecg || !blendcg) return NG;
surface_t *sf = blend(basecg->sf, wX, wY, blendcg->sf, wAlphaMapMode);
nt_scg_new(CG_SET, wNumDstCG, sf);
return OK;
}
// 指定の文字列のCGを作成
int nt_scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, char *cText) {
spcg_assert_no(wNumCG);
// 勝手に出ていいのかな?
if (strlen(cText) == 0) return OK;
ags_setFont(FONT_GOTHIC, wSize);
agsurface_t *glyph = ags_drawStringToSurface(cText);
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
nt_scg_new(CG_SET, wNumCG, sf);
return OK;
}
// 数字文字列のCGを作成
int nt_scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue) {
spcg_assert_no(wNumCG);
char s[256], ss[256];
if (wZeroPadding) {
char *sss = "%%0%dd";
sprintf(ss, sss, wFigs);
} else {
char *sss = "%%%dd";
sprintf(ss, sss, wFigs);
}
sprintf(s, ss, wValue);
ags_setFont(FONT_GOTHIC, wSize);
agsurface_t *glyph = ags_drawStringToSurface(s);
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
nt_scg_new(CG_SET, wNumCG, sf);
return OK;
}
// CGを複製
int nt_scg_copy(int wNumDstCG, int wNumSrcCG) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumSrcCG);
cginfo_t *src = nt_scg_get(wNumSrcCG);
if (!src)
return NG;
nt_scg_new(CG_SET, wNumDstCG, sf_dup(src->sf));
return OK;
}
// CGの一部を切りぬいたCGを作成
int nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumSrcCG);
void nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
SPCG_ASSERT_NO(wNumDstCG);
SPCG_ASSERT_NO(wNumSrcCG);
cginfo_t *src = nt_scg_get(wNumSrcCG);
if (!src)
return NG;
return;
surface_t *sf = src->sf->alpha
? sf_create_surface(wWidth, wHeight, src->sf->depth)
: sf_create_pixel(wWidth, wHeight, src->sf->depth);
if (src->sf->pixel)
gr_copy(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
if (src->sf->alpha)
gr_copy_alpha_map(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, src->sf->format->BitsPerPixel, src->sf->format->format);
SDL_BlitSurface(src->sf, &(SDL_Rect){wX, wY, wWidth, wHeight}, sf, NULL);
nt_scg_new(CG_SET, wNumDstCG, sf);
return OK;
}
// 元のCGの一部を切りぬいたCGを作成
int nt_scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumSrcCG);
cginfo_t *src = nt_scg_get(wNumSrcCG);
if (!src)
return NG;
surface_t *sf;
if (src->sf->alpha) {
sf = sf_create_surface(src->sf->width, src->sf->height, src->sf->depth);
gr_fill_alpha_map(sf, 0, 0, src->sf->width, src->sf->height, 255);
} else {
sf = sf_create_pixel(src->sf->width, src->sf->height, src->sf->depth);
}
if (src->sf->pixel)
gr_copy(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
if (src->sf->alpha)
gr_copy_alpha_map(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
nt_scg_new(CG_SET, wNumDstCG, sf);
return OK;
}
// 全てのCGの開放
int nt_scg_freeall() {
void nt_scg_freeall(void) {
int i;
for (i = 1; i < CGMAX; i++) {
nt_scg_free(i);
}
return OK;
}
/**
* 指定の番号の CG をオブジェクトリストから消し、オブジェクトがどこからも参照
* されていない(参照数が0の)場合のみ、オブジェクトを削除
*/
int nt_scg_free(int no) {
spcg_assert_no(no);
void nt_scg_free(int no) {
SPCG_ASSERT_NO(no);
cginfo_t *cg = cgs[no];
if (!cg) return NG;
if (!cg) return;
nt_scg_deref(cg);
cgs[no] = NULL;
return OK;
}
// CGの種類を取得
int nt_scg_querytype(int wNumCG, int *ret) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (cgs[wNumCG] == NULL) goto errexit;
*ret = cgs[wNumCG]->type;
return OK;
errexit:
*ret = CG_NOTUSED;
return NG;
}
// CGの大きさを取得
int nt_scg_querysize(int wNumCG, int *w, int *h) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (cgs[wNumCG] == NULL) goto errexit;
if (cgs[wNumCG]->sf == NULL) goto errexit;
*w = cgs[wNumCG]->sf->width;
*h = cgs[wNumCG]->sf->height;
return OK;
errexit:
*w = *h = 0;
return NG;
}
// CGのBPPを取得
int nt_scg_querybpp(int wNumCG, int *ret) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (cgs[wNumCG] == NULL) goto errexit;
if (cgs[wNumCG]->sf == NULL) goto errexit;
*ret = cgs[wNumCG]->sf->depth;
return OK;
errexit:
*ret = 0;
return NG;
}
// CGの alphamap が存在するかを取得
int nt_scg_existalphamap(int wNumCG, int *ret) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (cgs[wNumCG] == NULL) goto errexit;
if (cgs[wNumCG]->sf == NULL) goto errexit;
*ret = cgs[wNumCG]->sf->alpha ? 1 : 0;
errexit:
*ret = 0;
return NG;
}
+6 -18
View File
@@ -27,23 +27,11 @@
#include "portab.h"
#include "night.h"
extern cginfo_t *nt_scg_addref(int no);
extern void nt_scg_deref(cginfo_t *cg);
extern int nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
extern int nt_scg_create_reverse(int NumCG, int wNumSrcCG, int wReverseX, int wReverseY);
extern int nt_scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG);
extern int nt_scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode);
extern int nt_scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, char *cText);
extern int nt_scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue);
extern int nt_scg_copy(int wNumDstCG, int wNumSrcCG);
extern int nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
extern int nt_scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
extern int nt_scg_freeall();
extern int nt_scg_free(int cg);
extern int nt_scg_querytype(int wNumCG, int *ret);
extern int nt_scg_querysize(int wNumCG, int *w, int *h);
extern int nt_scg_querybpp(int wNumCG, int *ret);
extern int nt_scg_existalphamap(int wNumCG, int *ret);
extern int nt_scg_linkcgfree(int no);
cginfo_t *nt_scg_addref(int no);
void nt_scg_deref(cginfo_t *cg);
void nt_scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
void nt_scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
void nt_scg_freeall(void);
void nt_scg_free(int cg);
#endif
-31
View File
@@ -1,31 +0,0 @@
//
static surface_t *blend(surface_t *base, int x, int y, surface_t *blend, int mode) {
surface_t *dst = sf_create_surface(base->width, base->height, base->depth);
gr_copy(dst, 0, 0, base, 0, 0, base->width, base->height);
if (base->alpha) {
// ベースに alpha map がある場合はそれをコピー
gr_copy_alpha_map(dst, 0, 0, base, 0, 0, base->width, base->height);
} else {
// 無い場合は全て 255 の map を作成
gr_fill_alpha_map(dst, 0, 0, base->width, base->height, 255);
}
if (blend->alpha) {
// 重ね合わせ先の alpha map があるときはそれを使う
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, blend, 0, 0, 255);
} else {
// 無いときは dst の alpha map を使う
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, dst, x, y, 255);
}
// alpha 作成モードが dst + blend の時は飽和加算
if (mode == 1) {
gr_saturadd_alpha_map(dst, x, y, blend, 0, 0, blend->width, blend->height);
}
return dst;
}
-114
View File
@@ -1,114 +0,0 @@
// 拡大縮小
static surface_t *stretch(surface_t *src, int dw, int dh, int mirror) {
surface_t *dst = calloc(1, sizeof(surface_t));
float a1, a2, xd, yd;
int sw, sh;
int *row, *col;
int x, y;
uint8_t *sdata, *ddata;
dst->width = dw;
dst->height = dh;
dst->depth = src->depth;
dst->bytes_per_line = dw * src->bytes_per_pixel;
dst->bytes_per_pixel = src->bytes_per_pixel;
if (src->pixel) {
dst->pixel = malloc(dh * dst->bytes_per_line);
}
if (src->alpha) {
dst->alpha = malloc(dw * dh);
}
sdata = GETOFFSET_PIXEL(src, 0, 0);
ddata = GETOFFSET_PIXEL(dst, 0, 0);
sw = src->width;
sh = src->height;
a1 = (float)sw / (float)dw;
a2 = (float)sh / (float)dh;
row = malloc(sizeof(int) * dw);
// 1おおきくして初期化しないと col[dw-1]とcol[dw]が同じになる
// 可能性がある。
col = calloc(dh +1, sizeof(int));
if (mirror & 1) {
/* 上下反転 added by tajiri@wizard */
for (yd = sh - a2, y = 0; y < dh; y++) {
col[y] = yd; yd -= a2;
}
} else {
for (yd = 0.0, y = 0; y < dh; y++) {
col[y] = yd; yd += a2;
}
}
if (mirror & 2) {
/* 左右反転 added by tajiri@wizard */
for (xd = sw - a1, x = 0; x < dw; x++) {
row[x] = xd; xd -= a1;
}
} else {
for (xd = 0.0, x = 0; x < dw; x++) {
row[x] = xd; xd += a1;
}
}
#define SCALEDCOPYAREA(type) { \
int x, y; \
type *sl, *dl; \
uint8_t *_sl, *_dl; \
for (y = 0; y < dh; y++) { \
sl = (type *)(sdata + *(y + col) * src->bytes_per_line);\
dl = (type *)(ddata + y * dst->bytes_per_line);\
for (x = 0; x < dw; x++) { \
*(dl + x) = *(sl + *(row + x)); \
} \
_dl = (uint8_t *)dl; \
while (y < dh - 1 && *(col + y) == *(col + y + 1)) { \
_sl = _dl; \
_dl += dst->bytes_per_line; \
memcpy(_dl, _sl, dw * sizeof(type)); \
y++; \
} \
}}
switch(dst->depth) {
case 8:
SCALEDCOPYAREA(uint8_t); break;
case 16:
SCALEDCOPYAREA(uint16_t); break;
case 24:
case 32:
SCALEDCOPYAREA(uint32_t); break;
default:
break;
}
if (src->alpha) {
int x, y;
uint8_t *sl, *dl;
uint8_t *_sl, *_dl;
sdata = GETOFFSET_ALPHA(src, 0, 0);
ddata = GETOFFSET_ALPHA(dst, 0, 0);
for (y = 0; y < dh; y++) {
sl = (uint8_t *)(sdata + *(y + col) * src->width);
dl = (uint8_t *)(ddata + y * dst->width);
for (x = 0; x < dw; x++) {
*(dl + x) = *(sl + *(row + x));
}
_dl = (uint8_t *)dl;
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
_sl = _dl;
_dl += dst->width;
memcpy(_dl, _sl, dw);
y++;
}
}
}
free(row);
free(col);
return dst;
}
+5 -56
View File
@@ -51,14 +51,13 @@ static char *replacedst;
/**
* 文字列変数スタックの初期化
*/
int nt_sstr_init() {
void nt_sstr_init(void) {
stack = malloc(sizeof(char *) * DEFSTACKSIZE);
idx = 0;
idxmax = DEFSTACKSIZE;
return OK;
}
int nt_sstr_reset(void) {
void nt_sstr_reset(void) {
for (int i = 0; i < idx; i++)
free(stack[i]);
idx = 0;
@@ -73,35 +72,6 @@ int nt_sstr_reset(void) {
}
slist_free(strreplace);
strreplace = NULL;
return OK;
}
/**
* 文字列変数スタックに文字列を積む
* @param strno: シナリオ上での文字列変数番号
*/
int nt_sstr_push(char *str) {
if (idx >= idxmax) {
stack = realloc(stack, sizeof(char *) * idx*2);
idxmax = idx*2;
}
stack[idx++] = strdup(str);
return OK;
}
/**
* 文字列変数スタックから文字列を取り出す
* @param strno: スタックから戻した文字列を格納する文字列変数番号
*/
int nt_sstr_pop(char *str, int maxlen) {
if (idx == 0) return NG;
strncpy(str, stack[--idx], maxlen);
free(stack[idx]);
return OK;
}
/**
@@ -109,36 +79,15 @@ int nt_sstr_pop(char *str, int maxlen) {
* @param sstrno: 変換元文字列変数番号
* @param dstrno: 変換先文字列変数番号
*/
int nt_sstr_regist_replace(char *sstr, char *dstr) {
void nt_sstr_regist_replace(char *sstr, char *dstr) {
strexchange_t *ex;
if (sstr == dstr) return NG;
if (sstr == dstr) return;
ex = malloc(sizeof(strexchange_t));
ex->src = sstr;
ex->dst = dstr;
strreplace = slist_append(strreplace, ex);
return OK;
}
/**
* 数値 -> 文字列化
*/
int nt_sstr_num2str(int strno, int fig, int nzeropad, int num) {
char s[256], ss[256];
if (nzeropad) {
char *sss = "%%0%dd";
sprintf(ss, sss, fig);
} else {
char *sss = "%%%dd";
sprintf(ss, sss, fig);
}
sprintf(s, ss, num);
svar_set(strno, s);
return OK;
}
// 文字列の置き換え処理
@@ -151,7 +100,7 @@ static void replacestr_cb(void* data, void* userdata) {
start = replacesrc;
out = replacedst;
while (TRUE) {
while (true) {
next = strstr(start, ex->src);
if (next == NULL) break;
strncat(out, start, (size_t)(next - start));
+4 -7
View File
@@ -24,13 +24,10 @@
#ifndef __SACTSTRING_H__
#define __SACTSTRING_H__
extern int nt_sstr_init();
extern int nt_sstr_reset(void);
extern int nt_sstr_push(char *str);
extern int nt_sstr_pop(char *str, int maxlen);
extern int nt_sstr_regist_replace(char *sstr, char *dstr);
extern int nt_sstr_num2str(int strno, int fig, int nzeropad, int num);
extern char *nt_sstr_replacestr(char *msg);
void nt_sstr_init(void);
void nt_sstr_reset(void);
void nt_sstr_regist_replace(char *sstr, char *dstr);
char *nt_sstr_replacestr(char *msg);
#endif /* __SACTSTRING_H__ */
+11 -12
View File
@@ -1,12 +1,11 @@
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "portab.h"
#include "sprite.h"
#include "sactcg.h"
#include "surface.h"
#include "ngraph.h"
#include "nt_msg.h"
sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
@@ -22,7 +21,7 @@ sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
sp->cg3 = cg3 ? nt_scg_addref(cg3) : NULL;
sp->curcg = sp->cg1;
sp->show = TRUE;
sp->show = true;
sp->blendrate = 255;
sp->loc.x = 0;
sp->loc.y = 0;
@@ -32,8 +31,8 @@ sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
sp->cursize.width = 0;
sp->cursize.height = 0;
} else {
sp->cursize.width = sp->curcg->sf->width;
sp->cursize.height = sp->curcg->sf->height;
sp->cursize.width = sp->curcg->sf->w;
sp->cursize.height = sp->curcg->sf->h;
}
sp->update = DEFAULT_UPDATE;
@@ -54,7 +53,7 @@ sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height) {
sp->no = no;
sp->type = SPRITE_MSG;
sp->show = TRUE;
sp->show = true;
sp->blendrate = 255;
sp->loc.x = x;
sp->loc.y = y;
@@ -63,7 +62,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;
@@ -77,14 +76,14 @@ 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);
}
void nt_sp_set_show(sprite_t *sp, boolean show) {
boolean oldshow;
void nt_sp_set_show(sprite_t *sp, bool show) {
bool oldshow;
if (sp == NULL) return;
@@ -111,8 +110,8 @@ void nt_sp_set_cg(sprite_t *sp, int no) {
sp->cursize.width = 0;
sp->cursize.height = 0;
} else {
sp->cursize.width = cg->sf->width;
sp->cursize.height = cg->sf->height;
sp->cursize.width = cg->sf->w;
sp->cursize.height = cg->sf->h;
}
sp->curcg = cg;
+21 -24
View File
@@ -3,7 +3,6 @@
#define __SPRITE_H__
#include "portab.h"
#include "surface.h"
#include "graphics.h"
#define DEFAULT_UPDATE nt_sp_draw
@@ -54,7 +53,7 @@ enum cgtype {
struct _cginfo {
enum cgtype type; // CGの種類, 0: 未使用, 1:リンクされている, ...
int no; // CGの番号
surface_t *sf; // CG本体
struct SDL_Surface *sf;
int refcnt; // 参照カウンタ。0になったら開放してもよい。
};
typedef struct _cginfo cginfo_t;
@@ -78,7 +77,7 @@ struct _sprite {
cginfo_t *curcg;
cginfo_t *cg1, *cg2, *cg3;
boolean show;
bool show;
int blendrate;
@@ -86,7 +85,7 @@ struct _sprite {
MyPoint cur;
int (* update)(struct _sprite *sp, MyRectangle *updatearea);
void (* update)(struct _sprite *sp, MyRectangle *updatearea);
union {
struct {
@@ -97,7 +96,7 @@ struct _sprite {
} anime;
struct {
surface_t *canvas;
struct SDL_Surface *canvas;
MyPoint dspcur;
} msg;
} u;
@@ -107,31 +106,29 @@ typedef struct _sprite sprite_t;
/* in nt_sprite.c */
extern sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type);
extern sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height);
extern void nt_sp_free(sprite_t *sp);
extern void nt_sp_set_show(sprite_t *sp, boolean show);
// extern void nt_sp_set_cg(sprite_t *sp, int no);
extern void nt_sp_set_loc(sprite_t *sp, int x, int y);
sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type);
sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height);
void nt_sp_free(sprite_t *sp);
void nt_sp_set_show(sprite_t *sp, bool show);
// void nt_sp_set_cg(sprite_t *sp, int no);
void nt_sp_set_loc(sprite_t *sp, int x, int y);
/* in nt_sprite_update.c */
extern int nt_sp_update_clipped();
extern int nt_sp_update_all(boolean syncscreen);
extern int nt_sp_updateme(sprite_t *sp);
extern int nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
extern void nt_sp_add_updatelist(sprite_t *sp);
extern void nt_sp_remove_updatelist(sprite_t *sp);
extern int nt_sp_draw_wall(sprite_t *sp, MyRectangle *r);
extern void nt_sp_clear_updatelist(void);
void nt_sp_update_clipped();
void nt_sp_update_all(bool syncscreen);
void nt_sp_updateme(sprite_t *sp);
void nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
void nt_sp_add_updatelist(sprite_t *sp);
void nt_sp_remove_updatelist(sprite_t *sp);
void nt_sp_draw_wall(sprite_t *sp, MyRectangle *r);
void nt_sp_clear_updatelist(void);
/* in nt_sprite_draw.c */
extern int nt_sp_draw(sprite_t *sp, MyRectangle *r);
extern int nt_sp_draw2(sprite_t *sp, cginfo_t *cg, MyRectangle *r);
extern void nt_sp_draw_dmap(void* data, void* userdata);
extern int nt_sp_draw_scg(sprite_t *sp, MyRectangle *r);
void nt_sp_draw(sprite_t *sp, MyRectangle *r);
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r);
/* in nt_sprite_eupdate.c */
extern int nt_sp_eupdate(int type, int time, int cancel);
void nt_sp_eupdate(int type, int time, int cancel);
#endif /* __SPRITE_H__ */
+37 -84
View File
@@ -24,13 +24,12 @@
#include "config.h"
#include <stdio.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "ags.h"
#include "graphics.h"
#include "surface.h"
#include "ngraph.h"
#include "sprite.h"
/*
@@ -38,106 +37,60 @@
@param sp: 描画するスプライト
@param r : 再描画する領域
*/
int nt_sp_draw(sprite_t *sp, MyRectangle *r) {
if (sp == NULL) return NG;
return nt_sp_draw2(sp, sp->curcg, r);
}
/*
指定の spriteの指定のCGを surface0 に書く
(このインターフェイスはもう不要?)
@param sp: 描画するスプライト
@param cg: 描画するCG
@param r : 再描画する領域
*/
int nt_sp_draw2(sprite_t *sp, cginfo_t *cg, MyRectangle *r) {
surface_t update;
int sx, sy, w, h, dx, dy;
if (cg == NULL) return NG;
if (cg->sf == NULL) return NG;
void nt_sp_draw(sprite_t *sp, MyRectangle *r) {
if (sp == NULL) return;
cginfo_t *cg = sp->curcg;
if (cg == NULL) return;
if (cg->sf == NULL) return;
// 更新領域の確定
update.width = r->w;
update.height = r->h;
sx = 0;
sy = 0;
dx = sp->cur.x - r->x;
dy = sp->cur.y - r->y;
w = cg->sf->width;
h = cg->sf->height;
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = cg->sf->w;
int h = cg->sf->h;
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
return NG;
if (!ags_clipCopyRect(&cg_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
dx += r->x;
dy += r->y;
if (cg->sf->alpha) {
// alpha map がある場合
gre_BlendUseAMap(sf0, dx, dy,
sf0, dx, dy,
cg->sf, sx, sy, w, h,
cg->sf, sx, sy,
sp->blendrate);
if (SDL_ISPIXELFORMAT_ALPHA(cg->sf->format->format) || sp->blendrate < 255) {
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(cg->sf, sp->blendrate);
} else {
if (sp->blendrate == 255) {
// alpha値指定が無い場合
gr_copy(sf0, dx, dy, cg->sf, sx, sy, w, h);
} else if (sp->blendrate > 0) {
// alpha値指定がある場合
gre_Blend(sf0, dx, dy,
sf0, dx, dy,
cg->sf, sx, sy, w, h,
sp->blendrate);
}
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_NONE);
}
SDL_BlitSurface(cg->sf, &(SDL_Rect){sx, sy, w, h}, main_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);
return OK;
}
// BlendScreenによる描画
int nt_sp_draw_scg(sprite_t *sp, MyRectangle *r) {
surface_t update;
cginfo_t *cg;
int sx, sy, w, h, dx, dy;
if (sp == NULL) return NG;
cg = sp->curcg;
if (cg == NULL) return NG;
if (cg->sf == NULL) return NG;
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r) {
if (sp == NULL) return;
cginfo_t *cg = sp->curcg;
if (cg == NULL) return;
if (cg->sf == NULL) return;
// 更新領域の確定
update.width = r->w;
update.height = r->h;
sx = 0;
sy = 0;
dx = sp->cur.x - r->x;
dy = sp->cur.y - r->y;
w = cg->sf->width;
h = cg->sf->height;
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = cg->sf->w;
int h = cg->sf->h;
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
return NG;
if (!ags_clipCopyRect(&cg_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
dx += r->x;
dy += r->y;
gre_BlendScreen(sf0, dx, dy,
sf0, dx, dy,
cg->sf, sx, sy, w, h);
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_ADD);
SDL_BlitSurface(cg->sf, &(SDL_Rect){sx, sy, w, h}, main_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);
return OK;
}
+5 -7
View File
@@ -25,7 +25,6 @@
#include "portab.h"
#include "system.h"
#include "ngraph.h"
#include "ags.h"
#include "input.h"
#include "sprite.h"
@@ -37,20 +36,20 @@
@param time: 実行時間(msec)
@param cancel: キー抜け(0:なし, 1:あり)
*/
int nt_sp_eupdate(int no, int time, int cancel) {
void nt_sp_eupdate(int no, int time, int cancel) {
if (no == 1013) {
nt_sp_update_all(TRUE);
return OK;
nt_sp_update_all(true);
return;
}
nt_sp_update_all(FALSE);
nt_sp_update_all(false);
enum sdl_effect_type type = from_sact_effect(no - 100);
if (type == EFFECT_INVALID) {
WARNING("Unimplemented effect %d", no);
type = EFFECT_CROSSFADE;
}
SDL_Rect rect = { 0, 0, sf0->width, sf0->height };
SDL_Rect rect = { 0, 0, main_surface->w, main_surface->h };
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, 0, 0, sdl_getDIB(), 0, 0, type);
int sttime, curtime;
@@ -66,5 +65,4 @@ int nt_sp_eupdate(int no, int time, int cancel) {
}
sdl_effect_finish(eff);
ags_updateFull();
return OK;
}
+15 -37
View File
@@ -25,15 +25,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "list.h"
#include "ags.h"
#include "graphics.h"
// #include "sact.h"
#include "surface.h"
#include "ngraph.h"
#include "sprite.h"
// スプライト再描画間の間に変更のあったスプライトの領域の和
@@ -57,7 +55,7 @@ static void disjunction(void* region, void* data) {
// 更新の必要なスプライトの領域の和をとってクリッピングする
static MyRectangle get_updatearea() {
MyRectangle clip = {0, 0, 0, 0};
MyRectangle rsf0 = {0, 0, sf0->width, sf0->height};
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
MyRectangle result;
slist_foreach(updatearea, disjunction, &clip);
@@ -66,7 +64,7 @@ static MyRectangle get_updatearea() {
updatearea = NULL;
// surface0との領域の積をとる
SDL_IntersectRect(&rsf0, &clip, &result);
SDL_IntersectRect(&screen, &clip, &result);
SACT_DEBUG("clipped area x=%d y=%d w=%d h=%d",
result.x, result.y, result.w, result.h);
@@ -92,9 +90,9 @@ static void do_update_each(void* data, void* userdata) {
画面全体の更新
@param syncscreen: surface0 に描画したものを Screen に反映させるかどうか
*/
int nt_sp_update_all(boolean syncscreen) {
void nt_sp_update_all(bool syncscreen) {
// 画面全体を更新領域に
MyRectangle r = {0, 0, sf0->width, sf0->height };
MyRectangle r = {0, 0, main_surface->w, main_surface->h };
// updatelistに登録してあるスプライトを再描画
// updatelistはスプライトの番号順に並んでいる
@@ -106,41 +104,37 @@ int nt_sp_update_all(boolean syncscreen) {
if (syncscreen) {
ags_updateFull();
}
return OK;
}
/*
画面の一部を更新
updateme(_part)で登録した更新が必要なspriteの和の領域をupdate
*/
int nt_sp_update_clipped() {
void nt_sp_update_clipped() {
MyRectangle r;
// 更新領域の確定
r = get_updatearea();
if (SDL_RectEmpty(&r))
return OK;
return;
// 更新領域に入っているスプライトの再描画
slist_foreach(updatelist, do_update_each, &r);
// 更新領域を Window に転送
ags_updateArea(r.x, r.y, r.w, r.h);
return OK;
}
/*
sprite全体の更新を登録
@param sp: 更新するスプライト
*/
int nt_sp_updateme(sprite_t *sp) {
void nt_sp_updateme(sprite_t *sp) {
MyRectangle *r;
if (sp == NULL) return NG;
if (sp->cursize.width == 0 || sp->cursize.height == 0) return NG;
if (sp == NULL) return;
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
r = malloc(sizeof(MyRectangle));
r->x = sp->cur.x;
@@ -152,8 +146,6 @@ int nt_sp_updateme(sprite_t *sp) {
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
r->x, r->y, sp->no, r->w, r->h);
return OK;
}
/*
@@ -164,11 +156,11 @@ int nt_sp_updateme(sprite_t *sp) {
@param w: 更新領域幅
@param h: 更新領域高さ
*/
int nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
void nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
MyRectangle *r;
if (sp == NULL) return NG;
if (w == 0 || h == 0) return NG;
if (sp == NULL) return;
if (w == 0 || h == 0) return;
r = malloc(sizeof(MyRectangle));
r->x = sp->cur.x + x;
@@ -180,8 +172,6 @@ int nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
r->x, r->y, sp->no, r->w, r->h);
return OK;
}
// スプライトの番号順に更新するためにリストに順番に要れるためのcallbck
@@ -214,18 +204,6 @@ void nt_sp_clear_updatelist(void) {
}
// デフォルトの壁紙update
int nt_sp_draw_wall(sprite_t *sp, MyRectangle *area) {
int sx, sy, w, h;
sx = area->x;
sy = area->y;
w = area->w;
h = area->h;
gr_fill(sf0, sx, sy, w, h, 0, 0, 0);
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d",
sp->no, sx, sy, w, h);
return OK;
void nt_sp_draw_wall(sprite_t *sp, MyRectangle *area) {
SDL_FillRect(main_surface, area, SDL_MapRGB(main_surface->format, 0, 0, 0));
}
+3 -2
View File
@@ -34,7 +34,6 @@
#include "music.h"
#include "sdl_core.h"
#include "input.h"
#include "ngraph.h"
#include "cg.h"
#include "jpeg.h"
@@ -61,8 +60,10 @@ static void ndd_run(int demonum) {
cgdata *cg = jpeg_extract(alk->entries[i].data, alk->entries[i].size);
if (cg) {
gr_drawimage24(sf0, cg, 0, 0);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormatFrom(cg->pic, cg->width, cg->height, 24, cg->width * 3, SDL_PIXELFORMAT_RGB24);
SDL_BlitSurface(sf, NULL, main_surface, NULL);
ags_updateFull();
SDL_FreeSurface(sf);
cgdata_free(cg);
} else {
WARNING("Cannot decode CG %d in %s", i, alk_path);
+1 -1
View File
@@ -48,7 +48,7 @@ static void Prepare(void) {
current_no = no;
*result = 1;
} else {
*result = muspcm_load_bgm(SLOT, no) == OK;
*result = muspcm_load_bgm(SLOT, no) ? 1 : 0;
}
TRACE("S3xMusic.Prepare %d, %d => %d:", ch, no, *result);
}
+16 -17
View File
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <string.h>
#include <SDL.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
@@ -46,8 +47,6 @@
#include "sactsound.h"
#include "sactcrypto.h"
#include "sactchart.h"
#include "ngraph.h"
#include "surface.h"
#include "sactamask.h"
/*
@@ -147,20 +146,20 @@ static void Init() {
}
// create depth map
sact.dmap = sf_create_pixel(sf0->width, sf0->height, 16);
sact.dmap = SDL_CreateRGBSurface(0, main_surface->w, main_surface->h, 16, 0, 0, 0, 0);
// その他 System35 のデフォルト動作の変更
ags_setAntialiasedStringMode(TRUE);
ags_setAntialiasedStringMode(true);
sys_setHankakuMode(2); // 全角半角変換無し
ags_autorepeat(FALSE); // key auto repeat off
ags_autorepeat(false); // key auto repeat off
if (sact.version >= 120) {
sact.logging = TRUE;
sact.logging = true;
#ifdef __EMSCRIPTEN__
EM_ASM( xsystem35.texthook.disableWheelEvent(0xffffffff) );
#endif
} else {
sact.logging = FALSE;
sact.logging = false;
}
TRACE("SACT.Init %d:", p1);
@@ -267,7 +266,7 @@ static void SpriteDeleteCount() {
* 現在設定されているスプライト状態を画面に反映(~SP_UPDATE)
*/
static void Draw() {
sp_update_all(TRUE);
sp_update_all(true);
TRACE("SACT.Draw:");
}
@@ -639,7 +638,7 @@ static void QuerySpriteIsExist() {
int wNum = getCaliValue();
int *var = getCaliVariable();
sp_query_isexist(wNum, var);
*var = sp_exists(wNum) ? 1 : 0;
TRACE("SACT.QuerySpriteIsExist %d,%p:", wNum, var);
}
@@ -765,7 +764,7 @@ static void CG_QueryType() {
int wNumCG = getCaliValue();
int *vType = getCaliVariable();
scg_querytype(wNumCG, vType);
*vType = scg_querytype(wNumCG);
TRACE("SACT.CG_QueryType %d,%p:", wNumCG, vType);
}
@@ -797,7 +796,7 @@ static void CG_QueryBpp() {
int wNumCG = getCaliValue();
int *vBpp = getCaliVariable();
scg_querybpp(wNumCG, vBpp);
*vBpp = scg_querybpp(wNumCG);
TRACE("SACT.CG_QueryBpp %d,%p:", wNumCG, vBpp);
}
@@ -812,7 +811,7 @@ static void CG_ExistAlphaMap() {
int wNumCG = getCaliValue();
int *vMask = getCaliVariable();
scg_existalphamap(wNumCG, vMask);
*vMask = scg_existalphamap(wNumCG) ? 1 : 0;
TRACE("SACT.CG_ExistAlphaMap %d,%p:", wNumCG, vMask);
}
@@ -1027,7 +1026,7 @@ static void WaitKeySimple() {
TRACE("SACT.WaitKeySimple %d:", vKey);
// とりあえず全更新
sp_update_all(TRUE);
sp_update_all(true);
sact.waittype = KEYWAIT_SIMPLE;
sact.waitkey = -1;
@@ -1314,7 +1313,7 @@ static void MessageClear() {
static void MessageIsEmpty() {
int *wResult = getCaliVariable();
*wResult = smsg_is_empty();
*wResult = smsg_is_empty() ? 1 : 0;
TRACE("SACT.MessageIsEmpty %p:", wResult);
}
@@ -1339,7 +1338,7 @@ static void MessagePeek() {
* ログ採取停止
*/
static void Log_Stop() {
sact.logging = FALSE;
sact.logging = false;
TRACE("SACT.Log_Stop:");
}
@@ -1348,7 +1347,7 @@ static void Log_Stop() {
* ログ採取開始
*/
static void Log_Start() {
sact.logging = TRUE;
sact.logging = true;
TRACE("SACT.Log_Start:");
}
@@ -2146,7 +2145,7 @@ static void SACT_reset(void) {
sp_reset();
scg_freeall();
sf_free(sact.dmap);
SDL_FreeSurface(sact.dmap);
memset(&sact, 0, sizeof(sact));
}
+16 -16
View File
@@ -29,7 +29,7 @@
#include "portab.h"
#include "list.h"
#include "graphics.h"
#include "surface.h"
#include "ags.h"
#include "sacttimer.h"
#include "variable.h"
@@ -73,7 +73,7 @@ enum cgtype {
struct _cginfo {
enum cgtype type; // CGの種類, 0: 未使用, 1:リンクされている, ...
int no; // CGの番号
surface_t *sf; // CG本体
struct SDL_Surface *sf;
int refcnt; // 参照カウンタ。0になったら開放してもよい。
};
typedef struct _cginfo cginfo_t;
@@ -116,8 +116,8 @@ struct _sprite {
cginfo_t *curcg;
// スプライトを表示するか
boolean show;
boolean show_save; // Zkey hide save用
bool show;
bool show_save; // Zkey hide save用
// 表示する際のブレンド率 0:全く見えない, 255: 通常表示
int blendrate;
@@ -137,10 +137,10 @@ struct _sprite {
// sprite削除時の callback
void (* remove)(struct _sprite *sp);
// spriteを再描画するときの callback
int (* update)(struct _sprite *sp);
void (* update)(struct _sprite *sp);
boolean focused; // forcusを得ているか
boolean pressed; // このsprite上でマウスが押されているか
bool focused; // forcusを得ているか
bool pressed; // このsprite上でマウスが押されているか
SList *expsp; // 説明スプライトのリスト
@@ -151,7 +151,7 @@ struct _sprite {
int speed; // 移動速度
int starttime; // 移動開始時刻
int endtime; // 移動終了予定時刻
boolean moving; // 移動中かどうか
bool moving; // 移動中かどうか
} move;
// SACT.Numeral用パラメータ
@@ -170,7 +170,7 @@ struct _sprite {
// ゲットスプライト
struct {
boolean dragging; // ドラッグ中
bool dragging; // ドラッグ中
MyPoint dragstart; // ドラッグ開始位置
} get;
@@ -190,7 +190,7 @@ struct _sprite {
// メッセージスプライト
struct {
SList *buf; // 表示する文字のリスト
surface_t *canvas; // 文字を描画するsurface
struct SDL_Surface *canvas;
MyPoint dspcur; // 現在の表示位置
} msg;
} u;
@@ -234,7 +234,7 @@ struct _sact {
int align; // 行そろえ
void (* cbmove)(agsevent_t *);
void (* cbrelease)(agsevent_t *);
surface_t *charcanvas;
struct SDL_Surface *charcanvas;
} sel;
// event listener
@@ -254,7 +254,7 @@ struct _sact {
// DnDに関するもの
sprite_t *draggedsp; // drag中のスプライト
boolean dropped; // スプライトがドロップされたかどうか
bool dropped; // スプライトがドロップされたかどうか
// keywaitの種類
int waittype;
@@ -273,14 +273,14 @@ struct _sact {
int numsoundob;
// depth map
surface_t *dmap;
struct SDL_Surface *dmap;
boolean zhiding; // Zkeyによる隠し中
bool zhiding; // Zkeyによる隠し中
int zofftime;
boolean zdooff;
bool zdooff;
// バックログ
boolean logging;
bool logging;
List *log;
};
typedef struct _sact sact_t;
+21 -82
View File
@@ -25,23 +25,18 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "LittleEndian.h"
#include "input.h"
#include "ags.h"
#include "sact.h"
#include "surface.h"
#include "ngraph.h"
#include "pms.h"
#include "sprite.h"
#include "sdl_core.h"
#include "mmap.h"
static surface_t *smask_get(int no);
static surface_t *smask_mul(surface_t *sf, int val);
// SACTEFAM を使ったマスク
typedef struct {
mmap_t *mmap;
@@ -52,24 +47,14 @@ typedef struct {
static SACTEFAM_t am;
struct ecopyparam {
int sttime;
int curtime;
int edtime;
int curstep;
int oldstep;
};
typedef struct ecopyparam ecopyparam_t;
static ecopyparam_t ecp;
// SACTEFAM.KLD の読み込み
int smask_init(char *path) {
bool smask_init(char *path) {
if (am.mmap)
return OK; // already loaded
return true; // already loaded
mmap_t *m = map_file(path);
if (!m)
return NG;
return false;
am.mmap = m;
am.datanum = LittleEndian_getDW(m->addr, 0);
am.no = malloc(sizeof(int) * am.datanum);
@@ -80,11 +65,11 @@ int smask_init(char *path) {
am.offset[i] = LittleEndian_getDW(m->addr, 16 + i * 16 + 8);
}
return OK;
return true;
}
// 指定番号の alphamask ファイルをよみだす
static surface_t *smask_get(int no) {
static cgdata *smask_get(int no) {
int i;
for (i = 0; i < am.datanum; i++) {
@@ -93,71 +78,25 @@ static surface_t *smask_get(int no) {
if (i == am.datanum) return NULL;
return sf_getcg(am.mmap->addr + am.offset[i], 0 /*FIXME*/);
}
// ベースになるマスクの alpha 値を拡大して取り出す
static surface_t *smask_mul(surface_t *sf, int val) {
surface_t *out = sf_create_alpha(sf->width, sf->height);
uint8_t *src = sf->alpha;
uint8_t *dst = out->alpha;
int pix = sf->width * sf->height;
while(pix--) {
int i = (*src - val) * 16;
if (i < 0) *dst = 255; // 指定値よりも大きいのはコピー
else if (i > 255) *dst = 0; // 指定値よりも小さいのは無視
else *dst = 255-i; // それ以外は値を16倍
src++; dst++;
}
return out;
return pms256_extract(am.mmap->addr + am.offset[i]);
}
/**
* マスクつき画面更新
*/
int sp_eupdate_amap(int index, int time, int cancel) {
surface_t *mask, *mask2;
surface_t *sfsrc, *sfdst;
int key;
mask = smask_get(index);
void sp_eupdate_amap(int index, int time, int cancel) {
cgdata *mask = smask_get(index);
if (mask == NULL) {
sp_update_all(TRUE);
return OK;
sp_update_all(true);
return;
}
// 現在の sf0 をセーブ
sfsrc = sf_dup(sf0);
sp_update_all(FALSE);
sfdst = sf_dup(sf0);
sf_copyall(sf0, sfsrc);
ecp.sttime = ecp.curtime = sdl_getTicks();
ecp.edtime = ecp.curtime + time*10;
ecp.oldstep = 0;
while ((ecp.curtime = sdl_getTicks()) < ecp.edtime) {
int curstep = 255 * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
// 元になるマスクのalpha値を16倍して欲しいところだけ取り出す
mask2 = smask_mul(mask, curstep);
gre_BlendUseAMap(sf0, 0, 0, sfsrc, 0, 0, sfdst, 0, 0, sfsrc->width, sfsrc->height, mask2, 0, 0, 255);
ags_updateFull();
key = sys_keywait(10, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
if (cancel && key) break;
// 一時マスクを削除
sf_free(mask2);
}
sf_copyall(sf0, sfdst);
SDL_Surface *mask_sf = SDL_CreateRGBSurfaceFrom(mask->pic, mask->width, mask->height, 8, mask->width, 0, 0, 0, 0);
sp_update_all(false); // old = sdl_texture, new = main_surface
struct sdl_effect *eff = sdl_effect_sactamask_init(mask_sf);
ags_runEffect(time * 10, cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
sdl_effect_finish(eff);
ags_updateFull();
sf_free(sfsrc);
sf_free(sfdst);
sf_free(mask);
return OK;
SDL_FreeSurface(mask_sf);
cgdata_free(mask);
}
+2 -1
View File
@@ -24,6 +24,7 @@
#ifndef __SACTAMASK_H__
#define __SACTAMASK_H__
extern int smask_init(const char *path);
bool smask_init(const char *path);
void sp_eupdate_amap(int type, int time, int key);
#endif
+143 -132
View File
@@ -23,9 +23,11 @@
#include "config.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "nact.h"
@@ -33,19 +35,16 @@
#include "ags.h"
#include "sact.h"
#include "sactcg.h"
#include "surface.h"
#include "ngraph.h"
#include "cg.h"
#include "sdl_core.h"
#include "sactcg_stretch.c"
#include "sactcg_blend.c"
#define spcg_assert_no(no) \
#define SPCG_ASSERT_NO(no) \
if ((no) > (CGMAX -1)) { \
WARNING("no is too large (should be %d < %d)", (no), CGMAX); \
return NG; \
return; \
} \
static cginfo_t *scg_new(enum cgtype type, int no, surface_t *sf) {
static cginfo_t *scg_new(enum cgtype type, int no, SDL_Surface *sf) {
cginfo_t *info = calloc(1, sizeof(cginfo_t));
info->type = type;
info->no = no;
@@ -75,7 +74,7 @@ static cginfo_t *scg_get(int no) {
if (sact.cg[no] != NULL)
return sact.cg[no];
surface_t *sf = sf_loadcg_no(no - 1);
SDL_Surface *sf = cg_load_as_sdlsurface(no - 1);
if (!sf) {
WARNING("load fail (%d)", no -1);
return NULL;
@@ -95,85 +94,137 @@ void scg_deref(cginfo_t *cg) {
return;
if (cg->sf)
sf_free(cg->sf);
SDL_FreeSurface(cg->sf);
free(cg);
}
// 指定の大きさ、色の矩形の CG を作成
int scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
spcg_assert_no(wNumCG);
void scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate) {
SPCG_ASSERT_NO(wNumCG);
surface_t *sf = sf_create_surface(wWidth, wHeight, sf0->depth);
gr_fill(sf, 0, 0, wWidth, wHeight, wR, wG, wB);
gr_fill_alpha_map(sf, 0, 0, wWidth, wHeight, wBlendRate);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_FillRect(sf, NULL, SDL_MapRGBA(sf->format, wR, wG, wB, wBlendRate));
scg_new(CG_SET, wNumCG, sf);
return OK;
}
// 指定のCGを反転させたCGを作成
int scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY) {
spcg_assert_no(wNumCG);
spcg_assert_no(wNumSrcCG);
void scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY) {
SPCG_ASSERT_NO(wNumCG);
SPCG_ASSERT_NO(wNumSrcCG);
cginfo_t *src = scg_get(wNumSrcCG);
if (!src)
return NG;
return;
surface_t *sf = stretch(src->sf, src->sf->width, src->sf->height, (wReverseX << 1) | wReverseY);
SDL_Surface *sf = SDL_ConvertSurface(src->sf, src->sf->format, 0);
if (wReverseX)
sdl_FlipSurfaceHorizontal(sf);
if (wReverseY)
sdl_FlipSurfaceVertical(sf);
scg_new(CG_REVERSE, wNumCG, sf);
return OK;
}
// 指定のCGを拡大/縮小したCGを作成
int scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG) {
spcg_assert_no(wNumCG);
spcg_assert_no(wNumSrcCG);
void scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG) {
SPCG_ASSERT_NO(wNumCG);
SPCG_ASSERT_NO(wNumSrcCG);
cginfo_t *src = scg_get(wNumSrcCG);
if (!src)
return NG;
surface_t *sf = stretch(src->sf, wWidth, wHeight, 0);
return;
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, src->sf->format->BitsPerPixel, src->sf->format->format);
SDL_BlitScaled(src->sf, NULL, sf, NULL);
scg_new(CG_STRETCH, wNumCG, sf);
return OK;
}
static SDL_Surface *blend(SDL_Surface *base, int x, int y, SDL_Surface *blend, int mode) {
assert(blend->format->format == SDL_PIXELFORMAT_ARGB8888 || blend->format->format == SDL_PIXELFORMAT_XRGB8888);
bool src_has_alpha = SDL_ISPIXELFORMAT_ALPHA(blend->format->format);
SDL_Surface *dst = SDL_ConvertSurfaceFormat(base, SDL_PIXELFORMAT_ARGB8888, 0);
SDL_Rect rect = {x, y, blend->w, blend->h};
SDL_IntersectRect(&(SDL_Rect){0, 0, dst->w, dst->h}, &rect, &rect);
for (int i = 0; i < rect.h; i++) {
uint8_t *dstp = (uint8_t *)dst->pixels + (i + rect.y) * dst->pitch + rect.x * 4;
uint8_t *srcp = (uint8_t *)blend->pixels + i * blend->pitch;
for (int j = 0; j < rect.w; j++) {
uint8_t *dstpp = dstp + j * 4;
uint8_t *srcpp = srcp + j * 4;
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
// Use base's alpha map if blend has no alpha map
uint8_t alpha = src_has_alpha ? srcpp[3] : dstpp[3];
if (alpha == 0) {
// do nothing
} else if (alpha == 255) {
memcpy(dstpp, srcpp, 3);
} else {
for (int k = 0; k < 3; k++) {
dstpp[k] = (dstpp[k] * (255 - alpha) + srcpp[k] * alpha) / 255;
}
}
if (mode) {
int dsta = dstpp[3] + srcpp[3];
dstpp[3] = dsta > 255 ? 255 : dsta;
}
#else
// Use base's alpha map if blend has no alpha map
uint8_t alpha = src_has_alpha ? srcpp[0] : dstpp[0];
if (alpha == 0) {
// do nothing
} else if (alpha == 255) {
memcpy(dstpp + 1, srcpp + 1, 3);
} else {
for (int 1 = 0; k < 4; k++) {
dstpp[k] = (dstpp[k] * (255 - alpha) + srcpp[k] * alpha) / 255;
}
}
if (mode) {
int dsta = dstpp[0] + srcpp[0];
dstpp[0] = dsta > 255 ? 255 : dsta;
}
#endif
}
}
return dst;
}
// ベースCGの上にブレンドCGを重ねた CG を作成
int scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumBaseCG);
spcg_assert_no(wNumBlendCG);
void scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode) {
SPCG_ASSERT_NO(wNumDstCG);
SPCG_ASSERT_NO(wNumBaseCG);
SPCG_ASSERT_NO(wNumBlendCG);
cginfo_t *basecg = scg_get(wNumBaseCG);
cginfo_t *blendcg = scg_get(wNumBlendCG);
if (!basecg || !blendcg) return NG;
if (!basecg || !blendcg) return;
surface_t *sf = blend(basecg->sf, wX, wY, blendcg->sf, wAlphaMapMode);
SDL_Surface *sf = blend(basecg->sf, wX, wY, blendcg->sf, wAlphaMapMode);
scg_new(CG_SET, wNumDstCG, sf);
return OK;
}
// 指定の文字列のCGを作成
int scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText) {
spcg_assert_no(wNumCG);
void scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText) {
SPCG_ASSERT_NO(wNumCG);
// 勝手に出ていいのかな?
if (svar_length(wText) == 0) return OK;
if (svar_length(wText) == 0) return;
ags_setFont(FONT_GOTHIC, wSize);
agsurface_t *glyph = ags_drawStringToSurface(svar_get(wText));
SDL_Surface *glyph = ags_drawStringToSurface(svar_get(wText), wR, wG, wB);
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, glyph->w, wSize, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_SetSurfaceBlendMode(glyph, SDL_BLENDMODE_NONE);
SDL_BlitSurface(glyph, NULL, sf, NULL);
SDL_FreeSurface(glyph);
scg_new(CG_SET, wNumCG, sf);
return OK;
}
// 数字文字列のCGを作成
int scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue) {
spcg_assert_no(wNumCG);
void scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue) {
SPCG_ASSERT_NO(wNumCG);
char s[256], ss[256];
if (wZeroPadding) {
@@ -186,157 +237,117 @@ int scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs,
sprintf(s, ss, wValue);
ags_setFont(FONT_GOTHIC, wSize);
agsurface_t *glyph = ags_drawStringToSurface(s);
SDL_Surface *glyph = ags_drawStringToSurface(s, wR, wG, wB);
surface_t *sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth);
gr_fill(sf, 0, 0, glyph->width, wSize, wR, wG, wB);
gr_draw_amap(sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, glyph->w, wSize, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_SetSurfaceBlendMode(glyph, SDL_BLENDMODE_NONE);
SDL_BlitSurface(glyph, NULL, sf, NULL);
SDL_FreeSurface(glyph);
scg_new(CG_SET, wNumCG, sf);
return OK;
}
// CGを複製
int scg_copy(int wNumDstCG, int wNumSrcCG) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumSrcCG);
void scg_copy(int wNumDstCG, int wNumSrcCG) {
SPCG_ASSERT_NO(wNumDstCG);
SPCG_ASSERT_NO(wNumSrcCG);
cginfo_t *src = scg_get(wNumSrcCG);
if (!src)
return NG;
return;
scg_new(CG_SET, wNumDstCG, sf_dup(src->sf));
return OK;
scg_new(CG_SET, wNumDstCG, SDL_ConvertSurface(src->sf, src->sf->format, 0));
}
// CGの一部を切りぬいたCGを作成
int scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumSrcCG);
void scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
SPCG_ASSERT_NO(wNumDstCG);
SPCG_ASSERT_NO(wNumSrcCG);
cginfo_t *src = scg_get(wNumSrcCG);
if (!src)
return NG;
return;
surface_t *sf = src->sf->alpha
? sf_create_surface(wWidth, wHeight, src->sf->depth)
: sf_create_pixel(wWidth, wHeight, src->sf->depth);
if (src->sf->pixel)
gr_copy(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
if (src->sf->alpha)
gr_copy_alpha_map(sf, 0, 0, src->sf, wX, wY, wWidth, wHeight);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, wWidth, wHeight, src->sf->format->BitsPerPixel, src->sf->format->format);
SDL_BlitSurface(src->sf, &(SDL_Rect){wX, wY, wWidth, wHeight}, sf, NULL);
scg_new(CG_SET, wNumDstCG, sf);
return OK;
}
// 元のCGの一部を切りぬいたCGを作成
int scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
spcg_assert_no(wNumDstCG);
spcg_assert_no(wNumSrcCG);
void scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight) {
SPCG_ASSERT_NO(wNumDstCG);
SPCG_ASSERT_NO(wNumSrcCG);
cginfo_t *src = scg_get(wNumSrcCG);
if (!src)
return NG;
return;
surface_t *sf;
if (src->sf->alpha) {
sf = sf_create_surface(src->sf->width, src->sf->height, src->sf->depth);
gr_fill_alpha_map(sf, 0, 0, src->sf->width, src->sf->height, 255);
} else {
sf = sf_create_pixel(src->sf->width, src->sf->height, src->sf->depth);
}
if (src->sf->pixel)
gr_copy(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
if (src->sf->alpha)
gr_copy_alpha_map(sf, wX, wY, src->sf, wX, wY, wWidth, wHeight);
SDL_Surface *sf = SDL_CreateRGBSurfaceWithFormat(0, src->sf->w, src->sf->h, src->sf->format->BitsPerPixel, src->sf->format->format);
SDL_FillRect(sf, NULL, SDL_MapRGBA(sf->format, 0, 0, 0, 255));
SDL_BlitSurface(src->sf, &(SDL_Rect){wX, wY, wWidth, wHeight}, sf, &(SDL_Rect){wX, wY, wWidth, wHeight});
scg_new(CG_SET, wNumDstCG, sf);
return OK;
}
// 全てのCGの開放
int scg_freeall() {
void scg_freeall(void) {
int i;
for (i = 1; i < CGMAX; i++) {
scg_free(i);
}
return OK;
}
/**
* 指定の番号の CG をオブジェクトリストから消し、オブジェクトがどこからも参照
* されていない(参照数が0の)場合のみ、オブジェクトを削除
*/
int scg_free(int no) {
spcg_assert_no(no);
void scg_free(int no) {
SPCG_ASSERT_NO(no);
cginfo_t *cg = sact.cg[no];
if (!cg) return NG;
if (!cg) return;
scg_deref(cg);
sact.cg[no] = NULL;
return OK;
}
// CGの種類を取得
int scg_querytype(int wNumCG, int *ret) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (sact.cg[wNumCG] == NULL) goto errexit;
*ret = sact.cg[wNumCG]->type;
return OK;
errexit:
*ret = CG_NOTUSED;
return NG;
int scg_querytype(int wNumCG) {
if (wNumCG >= (CGMAX -1)) return CG_NOTUSED;
if (sact.cg[wNumCG] == NULL) return CG_NOTUSED;
return sact.cg[wNumCG]->type;
}
// CGの大きさを取得
int scg_querysize(int wNumCG, int *w, int *h) {
bool scg_querysize(int wNumCG, int *w, int *h) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (sact.cg[wNumCG] == NULL) goto errexit;
if (sact.cg[wNumCG]->sf == NULL) goto errexit;
*w = sact.cg[wNumCG]->sf->width;
*h = sact.cg[wNumCG]->sf->height;
*w = sact.cg[wNumCG]->sf->w;
*h = sact.cg[wNumCG]->sf->h;
return OK;
return true;
errexit:
*w = *h = 0;
return NG;
return false;
}
// CGのBPPを取得
int scg_querybpp(int wNumCG, int *ret) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (sact.cg[wNumCG] == NULL) goto errexit;
if (sact.cg[wNumCG]->sf == NULL) goto errexit;
*ret = sact.cg[wNumCG]->sf->depth;
return OK;
errexit:
*ret = 0;
return NG;
int scg_querybpp(int wNumCG) {
if (wNumCG >= (CGMAX -1)) return 0;
if (sact.cg[wNumCG] == NULL) return 0;
if (sact.cg[wNumCG]->sf == NULL) return 0;
return sact.cg[wNumCG]->sf->format->BitsPerPixel;
}
// CGの alphamap が存在するかを取得
int scg_existalphamap(int wNumCG, int *ret) {
if (wNumCG >= (CGMAX -1)) goto errexit;
if (sact.cg[wNumCG] == NULL) goto errexit;
if (sact.cg[wNumCG]->sf == NULL) goto errexit;
*ret = sact.cg[wNumCG]->sf->alpha ? 1 : 0;
errexit:
*ret = 0;
return NG;
bool scg_existalphamap(int wNumCG) {
if (wNumCG >= (CGMAX -1)) return false;
if (sact.cg[wNumCG] == NULL) return false;
if (sact.cg[wNumCG]->sf == NULL) return false;
return SDL_ISPIXELFORMAT_ALPHA(sact.cg[wNumCG]->sf->format->format);
}
+17 -18
View File
@@ -27,23 +27,22 @@
#include "portab.h"
#include "sact.h"
extern cginfo_t *scg_addref(int no);
extern void scg_deref(cginfo_t *cg);
extern int scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
extern int scg_create_reverse(int NumCG, int wNumSrcCG, int wReverseX, int wReverseY);
extern int scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG);
extern int scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode);
extern int scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText);
extern int scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue);
extern int scg_copy(int wNumDstCG, int wNumSrcCG);
extern int scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
extern int scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
extern int scg_freeall();
extern int scg_free(int cg);
extern int scg_querytype(int wNumCG, int *ret);
extern int scg_querysize(int wNumCG, int *w, int *h);
extern int scg_querybpp(int wNumCG, int *ret);
extern int scg_existalphamap(int wNumCG, int *ret);
extern int scg_linkcgfree(int no);
cginfo_t *scg_addref(int no);
void scg_deref(cginfo_t *cg);
void scg_create(int wNumCG, int wWidth, int wHeight, int wR, int wG, int wB, int wBlendRate);
void scg_create_reverse(int NumCG, int wNumSrcCG, int wReverseX, int wReverseY);
void scg_create_stretch(int wNumCG, int wWidth, int wHeight, int wNumSrcCG);
void scg_create_blend(int wNumDstCG, int wNumBaseCG, int wX, int wY, int wNumBlendCG, int wAlphaMapMode);
void scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText);
void scg_create_textnum(int wNumCG, int wSize, int wR, int wG, int wB, int wFigs, int wZeroPadding, int wValue);
void scg_copy(int wNumDstCG, int wNumSrcCG);
void scg_cut(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
void scg_partcopy(int wNumDstCG, int wNumSrcCG, int wX, int wY, int wWidth, int wHeight);
void scg_freeall(void);
void scg_free(int cg);
int scg_querytype(int wNumCG);
bool scg_querysize(int wNumCG, int *w, int *h);
int scg_querybpp(int wNumCG);
bool scg_existalphamap(int wNumCG);
#endif
-31
View File
@@ -1,31 +0,0 @@
//
static surface_t *blend(surface_t *base, int x, int y, surface_t *blend, int mode) {
surface_t *dst = sf_create_surface(base->width, base->height, base->depth);
gr_copy(dst, 0, 0, base, 0, 0, base->width, base->height);
if (base->alpha) {
// ベースに alpha map がある場合はそれをコピー
gr_copy_alpha_map(dst, 0, 0, base, 0, 0, base->width, base->height);
} else {
// 無い場合は全て 255 の map を作成
gr_fill_alpha_map(dst, 0, 0, base->width, base->height, 255);
}
if (blend->alpha) {
// 重ね合わせ先の alpha map があるときはそれを使う
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, blend, 0, 0, 255);
} else {
// 無いときは dst の alpha map を使う
gre_BlendUseAMap(dst, x, y, base, x, y, blend, 0, 0, blend->width, blend->height, dst, x, y, 255);
}
// alpha 作成モードが dst + blend の時は飽和加算
if (mode == 1) {
gr_saturadd_alpha_map(dst, x, y, blend, 0, 0, blend->width, blend->height);
}
return dst;
}
-114
View File
@@ -1,114 +0,0 @@
// 拡大縮小
static surface_t *stretch(surface_t *src, int dw, int dh, int mirror) {
surface_t *dst = calloc(1, sizeof(surface_t));
float a1, a2, xd, yd;
int sw, sh;
int *row, *col;
int x, y;
uint8_t *sdata, *ddata;
dst->width = dw;
dst->height = dh;
dst->depth = src->depth;
dst->bytes_per_line = dw * src->bytes_per_pixel;
dst->bytes_per_pixel = src->bytes_per_pixel;
if (src->pixel) {
dst->pixel = malloc(dh * dst->bytes_per_line);
}
if (src->alpha) {
dst->alpha = malloc(dw * dh);
}
sdata = GETOFFSET_PIXEL(src, 0, 0);
ddata = GETOFFSET_PIXEL(dst, 0, 0);
sw = src->width;
sh = src->height;
a1 = (float)sw / (float)dw;
a2 = (float)sh / (float)dh;
row = malloc(sizeof(int) * dw);
// 1おおきくして初期化しないと col[dw-1]とcol[dw]が同じになる
// 可能性がある。
col = calloc(dh +1, sizeof(int));
if (mirror & 1) {
/* 上下反転 added by tajiri@wizard */
for (yd = sh - a2, y = 0; y < dh; y++) {
col[y] = yd; yd -= a2;
}
} else {
for (yd = 0.0, y = 0; y < dh; y++) {
col[y] = yd; yd += a2;
}
}
if (mirror & 2) {
/* 左右反転 added by tajiri@wizard */
for (xd = sw - a1, x = 0; x < dw; x++) {
row[x] = xd; xd -= a1;
}
} else {
for (xd = 0.0, x = 0; x < dw; x++) {
row[x] = xd; xd += a1;
}
}
#define SCALEDCOPYAREA(type) { \
int x, y; \
type *sl, *dl; \
uint8_t *_sl, *_dl; \
for (y = 0; y < dh; y++) { \
sl = (type *)(sdata + *(y + col) * src->bytes_per_line);\
dl = (type *)(ddata + y * dst->bytes_per_line);\
for (x = 0; x < dw; x++) { \
*(dl + x) = *(sl + *(row + x)); \
} \
_dl = (uint8_t *)dl; \
while (y < dh - 1 && *(col + y) == *(col + y + 1)) { \
_sl = _dl; \
_dl += dst->bytes_per_line; \
memcpy(_dl, _sl, dw * sizeof(type)); \
y++; \
} \
}}
switch(dst->depth) {
case 8:
SCALEDCOPYAREA(uint8_t); break;
case 16:
SCALEDCOPYAREA(uint16_t); break;
case 24:
case 32:
SCALEDCOPYAREA(uint32_t); break;
default:
break;
}
if (src->alpha) {
int x, y;
uint8_t *sl, *dl;
uint8_t *_sl, *_dl;
sdata = GETOFFSET_ALPHA(src, 0, 0);
ddata = GETOFFSET_ALPHA(dst, 0, 0);
for (y = 0; y < dh; y++) {
sl = (uint8_t *)(sdata + *(y + col) * src->width);
dl = (uint8_t *)(ddata + y * dst->width);
for (x = 0; x < dw; x++) {
*(dl + x) = *(sl + *(row + x));
}
_dl = (uint8_t *)dl;
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
_sl = _dl;
_dl += dst->width;
memcpy(_dl, _sl, dw);
y++;
}
}
}
free(row);
free(col);
return dst;
}
+1 -2
View File
@@ -25,13 +25,12 @@
#include "portab.h"
// グラフ用チャート作成
int schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val) {
void schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val) {
if (val1 == val2) {
*pos = 0;
} else {
*pos = (((pos2 - pos1) * (val - val1)) / (val2 - val1)) + pos1;
}
return OK;
}
/*
+1 -1
View File
@@ -24,6 +24,6 @@
#ifndef __SACTCHART_H__
#define __SACTCHART_H__
extern int schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val);
void schart_pos(int *pos, int pos1, int pos2, int val1, int val2, int val);
#endif
+4 -8
View File
@@ -31,23 +31,19 @@
適当でいいとおもう
*/
int scryp_encrypt_word(int *array, int num, int key) {
void scryp_encrypt_word(int *array, int num, int key) {
WARNING("NOT IMPLEMENTED");
return OK;
}
int scryp_decrypt_word(int *array, int num, int key) {
void scryp_decrypt_word(int *array, int num, int key) {
WARNING("NOT IMPLEMENTED");
return OK;
}
int scryp_encrypt_str(int strno, int key) {
void scryp_encrypt_str(int strno, int key) {
WARNING("NOT IMPLEMENTED");
return OK;
}
int scryp_decrypt_str(int strno, int key) {
void scryp_decrypt_str(int strno, int key) {
WARNING("str = '%s'", svar_get(strno));
WARNING("NOT IMPLEMENTED");
return OK;
}
+4 -4
View File
@@ -24,9 +24,9 @@
#ifndef __SACTCRYPT_H__
#define __SACTCRYPT_H__
extern int scryp_encrypt_word(int *array, int num, int key);
extern int scryp_decrypt_word(int *array, int num, int key);
extern int scryp_encrypt_str(int strno, int key);
extern int scryp_decrypt_str(int strno, int key);
void scryp_encrypt_word(int *array, int num, int key);
void scryp_decrypt_word(int *array, int num, int key);
void scryp_encrypt_str(int strno, int key);
void scryp_decrypt_str(int strno, int key);
#endif
+28 -34
View File
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
@@ -35,7 +36,6 @@
#include "nact.h"
#include "sact.h"
#include "sprite.h"
#include "ngraph.h"
#include "drawtext.h"
#include "utfsjis.h"
@@ -58,10 +58,9 @@ static const char *logmsg_utf8[LOGMSG_LINES] = {
#define FONTSIZEINDEX 10
#define FONTSIZE 20
#define LOGLINENUM (sf0->height / FONTSIZE)
#define LOGLINENUM (main_surface->h / FONTSIZE)
static int curline;
static surface_t *back;
static surface_t *chr;
static SDL_Surface *back;
static void draw_log() {
int i, y = 0, len;
@@ -69,14 +68,20 @@ static void draw_log() {
char pinfo[256];
List *node;
// canvas clear
memset(chr->pixel, 0, chr->bytes_per_line * chr->height);
SDL_Surface *hline = SDL_CreateRGBSurfaceWithFormat(0, main_surface->w, 3, 32, SDL_PIXELFORMAT_RGB888);
SDL_FillRect(hline, NULL, SDL_MapRGB(hline->format, 255, 255, 255));
SDL_SetSurfaceBlendMode(hline, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(hline, 128);
SDL_SetSurfaceColorMod(back, 128, 128, 128);
SDL_BlitSurface(back, NULL, main_surface, NULL);
SDL_SetSurfaceColorMod(back, 255, 255, 255);
// ページ位置情報
len = snprintf(pinfo, sizeof(pinfo) -1, "%d/%d", curline, list_length(sact.log));
dt_setfont(FONT_GOTHIC, FONTSIZEINDEX);
dt_drawtext(chr, sf0->width - FONTSIZEINDEX *len /2, 0, pinfo);
dt_drawtext_col(main_surface, main_surface->w - FONTSIZEINDEX *len /2, 0, pinfo, 255, 255, 255);
// 表示始め位置
node = list_nth(sact.log, list_length(sact.log) - curline);
@@ -85,31 +90,28 @@ static void draw_log() {
char *str = (char *)(node->data);
if (0 == strcmp(str, "\n")) {
gr_fill(chr, 0, y + FONTSIZE/2, sf0->width, 3, 128, 0, 0);
SDL_BlitSurface(hline, NULL, main_surface, &(SDL_Rect){0, y + FONTSIZE/2, main_surface->w, 3});
} else {
if (cur < 6) {
dt_setfont(FONT_MINCHO, FONTSIZE);
} else {
dt_setfont(FONT_GOTHIC, FONTSIZE);
}
dt_drawtext(chr, 0, y, str);
dt_drawtext_col(main_surface, 0, y, str, 255, 255, 255);
}
y += FONTSIZE;
cur--;
node = list_next(node);
}
gr_copy_bright(sf0, 0, 0, back, 0, 0, sf0->width, sf0->height, 128);
gr_expandcolor_blend(sf0, 0, 0, chr, 0, 0, sf0->width, sf0->height,
255, 255, 255);
ags_updateFull();
}
int sblog_start(void) {
bool sblog_start(void) {
if (sact.version < 120)
return NG;
return false;
static char *logmsg[LOGMSG_LINES];
if (!logmsg[0]) {
@@ -121,52 +123,44 @@ int sblog_start(void) {
for (int i = 0; i < LOGMSG_LINES; i++)
sact.log = list_append(sact.log, logmsg[i]);
back = sf_dup(sf0);
chr = sf_create_surface(sf0->width, sf0->height, 8);
back = SDL_ConvertSurface(main_surface, main_surface->format, 0);
curline = 6;
draw_log();
return OK;
return true;
}
int sblog_end(void) {
void sblog_end(void) {
List *node;
int i;
sf_copyall(sf0, back);
SDL_BlitSurface(back, NULL, main_surface, NULL);
ags_updateFull();
sf_free(back);
sf_free(chr);
SDL_FreeSurface(back);
// 説明文章を削除
for (i = 0; i < LOGMSG_LINES; i++) {
node = list_last(sact.log);
sact.log = list_remove(sact.log, node->data);
}
return OK;
}
int sblog_pageup(void) {
void sblog_pageup(void) {
curline = min(list_length(sact.log), curline + (LOGLINENUM -1));
draw_log();
return OK;
}
int sblog_pagedown(void) {
void sblog_pagedown(void) {
curline = max(1, curline - (LOGLINENUM -1));
draw_log();
return OK;
}
int sblog_pagepre(void) {
void sblog_pagepre(void) {
curline = max(1, curline - 1);
draw_log();
return OK;
}
int sblog_pagenext(void) {
void sblog_pagenext(void) {
curline = min(list_length(sact.log), curline + 1);
draw_log();
return OK;
}
+6 -6
View File
@@ -24,11 +24,11 @@
#ifndef __SACTLOG_H__
#define __SACTLOG_H__
extern int sblog_start(void);
extern int sblog_end(void);
extern int sblog_pageup(void);
extern int sblog_pagedown(void);
extern int sblog_pagepre(void);
extern int sblog_pagenext(void);
bool sblog_start(void);
void sblog_end(void);
void sblog_pageup(void);
void sblog_pagedown(void);
void sblog_pagepre(void);
void sblog_pagenext(void);
#endif
+14 -28
View File
@@ -64,27 +64,24 @@ static int slt_find(int no) {
/*
SACT 効果音 subsystem 初期化
*/
int ssnd_init() {
void ssnd_init(void) {
// ch 1-8 をキャッシュとして使おう
cachei = 0;
memset(cache, 0, sizeof(cache));
return OK;
}
// 指定の番号の効果音をメモリに読み込み
int ssnd_prepare(int no) {
void ssnd_prepare(int no) {
int slot = slt_find(no);
if (slot == -1) {
slot = slt_getnext(no);
mus_wav_load(slot, no);
}
return OK;
}
// 指定の番号の効果音を再生
int ssnd_play(int no) {
void ssnd_play(int no) {
int slot = slt_find(no);
if (slot == -1) {
@@ -92,45 +89,40 @@ int ssnd_play(int no) {
mus_wav_load(slot, no);
}
mus_wav_play(slot, 1);
return OK;
}
// 指定の番号の効果音を再生停止
int ssnd_stop(int no, int fadetime) {
void ssnd_stop(int no, int fadetime) {
int slot = slt_find(no);
if (slot != -1) {
mus_wav_fadeout_start(slot, fadetime, 0, TRUE);
mus_wav_fadeout_start(slot, fadetime, 0, true);
cache[slot - SLOTOFFSET] = 0;
}
return OK;
}
// 指定の番号の効果音が再生終了するのを待つ
int ssnd_wait(int no) {
void ssnd_wait(int no) {
int slot = slt_find(no);
if (slot != -1) {
mus_wav_waitend(slot);
cache[slot - SLOTOFFSET] = 0;
}
return OK;
}
// 指定の効果音が終了するか、キーが押されるまで待つ
int ssnd_waitkey(int no, int *res) {
void ssnd_waitkey(int no, int *res) {
int slot = slt_find(no);
if (slot == -1) {
*res = 0;
return OK;
return;
}
if (sact.waitskiplv > 1) {
*res = SYS35KEY_RET;
return OK;
return;
}
sact.waittype = KEYWAIT_SIMPLE;
@@ -147,39 +139,33 @@ int ssnd_waitkey(int no, int *res) {
*res = sact.waitkey;
}
sact.waittype = KEYWAIT_NONE;
return OK;
}
// 左右チャンネルの反転した効果音をメモリに読み込む
int ssnd_prepareLRrev(int no) {
void ssnd_prepareLRrev(int no) {
mus_wav_load_lrsw(30, no); // slot は 30固定でいい?
return OK;
}
// 左右チャンネルの反転した効果音を再生
int ssnd_playLRrev(int no) {
void ssnd_playLRrev(int no) {
mus_wav_load_lrsw(30, no);
mus_wav_play(30, 1);
return OK;
}
// 指定の番号の効果音が存在するかどうかをチェック
int ssnd_getlinknum(int no) {
WARNING("NOT IMPLEMENTED");
return OK;
return 0;
}
// すべての再生中の効果音が再生を終了するのを待つ
int ssnd_stopall(int time) {
void ssnd_stopall(int time) {
int i;
for (i = 0; i < CACHEMAX; i++) {
if (cache[i] > 0) {
mus_wav_fadeout_start(i + SLOTOFFSET, time, 0, TRUE);
mus_wav_fadeout_start(i + SLOTOFFSET, time, 0, true);
cache[i] = 0;
}
}
return OK;
}
+10 -10
View File
@@ -24,15 +24,15 @@
#ifndef __SACTSOUND_H__
#define __SACTSOUND_H__
extern int ssnd_init();
extern int ssnd_play(int no);
extern int ssnd_stop(int no, int fadetime);
extern int ssnd_wait(int no);
extern int ssnd_waitkey(int no, int *res);
extern int ssnd_prepare(int no);
extern int ssnd_prepareLRrev(int no);
extern int ssnd_playLRrev(int no);
extern int ssnd_getlinknum(int no);
extern int ssnd_stopall(int time);
void ssnd_init(void);
void ssnd_play(int no);
void ssnd_stop(int no, int fadetime);
void ssnd_wait(int no);
void ssnd_waitkey(int no, int *res);
void ssnd_prepare(int no);
void ssnd_prepareLRrev(int no);
void ssnd_playLRrev(int no);
int ssnd_getlinknum(int no);
void ssnd_stopall(int time);
#endif /* __SACTSOUND_H__ */
+8 -17
View File
@@ -39,14 +39,13 @@ static int idxmax; // stack pointerの最大
/**
* 文字列変数スタックの初期化
*/
int sstr_init() {
void sstr_init(void) {
stack = malloc(sizeof(char *) * DEFSTACKSIZE);
idx = 0;
idxmax = DEFSTACKSIZE;
return OK;
}
int sstr_reset(void) {
void sstr_reset(void) {
for (int i = 0; i < idx; i++)
free(stack[i]);
idx = 0;
@@ -61,35 +60,30 @@ int sstr_reset(void) {
}
slist_free(sact.strreplace);
sact.strreplace = NULL;
return OK;
}
/**
* 文字列変数スタックに文字列を積む
* @param strno: シナリオ上での文字列変数番号
*/
int sstr_push(int strno) {
void sstr_push(int strno) {
if (idx >= idxmax) {
stack = realloc(stack, sizeof(char *) * idx*2);
idxmax = idx*2;
}
stack[idx++] = strdup(svar_get(strno));
return OK;
}
/**
* 文字列変数スタックから文字列を取り出す
* @param strno: スタックから戻した文字列を格納する文字列変数番号
*/
int sstr_pop(int strno) {
if (idx == 0) return NG;
void sstr_pop(int strno) {
if (idx == 0) return;
svar_set(strno, stack[--idx]);
free(stack[idx]);
return OK;
}
/**
@@ -97,22 +91,21 @@ int sstr_pop(int strno) {
* @param sstrno: 変換元文字列変数番号
* @param dstrno: 変換先文字列変数番号
*/
int sstr_regist_replace(int sstrno, int dstrno) {
void sstr_regist_replace(int sstrno, int dstrno) {
strexchange_t *ex;
if (sstrno == dstrno) return NG;
if (sstrno == dstrno) return;
ex = malloc(sizeof(strexchange_t));
ex->src = strdup(svar_get(sstrno));
ex->dst = strdup(svar_get(dstrno));
sact.strreplace = slist_append(sact.strreplace, ex);
return OK;
}
/**
* 数値 -> 文字列化
*/
int sstr_num2str(int strno, int fig, int nzeropad, int num) {
void sstr_num2str(int strno, int fig, int nzeropad, int num) {
char s[256], ss[256];
if (nzeropad) {
@@ -125,6 +118,4 @@ int sstr_num2str(int strno, int fig, int nzeropad, int num) {
sprintf(s, ss, num);
svar_set(strno, s);
return OK;
}
+6 -6
View File
@@ -24,12 +24,12 @@
#ifndef __SACTSTRING_H__
#define __SACTSTRING_H__
extern int sstr_init();
extern int sstr_reset(void);
extern int sstr_push(int strno);
extern int sstr_pop(int strno);
extern int sstr_regist_replace(int sstrtno, int dstrno);
extern int sstr_num2str(int strno, int fig, int nzeropad, int num);
void sstr_init(void);
void sstr_reset(void);
void sstr_push(int strno);
void sstr_pop(int strno);
void sstr_regist_replace(int sstrtno, int dstrno);
void sstr_num2str(int strno, int fig, int nzeropad, int num);
#endif /* __SACTSTRING_H__ */
+2 -4
View File
@@ -32,16 +32,14 @@
/*
sact timer subsystem 初期化
*/
int stimer_init() {
void stimer_init(void) {
stimer_reset(0, 0);
return OK;
}
// 指定IDのタイマーのリセット
int stimer_reset(int id, int val) {
void stimer_reset(int id, int val) {
gettimeofday(&(sact.timer[id].tv_base), NULL);
sact.timer[id].val = val;
return OK;
}
// 指定IDのタイマーの取得
+3 -3
View File
@@ -34,8 +34,8 @@ struct _stimer {
typedef struct _stimer stimer_t;
extern int stimer_init();
extern int stimer_reset(int id, int val);
extern int stimer_get(int id);
void stimer_init(void);
void stimer_reset(int id, int val);
int stimer_get(int id);
#endif
+4 -8
View File
@@ -33,8 +33,6 @@
#include "ags.h"
#include "input.h"
#include "sact.h"
#include "surface.h"
#include "ngraph.h"
#include "sprite.h"
#include "sdl_core.h"
#include "randMT.h"
@@ -73,12 +71,12 @@ static void quake1(float curstep, int diam, int round, int *adjx, int *adjy) {
@param wCount: 時間(1/100秒)
@param nfKeyEnable: キー抜け (1で有効)
*/
int sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
void sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
int sttime, edtime, curtime;
int key;
entrypoint *cb[2] = {quake0, quake1};
if (type > 1) return OK;
if (type > 1) return;
sttime = sdl_getTicks();
edtime = time * 10 + sttime;
@@ -86,16 +84,14 @@ int sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
int adjx, adjy;
cb[type]((float)(curtime - sttime)/(edtime - sttime), p1, p2, &adjx, &adjy);
ags_setViewArea(adjx, adjy, sf0->width, sf0->height);
ags_setViewArea(adjx, adjy, main_surface->w, main_surface->h);
ags_updateFull();
key = sys_keywait(10, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
if (cancel && key) break;
}
ags_setViewArea(0, 0, sf0->width, sf0->height);
ags_setViewArea(0, 0, main_surface->w, main_surface->h);
ags_updateFull();
return OK;
}
+103 -181
View File
@@ -26,33 +26,25 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "list.h"
#include "ngraph.h"
#include "ags.h"
#include "nact.h"
#include "sact.h"
#include "sprite.h"
#include "surface.h"
#include "sactcg.h"
#include "sactsound.h"
static int compare_spriteno_smallfirst(const void *a, const void *b);
#define sp_assert_no(no) do { \
#define SP_ASSERT_NO(no) do { \
if ((no) >= SPRITEMAX) { \
WARNING("no is too large (should be %d < %d)", no, SPRITEMAX); \
return NG; \
} \
} while (0)
#define sp_assert_null(no) do { \
if (sact.sp[no] == NULL) { \
WARNING("sprite %d is NULL", no); \
return NG; \
return; \
} \
} while (0)
@@ -72,27 +64,14 @@ static int compare_spriteno_smallfirst(const void *a, const void *b) {
}
// デフォルトの壁紙update
static int sp_draw_wall(sprite_t *sp) {
int sx, sy, w, h;
sx = sact.updaterect.x;
sy = sact.updaterect.y;
w = sact.updaterect.w;
h = sact.updaterect.h;
gr_fill(sf0, sx, sy, w, h, 0, 0, 0);
SACT_DEBUG("do update no=%d, sx=%d, sy=%d, w=%d, h=%d",
sp->no, sx, sy, w, h);
return OK;
static void sp_draw_wall(sprite_t *sp) {
SDL_FillRect(main_surface, &sact.updaterect, SDL_MapRGB(main_surface->format, 0, 0, 0));
}
/**
* sprite 関連の初期化
* @param none
* @return OK:成功, NG:失敗
*/
int sp_init() {
void sp_init(void) {
int i;
// DLL用メッセージ表示
@@ -109,7 +88,7 @@ int sp_init() {
sact.sp[i] = calloc(1, sizeof(sprite_t));
sact.sp[i]->no = i;
sact.sp[i]->type = SPRITE_NONE;
sact.sp[i]->show = FALSE;
sact.sp[i]->show = false;
}
// 壁紙(スプライト番号0)はデフォルトへ
@@ -117,15 +96,12 @@ int sp_init() {
// 壁紙を updateリストに追加
sact.updatelist = slist_append(sact.updatelist, sact.sp[0]);
return OK;
}
int sp_reset(void) {
void sp_reset(void) {
sp_clear_zkey_hidesprite_all();
sp_clear_quakesprite_all();
sp_free_all();
return OK;
}
/**
@@ -136,10 +112,10 @@ int sp_reset(void) {
* @param cg3: 3枚目のCG (ない場合は0)
* @param type: スプライトの種類
*/
int sp_new(int no, int cg1, int cg2, int cg3, int type) {
void sp_new(int no, int cg1, int cg2, int cg3, int type) {
sprite_t *sp;
sp_assert_no(no);
SP_ASSERT_NO(no);
sp = sact.sp[no];
@@ -161,7 +137,7 @@ int sp_new(int no, int cg1, int cg2, int cg3, int type) {
//初期のcurcgはcg1
sp->curcg = sp->cg1;
sp->show = TRUE; // 初期状態は表示
sp->show = true; // 初期状態は表示
sp->blendrate = 255; // ブレンド無し
sp->loc.x = 0; // 初期表示位置は(0,0)
sp->loc.y = 0;
@@ -172,8 +148,8 @@ int sp_new(int no, int cg1, int cg2, int cg3, int type) {
sp->cursize.width = 0;
sp->cursize.height = 0;
} else {
sp->cursize.width = sp->curcg->sf->width;
sp->cursize.height = sp->curcg->sf->height;
sp->cursize.width = sp->curcg->sf->w;
sp->cursize.height = sp->curcg->sf->h;
}
sp->freezed_state = 0; // 状態固定は無し
@@ -199,15 +175,13 @@ int sp_new(int no, int cg1, int cg2, int cg3, int type) {
sp_anime_setup(sp);
break;
}
return OK;
}
// メッセージスプライトの作成
int sp_new_msg(int no, int x, int y, int width, int height) {
void sp_new_msg(int no, int x, int y, int width, int height) {
sprite_t *sp;
sp_assert_no(no);
SP_ASSERT_NO(no);
sp = sact.sp[no];
@@ -220,7 +194,7 @@ int sp_new_msg(int no, int x, int y, int width, int height) {
sp->type = SPRITE_MSG;
sp->no = no;
sp->show = TRUE; // 初期状態は表示
sp->show = true; // 初期状態は表示
sp->blendrate = 255; // ブレンド無し
sp->freezed_state = 0; // 状態固定無し
sp->loc.x = x - sact.origin.x; // 初期表示位置
@@ -231,18 +205,16 @@ int 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;
return OK;
}
// 壁紙の設定
int sp_set_wall_paper(int no) {
void sp_set_wall_paper(int no) {
sprite_t *sp = sact.sp[0];
if (sp->curcg)
@@ -252,38 +224,35 @@ int sp_set_wall_paper(int no) {
if (sp->curcg) { // display specified CG
sp->update = DEFAULT_UPDATE;
sp->cursize.width = sp->curcg->sf->width;
sp->cursize.height = sp->curcg->sf->height;
sp->cursize.width = sp->curcg->sf->w;
sp->cursize.height = sp->curcg->sf->h;
} else { // Black
sp->cursize.height = sf0->height;
sp->cursize.height = main_surface->h;
sp->curcg = NULL;
sp->update = sp_draw_wall;
}
sp->type = SPRITE_WP;
sp->show = TRUE;
sp->show = true;
sp->blendrate = 255;
sp->cur.x = 0;
sp->cur.y = 0;
return OK;
}
// 全ての sprite を消去
int sp_free_all() {
void sp_free_all(void) {
int i;
for (i = 1; i < SPRITEMAX; i++) {
sp_free(i);
}
return OK;
}
// 指定のsprite を消去
int sp_free(int no) {
void sp_free(int no) {
sprite_t *sp;
sp_assert_no(no);
SP_ASSERT_NO(no);
sp = sact.sp[no];
@@ -310,7 +279,7 @@ int 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);
@@ -321,50 +290,46 @@ int sp_free(int no) {
memset(sp, 0, sizeof(sprite_t));
sp->type = SPRITE_NONE;
sp->no = no;
sp->show = FALSE;
sp->show = false;
memcpy(&(sp->numeral), &(back.numeral), sizeof(sp->numeral));
}
return OK;
}
// 表示状態の変更
int sp_set_show(int wNum, int wCount, int sShow) {
void sp_set_show(int wNum, int wCount, int sShow) {
int i;
boolean oldstate;
bool oldstate;
sprite_t *sp;
sp_assert_no(wNum);
SP_ASSERT_NO(wNum);
for (i = wNum; i < (wNum + wCount); i++) {
if (i >= (SPRITEMAX -1)) break;
sp = sact.sp[i];
oldstate = sp->show;
sp->show = (sShow == 1 ? TRUE : FALSE);
sp->show = sShow == 1;
}
return OK;
}
// 表示位置の設定
int sp_set_pos(int wNum, int wX, int wY) {
void sp_set_pos(int wNum, int wX, int wY) {
sprite_t *sp;
sp_assert_no(wNum);
SP_ASSERT_NO(wNum);
sp = sact.sp[wNum];
sp->loc.x = wX - sact.origin.x;
sp->loc.y = wY - sact.origin.y;
sp->cur.x = sp->loc.x;
sp->cur.y = sp->loc.y;
return OK;
}
// スプライトの移動
int sp_set_move(int wNum, int wX, int wY) {
void sp_set_move(int wNum, int wX, int wY) {
sprite_t *sp;
sp_assert_no(wNum);
SP_ASSERT_NO(wNum);
sp = sact.sp[wNum];
sp->move.to.x = wX - sact.origin.x;
@@ -378,59 +343,52 @@ int sp_set_move(int wNum, int wX, int wY) {
// moveするスプライトリストに登録
// 実際に move を開始するのは ~SP_DRAW(sp_update_all)が呼ばれたとき
sact.movelist = slist_append(sact.movelist, sp);
return OK;
}
// スプライト移動時間の設定
int sp_set_movetime(int wNum, int wTime) {
sp_assert_no(wNum);
void sp_set_movetime(int wNum, int wTime) {
SP_ASSERT_NO(wNum);
sact.sp[wNum]->move.time = wTime * 10;
sact.sp[wNum]->move.speed = 0;
return OK;
}
// スプライト移動速度の設定
int sp_set_movespeed(int wNum, int wSpeed) {
sp_assert_no(wNum);
void sp_set_movespeed(int wNum, int wSpeed) {
SP_ASSERT_NO(wNum);
if (wSpeed == 0) wSpeed = 1;
sact.sp[wNum]->move.speed = wSpeed;
sact.sp[wNum]->move.time = 0;
return OK;
}
// Zキーを押したときに隠すスプライトの登録
int sp_add_zkey_hidesprite(int wNum) {
void sp_add_zkey_hidesprite(int wNum) {
sprite_t *sp;
sp_assert_no(wNum);
SP_ASSERT_NO(wNum);
sp = sact.sp[wNum];
// 登録時点でまだ生成していないスプライトは隠さない
// シェルクレイルでまずいのがあったので中止
// if (sp->type == SPRITE_NONE) return NG;
// if (sp->type == SPRITE_NONE) return;
sact.sp_zhide = slist_append(sact.sp_zhide, sp);
return OK;
}
// 上で登録したスプライトの削除
int sp_clear_zkey_hidesprite_all() {
void sp_clear_zkey_hidesprite_all(void) {
slist_free(sact.sp_zhide);
sact.sp_zhide = NULL;
return OK;
}
// スプライト状態の固化
int sp_freeze_sprite(int wNum, int wIndex) {
void sp_freeze_sprite(int wNum, int wIndex) {
sprite_t *sp;
void *oldstate;
sp_assert_no(wNum);
SP_ASSERT_NO(wNum);
sp = sact.sp[wNum];
sp->freezed_state = wIndex;
@@ -444,74 +402,60 @@ int sp_freeze_sprite(int wNum, int wIndex) {
case 3:
sp->curcg = sp->cg3; break;
}
return OK;
}
// 上で固化した状態の解除
int sp_thaw_sprite(int wNum) {
sp_assert_no(wNum);
void sp_thaw_sprite(int wNum) {
SP_ASSERT_NO(wNum);
sact.sp[wNum]->freezed_state = 0;
return OK;
}
// SP_QUAKEで揺らすスプライトの登録
int sp_add_quakesprite(int wNum) {
sp_assert_no(wNum);
void sp_add_quakesprite(int wNum) {
SP_ASSERT_NO(wNum);
sact.sp_quake = slist_append(sact.sp_quake, sact.sp[wNum]);
return OK;
}
// 上で登録したスプライトの削除
int sp_clear_quakesprite_all() {
void sp_clear_quakesprite_all(void) {
slist_free(sact.sp_quake);
sact.sp_quake = NULL;
return OK;
}
// アニメーションスプライトの間隔の設定
int sp_set_animeinterval(int wNum, int wTime) {
sp_assert_no(wNum);
void sp_set_animeinterval(int wNum, int wTime) {
SP_ASSERT_NO(wNum);
if (sact.sp[wNum]->type != SPRITE_ANIME) return NG;
if (sact.sp[wNum]->type != SPRITE_ANIME) return;
sact.sp[wNum]->u.anime.interval = wTime * 10;
return OK;
}
// スプライトのブレンド率の設定
int sp_set_blendrate(int wNum, int wCount, int rate) {
void sp_set_blendrate(int wNum, int wCount, int rate) {
int i;
sprite_t *sp;
sp_assert_no(wNum);
SP_ASSERT_NO(wNum);
for (i = wNum; i < (wNum + wCount); i++) {
if (i >= (SPRITEMAX -1)) break;
sp = sact.sp[i];
sp->blendrate = rate;
}
return OK;
}
// スプライトが create されているかどうかの取得
int sp_query_isexist(int wNum, int *ret) {
if (wNum >= SPRITEMAX) goto errexit;
if (sact.sp[wNum]->type == SPRITE_NONE) goto errexit;
*ret = 1;
return OK;
errexit:
*ret = 0;
return NG;
bool sp_exists(int wNum) {
if (wNum >= SPRITEMAX) return false;
if (sact.sp[wNum]->type == SPRITE_NONE) return false;
return true;
}
// スプライトのタイプと何番のCGがセットされているかの取得
int sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3) {
bool sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3) {
sprite_t *sp;
if (wNum >= SPRITEMAX) goto errexit;
@@ -524,46 +468,46 @@ int sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3) {
*vcg2 = sp->cg2 ? sp->cg2->no : 0;
*vcg3 = sp->cg3 ? sp->cg3->no : 0;
return OK;
return true;
errexit:
*vtype = 0;
*vcg1 = 0;
*vcg2 = 0;
*vcg3 = 0;
return NG;
return false;
}
// スプライトの表示状態の取得
int sp_query_show(int wNum, int *vShow) {
bool sp_query_show(int wNum, int *vShow) {
if (wNum >= SPRITEMAX) goto errexit;
if (sact.sp[wNum]->type == SPRITE_NONE) goto errexit;
*vShow = sact.sp[wNum]->show ? 1: 0;
return OK;
return true;
errexit:
*vShow = 0;
return NG;
return false;
}
// スプライトの表示位置の取得
int sp_query_pos(int wNum, int *vx, int *vy) {
bool sp_query_pos(int wNum, int *vx, int *vy) {
if (wNum >= SPRITEMAX) goto errexit;
if (sact.sp[wNum]->type == SPRITE_NONE) goto errexit;
*vx = sact.sp[wNum]->loc.x;
*vy = sact.sp[wNum]->loc.y;
return OK;
return true;
errexit:
*vx = 0;
*vy = 0;
return NG;
return false;
}
// スプライトの大きさの取得
int sp_query_size(int wNum, int *vw, int *vh) {
bool sp_query_size(int wNum, int *vw, int *vh) {
sprite_t *sp;
if (wNum >= SPRITEMAX) goto errexit;
@@ -575,88 +519,76 @@ int sp_query_size(int wNum, int *vw, int *vh) {
*vw = sp->cursize.width;
*vh = sp->cursize.height;
return OK;
return true;
errexit:
*vw = 0;
*vh = 0;
return NG;
return false;
}
// テキストスプライトの現在の文字表示位置の取得
int sp_query_textpos(int wNum, int *vx, int *vy) {
bool sp_query_textpos(int wNum, int *vx, int *vy) {
if (wNum >= SPRITEMAX) goto errexit;
sprite_t *sp = sact.sp[wNum];
if (sp->type != SPRITE_MSG) goto errexit;
*vx = sp->u.msg.dspcur.x + sp->loc.x;
*vy = sp->u.msg.dspcur.y + sp->loc.y;
return OK;
return true;
errexit:
*vx = 0;
*vy = 0;
return NG;
return false;
}
// NumeralXXXのCGのセット
int sp_num_setcg(int nNum, int nIndex, int nCG) {
sp_assert_no(nNum);
void sp_num_setcg(int nNum, int nIndex, int nCG) {
SP_ASSERT_NO(nNum);
sact.sp[nNum]->numeral.cg[nIndex] = nCG;
return OK;
}
// NumeralXXXのCGの取得
int sp_num_getcg(int nNum, int nIndex, int *vCG) {
sp_assert_no(nNum);
void sp_num_getcg(int nNum, int nIndex, int *vCG) {
SP_ASSERT_NO(nNum);
*vCG = sact.sp[nNum]->numeral.cg[nIndex];
return OK;
}
// NumeralXXXの位置のセット
int sp_num_setpos(int nNum, int nX, int nY) {
sp_assert_no(nNum);
void sp_num_setpos(int nNum, int nX, int nY) {
SP_ASSERT_NO(nNum);
sact.sp[nNum]->numeral.pos.x = nX;
sact.sp[nNum]->numeral.pos.y = nY;
return OK;
}
// NumeralXXXの位置の取得
int sp_num_getpos(int nNum, int *vX, int *vY) {
sp_assert_no(nNum);
void sp_num_getpos(int nNum, int *vX, int *vY) {
SP_ASSERT_NO(nNum);
*vX = sact.sp[nNum]->numeral.pos.x;
*vY = sact.sp[nNum]->numeral.pos.y;
return OK;
}
// NumeralXXXのスパンのセット
int sp_num_setspan(int nNum, int nSpan) {
sp_assert_no(nNum);
void sp_num_setspan(int nNum, int nSpan) {
SP_ASSERT_NO(nNum);
sact.sp[nNum]->numeral.span = nSpan;
return OK;
}
// NumeralXXXのスパンの取得
int sp_num_getspan(int nNum, int *vSpan) {
sp_assert_no(nNum);
void sp_num_getspan(int nNum, int *vSpan) {
SP_ASSERT_NO(nNum);
*vSpan = sact.sp[nNum]->numeral.span;
return OK;
}
// すべての説明スプライトの削除
int sp_exp_clear() {
void sp_exp_clear(void) {
SList *node;
for (node = sact.updatelist; node; node = node->next) {
@@ -664,75 +596,65 @@ int sp_exp_clear() {
if (sp == NULL) continue;
sp_exp_del(sp->no);
}
return OK;
}
// 説明スプライトの登録
int sp_exp_add(int nNumSP1, int nNumSP2) {
void sp_exp_add(int nNumSP1, int nNumSP2) {
sprite_t *swsp, *expsp;
sp_assert_no(nNumSP1);
sp_assert_no(nNumSP2);
SP_ASSERT_NO(nNumSP1);
SP_ASSERT_NO(nNumSP2);
swsp = sact.sp[nNumSP1];
expsp = sact.sp[nNumSP2];
swsp->expsp = slist_append(swsp->expsp, expsp);
return OK;
}
// 説明スプライトの削除
int sp_exp_del(int nNum) {
void sp_exp_del(int nNum) {
sprite_t *sp;
sp_assert_no(nNum);
SP_ASSERT_NO(nNum);
sp = sact.sp[nNum];
slist_free(sp->expsp);
sp->expsp = NULL;
return OK;
}
// スプライトサウンドのセット
int sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3) {
void sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3) {
sprite_t *sp;
sp_assert_no(wNumSP);
SP_ASSERT_NO(wNumSP);
sp = sact.sp[wNumSP];
sp->numsound1 = wNumWave1;
sp->numsound2 = wNumWave2;
sp->numsound3 = wNumWave3;
return OK;
}
// すべてのスプライトサウンドの終了を待つ
int sp_sound_wait() {
void sp_sound_wait(void) {
WARNING("NOT IMPLEMENTED");
return OK;
}
// 範囲外をクリックしたときのサウンドの設定
int sp_sound_ob(int wNumWave) {
void sp_sound_ob(int wNumWave) {
sact.numsoundob = wNumWave;
return OK;
}
/**
* 指定の座標が現在のスプライトの位置の範囲に入っているか?
* @param sp: 調べる対象のスプライト
* @param x,y: 座標
* @return: TRUE:入っている, FALSE: 入っていない
* @return: true:入っている, false: 入っていない
*/
boolean sp_is_insprite(sprite_t *sp, int x, int y) {
bool sp_is_insprite(sprite_t *sp, int x, int y) {
uint8_t *dp;
if (x < 0 || y < 0 || x >= sf0->width || y >= sf0->height) return FALSE;
if (x < 0 || y < 0 || x >= main_surface->w || y >= main_surface->h) return false;
dp = GETOFFSET_PIXEL(sact.dmap, x, y);
dp = PIXEL_AT(sact.dmap, x, y);
return (*(uint16_t *)dp == sp->no);
}
+81 -85
View File
@@ -29,125 +29,121 @@
#define DEFAULT_UPDATE sp_draw
// in sprite.c
extern int sp_init();
extern int sp_reset(void);
extern int sp_new(int no, int cg1, int cg2, int cg3, int type);
extern int sp_new_msg(int no, int x, int y, int width, int height);
extern int sp_set_wall_paper(int no);
extern int sp_free_all();
extern int sp_free(int no);
extern int sp_set_show(int no, int cnt, int flag);
extern int sp_set_pos(int wNum, int wX, int wY);
extern int sp_set_move(int wNum, int wX, int wY);
extern int sp_set_movetime(int wNum, int wTime);
extern int sp_set_movespeed(int wNum, int wTime);
extern int sp_add_zkey_hidesprite(int wNum);
extern int sp_clear_zkey_hidesprite_all();
extern int sp_freeze_sprite(int wNum, int wIndex);
extern int sp_thaw_sprite(int wNum);
extern int sp_add_quakesprite(int wNum);
extern int sp_clear_quakesprite_all();
extern int sp_set_animeinterval(int wNum, int wTime);
extern boolean sp_is_insprite(sprite_t *sp, int x, int y);
extern int sp_set_blendrate(int wNum, int wCount, int rate);
extern int sp_query_isexist(int wNum, int *ret);
extern int sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3);
extern int sp_query_show(int wNum, int *vShow);
extern int sp_query_pos(int wNum, int *vx, int *vy);
extern int sp_query_size(int wNum, int *vw, int *vh);
extern int sp_query_textpos(int wNum, int *vx, int *vy);
extern int sp_num_setcg(int nNum, int nIndex, int nCG);
extern int sp_num_getcg(int nNum, int nIndex, int *vCG);
extern int sp_num_setpos(int nNum, int nX, int nY);
extern int sp_num_getpos(int nNum, int *vX, int *vY);
extern int sp_num_setspan(int nNum, int nSpan);
extern int sp_num_getspan(int nNUm, int *vSpan);
extern int sp_exp_clear();
extern int sp_exp_add(int nNumSP1, int nNumSP2);
extern int sp_exp_del(int wNum);
extern int sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3);
extern int sp_sound_wait();
extern int sp_sound_ob(int wNumWave);
void sp_init(void);
void sp_reset(void);
void sp_new(int no, int cg1, int cg2, int cg3, int type);
void sp_new_msg(int no, int x, int y, int width, int height);
void sp_set_wall_paper(int no);
void sp_free_all(void);
void sp_free(int no);
void sp_set_show(int no, int cnt, int flag);
void sp_set_pos(int wNum, int wX, int wY);
void sp_set_move(int wNum, int wX, int wY);
void sp_set_movetime(int wNum, int wTime);
void sp_set_movespeed(int wNum, int wTime);
void sp_add_zkey_hidesprite(int wNum);
void sp_clear_zkey_hidesprite_all(void);
void sp_freeze_sprite(int wNum, int wIndex);
void sp_thaw_sprite(int wNum);
void sp_add_quakesprite(int wNum);
void sp_clear_quakesprite_all(void);
void sp_set_animeinterval(int wNum, int wTime);
bool sp_is_insprite(sprite_t *sp, int x, int y);
void sp_set_blendrate(int wNum, int wCount, int rate);
bool sp_exists(int wNum);
bool sp_query_info(int wNum, int *vtype, int *vcg1, int *vcg2, int *vcg3);
bool sp_query_show(int wNum, int *vShow);
bool sp_query_pos(int wNum, int *vx, int *vy);
bool sp_query_size(int wNum, int *vw, int *vh);
bool sp_query_textpos(int wNum, int *vx, int *vy);
void sp_num_setcg(int nNum, int nIndex, int nCG);
void sp_num_getcg(int nNum, int nIndex, int *vCG);
void sp_num_setpos(int nNum, int nX, int nY);
void sp_num_getpos(int nNum, int *vX, int *vY);
void sp_num_setspan(int nNum, int nSpan);
void sp_num_getspan(int nNUm, int *vSpan);
void sp_exp_clear(void);
void sp_exp_add(int nNumSP1, int nNumSP2);
void sp_exp_del(int wNum);
void sp_sound_set(int wNumSP, int wNumWave1, int wNumWave2, int wNumWave3);
void sp_sound_wait(void);
void sp_sound_ob(int wNumWave);
// in sprite_update.c
extern int sp_update_all(boolean syncscreen);
extern int sp_update_clipped();
extern int sp_updateme(sprite_t *sp);
extern int sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
void sp_update_all(bool syncscreen);
void sp_update_clipped();
void sp_updateme(sprite_t *sp);
void sp_updateme_part(sprite_t *sp, int x, int y, int w, int h);
// in sprite_draw.c
extern int sp_draw(sprite_t *sf);
extern int sp_draw2(sprite_t *sf, cginfo_t *cg);
extern void sp_draw_dmap(void* data, void* userdata);
void sp_draw(sprite_t *sf);
void sp_draw_dmap(void* data, void* userdata);
// in sprite_msg.c
extern void smsg_add(const char *msg);
extern void smsg_newline(int wNum, int size);
extern void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wFont, int wSpeed, int wLineSpace, int wAlign, int wRSize, int wRFont, int wRLineSpace, int *wLength);
extern void smsg_clear(int wNum);
extern int smsg_is_empty();
extern int smsg_peek(int nTopStringNum);
extern int smsg_keywait(int sp1, int sp2, int timeout);
extern int smsg_update(sprite_t *sp);
void smsg_add(const char *msg);
void smsg_newline(int wNum, int size);
void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wFont, int wSpeed, int wLineSpace, int wAlign, int wRSize, int wRFont, int wRLineSpace, int *wLength);
void smsg_clear(int wNum);
bool smsg_is_empty();
int smsg_peek(int nTopStringNum);
int smsg_keywait(int sp1, int sp2, int timeout);
void smsg_update(sprite_t *sp);
// in sprite_sel.c
extern void ssel_init();
extern void ssel_reset(void);
extern void ssel_clear();
extern void ssel_add(int nString, int wI);
extern int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace, int wChoiceAutoMoveCursor, int nAlign);
void ssel_init();
void ssel_reset(void);
void ssel_clear();
void ssel_add(int nString, int wI);
int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace, int wChoiceAutoMoveCursor, int nAlign);
// in sprite_event.c
extern void spev_callback(agsevent_t *e);
extern void spev_add_eventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
extern void spev_remove_eventlistener(sprite_t *sp);
void spev_callback(agsevent_t *e);
void spev_add_eventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
void spev_remove_eventlistener(sprite_t *sp);
// in sprite_tevent.c
extern void spev_add_teventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
extern void spev_remove_teventlistener(sprite_t *sp);
extern void spev_main();
void spev_add_teventlistener(sprite_t *sp, int (*cb)(sprite_t *, agsevent_t *));
void spev_remove_teventlistener(sprite_t *sp);
void spev_main();
// in sprite_move.c
extern void spev_move_setup(void* data, void* userdata);
extern void spev_move_waitend(sprite_t *sp, int dx, int dy, int time);
extern void spev_wait4moving_sp();
void spev_move_setup(void* data, void* userdata);
void spev_move_waitend(sprite_t *sp, int dx, int dy, int time);
void spev_wait4moving_sp();
// in sprite_switch.c
extern int sp_sw_setup(sprite_t *sp);
void sp_sw_setup(sprite_t *sp);
// in sprite_get.c
extern int sp_get_setup(sprite_t *sp);
void sp_get_setup(sprite_t *sp);
// in sprite_put.c
extern int sp_put_setup(sprite_t *sp);
void sp_put_setup(sprite_t *sp);
// in sprite_anime.c
extern int sp_anime_setup(sprite_t *sp);
void sp_anime_setup(sprite_t *sp);
// in sprite_eupdate.c
extern int sp_eupdate(int type, int time, int key);
void sp_eupdate(int type, int time, int key);
// in sprite_quake.c
extern int sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitude, int wCount, int cancel);
void sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitude, int wCount, int cancel);
// in sprite_keywait.c
extern int sp_keywait(int *vOK, int *vRND, int *vRsv1, int *vRsv2, int *vRsv3, int timeout);
void sp_keywait(int *vOK, int *vRND, int *vRsv1, int *vRsv2, int *vRsv3, int timeout);
// in screen_quake.c
extern int sp_quake_screen(int type, int p1, int p2, int time, int cancel);
// in sactamask.c
extern int sp_eupdate_amap(int type, int time, int key);
void sp_quake_screen(int type, int p1, int p2, int time, int cancel);
// in sprite_xmenu.c
extern int spxm_clear(void);
extern int spxm_register(int reginum, int menuid);
extern int spxm_getnum(int reginum);
extern int spxm_gettext(int regnum, int strno);
extern int spxm_titlereg(void);
extern int spxm_titleget(int strno);
void spxm_clear(void);
void spxm_register(int reginum, int menuid);
int spxm_getnum(int reginum);
void spxm_gettext(int regnum, int strno);
void spxm_titlereg(void);
void spxm_titleget(int strno);
#endif /* __SPRITE_H__ */
+1 -3
View File
@@ -81,7 +81,7 @@ static void cb_remove(sprite_t *sp) {
sp_new
@param sp:
*/
int sp_anime_setup(sprite_t *sp) {
void sp_anime_setup(sprite_t *sp) {
int n = 0;
sp->u.anime.interval = 500; // デフォルトの間隔 0.5秒
@@ -96,6 +96,4 @@ int sp_anime_setup(sprite_t *sp) {
spev_add_teventlistener(sp, eventCB_ANIM);
sp->remove = cb_remove;
return OK;
}
+44 -102
View File
@@ -23,55 +23,32 @@
#include "config.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "system.h"
#include "ags.h"
#include "graphics.h"
#include "sact.h"
#include "surface.h"
#include "ngraph.h"
#include "sprite.h"
static void fill_dmap(int dx ,int dy, int w, int h, uint16_t val);
static void fill_dmap_mask(surface_t *src, int sx, int sy, int dx ,int dy, int w, int h, uint16_t val);
// 矩形の depthmap を描画
static void fill_dmap(int dx ,int dy, int w, int h, uint16_t val) {
uint8_t *dp, *dp_;
int x, y;
dp = dp_ = (GETOFFSET_PIXEL(sact.dmap, dx, dy));
for (x = 0; x < w; x++) {
*((uint16_t *)dp + x) = val;
}
dp += sact.dmap->bytes_per_line;
for (y = 1; y < h; y++) {
memcpy(dp, dp_, w * 2);
dp += sact.dmap->bytes_per_line;
}
}
// alphamapにしたがって、alpha値が0より大きいところを指定のdepthとする
static void fill_dmap_mask(surface_t *src, int sx, int sy, int dx ,int dy, int w, int h, uint16_t val) {
static void fill_dmap_mask(SDL_Surface *src, int sx, int sy, int dx ,int dy, int w, int h, uint16_t val) {
uint8_t *sp, *dp;
int x, y;
dp = GETOFFSET_PIXEL(sact.dmap, dx, dy);
sp = GETOFFSET_ALPHA(src, sx, sy);
assert(src->format->Amask == 0xff000000);
dp = PIXEL_AT(sact.dmap, dx, dy);
sp = ALPHA_AT(src, sx, sy);
for (y = 0; y < h; y++) {
uint8_t *yls = (uint8_t *)(sp + y * src->width);
uint16_t *yld = (uint16_t *)(dp + y * sact.dmap->bytes_per_line);
uint8_t *yls = sp + y * src->pitch;
uint16_t *yld = (uint16_t *)(dp + y * sact.dmap->pitch);
for (x = 0; x < w; x++) {
if (*yls > 0) *yld = val;
yls++; yld++;
yls += 4; yld++;
}
}
}
@@ -80,66 +57,34 @@ static void fill_dmap_mask(surface_t *src, int sx, int sy, int dx ,int dy, int w
sprite (CG) surface0
@param sp:
*/
int sp_draw(sprite_t *sp) {
if (sp == NULL) return NG;
return sp_draw2(sp, sp->curcg);
}
/*
spriteの指定のCGを surface0
(?)
@param sp:
@param cg: CG
*/
int sp_draw2(sprite_t *sp, cginfo_t *cg) {
surface_t update;
int sx, sy, w, h, dx, dy;
if (cg == NULL) return NG;
if (cg->sf == NULL) return NG;
void sp_draw(sprite_t *sp) {
if (sp == NULL) return;
cginfo_t *cg = sp->curcg;
if (cg == NULL) return;
if (cg->sf == NULL) return;
// 更新領域の確定
update.width = sact.updaterect.w;
update.height = sact.updaterect.h;
sx = 0;
sy = 0;
dx = sp->cur.x - sact.updaterect.x;
dy = sp->cur.y - sact.updaterect.y;
w = cg->sf->width;
h = cg->sf->height;
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
return NG;
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = cg->sf->w;
int h = cg->sf->h;
if (!ags_clipCopyRect(&cg_rect, &sact.updaterect, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
dx += sact.updaterect.x;
dy += sact.updaterect.y;
if (cg->sf->alpha) {
// alpha map がある場合
gre_BlendUseAMap(sf0, dx, dy,
sf0, dx, dy,
cg->sf, sx, sy, w, h,
cg->sf, sx, sy,
sp->blendrate);
if (SDL_ISPIXELFORMAT_ALPHA(cg->sf->format->format) || sp->blendrate < 255) {
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(cg->sf, sp->blendrate);
} else {
if (sp->blendrate == 255) {
// alpha値指定が無い場合
gr_copy(sf0, dx, dy, cg->sf, sx, sy, w, h);
} else if (sp->blendrate > 0) {
// alpha値指定がある場合
gre_Blend(sf0, dx, dy,
sf0, dx, dy,
cg->sf, sx, sy, w, h,
sp->blendrate);
}
SDL_SetSurfaceBlendMode(cg->sf, SDL_BLENDMODE_NONE);
}
SDL_BlitSurface(cg->sf, &(SDL_Rect){sx, sy, w, h}, main_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);
return OK;
}
/*
@@ -147,38 +92,35 @@ int sp_draw2(sprite_t *sp, cginfo_t *cg) {
*/
void sp_draw_dmap(void* data, void* userdata) {
sprite_t *sp = (sprite_t *)data;
cginfo_t *cg;
surface_t update;
int sx, sy, w, h, dx, dy;
// 非表示状態の時は無視
if (!sp->show) return;
// ドラッグ中のスプライトは無視
if (sp == sact.draggedsp) return;
cg = sp->curcg;
cginfo_t *cg = sp->curcg;
if (cg == NULL) return;
if (cg->sf == NULL) return;
// depth map を書く領域を確定
update.width = sf0->width;
update.height = sf0->height;
sx = 0;
sy = 0;
dx = sp->cur.x;
dy = sp->cur.y;
w = cg->sf->width;
h = cg->sf->height;
if (!gr_clip(cg->sf, &sx, &sy, &w, &h, &update, &dx, &dy)) {
SDL_Rect cg_rect = {0, 0, cg->sf->w, cg->sf->h};
SDL_Rect screen_rect = {0, 0, main_surface->w, main_surface->h};
int sx = 0;
int sy = 0;
int dx = sp->cur.x;
int dy = sp->cur.y;
int w = cg->sf->w;
int h = cg->sf->h;
if (!ags_clipCopyRect(&cg_rect, &screen_rect, &sx, &sy, &dx, &dy, &w, &h)) {
return;
}
if (cg->sf->alpha) {
if (SDL_ISPIXELFORMAT_ALPHA(cg->sf->format->format)) {
fill_dmap_mask(cg->sf, sx, sy, dx, dy, w, h, sp->no);
} else {
fill_dmap(dx, dy, w, h, sp->no);
SDL_FillRect(sact.dmap, &(SDL_Rect){dx, dy, w, h}, sp->no);
}
return;
+5 -7
View File
@@ -25,7 +25,6 @@
#include "portab.h"
#include "system.h"
#include "ngraph.h"
#include "ags.h"
#include "input.h"
#include "sact.h"
@@ -38,20 +37,20 @@
@param time:
@param cancel: (0:, 1:)
*/
int sp_eupdate(int type, int time, int cancel) {
void sp_eupdate(int type, int time, int cancel) {
if (sact.waitskiplv > 1) {
sp_update_all(TRUE);
return OK;
sp_update_all(true);
return;
}
sp_update_all(FALSE);
sp_update_all(false);
enum sdl_effect_type sdl_effect = from_sact_effect(type);
if (sdl_effect == EFFECT_INVALID) {
WARNING("Unimplemented effect %d", type);
type = EFFECT_CROSSFADE;
}
SDL_Rect rect = { 0, 0, sf0->width, sf0->height };
SDL_Rect rect = { 0, 0, main_surface->w, main_surface->h };
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, 0, 0, sdl_getDIB(), 0, 0, sdl_effect);
int sttime, curtime;
@@ -67,5 +66,4 @@ int sp_eupdate(int type, int time, int cancel) {
}
sdl_effect_finish(eff);
ags_updateFull();
return OK;
}
+16 -16
View File
@@ -91,11 +91,11 @@ static void cb_waitkey_selection(agsevent_t *e);
static void cb_focused_swsp(void* s, void* data) {
sprite_t *sp = (sprite_t *)s;
int *update = (int *)data;
boolean oldstate = sp->show;
bool oldstate = sp->show;
SACT_DEBUG("show up spex %d", sp->no);
sp->show = TRUE;
sp->show = true;
if (oldstate != sp->show) {
(*update)++;
sp_updateme(sp);
@@ -109,11 +109,11 @@ static void cb_focused_swsp(void* s, void* data) {
static void cb_defocused_swsp(void* s, void* data) {
sprite_t *sp = (sprite_t *)s;
int *update = (int *)data;
boolean oldstate = sp->show;
bool oldstate = sp->show;
SACT_DEBUG("hide spex %d", sp->no);
sp->show = FALSE;
sp->show = false;
if (oldstate != sp->show) {
(*update)++;
sp_updateme(sp);
@@ -124,7 +124,7 @@ static void cb_defocused_swsp(void* s, void* data) {
static void cb_focused_zkey(void* s, void* data) {
sprite_t *sp = (sprite_t *)s;
int *update = (int *)data;
boolean oldstate = sp->show;
bool oldstate = sp->show;
sp->show = sp->show_save;
if (oldstate != sp->show) {
@@ -137,9 +137,9 @@ static void cb_focused_zkey(void* s, void* data) {
static void cb_defocused_zkey(void* s, void* data) {
sprite_t *sp = (sprite_t *)s;
int *update = (int *)data;
boolean oldstate = sp->show;
bool oldstate = sp->show;
sp->show = FALSE;
sp->show = false;
if (oldstate != sp->show) {
(*update)++;
sp_updateme(sp);
@@ -174,7 +174,7 @@ static int cb_focused(sprite_t *sp) {
sp->curcg = sp->cg2;
update++;
}
sp->focused = TRUE;
sp->focused = true;
SACT_DEBUG("get forcused %d, type %d", sp->no, sp->type);
if (sp->numsound1) {
ssnd_play(sp->numsound1);
@@ -197,7 +197,7 @@ static int cb_defocused(sprite_t *sp) {
}
sp->curcg = sp->cg1;
update++;
sp->focused = FALSE;
sp->focused = false;
SACT_DEBUG("lost forcused %d", sp->no);
}
@@ -216,11 +216,11 @@ static void cb_waitkey_simple(agsevent_t *e) {
cur = sdl_getTicks();
if (!sact.zhiding) {
slist_foreach(sact.sp_zhide, cb_defocused_zkey, &update);
sact.zhiding = TRUE;
sact.zdooff = TRUE;
sact.zhiding = true;
sact.zdooff = true;
sact.zofftime = cur;
} else {
sact.zdooff = FALSE;
sact.zdooff = false;
}
}
break;
@@ -229,14 +229,14 @@ static void cb_waitkey_simple(agsevent_t *e) {
// back log view mode に移行
// MessageKey 待ちのときのみ
if (sact.waittype != KEYWAIT_MESSAGE) break;
if (sblog_start() == OK)
if (sblog_start())
sact.waittype = KEYWAIT_BACKLOG;
break;
case AGSEVENT_BUTTON_RELEASE:
if (sact.zhiding) {
slist_foreach(sact.sp_zhide, cb_focused_zkey, &update);
sact.zhiding = FALSE;
sact.zhiding = false;
}
// fall through
@@ -246,14 +246,14 @@ static void cb_waitkey_simple(agsevent_t *e) {
cur = sdl_getTicks();
if (500 < (cur - sact.zofftime) || !sact.zdooff) {
slist_foreach(sact.sp_zhide, cb_focused_zkey, &update);
sact.zhiding = FALSE;
sact.zhiding = false;
}
break;
case KEY_PAGEUP:
case KEY_PAGEDOWN:
// MessageKey 待ちのときのみ
if (sact.waittype != KEYWAIT_MESSAGE) break;
if (sblog_start() == OK)
if (sblog_start())
sact.waittype = KEYWAIT_BACKLOG;
break;
default:
+6 -8
View File
@@ -42,9 +42,9 @@ static void cb_remove(sprite_t *sp);
static void cb_defocused_swsp(void* s, void* data) {
sprite_t *sp = (sprite_t *)s;
int *update = (int *)data;
boolean oldstate = sp->show;
bool oldstate = sp->show;
sp->show = FALSE;
sp->show = false;
if (oldstate != sp->show) {
(*update)++;
sp_updateme(sp);
@@ -61,7 +61,7 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
if (e->code != AGSEVENT_BUTTON_LEFT) break;
// drag開始時のマウスの位置記録
sp->u.get.dragging = TRUE;
sp->u.get.dragging = true;
sp->u.get.dragstart.x = e->mousex;
sp->u.get.dragstart.y = e->mousey;
@@ -73,7 +73,7 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
// スプライトの表示を一番前に持って来る
sact.draggedsp = sp;
sact.dropped = FALSE;
sact.dropped = false;
// 説明スプライトがある場合は、それを非表示にする
if (sp->expsp) {
@@ -92,7 +92,7 @@ static int eventCB_GET(sprite_t *sp, agsevent_t *e) {
if (!sp->u.get.dragging) break;
sact.dropped = TRUE;
sact.dropped = true;
break;
case AGSEVENT_MOUSE_MOTION:
@@ -128,10 +128,8 @@ static void cb_remove(sprite_t *sp) {
sp_new
@param sp:
*/
int sp_get_setup(sprite_t *sp) {
void sp_get_setup(sprite_t *sp) {
spev_add_eventlistener(sp, eventCB_GET);
sp->remove = cb_remove;
return OK;
}
+13 -17
View File
@@ -33,15 +33,13 @@
#include "ags.h"
#include "nact.h"
#include "input.h"
#include "ngraph.h"
#include "surface.h"
#include "sact.h"
#include "sprite.h"
#include "sactsound.h"
static void hidesprite(sprite_t *sp);
static boolean waitcond(int endtime);
static bool waitcond(int endtime);
@@ -57,23 +55,23 @@ static void hidesprite(sprite_t *sp) {
}
sp_updateme(sp);
sp->show = FALSE;
sp->show = false;
sp_update_clipped();
}
/*
@param endtime:
@return: TRUE FALSE
@return: true false
*/
static boolean waitcond(int endtime) {
static bool waitcond(int endtime) {
int curtime = sdl_getTicks();
if (curtime >= endtime) return TRUE;
if (curtime >= endtime) return true;
if (sact.dropped) {
sact.draggedsp->u.get.dragging = FALSE;
sact.draggedsp->u.get.dragging = false;
if (sact.waitkey != -1) {
// dropしたスプライトをじわじわ消す
hidesprite(sact.draggedsp);
@@ -81,8 +79,8 @@ static boolean waitcond(int endtime) {
sact.sp_result_put = sact.waitkey;
sp_free(sact.draggedsp->no);
sact.draggedsp = NULL;
sact.dropped = FALSE;
return TRUE;
sact.dropped = false;
return true;
} else {
// PUT/SWPUTスプライト以外のところにdropした場合
sprite_t *sp = sact.draggedsp;
@@ -99,12 +97,12 @@ static boolean waitcond(int endtime) {
ssnd_play(sact.draggedsp->numsound3);
}
sact.draggedsp = NULL;
sact.dropped = FALSE;
sact.dropped = false;
}
}
// その他キー入力があれば終了
return sact.waitkey == -1 ? FALSE : TRUE;
return sact.waitkey != -1;
}
/*
@@ -116,11 +114,11 @@ static boolean waitcond(int endtime) {
@param vD03: =1, =0
@param wTime: (1/100sec)
*/
int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout) {
void sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout) {
int curtime, endtime;
// とりあえず全更新
sp_update_all(TRUE);
sp_update_all(true);
// depthmap を準備
slist_foreach(sact.updatelist, sp_draw_dmap, NULL);
@@ -136,7 +134,7 @@ int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout
// とりあえず、現在のマウス位置を送って、switch sprite の
// 状態を更新しておく
MyPoint p;
sys_getMouseInfo(&p, FALSE);
sys_getMouseInfo(&p, false);
agsevent_t agse = {
.type = AGSEVENT_MOUSE_MOTION,
.mousex = p.x,
@@ -172,8 +170,6 @@ int sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeout
*vD02 = sact.sp_result_put;
sact.waittype = KEYWAIT_NONE;
return OK;
}
+2 -2
View File
@@ -62,7 +62,7 @@ static void move_drain(sprite_t *sp) {
// 後で、movelist から外してもらうための処理
sact.teventremovelist = slist_append(sact.teventremovelist, sp);
sp->move.moving = FALSE;
sp->move.moving = false;
if (sp->move.speed > 0)
sp->move.time = 0;
}
@@ -122,7 +122,7 @@ void spev_move_setup(void* data, void* userdata) {
// move 開始時刻の記録
sp->move.starttime = sact.movestarttime;
sp->move.moving = TRUE;
sp->move.moving = true;
// MOVE_SPEED で設定した場合は、移動量を考慮して移動時間を決定
if (sp->move.speed > 0) {
+31 -52
View File
@@ -35,7 +35,6 @@
#include "input.h"
#include "sact.h"
#include "sprite.h"
#include "ngraph.h"
#include "drawtext.h"
#include "sactlog.h"
@@ -46,7 +45,7 @@ struct markinfo {
int interval;
};
static boolean is_messagesprite(int wNum);
static bool is_messagesprite(int wNum);
static void replacestr_cb(void* data, void* userdata);
static char *replacestr(char *msg);
static void update_mark(sprite_t *sp, cginfo_t *cg);
@@ -65,17 +64,17 @@ static char *replacesrc;
static char *replacedst;
// 指定の番号のスプライトがメッセージスプライトかどうかをチェック
static boolean is_messagesprite(int wNum) {
static bool is_messagesprite(int wNum) {
// check sprite number is sane
if (wNum >= (SPRITEMAX -1) || wNum <= 0) return FALSE;
if (wNum >= (SPRITEMAX -1) || wNum <= 0) return false;
// check sprite is set
if (sact.sp[wNum] == NULL) return FALSE;
if (sact.sp[wNum] == NULL) return false;
// check sprite is message sprite
if (sact.sp[wNum]->type != SPRITE_MSG) return FALSE;
if (sact.sp[wNum]->type != SPRITE_MSG) return false;
return TRUE;
return true;
}
// 文字列の置き換え処理
@@ -88,7 +87,7 @@ static void replacestr_cb(void* data, void* userdata) {
start = replacesrc;
out = replacedst;
while (TRUE) {
while (true) {
next = strstr(start, ex->src);
if (next == NULL) break;
strncat(out, start, (size_t)(next - start));
@@ -118,10 +117,10 @@ static char *replacestr(char *msg) {
// アニメパターンの描画
static void update_mark(sprite_t *sp, cginfo_t *cg) {
boolean show = sp->show;
bool show = sp->show;
cginfo_t *curcg = sp->curcg;
sp->show = TRUE;
sp->show = true;
sp->curcg = cg;
sp_updateme(sp);
@@ -241,7 +240,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
char *msg;
sprite_t *sp;
int len = 0; // 処理した文字数?
boolean needupdate = FALSE;
bool needupdate = false;
MyRectangle uparea = {0,0,0,0};
// wRSize == 0 -> ルビ無し(SACT.MessageOutputからの呼出)
@@ -303,7 +302,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
mbuf,
wColorR, wColorG, wColorB);
needupdate = TRUE;
needupdate = true;
append_to_log(mbuf);
@@ -314,7 +313,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
cw,
wSize + wRSize + wRLineSpace);
sp_update_clipped();
needupdate = FALSE;
needupdate = false;
// keywait
delta = sdl_getTicks() - wcnt;
@@ -352,24 +351,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) {
@@ -381,7 +375,7 @@ void smsg_clear(int wNum) {
@return: (1) , (0)
*/
int smsg_is_empty() {
bool smsg_is_empty() {
return (sact.msgbuf[0] == '\0');
}
@@ -452,38 +446,23 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
@param sp:
*/
int smsg_update(sprite_t *sp) {
int sx, sy, w, h, dx, dy;
surface_t update;
// canvas が clean のときはなにもしない
// -> 説明スプライトのように、SetShowされたときに対応できないからだめ
//if (sact.msgbufempty) return OK;
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)) {
return NG;
void smsg_update(sprite_t *sp) {
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}, main_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);
return OK;
}
// 改行を含む文字列バッファ中から、改行までの文字列の長さを取り出す
+3 -5
View File
@@ -48,7 +48,7 @@ static int eventCB_PUT(sprite_t *sp, agsevent_t *e) {
update++;
}
sp->pressed = TRUE;
sp->pressed = true;
break;
case AGSEVENT_BUTTON_RELEASE:
@@ -76,7 +76,7 @@ static int eventCB_PUT(sprite_t *sp, agsevent_t *e) {
ssnd_play(sp->numsound2);
}
}
sp->pressed = FALSE;
sp->pressed = false;
}
break;
}
@@ -98,9 +98,7 @@ static void cb_remove(sprite_t *sp) {
sp_new
@param sp:
*/
int sp_put_setup(sprite_t *sp) {
void sp_put_setup(sprite_t *sp) {
spev_add_eventlistener(sp, eventCB_PUT);
sp->remove = cb_remove;
return OK;
}
+1 -4
View File
@@ -30,8 +30,6 @@
#include "list.h"
#include "input.h"
#include "sact.h"
#include "surface.h"
#include "ngraph.h"
#include "sprite.h"
#include "sdl_core.h"
#include "randMT.h"
@@ -46,7 +44,7 @@
@param wCount: (1/100)
@param cancel: (=1)
*/
int sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, int cancel) {
void sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, int cancel) {
int edtime, curtime;
int i = 0, key;
SList *node;
@@ -97,5 +95,4 @@ int sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, int
sp_updateme(sp);
}
sp_update_clipped();
return OK;
}
+36 -40
View File
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include "portab.h"
#include "nact.h"
@@ -33,25 +34,20 @@
#include "input.h"
#include "sact.h"
#include "sprite.h"
#include "ngraph.h"
#include "drawtext.h"
// 選択された要素(1~) キャンセルの場合は0、初期状態は -1
static int selected_item;
static int selected_item_cur;
// 選択肢を描画するsurface
static surface_t *selcanvas;
// 前のカーソルの状態
static boolean oldstate; // spriteの中か外か
static bool oldstate; // spriteの中か外か
static int oldindex; // 何番目の要素か(0~)
static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin);
static bool sp_is_insprite2(sprite_t *sp, int x, int y, int margin);
static void cb_select_move(agsevent_t *e);
static void cb_select_release(agsevent_t *e);
static int update_selwindow(sprite_t *sp);
static void setup_selwindow();
static void remove_selwindow();
static int sel_main();
@@ -63,13 +59,13 @@ static int sel_main();
* sprite内領域チェック
* sprite内部とは判断しない
*/
static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
static bool sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
MyPoint p = {x, y};
MyRectangle r = {
sp->cur.x + margin,
sp->cur.y + margin,
sp->curcg->sf->width - 2 * margin,
sp->curcg->sf->height - 2 * margin
sp->curcg->sf->w - 2 * margin,
sp->curcg->sf->h - 2 * margin
};
return SDL_PointInRect(&p, &r);
}
@@ -78,7 +74,7 @@ static boolean sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
static void cb_select_move(agsevent_t *e) {
int x = e->mousex, y = e->mousey;
sprite_t *sp = sact.sp[sact.sel.spno];
boolean newstate;
bool newstate;
int newindex;
// sprite内か?
@@ -86,7 +82,7 @@ static void cb_select_move(agsevent_t *e) {
newindex = (y - (sp->cur.y + sact.sel.frame_dot)) / (sact.sel.font_size + sact.sel.linespace);
if (newstate == oldstate) {
if ((newstate == FALSE) || (newindex == oldindex)) {
if (!newstate || newindex == oldindex) {
// 前と状態が同じでかつ、新しい状態がspriteの外か、
// indexが変わらない場合はなにもしない。
return;
@@ -116,7 +112,7 @@ static void cb_select_move(agsevent_t *e) {
static void cb_select_release(agsevent_t *e) {
int x = e->mousex, y = e->mousey;
sprite_t *sp = sact.sp[sact.sel.spno];
boolean st;
bool st;
int iy;
switch (e->code) {
@@ -125,7 +121,7 @@ static void cb_select_release(agsevent_t *e) {
iy = (y - (sp->cur.y + sact.sel.frame_dot)) / (sact.sel.font_size + sact.sel.linespace);
// カーソルが sprite の外の場合は無視
if (st == FALSE) {
if (!st) {
return;
}
@@ -142,8 +138,19 @@ static void cb_select_release(agsevent_t *e) {
}
}
static void draw_box(SDL_Surface *dst, int x, int y, int w, int h) {
SDL_FillRect(dst, &(SDL_Rect){x, y, w, h}, SDL_MapRGB(dst->format, 0, 0, 0));
SDL_Rect border_rects[4] = {
{x, y, w, 1},
{x, y + h - 1, w, 1},
{x, y, 1, h},
{x + w - 1, y, 1, h}
};
SDL_FillRects(dst, border_rects, 4, SDL_MapRGB(dst->format, 255, 255, 255));
}
// 選択ウィンドを更新するときの callback
static int update_selwindow(sprite_t *sp) {
static void update_selwindow(sprite_t *sp) {
int selno = selected_item_cur;
int x0, y0;
@@ -154,20 +161,16 @@ static int update_selwindow(sprite_t *sp) {
// 選択されている要素
if (selno && sact.sel.elem[selno] != NULL) {
int w = selcanvas->width - 2 * sact.sel.frame_dot;
int w = sact.sel.charcanvas->w - 2 * sact.sel.frame_dot;
int h = sact.sel.font_size + sact.sel.linespace;
int x = x0 + sact.sel.frame_dot;
int y = y0 + sact.sel.frame_dot + (selno -1) * h;
gr_fill(sf0, x, y, w, h, 0, 0, 0);
gr_drawrect(sf0, x, y, w, h, 255, 255, 255);
draw_box(main_surface, x, y, w, h);
}
// 選択肢文字列
gr_expandcolor_blend(sf0, x0, y0,
sact.sel.charcanvas, 0, 0,
selcanvas->width, selcanvas->height, 255, 255, 255);
return OK;
SDL_BlitSurface(sact.sel.charcanvas, NULL, main_surface,
&(SDL_Rect){x0, y0, sact.sel.charcanvas->w, sact.sel.charcanvas->h});
}
// 選択ウィンドの準備
@@ -175,11 +178,9 @@ static void setup_selwindow() {
sprite_t *sp = sact.sp[sact.sel.spno];
int i;
//選択ウィンド作業 surfaceの生成
selcanvas = sf_dup(sp->cg1->sf);
// 選択肢文字用 canvas
sact.sel.charcanvas = sf_create_pixel(selcanvas->width, selcanvas->height, 8);
sact.sel.charcanvas = SDL_CreateRGBSurfaceWithFormat(0, sp->cg1->sf->w, sp->cg1->sf->h, 32, SDL_PIXELFORMAT_ARGB8888);
SDL_SetSurfaceBlendMode(sact.sel.charcanvas, SDL_BLENDMODE_BLEND);
dt_setfont(sact.sel.font_type, sact.sel.font_size);
@@ -190,9 +191,9 @@ static void setup_selwindow() {
// 文字の場所計算
x = 0; // 行そろえは無し
y = (i - 1) * (sact.sel.font_size + sact.sel.linespace);
dt_drawtext(sact.sel.charcanvas,
dt_drawtext_col(sact.sel.charcanvas,
x + sact.sel.frame_dot, y + sact.sel.frame_dot,
sact.sel.elem[i]);
sact.sel.elem[i], 255, 255, 255);
}
// デフォルトで選択される選択肢がある場合、そこへカーソルを移動
@@ -202,7 +203,7 @@ static void setup_selwindow() {
(sact.sel.font_size + sact.sel.linespace) * (sact.sel.movecursor - 1);
ags_setCursorLocation(x, y, true, true);
selected_item = (sact.sel.movecursor -1);
oldstate = TRUE;
oldstate = true;
oldindex = selected_item -1;
}
@@ -225,9 +226,8 @@ static void remove_selwindow() {
sp_update_clipped();
// 作業用 surface の削除
sf_free(selcanvas);
selcanvas = NULL;
sf_free(sact.sel.charcanvas);
if (sact.sel.charcanvas)
SDL_FreeSurface(sact.sel.charcanvas);
sact.sel.charcanvas = NULL;
}
@@ -264,12 +264,8 @@ void ssel_init() {
void ssel_reset(void) {
ssel_clear();
if (selcanvas) {
sf_free(selcanvas);
selcanvas = NULL;
}
if (sact.sel.charcanvas) {
sf_free(sact.sel.charcanvas);
SDL_FreeSurface(sact.sel.charcanvas);
sact.sel.charcanvas = NULL;
}
}
@@ -315,7 +311,7 @@ void ssel_add(int nString, int wI) {
*/
int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace, int wChoiceAutoMoveCursor, int nAlign) {
int ret = 0;
boolean saveflag;
bool saveflag;
// check sprite number is sane
if (wNum >= (SPRITEMAX-1) || wNum <= 0) return ret;
@@ -335,7 +331,7 @@ int ssel_select(int wNum, int wChoiceSize, int wMenuOutSpc, int wChoiceLineSpace
// 古い sprite の表示フラグを保存
saveflag = sact.sp[wNum]->show;
sact.sp[wNum]->show = TRUE;
sact.sp[wNum]->show = true;
setup_selwindow();
ret = sel_main();
+3 -4
View File
@@ -49,7 +49,7 @@ static int eventCB_switch(sprite_t *sp, agsevent_t *e) {
update++;
}
sp->pressed = TRUE;
sp->pressed = true;
break;
case AGSEVENT_BUTTON_RELEASE:
@@ -71,7 +71,7 @@ static int eventCB_switch(sprite_t *sp, agsevent_t *e) {
ssnd_play(sp->numsound2);
}
}
sp->pressed = FALSE;
sp->pressed = false;
break;
}
@@ -93,8 +93,7 @@ static void cb_remove(sprite_t *sp) {
sp_new
@param sp:
*/
int sp_sw_setup(sprite_t *sp) {
void sp_sw_setup(sprite_t *sp) {
spev_add_eventlistener(sp, eventCB_switch);
sp->remove = cb_remove;
return OK;
}
+13 -23
View File
@@ -32,8 +32,6 @@
#include "ags.h"
#include "graphics.h"
#include "sact.h"
#include "surface.h"
#include "ngraph.h"
#include "sprite.h"
// スプライト再描画間の間に変更のあったスプライトの領域の和
@@ -54,7 +52,7 @@ static void disjunction(void* region, void* data) {
// 更新の必要なスプライトの領域の和をとってクリッピングする
static void get_updatearea() {
MyRectangle clip = {0, 0, 0, 0};
MyRectangle rsf0 = {0, 0, sf0->width, sf0->height};
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
slist_foreach(updatearea, disjunction, &clip);
@@ -62,7 +60,7 @@ static void get_updatearea() {
updatearea = NULL;
// surface0との領域の積をとる
SDL_IntersectRect(&rsf0, &clip, &sact.updaterect);
SDL_IntersectRect(&screen, &clip, &sact.updaterect);
SACT_DEBUG("clipped area x=%d y=%d w=%d h=%d",
sact.updaterect.x, sact.updaterect.y,
@@ -90,7 +88,7 @@ static void do_update_each(void* data, void* userdata) {
@param syncscreen: surface0 Screen
*/
int sp_update_all(boolean syncscreen) {
void sp_update_all(bool syncscreen) {
// スプライト移動がある場合は移動開始
if (sact.movelist) {
@@ -104,8 +102,8 @@ int sp_update_all(boolean syncscreen) {
// 画面全体を更新領域に
sact.updaterect.x = 0;
sact.updaterect.y = 0;
sact.updaterect.w = sf0->width;
sact.updaterect.h = sf0->height;
sact.updaterect.w = main_surface->w;
sact.updaterect.h = main_surface->h;
// updatelistに登録してあるスプライトを再描画
// updatelistはスプライトの番号順に並んでいる
@@ -121,20 +119,18 @@ int sp_update_all(boolean syncscreen) {
// 移動中のすべてのスプライトが移動終了するまで待つ
// こうしないと動きが同期しない
spev_wait4moving_sp();
return OK;
}
/*
updateme(_part)spriteの和の領域をupdate
*/
int sp_update_clipped() {
void sp_update_clipped() {
// 更新領域の確定
get_updatearea();
if (SDL_RectEmpty(&sact.updaterect))
return OK;
return;
// 更新領域に入っているスプライトの再描画
slist_foreach(sact.updatelist, do_update_each, NULL);
@@ -146,19 +142,17 @@ int sp_update_clipped() {
// 更新領域を Window に転送
ags_updateArea(sact.updaterect.x, sact.updaterect.y, sact.updaterect.w, sact.updaterect.h);
return OK;
}
/*
sprite全体の更新を登録
@param sp:
*/
int sp_updateme(sprite_t *sp) {
void sp_updateme(sprite_t *sp) {
MyRectangle *r;
if (sp == NULL) return NG;
if (sp->cursize.width == 0 || sp->cursize.height == 0) return NG;
if (sp == NULL) return;
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
r = malloc(sizeof(MyRectangle));
r->x = sp->cur.x;
@@ -170,8 +164,6 @@ int sp_updateme(sprite_t *sp) {
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
r->x, r->y, sp->no, r->w, r->h);
return OK;
}
/*
@@ -182,11 +174,11 @@ int sp_updateme(sprite_t *sp) {
@param w:
@param h:
*/
int sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
void sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
MyRectangle *r;
if (sp == NULL) return NG;
if (w == 0 || h == 0) return NG;
if (sp == NULL) return;
if (w == 0 || h == 0) return;
r = malloc(sizeof(MyRectangle));
r->x = sp->cur.x + x;
@@ -198,7 +190,5 @@ int sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
SACT_DEBUG("x = %d, y = %d, spno = %d w=%d,h=%d",
r->x, r->y, sp->no, r->w, r->h);
return OK;
}
+7 -12
View File
@@ -40,7 +40,7 @@ struct _xm {
static struct _xm xmenu;
int spxm_clear(void) {
void spxm_clear(void) {
int i;
free(xmenu.title); xmenu.title = NULL;
@@ -48,16 +48,14 @@ int spxm_clear(void) {
free(xmenu.item[i]); xmenu.item[i] = NULL;
xmenu.ret[i] = 0;
}
return OK;
}
int spxm_register(int reginum, int menuid) {
if (reginum > SEL_ELEMENT_MAX) return NG;
void spxm_register(int reginum, int menuid) {
if (reginum > SEL_ELEMENT_MAX) return;
xmenu.ret[reginum] = menuid;
xmenu.item[reginum] = strdup(sact.msgbuf);
sact.msgbuf[0] = '\0';
return OK;
}
int spxm_getnum(int reginum) {
@@ -65,19 +63,16 @@ int spxm_getnum(int reginum) {
return xmenu.ret[reginum];
}
int spxm_gettext(int reginum, int strno) {
if (reginum > SEL_ELEMENT_MAX) return NG;
void spxm_gettext(int reginum, int strno) {
if (reginum > SEL_ELEMENT_MAX) return;
svar_set(strno, xmenu.item[reginum]);
return OK;
}
int spxm_titlereg(void) {
void spxm_titlereg(void) {
xmenu.title = strdup(sact.msgbuf);
sact.msgbuf[0] = '\0';
return OK;
}
int spxm_titleget(int strno) {
void spxm_titleget(int strno) {
svar_set(strno, xmenu.title);
return OK;
}
+23 -95
View File
@@ -41,8 +41,6 @@
#define SLOT 40
static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, int r, int g, int b);
static MyRectangle maprect; /* アニメーション表示領域 */
static MyRectangle mapback; /* 背景セーブ領域 */
static int mapback_p5; /* 背景転送先 X */
@@ -89,6 +87,14 @@ static struct _s2 s2[SLOT];
static int* add_p5[SLOT]; /* どこまでアニメーションのコマが進んだか */
static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, int r, int g, int b) {
SDL_Surface *sf = nact->ags.dib->sdl_surface;
SDL_SetColorKey(sf, SDL_TRUE, SDL_MapRGB(sf->format, r, g, b));
SDL_Rect src_rect = { sx, sy, width, height };
SDL_Rect dst_rect = { dx, dy, width, height };
SDL_BlitSurface(sf, &src_rect, sf, &dst_rect);
SDL_SetColorKey(sf, SDL_FALSE, 0);
}
static void Init() {
/*
@@ -135,7 +141,7 @@ static void ChangeNotColor() {
int *src = getCaliVariable(); /* r, g, b */
int *dst = getCaliVariable(); /* r, g, b */
int p7 = getCaliValue(); /* ISurface */
agsurface_t *dib;
surface_t *dib;
int x, y;
uint8_t *dp;
@@ -146,42 +152,18 @@ static void ChangeNotColor() {
dib = nact->ags.dib;
dp = GETOFFSET_PIXEL(dib, x0, y0);
switch(dib->depth) {
case 16:
{
uint16_t pic16s = PIX16(*src, *(src+1), *(src+2));
uint16_t pic16d = PIX16(*dst, *(dst+1), *(dst+2));
uint16_t *yl;
for (y = 0; y < height; y++) {
yl = (uint16_t *)(dp + y * dib->bytes_per_line);
for (x = 0; x < width; x++) {
if (*yl != pic16s) {
*yl = pic16d;
}
yl++;
uint32_t pic24s = PIX24(*src, *(src+1), *(src+2));
uint32_t pic24d = PIX24(*dst, *(dst+1), *(dst+2));
uint32_t *yl;
for (y = 0; y < height; y++) {
yl = (uint32_t *)(dp + y * dib->sdl_surface->pitch);
for (x = 0; x < width; x++) {
if (*yl != pic24s) {
*yl = pic24d;
}
yl++;
}
break;
}
case 24:
case 32:
{
uint32_t pic24s = PIX24(*src, *(src+1), *(src+2));
uint32_t pic24d = PIX24(*dst, *(dst+1), *(dst+2));
uint32_t *yl;
for (y = 0; y < height; y++) {
yl = (uint32_t *)(dp + y * dib->bytes_per_line);
for (x = 0; x < width; x++) {
if (*yl != pic24s) {
*yl = pic24d;
}
yl++;
}
}
break;
}
}
// The CX command after ChangeNotColor (in FIGHT.ADV) must use a precise
// calculation.
@@ -452,8 +434,8 @@ static void PlayAnimeData() {
int p6 = getCaliValue(); /* IWinMsg */
int interval, loop;
int i;
boolean is_backcopied;
agsurface_t *dib;
bool is_backcopied;
surface_t *dib;
TRACE("ShGraph.PlayAnimeData %d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6);
@@ -470,7 +452,7 @@ static void PlayAnimeData() {
for (loop = 0; loop < p1; loop++) {
int cnt = sdl_getTicks();
is_backcopied = FALSE;
is_backcopied = false;
for (i = 0; i < SLOT; i++) {
int srcno = s1[i].add_p2;
@@ -489,7 +471,7 @@ static void PlayAnimeData() {
int sx, sy, dx, dy;
if (!is_backcopied) {
is_backcopied = TRUE;
is_backcopied = true;
ags_copyArea(mapback.x, mapback.y, mapback.w, mapback.h,
mapback_p5, mapback_p6);
}
@@ -553,60 +535,6 @@ static void PlayAnimeData() {
}
}
static void copy_sprite(int sx, int sy, int width, int height, int dx, int dy, int r, int g, int b) {
int x, y;
uint8_t *sp, *dp;
agsurface_t *dib;
if (dx < 0 || dy < 0) return;
ags_check_param(&sx, &sy, &width, &height);
ags_check_param(&dx, &dy, &width, &height);
dib = nact->ags.dib;
sp = GETOFFSET_PIXEL(dib, sx, sy);
dp = GETOFFSET_PIXEL(dib, dx, dy);
switch(dib->depth) {
case 16:
{
uint16_t pic16 = PIX16(r, g, b);
uint16_t *yls, *yld;
for (y = 0; y < height; y++) {
yls = (uint16_t *)(sp + y * dib->bytes_per_line);
yld = (uint16_t *)(dp + y * dib->bytes_per_line);
for (x = 0; x < width; x++) {
if (*yls != pic16) {
*yld = *yls;
}
yls++; yld++;
}
}
break;
}
case 24:
case 32:
{
uint32_t pic24 = PIX24(r, g, b);
uint32_t *yls, *yld;
for (y = 0; y < height; y++) {
yls = (uint32_t *)(sp + y * dib->bytes_per_line);
yld = (uint32_t *)(dp + y * dib->bytes_per_line);
for (x = 0; x < width; x++) {
if (*yls != pic24) {
*yld = *yls;
}
yls++; yld++;
}
}
break;
}
}
}
static const ModuleFunc functions[] = {
{"AddAnimeData", AddAnimeData},
{"AddAnimeRemain", AddAnimeRemain},
+9 -49
View File
@@ -30,10 +30,8 @@
#include "nact.h"
#include "ags.h"
#include "font.h"
#include "surface.h"
#include "ngraph.h"
static int ftype; // フォントの種類
static FontType ftype;
static int fsize; // フォントの大きさ
/**
@@ -42,44 +40,16 @@ static int fsize; // フォントの大きさ
* @param type: (FONT_MINCHO, FONT_GOTHIC)
* @param size:
*/
int dt_setfont(int type, int size) {
void dt_setfont(FontType type, int size) {
#ifdef __EMSCRIPTEN__
if (type == FONT_MINCHO) {
if (load_mincho_font() != OK)
if (!load_mincho_font())
type = FONT_GOTHIC;
}
#endif
ftype = type;
fsize = size;
return OK;
}
/**
* surface 256調
* surfaceは8ビットである必要あり
*
* @param sf: surface
* @param x:
* @param y:
* @param buf: (SJIS)
* @return:
*/
int dt_drawtext(surface_t *sf, int x, int y, char *buf) {
int sx, sy, sw, sh;
ags_setFont(ftype, fsize);
agsurface_t *glyph = ags_drawStringToSurface(buf);
if (glyph == NULL) return 0;
sx = x; sy = y;
sw = glyph->width;
sh = glyph->height;
if (!gr_clip_xywh(sf, &sx, &sy, &sw, &sh)) return 0;
gr_copy(sf, sx, sy, glyph, 0, 0, sw, sh);
return sw;
}
/**
@@ -95,23 +65,13 @@ int dt_drawtext(surface_t *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);
agsurface_t *glyph = ags_drawStringToSurface(buf);
SDL_Surface *glyph = ags_drawStringToSurface(buf, r, g, b);
if (glyph == NULL) return 0;
sx = x; sy = y;
sw = glyph->width;
sh = glyph->height;
if (!gr_clip_xywh(sf, &sx, &sy, &sw, &sh)) return 0;
// alpha map に文字そのものを描く
gr_draw_amap(sf, sx, sy, glyph->pixel, sw, sh, glyph->bytes_per_line);
// pixel map には色情報を矩形で描く
gr_fill(sf, sx, sy, sw, sh, r, g, b);
return sw;
SDL_Rect rect = {x, y, glyph->w, glyph->h};
SDL_BlitSurface(glyph, NULL, sf, &rect);
SDL_FreeSurface(glyph);
return rect.w;
}
+6 -3
View File
@@ -24,8 +24,11 @@
#ifndef __DRAWTEXT_H__
#define __DRAWTEXT_H__
extern int dt_setfont(int type, int size);
extern int dt_drawtext(surface_t *sf, int x, int y, char *buf);
extern int dt_drawtext_col(surface_t *sf, int x, int y, char *buf, int r, int g, int b);
#include "graphics.h"
struct SDL_Surface;
void dt_setfont(FontType type, int size);
int dt_drawtext_col(struct SDL_Surface *sf, int x, int y, char *buf, int r, int g, int b);
#endif /* __DRAWTEXT_H__ */
-18
View File
@@ -1,18 +0,0 @@
#ifndef __GRAPH_H__
#define __GRAPH_H__
#include "config.h"
#include "surface.h"
extern void gr_init();
extern void gr_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv);
extern void gr_copy_stretch_blend_alpha_map(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh);
extern void gr_fill_alpha_overborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
extern void gr_fill_alpha_underborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d);
extern void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh, int cl);
extern void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
extern void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy);
#endif /* __GRAPH_H__ */
+42 -7
View File
@@ -5,19 +5,54 @@
#include "portab.h"
#include "system.h"
#include "surface.h"
#include "ngraph.h"
#include "graph_blend_amap.h"
#include "ags.h"
int gr_blend_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
if (src == NULL || dst == NULL) return NG;
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return NG;
static void gre_BlendUseAMap(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height) {
uint8_t *sp = GETOFFSET_PIXEL(src, sx, sy);
uint8_t *dp = GETOFFSET_PIXEL(dst, dx, dy);
uint8_t *ap = GETOFFSET_ALPHA(src, sx, sy);
switch (dst->sdl_surface->format->BitsPerPixel) {
case 16:
for (int y = 0; y < height; y++) {
uint16_t *yls = (uint16_t *)(sp + y * src->sdl_surface->pitch);
uint16_t *yld = (uint16_t *)(dp + y * dst->sdl_surface->pitch);
uint8_t *yla = (uint8_t *)(ap + y * src->width);
for (int x = 0; x < width; x++) {
*yld = ALPHABLEND16(*yls, *yld, *yla);
yls++; yld++; yla++;
}
}
break;
case 24:
case 32:
for (int y = 0; y < height; y++) {
uint32_t *yls = (uint32_t *)(sp + y * src->sdl_surface->pitch);
uint32_t *yld = (uint32_t *)(dp + y * dst->sdl_surface->pitch);
uint8_t *yla = (uint8_t *)(ap + y * src->width);
for (int x = 0; x < width; x++) {
*yld = ALPHABLEND24(*yls, *yld, *yla);
yls++; yld++; yla++;
}
}
break;
}
}
void gr_blend_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
if (src == NULL || dst == NULL) return;
MyRectangle src_window = { 0, 0, src->width, src->height };
MyRectangle dst_window = { 0, 0, dst->width, dst->height };
if (!ags_clipCopyRect(&src_window, &dst_window, &sx, &sy, &dx, &dy, &sw, &sh)) return;
if (src->alpha == NULL) {
WARNING("src alpha NULL");
return NG;
return;
}
return gre_BlendUseAMap(dst, dx, dy, dst, dx, dy, src, sx, sy, sw, sh, src, sx, sy, 255);
gre_BlendUseAMap(dst, dx, dy, src, sx, sy, sw, sh);
}
+8
View File
@@ -0,0 +1,8 @@
#ifndef __GRAPH_BLEND_AMAP_H__
#define __GRAPH_BLEND_AMAP_H__
#include "ags.h"
void gr_blend_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh);
#endif /* __GRAPH_BLEND_AMAP_H__ */
-18
View File
@@ -1,18 +0,0 @@
// srcのsurfaceの一部をdstに飽和加算
#include <stdio.h>
#include "portab.h"
#include "system.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_blend_screen(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int w, int h) {
if (src == NULL || dst == NULL) return NG;
if (!gr_clip(src, &sx, &sy, &w, &h, dst, &dx, &dy)) return NG;
return gre_BlendScreen(dst, dx, dy, dst, dx, dy, src, sx, sy, w, h);
}
-150
View File
@@ -1,150 +0,0 @@
/*
* graph_cg.c surface cgデータを描く
*
* Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
* 1998- <masaki-c@is.aist-nara.ac.jp>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/* $Id: graph_cg.c,v 1.2 2003/08/30 21:29:16 chikama Exp $ */
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include "portab.h"
#include "surface.h"
#include "cg.h"
#include "ags.h"
#include "ngraph.h"
/**
* surface 24bpp CG (QNT)
*
* @param ds: surface
* @param cg: CGデータ
* @param x:
* @param y:
*/
void gr_drawimage24(surface_t *ds, cgdata *cg, int x, int y) {
int dx, dy, dw, dh;
uint8_t *sp, *dp, r, g, b;
dx = x;
dy = y;
dw = cg->width;
dh = cg->height;
if (!gr_clip_xywh(ds, &dx, &dy, &dw, &dh)) return;
int data_offset = (abs(dy - y) * cg->width + abs(dx - x)) * 3;
sp = (uint8_t *)(cg->pic + data_offset);
dp = GETOFFSET_PIXEL(ds, dx, dy);
switch(ds->depth) {
case 16:
{
uint16_t *yl;
for (y = 0; y < dh; y++) {
yl = (uint16_t *)(dp + y * ds->bytes_per_line);
for (x = 0; x < dw; x++) {
r = *sp;
g = *(sp +1);
b = *(sp +2);
*yl = PIX16(r, g, b);
yl++; sp += 3;
}
sp += ((cg->width - dw) * 3);
}
break;
}
case 24:
case 32:
{
uint32_t *yl;
for (y = 0; y < dh; y++) {
yl = (uint32_t *)(dp + y * ds->bytes_per_line);
for (x = 0; x < dw; x++) {
r = *sp;
g = *(sp +1);
b = *(sp +2);
*yl = PIX24(r, g, b);
yl++; sp += 3;
}
sp += ((cg->width - dw) * 3);
}
break;
}}
}
/**
* surface 16bpp CG (PMS16/BMP)
*
* @param ds: surface
* @param cg: CGデータ
* @param x:
* @param y:
*/
void gr_drawimage16(surface_t *ds, cgdata *cg, int x, int y) {
int dx, dy, dw, dh;
uint8_t *dp;
uint16_t pic16, *sp;
dx = x;
dy = y;
dw = cg->width;
dh = cg->height;
if (!gr_clip_xywh(ds, &dx, &dy, &dw, &dh)) return;
int data_offset = (abs(dy - y) * cg->width + abs(dx - x)) * 2;
sp = (uint16_t *)(cg->pic + data_offset);
dp = GETOFFSET_PIXEL(ds, dx, dy);
switch(ds->depth) {
case 16:
{
for (y = 0; y < dh; y++) {
memcpy(dp, sp, dw * 2);
sp += cg->width;
dp += ds->bytes_per_line;
}
break;
}
case 24:
case 32:
{
uint32_t *yl;
for (y = 0; y < dh; y++) {
yl = (uint32_t *)(dp + y * ds->bytes_per_line);
for (x = 0; x < dw; x++) {
pic16 = *sp;
*yl = rgb565_to_rgb888(pic16);
yl++; sp++;
}
sp += (cg->width - dw);
}
break;
}}
}
-80
View File
@@ -1,80 +0,0 @@
/*
* graph_copy.c pixel
*
* Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
* 1998- <masaki-c@is.aist-nara.ac.jp>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/* $Id: graph_copy.c,v 1.2 2003/04/25 17:23:55 chikama Exp $ */
#include <string.h>
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
/**
* surface surface
* pixelデータのみコピー
*
* @param dst: surface
* @param dx:
* @param dy:
* @param src: surface
* @param sx:
* @param sy:
* @param sw:
* @param sh:
*/
int gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
uint8_t *sp, *dp;
if (src == NULL || dst == NULL) return NG;
if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return NG;
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
if (sp == NULL || dp == NULL) return NG;
if (src == dst) {
if (sy <= dy && dy < (sy + sh)) {
sp += (sh -1) * src->bytes_per_line;
dp += (sh -1) * dst->bytes_per_line;
while(sh--) {
memmove(dp, sp, sw * src->bytes_per_pixel);
sp -= src->bytes_per_line;
dp -= dst->bytes_per_line;
}
} else {
while(sh--) {
memmove(dp, sp, sw * src->bytes_per_pixel);
sp += src->bytes_per_line;
dp += dst->bytes_per_line;
}
}
} else {
while(sh--) {
memcpy(dp, sp, sw * src->bytes_per_pixel);
sp += src->bytes_per_line;
dp += dst->bytes_per_line;
}
}
return OK;
}
-55
View File
@@ -1,55 +0,0 @@
// 指定のsurface領域を明るさを lv/255 倍してコピー
#include <string.h>
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
void gr_copy_bright(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
int x, y;
uint8_t *sp, *dp;
if (!gr_clip(src, &sx, &sy, &width, &height, dst, &dx, &dy)) return;
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
if (sp == NULL || dp == NULL) return;
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld;
for (y = 0; y < height; y++) {
yls = (uint16_t *)(sp + y * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < width; x++) {
*yld = ALPHALEVEL16(*yls, lv);
yls++; yld++;
}
}
}
break;
case 24:
case 32:
{
uint32_t *yls, *yld;
for (y = 0; y < height; y++) {
yls = (uint32_t *)(sp + y * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < width; x++) {
*yld = ALPHALEVEL24(*yls, lv);
yls++; yld++;
}
}
break;
}
}
}
-24
View File
@@ -1,24 +0,0 @@
// 8bit surface (or data列)から surface の alpha map へコピー
#include <string.h>
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_draw_amap(surface_t *dst, int dx, int dy, uint8_t *src, int width, int height, int scanline) {
int y;
uint8_t *sp, *dp;
sp = src;
dp = GETOFFSET_ALPHA(dst, dx, dy);
for (y = 0; y < height; y++) {
memcpy(dp, sp, width);
sp += scanline;
dp += dst->width;
}
return OK;
}
-58
View File
@@ -1,58 +0,0 @@
// color expansion and blending
// 8bppのモノクロをcolでブレンド
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_expandcolor_blend(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh, int r, int g, int b) {
uint8_t *sp, *dp;
int x, y;
int col;
if (FALSE == gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) {
return NG;
}
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
switch(dst->depth) {
case 16:
col = PIX16(r, g, b);
{
uint16_t *yd;
uint8_t *ys;
for (y = 0; y < sh; y++) {
ys = (uint8_t *)(sp + y * src->bytes_per_line);
yd = (uint16_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < sw; x++) {
if (*ys) {
*yd = ALPHABLEND16(col, *yd, (uint8_t)*ys);
}
ys++; yd++;
}
}
}
break;
case 32:
case 24: {
uint32_t *yd;
uint8_t *ys;
col = PIX24(r, g, b);
for (y = 0; y < sh; y++) {
ys = (uint8_t *)(sp + y * src->bytes_per_line);
yd = (uint32_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < sw; x++) {
if (*ys) {
*yd = ALPHABLEND24(col, *yd, (uint8_t)*ys);
}
ys++; yd++;
}
}
break;
}}
return OK;
}
-54
View File
@@ -1,54 +0,0 @@
// fill rectangle
#include <string.h>
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_fill(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b) {
uint8_t *dp, *dp_;
int x, y;
if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) {
return NG;
}
dp = dp_ = GETOFFSET_PIXEL(dst, dx, dy);
switch(dst->depth) {
case 8:
memset(dp, r, dw);
break;
case 16:
{
uint16_t pic16 = PIX16(r, g, b);
for (x = 0; x < dw; x++) {
*((uint16_t *)dp + x) = pic16;
}
break;
}
case 24:
case 32:
{
uint32_t pic24 = PIX24(r, g, b);
for (x = 0; x < dw; x++) {
*((uint32_t *)dp + x) = pic24;
}
break;
}
}
dp += dst->bytes_per_line;
for (y = 1; y < dh; y++) {
memcpy(dp, dp_, dw * dst->bytes_per_pixel);
dp += dst->bytes_per_line;
}
return OK;
}
-53
View File
@@ -1,53 +0,0 @@
// 指定の色(rgb)をブレンド率(lv)を指定して矩形塗りつぶし
#include "config.h"
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_fill_alpha_color(surface_t *dst, int dx, int dy, int dw, int dh, int r, int g, int b, int lv) {
int x, y;
uint8_t *dp;
if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) {
return NG;
}
dp = GETOFFSET_PIXEL(dst, dx, dy);
switch(dst->depth) {
case 16:
{
uint16_t pic16 = PIX16(r, g, b);
uint16_t *yls;
for (y = 0; y < dh; y++) {
yls = (uint16_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < dw; x++) {
*yls = ALPHABLEND16(pic16, *yls, lv);
yls++;
}
}
}
break;
case 24:
case 32:
{
uint32_t pic24 = PIX24(r, g, b);
uint32_t *yls;
for (y = 0; y < dh; y++) {
yls = (uint32_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < dw; x++) {
*yls = ALPHABLEND24(pic24, *yls, lv);
yls++;
}
}
break;
}
}
return OK;
}
-96
View File
@@ -1,96 +0,0 @@
// draw rectangle
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_drawrect(surface_t *dst, int x, int y, int w, int h, int r, int g, int b) {
uint8_t *dp;
int i;
int col = 0;
if (FALSE == gr_clip_xywh(dst, &x, &y, &w, &h)) {
return NG;
}
dp = GETOFFSET_PIXEL(dst, x, y);
switch(dst->depth) {
case 8:
col = r; break;
case 16:
col = PIX16(r, g, b); break;
case 24:
case 32:
col = PIX24(r, g, b); break;
}
switch(dst->depth) {
case 8:
/* top */
for (i = 0; i < w; i++) {
*((uint8_t *)dp + i) = col;
}
/* side */
h-=2;
for (i = 0; i < h; i++) {
dp += dst->bytes_per_line;
*((uint8_t *)dp) = col;
*((uint8_t *)dp + w - 1) = col;
}
/* bottom */
dp += dst->bytes_per_line;
for (i = 0; i < w; i++) {
*((uint8_t *)dp + i) = col;
}
break;
case 16:
/* top */
for (i = 0; i < w; i++) {
*((uint16_t *)dp + i) = col;
}
/* side */
h-=2;
for (i = 0; i < h; i++) {
dp += dst->bytes_per_line;
*((uint16_t *)dp) = col;
*((uint16_t *)dp + w - 1) = col;
}
/* bottom */
dp += dst->bytes_per_line;
for (i = 0; i < w; i++) {
*((uint16_t *)dp + i) = col;
}
break;
case 24:
case 32:
/* top */
for (i = 0; i < w; i++) {
*((uint32_t *)dp + i) = col;
}
/* side */
h-=2;
for (i = 0; i < h; i++) {
dp += dst->bytes_per_line;
*((uint32_t *)dp) = col;
*((uint32_t *)dp + w - 1) = col;
}
/* bottom */
dp += dst->bytes_per_line;
for (i = 0; i < w; i++) {
*((uint32_t *)dp + i) = col;
}
break;
}
return OK;
}
-43
View File
@@ -1,43 +0,0 @@
// alpha map の飽和加算
#include <stdio.h>
#include "portab.h"
#include "system.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gr_saturadd_alpha_map(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh) {
uint8_t *sp, *dp;
int x, y;
if (FALSE == gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) {
return NG;
}
if (src->alpha == NULL) {
WARNING("src alpha NULL");
return NG;
}
if (dst->alpha == NULL) {
WARNING("dst alpha NULL");
return NG;
}
sp = GETOFFSET_ALPHA(src, sx, sy);
dp = GETOFFSET_ALPHA(dst, dx, dy);
for (y = 0; y < sh; y++) {
uint8_t *yls = sp + y * src->width;
uint8_t *yld = dp + y * dst->width;
for (x = 0; x < sw; x++) {
int s = *yls, d = *yld;
*yld = (uint8_t)(min(255, (s + d)));
yls++; yld++;
}
}
return OK;
}
-88
View File
@@ -1,88 +0,0 @@
// 拡大・縮小
#include <stdlib.h>
#include <string.h>
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
void gr_copy_stretch(surface_t *dst, int dx, int dy, int dw, int dh, surface_t *src, int sx, int sy, int sw, int sh) {
float a1, a2, xd, yd;
int *row, *col;
int x, y;
uint8_t *sp, *dp;
if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) return;
if (!gr_clip_xywh(src, &sx, &sy, &sw, &sh)) return;
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
a1 = (float)sw / (float)dw;
a2 = (float)sh / (float)dh;
// src width と dst width が同じときに問題があるので+1
row = calloc(dw+1, sizeof(int));
// 1おおきくして初期化しないと col[dw-1]とcol[dw]が同じになる
// 可能性がある。
col = calloc(dh+1, sizeof(int));
for (yd = 0.0, y = 0; y < dh; y++) {
col[y] = yd; yd += a2;
}
for (xd = 0.0, x = 0; x < dw; x++) {
row[x] = xd; xd += a1;
}
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld;
uint8_t *_yls, *_yld;
for (y = 0; y < dh; y++) {
yls = (uint16_t *)(sp + *(y + col) * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < dw; x++) {
*(yld + x) = *(yls + *(row + x));
}
_yld = (uint8_t *)yld;
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
_yls = _yld;
_yld += dst->bytes_per_line;
memcpy(_yld, _yls, dw * 2);
y++;
}
}
break;
}
case 24:
case 32:
{
uint32_t *yls, *yld;
uint8_t *_yls, *_yld;
for (y = 0; y < dh; y++) {
yls = (uint32_t *)(sp + *(y + col) * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
for (x = 0; x < dw; x++) {
*(yld + x) = *(yls+ *(row + x));
}
_yld = (uint8_t *)yld;
while (y < dh - 1 && *(col + y) == *(col + y + 1)) {
_yls = _yld;
_yld += dst->bytes_per_line;
memcpy(_yld, _yls, dw * 4);
y++;
}
}
break;
}
}
free(row);
free(col);
}
-55
View File
@@ -1,55 +0,0 @@
// dst の上に src をブレンド率 lv でブレンドしたものを write へ書き出し
#include "config.h"
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gre_Blend(surface_t *write, int wx, int wy, surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, int lv) {
uint8_t *sp, *dp, *wp;
int x, y;
wp = GETOFFSET_PIXEL(write, wx, wy);
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld, *ylw;
for (y = 0; y < height; y++) {
yls = (uint16_t *)(sp + y * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
ylw = (uint16_t *)(wp + y * write->bytes_per_line);
for (x = 0; x < width; x++) {
*ylw = ALPHABLEND16(*yls, *yld, lv);
yls++; yld++; ylw++;
}
}
}
break;
case 24:
case 32:
{
uint32_t *yls, *yld, *ylw;
for (y = 0; y < height; y++) {
yls = (uint32_t *)(sp + y * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
ylw = (uint32_t *)(wp + y * write->bytes_per_line);
for (x = 0; x < width; x++) {
*ylw = ALPHABLEND24(*yls, *yld, lv);
yls++; yld++; ylw++;
}
}
break;
}
}
return OK;
}
-54
View File
@@ -1,54 +0,0 @@
//
#include "config.h"
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gre_BlendScreen(surface_t *write, int wx, int wy, surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height) {
uint8_t *sp, *dp, *wp;
int x, y;
wp = GETOFFSET_PIXEL(write, wx, wy);
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld, *ylw;
for (y = 0; y < height; y++) {
yls = (uint16_t *)(sp + y * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
ylw = (uint16_t *)(wp + y * write->bytes_per_line);
for (x = 0; x < width; x++) {
*ylw = SUTURADD16(*yls, *yld);
yls++; yld++; ylw++;
}
}
break;
}
case 32:
case 24:
{
uint32_t *yls, *yld, *ylw;
for (y = 0; y < height; y++) {
yls = (uint32_t *)(sp + y * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
ylw = (uint32_t *)(wp + y * write->bytes_per_line);
for (x = 0; x < width; x++) {
*ylw = SUTURADD24(*yls, *yld);
yls++; yld++; ylw++;
}
}
break;
}
}
return OK;
}
-104
View File
@@ -1,104 +0,0 @@
// dst の上に src をalphamapを参照しつつ、ブレンド率 lv でブレンド
// したものを write へ書き出し
#include "config.h"
#include "portab.h"
#include "surface.h"
#include "ngraph.h"
#include "ags.h"
int gre_BlendUseAMap(surface_t *write, int wx, int wy, surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int width, int height, surface_t *alpha, int ax, int ay, int lv) {
uint8_t *sp, *dp, *wp, *ap;
int x, y;
wp = GETOFFSET_PIXEL(write, wx, wy);
sp = GETOFFSET_PIXEL(src, sx, sy);
dp = GETOFFSET_PIXEL(dst, dx, dy);
ap = GETOFFSET_ALPHA(alpha, ax, ay);
if (lv == 255) {
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld, *ylw;
uint8_t *yla;
for (y = 0; y < height; y++) {
yls = (uint16_t *)(sp + y * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
ylw = (uint16_t *)(wp + y * write->bytes_per_line);
yla = (uint8_t *)(ap + y * alpha->width);
for (x = 0; x < width; x++) {
*ylw = ALPHABLEND16(*yls, *yld, *yla);
yls++; yld++; ylw++; yla++;
}
}
}
break;
case 24:
case 32:
{
uint32_t *yls, *yld, *ylw;
uint8_t *yla;
for (y = 0; y < height; y++) {
yls = (uint32_t *)(sp + y * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
ylw = (uint32_t *)(wp + y * write->bytes_per_line);
yla = (uint8_t *)(ap + y * alpha->width);
for (x = 0; x < width; x++) {
*ylw = ALPHABLEND24(*yls, *yld, *yla);
yls++; yld++; ylw++; yla++;
}
}
break;
}
}
} else {
switch(dst->depth) {
case 16:
{
uint16_t *yls, *yld, *ylw;
uint8_t *yla;
for (y = 0; y < height; y++) {
yls = (uint16_t *)(sp + y * src->bytes_per_line);
yld = (uint16_t *)(dp + y * dst->bytes_per_line);
ylw = (uint16_t *)(wp + y * write->bytes_per_line);
yla = (uint8_t *)(ap + y * alpha->width);
for (x = 0; x < width; x++) {
*ylw = ALPHABLEND16(*yls, *yld, (*yla * lv) / 255);
yls++; yld++; ylw++; yla++;
}
}
}
break;
case 24:
case 32:
{
uint32_t *yls, *yld, *ylw;
uint8_t *yla;
for (y = 0; y < height; y++) {
yls = (uint32_t *)(sp + y * src->bytes_per_line);
yld = (uint32_t *)(dp + y * dst->bytes_per_line);
ylw = (uint32_t *)(wp + y * write->bytes_per_line);
yla = (uint8_t *)(ap + y * alpha->width);
for (x = 0; x < width; x++) {
*ylw = ALPHABLEND24(*yls, *yld, (*yla * lv) / 255);
yls++; yld++; ylw++; yla++;
}
}
break;
}
}
}
return OK;
}

Some files were not shown because too many files have changed in this diff Show More