mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-09-22 22:48:08 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a395366cf8 | ||
|
|
e416fc20d3 | ||
|
|
7d03fc6757 | ||
|
|
e3b8c90611 | ||
|
|
361ca89016 | ||
|
|
5bd4622031 | ||
|
|
c7c0f69ec4 | ||
|
|
f38a3eda5c | ||
|
|
dc17b78365 | ||
|
|
b9f68eedd3 | ||
|
|
adf362ea57 | ||
|
|
b5bf439b8e | ||
|
|
9a01d28075 | ||
|
|
945dbd7722 | ||
|
|
1c54487041 | ||
|
|
92389289da | ||
|
|
4de03cc77f | ||
|
|
5a81ac6fc8 | ||
|
|
d7bac22059 | ||
|
|
8d4424061d | ||
|
|
6c692e44e5 | ||
|
|
ec071d4e8a | ||
|
|
904e10daa7 | ||
|
|
65b6da3f2a | ||
|
|
3f495b72c1 | ||
|
|
90670477c6 | ||
|
|
566ebb503f | ||
|
|
6feab51a5d | ||
|
|
15d0b44ab9 | ||
|
|
a0f20caa77 | ||
|
|
39712ee46e | ||
|
|
dcdbe7bb76 | ||
|
|
01a4255b83 | ||
|
|
d978a24a5e | ||
|
|
ed196f72b9 |
@@ -15,7 +15,9 @@ jobs:
|
||||
- sys: ucrt64
|
||||
package: "xsystem35-64bit"
|
||||
cmake_args: ""
|
||||
deps: "cjson:p"
|
||||
deps: >-
|
||||
cjson:p
|
||||
portmidi:p
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
@@ -31,7 +33,6 @@ jobs:
|
||||
SDL2_ttf:p
|
||||
SDL2_mixer:p
|
||||
libwebp:p
|
||||
portmidi:p
|
||||
${{ matrix.deps }}
|
||||
|
||||
- name: Checkout
|
||||
@@ -42,7 +43,7 @@ jobs:
|
||||
ls /${{ matrix.sys }}/share/licenses
|
||||
mkdir dist
|
||||
cp -r /${{ matrix.sys }}/share/licenses dist/
|
||||
cp fonts/*.license dist/licenses/
|
||||
cp licenses/* dist/licenses/
|
||||
|
||||
- name: Install dev dependencies
|
||||
run: pacboy --noconfirm -S --needed gcc:p cmake:p ninja:p asciidoctor:p
|
||||
|
||||
+24
-3
@@ -1,14 +1,35 @@
|
||||
# Changelog
|
||||
|
||||
## 2.14.2 - 2024-03-09
|
||||
## 2.16.1 - 2025-08-28
|
||||
- Fixed text rendering issue in SACT log (#71)
|
||||
- Windows: The 32-bit version no longer supports the portmidi MIDI backend
|
||||
|
||||
## 2.16.0 - 2025-06-13
|
||||
- Fixed map tile color issue in Graymerca (#67)
|
||||
- Windows: Implemented number input dialog for the `NI` command (#68)
|
||||
- Android: Added "Clear Save Files" launcher menu command
|
||||
|
||||
## 2.15.1 - 2025-05-14
|
||||
- Fixed a text rendering issue in Rance 5D (#66)
|
||||
|
||||
## 2.15.0 - 2025-04-21
|
||||
- Fixed color palette bug introduced in v2.14.2.
|
||||
- Fixed uncancellable message waiting mode.
|
||||
- Android: "Install from ZIP" button is moved to the top-right option menu.
|
||||
- Android: Improved extraction logic of track numbers from audio file names.
|
||||
|
||||
## 2.14.3 - 2025-04-01
|
||||
- Fixed build for big endian architectures.
|
||||
|
||||
## 2.14.2 - 2025-03-09
|
||||
- Android: Back button to exit the game (#50)
|
||||
- Improved touch input usability in ママトト (#64)
|
||||
|
||||
## 2.14.1 - 2024-02-07
|
||||
## 2.14.1 - 2025-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
|
||||
## 2.14.0 - 2025-01-09
|
||||
- New supported games: 俺の下であがけ and 楽園行.
|
||||
- Windows: On Windows 10 version 1903 or above, now xsystem35 can handle
|
||||
Japanese filenames correctly even if the system locale is not Japanese.
|
||||
|
||||
+4
-9
@@ -1,16 +1,11 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
# Rebuild external projects when download URL changes
|
||||
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
|
||||
cmake_policy(SET CMP0135 NEW)
|
||||
endif()
|
||||
cmake_minimum_required(VERSION 3.13...4.0)
|
||||
|
||||
project(xsystem35 LANGUAGES C)
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
enable_testing()
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
||||
|
||||
set(XSYSTEM35_VERSION "2.14.2")
|
||||
set(XSYSTEM35_VERSION "2.16.1")
|
||||
|
||||
include(CheckSymbolExists)
|
||||
include(FetchContent)
|
||||
@@ -37,8 +32,8 @@ endfunction()
|
||||
function(fetch_webp)
|
||||
FetchContent_Declare(
|
||||
libwebp
|
||||
URL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.4.0.tar.gz
|
||||
URL_HASH SHA1=0b1c8bea200caaa010182609dbaaa91aec69b64d
|
||||
URL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.5.0.tar.gz
|
||||
URL_HASH SHA1=b21aa842136dc59a72a38776a5aa73f4d0b00ac5
|
||||
)
|
||||
set(WEBP_BUILD_ANIM_UTILS OFF CACHE BOOL "Build animation utilities." FORCE)
|
||||
set(WEBP_BUILD_CWEBP OFF CACHE BOOL "Build the cwebp command line tool." FORCE)
|
||||
|
||||
+38
-37
@@ -6,7 +6,44 @@ Minimum supported Android version: 5.0
|
||||
You can download prebuilt APKs
|
||||
[here](https://github.com/kichikuou/xsystem35-sdl2/releases).
|
||||
|
||||
## Build
|
||||
## Usage
|
||||
### Basic Usage
|
||||
1. Create a ZIP file containing all the game files and BGM files (see
|
||||
[below](#preparing-a-zip) for details), and transfer it to your device.
|
||||
2. Open the app. Tap the option menu (three dots in the top right corner) and
|
||||
select "Install from ZIP".
|
||||
3. Select the ZIP file you created in step 1.
|
||||
4. The game will start. To simulate a right-click, tap the black bars on either
|
||||
the left or right, or top or bottom of the screen.
|
||||
|
||||
### Preparing a ZIP
|
||||
- Include all files from the `GAMEDATA` folder (such as `.ALD` files and
|
||||
others). `.EXE` and `.DLL` files are not necessary, but you can include them
|
||||
if you want.
|
||||
- Music files (`.mp3`, `.ogg`, or `.wav`) whose filenames have a number either
|
||||
at the beginning or just before the extension are recognized as BGM files.
|
||||
For example:
|
||||
- `Track2.mp3`
|
||||
- `15.ogg`
|
||||
- `02 - Title.mp3`
|
||||
- `rance4_03.wav` (Note: The filename shouldn't be `rance403.wav`, as it
|
||||
would be treated as the 403rd track.)
|
||||
|
||||
Note: This ZIP format is also compatible with
|
||||
[Kichikuou on Web](http://kichikuou.github.io/web/).
|
||||
|
||||
### Miscellaneous
|
||||
- You can export or import save files via the game list's option menu.
|
||||
- To uninstall a game, long-tap its title in the game list.
|
||||
|
||||
## Known Issues
|
||||
- Android versions older than 7.0 cannot handle ZIP files containing Shift-JIS
|
||||
filenames. This issue occurs with some ZIP files distributed on
|
||||
[retroc.net](http://retropc.net/alice/). If you encounter the error message
|
||||
"This type of ZIP is not supported," unzip the file on your PC and re-archive
|
||||
it using modern ZIP creation software.
|
||||
|
||||
## Building from Source
|
||||
|
||||
### Using Android Studio
|
||||
Open this directory as an Android Studio project.
|
||||
@@ -34,39 +71,3 @@ git clone https://github.com/kichikuou/xsystem35-sdl2.git
|
||||
cd xsystem35-sdl2/android
|
||||
./gradlew build # or ./gradlew installDebug if you have a connected device
|
||||
```
|
||||
|
||||
## Usage
|
||||
### Basic Usage
|
||||
1. Create a ZIP file containing all the game files and BGM files (see
|
||||
[below](#preparing-a-zip) for details), and transfer it to your device.
|
||||
2. Open the app. A list of installed games will be displayed. Since no games
|
||||
have been installed yet, only the "Install from ZIP" button will be visible.
|
||||
Tap it.
|
||||
3. Select the ZIP file you created in step 1.
|
||||
4. The game will start. To simulate a right-click, tap the black bars on either
|
||||
the left or right, or top or bottom of the screen.
|
||||
|
||||
### Preparing a ZIP
|
||||
- Include all files from the `GAMEDATA` folder (such as `.ALD` files and
|
||||
others). `.EXE` and `.DLL` files are not necessary, but you can include them
|
||||
if you want.
|
||||
- Music files (`.mp3`, `.ogg`, or `.wav`) whose filenames end with a number
|
||||
will be recognized as BGM files. For example:
|
||||
- `Track2.mp3`
|
||||
- `15.ogg`
|
||||
- `rance4_03.wav` (Note: The filename shouldn't be `rance403.wav`, as it
|
||||
would be treated as the 403rd track.)
|
||||
|
||||
Note: This ZIP format is also compatible with
|
||||
[Kichikuou on Web](http://kichikuou.github.io/web/).
|
||||
|
||||
### Miscellaneous
|
||||
- You can export or import save files via the game list's option menu.
|
||||
- To uninstall a game, long-tap its title in the game list.
|
||||
|
||||
## Known Issues
|
||||
- Android versions older than 7.0 cannot handle ZIP files containing Shift-JIS
|
||||
filenames. This issue occurs with some ZIP files distributed on
|
||||
[retroc.net](http://retropc.net/alice/). If you encounter the error message
|
||||
"This type of ZIP is not supported," unzip the file on your PC and re-archive
|
||||
it using modern ZIP creation software.
|
||||
|
||||
@@ -16,8 +16,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 34
|
||||
versionCode 31
|
||||
versionName "2.14.2" + gitRevision()
|
||||
versionCode 36
|
||||
versionName "2.16.1" + gitRevision()
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DANDROID_APP_PLATFORM=android-19", "-DANDROID_STL=c++_static"
|
||||
|
||||
@@ -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.12/SDL2-2.30.12.tar.gz
|
||||
URL_HASH SHA1=36d48b045209dcd3576250c1571795ad0cd4d5a9
|
||||
URL https://github.com/libsdl-org/SDL/releases/download/release-2.32.4/SDL2-2.32.4.tar.gz
|
||||
URL_HASH SHA1=4fb68f43891ca4def414cc7cf0f3b2a053cb6aaf
|
||||
)
|
||||
FetchContent_Declare(
|
||||
SDL_ttf
|
||||
@@ -44,8 +44,9 @@ file(MAKE_DIRECTORY ${ASSETS_DIR}/licenses)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/MTLc3m.ttf ${ASSETS_DIR}/MTLc3m.ttf)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/mincho.otf ${ASSETS_DIR}/mincho.otf)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/COPYING ${ASSETS_DIR}/licenses/xsystem35)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/MTLc3m.ttf.license ${ASSETS_DIR}/licenses/MTLc3m)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/fonts/mincho.otf.license ${ASSETS_DIR}/licenses/mincho)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/licenses/MTLc3m.txt ${ASSETS_DIR}/licenses/MTLc3m)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/licenses/mincho.txt ${ASSETS_DIR}/licenses/mincho)
|
||||
file(COPY_FILE ${PROJECT_ROOT_DIR}/licenses/nanojpeg.txt ${ASSETS_DIR}/licenses/nanojpeg)
|
||||
file(COPY_FILE ${sdl_SOURCE_DIR}/LICENSE.txt ${ASSETS_DIR}/licenses/SDL)
|
||||
file(COPY_FILE ${sdl_ttf_SOURCE_DIR}/LICENSE.txt ${ASSETS_DIR}/licenses/SDL_ttf)
|
||||
file(COPY_FILE ${sdl_ttf_SOURCE_DIR}/external/freetype/docs/GPLv2.TXT ${ASSETS_DIR}/licenses/freetype)
|
||||
|
||||
Vendored
+81
@@ -15,3 +15,84 @@
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLInputConnection {
|
||||
void nativeCommitText(java.lang.String, int);
|
||||
void nativeGenerateScancodeForUnichar(char);
|
||||
}
|
||||
|
||||
-keep,includedescriptorclasses class org.libsdl.app.SDLActivity {
|
||||
# for some reason these aren't compatible with allowoptimization modifier
|
||||
boolean supportsRelativeMouse();
|
||||
void setWindowStyle(boolean);
|
||||
}
|
||||
|
||||
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLActivity {
|
||||
java.lang.String nativeGetHint(java.lang.String); # Java-side doesn't use this, so it gets minified, but C-side still tries to register it
|
||||
boolean onNativeSoftReturnKey();
|
||||
void onNativeKeyboardFocusLost();
|
||||
boolean isScreenKeyboardShown();
|
||||
android.util.DisplayMetrics getDisplayDPI();
|
||||
java.lang.String clipboardGetText();
|
||||
boolean clipboardHasText();
|
||||
void clipboardSetText(java.lang.String);
|
||||
int createCustomCursor(int[], int, int, int, int);
|
||||
void destroyCustomCursor(int);
|
||||
android.content.Context getContext();
|
||||
boolean getManifestEnvironmentVariables();
|
||||
android.view.Surface getNativeSurface();
|
||||
void initTouch();
|
||||
boolean isAndroidTV();
|
||||
boolean isChromebook();
|
||||
boolean isDeXMode();
|
||||
boolean isTablet();
|
||||
void manualBackButton();
|
||||
int messageboxShowMessageBox(int, java.lang.String, java.lang.String, int[], int[], java.lang.String[], int[]);
|
||||
void minimizeWindow();
|
||||
int openURL(java.lang.String);
|
||||
void requestPermission(java.lang.String, int);
|
||||
int showToast(java.lang.String, int, int, int, int);
|
||||
boolean sendMessage(int, int);
|
||||
boolean setActivityTitle(java.lang.String);
|
||||
boolean setCustomCursor(int);
|
||||
void setOrientation(int, int, boolean, java.lang.String);
|
||||
boolean setRelativeMouseEnabled(boolean);
|
||||
boolean setSystemCursor(int);
|
||||
boolean shouldMinimizeOnFocusLoss();
|
||||
boolean showTextInput(int, int, int, int);
|
||||
}
|
||||
|
||||
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.HIDDeviceManager {
|
||||
boolean initialize(boolean, boolean);
|
||||
boolean openDevice(int);
|
||||
int sendOutputReport(int, byte[]);
|
||||
int sendFeatureReport(int, byte[]);
|
||||
boolean getFeatureReport(int, byte[]);
|
||||
void closeDevice(int);
|
||||
}
|
||||
|
||||
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLAudioManager {
|
||||
int[] getAudioOutputDevices();
|
||||
int[] getAudioInputDevices();
|
||||
int[] audioOpen(int, int, int, int, int);
|
||||
void audioWriteFloatBuffer(float[]);
|
||||
void audioWriteShortBuffer(short[]);
|
||||
void audioWriteByteBuffer(byte[]);
|
||||
void audioClose();
|
||||
int[] captureOpen(int, int, int, int, int);
|
||||
int captureReadFloatBuffer(float[], boolean);
|
||||
int captureReadShortBuffer(short[], boolean);
|
||||
int captureReadByteBuffer(byte[], boolean);
|
||||
void captureClose();
|
||||
void audioSetThreadPriority(boolean, int);
|
||||
native int nativeSetupJNI();
|
||||
native void removeAudioDevice(boolean, int);
|
||||
native void addAudioDevice(boolean, int);
|
||||
}
|
||||
|
||||
-keep,includedescriptorclasses,allowoptimization class org.libsdl.app.SDLControllerManager {
|
||||
void pollInputDevices();
|
||||
void pollHapticDevices();
|
||||
void hapticRun(int, float, int);
|
||||
void hapticStop(int);
|
||||
}
|
||||
|
||||
@@ -127,6 +127,7 @@ class Launcher private constructor(private val rootDir: File) {
|
||||
if (!saveDirFound) {
|
||||
File(rootDir, SAVE_DIR).mkdir()
|
||||
}
|
||||
observer?.onGameListChange()
|
||||
}
|
||||
|
||||
private fun createDirForGame(): File {
|
||||
@@ -219,16 +220,17 @@ class Launcher private constructor(private val rootDir: File) {
|
||||
var gameDir: String? = null
|
||||
private set
|
||||
private val aldRegex = """.*?s[a-z]\.ald""".toRegex(RegexOption.IGNORE_CASE)
|
||||
private val audioRegex = """.*?(\d+)\.(wav|mp3|ogg)""".toRegex(RegexOption.IGNORE_CASE)
|
||||
private val audioRegex = """((\d+).*|.*?(\d+))\.(wav|mp3|ogg)""".toRegex(RegexOption.IGNORE_CASE)
|
||||
private val audioFiles: Array<String?> = arrayOfNulls(100)
|
||||
|
||||
fun maybeAdd(path: String) {
|
||||
aldRegex.matchEntire(path)?.let {
|
||||
val name = File(path).name
|
||||
aldRegex.matchEntire(name)?.let {
|
||||
gameDir = File(path).parent
|
||||
ready = true
|
||||
}
|
||||
audioRegex.matchEntire(path)?.let {
|
||||
val track = it.groupValues[1].toInt()
|
||||
audioRegex.matchEntire(name)?.let {
|
||||
val track = it.groupValues[2].toIntOrNull() ?: it.groupValues[3].toInt()
|
||||
if (0 < track && track <= audioFiles.size)
|
||||
audioFiles[track - 1] = path
|
||||
}
|
||||
@@ -251,6 +253,14 @@ class Launcher private constructor(private val rootDir: File) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun clearSaveData(): Boolean {
|
||||
var success = true
|
||||
File(rootDir, SAVE_DIR).listFiles()?.forEach { file ->
|
||||
if (!file.deleteRecursively()) success = false
|
||||
}
|
||||
return success
|
||||
}
|
||||
}
|
||||
|
||||
private fun forEachZipEntry(input: InputStream, action: (ZipEntry, ZipInputStream) -> Unit): Boolean {
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.provider.OpenableColumns
|
||||
import android.text.Html
|
||||
import android.util.Log
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
@@ -53,6 +54,8 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
|
||||
onGameListChange()
|
||||
val listView = findViewById<ListView>(R.id.list)
|
||||
listView.emptyView = findViewById(R.id.empty)
|
||||
findViewById<TextView>(R.id.usage).text = Html.fromHtml(getString(R.string.usage))
|
||||
listView.setOnItemClickListener { _, _, position, _ ->
|
||||
onListItemClick(position)
|
||||
}
|
||||
@@ -75,23 +78,15 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
}
|
||||
|
||||
private fun onListItemClick(position: Int) {
|
||||
if (position < launcher.games.size) {
|
||||
startGame(launcher.games[position].path, null)
|
||||
} else {
|
||||
val i = Intent(Intent.ACTION_GET_CONTENT)
|
||||
i.type = CONTENT_TYPE_ZIP
|
||||
startActivityForResult(Intent.createChooser(i, getString(R.string.choose_a_file)), INSTALL_REQUEST)
|
||||
}
|
||||
startGame(launcher.games[position].path, null)
|
||||
}
|
||||
|
||||
private fun onItemLongClick(position: Int): Boolean {
|
||||
if (position < launcher.games.size) {
|
||||
AlertDialog.Builder(this).setTitle(R.string.uninstall_dialog_title)
|
||||
.setMessage(getString(R.string.uninstall_dialog_message, launcher.games[position].title))
|
||||
.setPositiveButton(R.string.ok) {_, _ -> uninstall(position)}
|
||||
.setNegativeButton(R.string.cancel) {_, _ -> }
|
||||
.show()
|
||||
}
|
||||
AlertDialog.Builder(this).setTitle(R.string.confirm)
|
||||
.setMessage(getString(R.string.uninstall_dialog_message, launcher.games[position].title))
|
||||
.setPositiveButton(R.string.ok) {_, _ -> uninstall(position)}
|
||||
.setNegativeButton(R.string.cancel) {_, _ -> }
|
||||
.show()
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -102,6 +97,12 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.install_from_zip -> {
|
||||
val i = Intent(Intent.ACTION_GET_CONTENT)
|
||||
i.type = CONTENT_TYPE_ZIP
|
||||
startActivityForResult(Intent.createChooser(i, getString(R.string.choose_a_file)), INSTALL_REQUEST)
|
||||
true
|
||||
}
|
||||
R.id.export_savedata -> {
|
||||
val i = Intent(Intent.ACTION_CREATE_DOCUMENT)
|
||||
i.type = CONTENT_TYPE_ZIP
|
||||
@@ -116,6 +117,27 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
SAVEDATA_IMPORT_REQUEST)
|
||||
true
|
||||
}
|
||||
R.id.clear_savedata -> {
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle(R.string.confirm)
|
||||
.setMessage(R.string.clear_save_data_confirm)
|
||||
.setPositiveButton(R.string.ok) { _, _ ->
|
||||
if (launcher.clearSaveData()) {
|
||||
Toast.makeText(this, R.string.save_data_clear_success, Toast.LENGTH_SHORT).show()
|
||||
} else {
|
||||
errorDialog(R.string.save_data_clear_error)
|
||||
}
|
||||
}
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.show()
|
||||
true
|
||||
}
|
||||
R.id.help -> {
|
||||
AlertDialog.Builder(this)
|
||||
.setMessage(Html.fromHtml(getString(R.string.usage)))
|
||||
.show()
|
||||
true
|
||||
}
|
||||
R.id.licenses -> {
|
||||
val intent = Intent(this, LicensesMenuActivity::class.java)
|
||||
startActivity(intent)
|
||||
@@ -157,7 +179,6 @@ class LauncherActivity : Activity(), LauncherObserver {
|
||||
|
||||
override fun onGameListChange() {
|
||||
val items = launcher.titles.toMutableList()
|
||||
items.add(getString(R.string.install_from_zip))
|
||||
val listView = findViewById<ListView>(R.id.list)
|
||||
listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ class LicensesMenuActivity : Activity() {
|
||||
Entry("SDL", "SDL", "https://www.libsdl.org/"),
|
||||
Entry("SDL_mixer", "SDL_mixer", "https://github.com/libsdl-org/SDL_mixer"),
|
||||
Entry("SDL_ttf", "SDL_ttf", "https://github.com/libsdl-org/SDL_ttf"),
|
||||
Entry("NanoJPEG", "nanojpeg", "https://keyj.emphy.de/nanojpeg/"),
|
||||
Entry("FreeType", "freetype", "https://freetype.org/"),
|
||||
Entry("HarfBuzz", "harfbuzz", "https://harfbuzz.github.io/"),
|
||||
Entry("MotoyaLCedar W3 mono", "MTLc3m", "https://github.com/aosp-mirror/platform_frameworks_base/tree/lollipop-release/data/fonts"),
|
||||
|
||||
@@ -60,8 +60,8 @@ import java.util.Locale;
|
||||
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
|
||||
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 = 12;
|
||||
private static final int SDL_MINOR_VERSION = 32;
|
||||
private static final int SDL_MICRO_VERSION = 4;
|
||||
/*
|
||||
// Display InputType.SOURCE/CLASS of events and devices
|
||||
//
|
||||
@@ -790,6 +790,9 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
SDLActivity.mFullscreenModeActive = false;
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= 28 /* Android 9 (Pie) */) {
|
||||
window.getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Log.e(TAG, "error handling message, getContext() returned no Activity");
|
||||
|
||||
@@ -6,4 +6,12 @@
|
||||
<ListView android:id="@+id/list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<ScrollView android:id="@+id/empty"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<TextView android:id="@+id/usage"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="20dp" />
|
||||
</ScrollView>
|
||||
</LinearLayout>
|
||||
@@ -1,11 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/install_from_zip"
|
||||
android:title="@string/action_install_from_zip" />
|
||||
<item
|
||||
android:id="@+id/export_savedata"
|
||||
android:title="@string/action_export_save_data" />
|
||||
<item
|
||||
android:id="@+id/import_savedata"
|
||||
android:title="@string/action_import_save_data" />
|
||||
<item
|
||||
android:id="@+id/clear_savedata"
|
||||
android:title="@string/action_clear_save_data" />
|
||||
<item
|
||||
android:id="@+id/help"
|
||||
android:title="@string/action_help" />
|
||||
<item
|
||||
android:id="@+id/licenses"
|
||||
android:title="@string/action_licenses" />
|
||||
|
||||
@@ -2,21 +2,43 @@
|
||||
<resources>
|
||||
<string name="app_name">xsystem35</string>
|
||||
<string name="action_export_save_data">セーブデータをエクスポート</string>
|
||||
<string name="action_help">使い方</string>
|
||||
<string name="action_import_save_data">セーブデータをインポート</string>
|
||||
<string name="action_install_from_zip">ZIPからインストール</string>
|
||||
<string name="action_licenses">オープンソースライセンス</string>
|
||||
<string name="action_clear_save_data">セーブデータをクリア</string>
|
||||
<string name="cancel">キャンセル</string>
|
||||
<string name="cannot_find_ald">System 3.x のファイル (*.ald) が見つかりません。</string>
|
||||
<string name="choose_a_file">ファイルを選択</string>
|
||||
<string name="clear_save_data_confirm">セーブデータをすべて削除します。元には戻せません。本当によろしいですか?</string>
|
||||
<string name="confirm">確認</string>
|
||||
<string name="error_dialog_title">エラー</string>
|
||||
<string name="install_dialog_title">インストール中…</string>
|
||||
<string name="install_from_zip">ZIP からインストール</string>
|
||||
<string name="install_progress">%s を展開中</string>
|
||||
<string name="no_data_to_import">ZIP アーカイブ中に save/ フォルダが見つかりません。</string>
|
||||
<string name="save_data_export_error">セーブデータのエクスポートに失敗しました。</string>
|
||||
<string name="save_data_export_success">エクスポートに成功しました。</string>
|
||||
<string name="save_data_import_success">インポートに成功しました。</string>
|
||||
<string name="save_data_clear_success">セーブデータをクリアしました。</string>
|
||||
<string name="save_data_clear_error">セーブデータのクリアに失敗しました。</string>
|
||||
<string name="uninstall_dialog_message">「%s」をアンインストールしますか?</string>
|
||||
<string name="uninstall_dialog_title">確認</string>
|
||||
<string name="unsupported_zip">この形式の ZIP はサポートしていません。</string>
|
||||
<string name="zip_extraction_error">ZIP の展開に失敗しました。</string>
|
||||
<string name="usage">
|
||||
<![CDATA[
|
||||
<h1>ゲームのインストール方法</h1>
|
||||
<p>1. PC上で、ゲームのファイルが入ったZIPを用意します。例えば以下のようなファイルを含めます:</p>
|
||||
<div>
|
||||
・鬼畜王SA.ALD<br>
|
||||
・鬼畜王GA.ALD<br>
|
||||
・鬼畜王GB.ALD<br>
|
||||
・鬼畜王WA.ALD<br>
|
||||
・02.mp3<br>
|
||||
・03.mp3<br>
|
||||
・…<br>
|
||||
</div>
|
||||
<p>2. ZIPファイルを (例えばUSB経由で) PCからデバイスに転送します。</p>
|
||||
<p>3. この画面の右上のメニューボタンをタップして「ZIPからインストール」を選択し、転送したZIPを選びます。</p>
|
||||
]]>
|
||||
</string>
|
||||
</resources>
|
||||
@@ -1,22 +1,45 @@
|
||||
<resources>
|
||||
<string name="app_name">xsystem35</string>
|
||||
<string name="action_clear_save_data">Clear Save Files</string>
|
||||
<string name="action_export_save_data">Export Save Files</string>
|
||||
<string name="action_help">Help</string>
|
||||
<string name="action_import_save_data">Import Save Files</string>
|
||||
<string name="action_install_from_zip">Install from ZIP</string>
|
||||
<string name="action_licenses">Open source licenses</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="cannot_find_ald">Cannot find System 3.x game files (*.ald).</string>
|
||||
<string name="choose_a_file">Choose a file</string>
|
||||
<string name="clear_save_data_confirm">Are you sure you want to clear all save files? This cannot be undone.</string>
|
||||
<string name="confirm">Confirm</string>
|
||||
<string name="error_dialog_title">Error</string>
|
||||
<string name="install_dialog_title">Installing…</string>
|
||||
<string name="install_from_zip">Install from ZIP</string>
|
||||
<string name="install_progress">Extracting %s</string>
|
||||
<string name="no_data_to_import">No save/ folder in the ZIP archive.</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="save_data_clear_error">Failed to clear save files.</string>
|
||||
<string name="save_data_clear_success">Save files cleared.</string>
|
||||
<string name="save_data_export_error">Failed to export save files.</string>
|
||||
<string name="save_data_import_success">Imported successfully.</string>
|
||||
<string name="save_data_export_success">Exported successfully.</string>
|
||||
<string name="uninstall_dialog_message">Uninstall \"%s\"?</string>
|
||||
<string name="uninstall_dialog_title">Confirm</string>
|
||||
<string name="unsupported_zip">This type of ZIP is not supported.</string>
|
||||
<string name="zip_extraction_error">Failed to extract ZIP.</string>
|
||||
<string name="usage">
|
||||
<![CDATA[
|
||||
<h1>How to install a game</h1>
|
||||
<p>1. On your PC, prepare a ZIP containing the game files. For example, it should contain the following files:</p>
|
||||
<div>
|
||||
* KICHIKUSA.ALD<br>
|
||||
* KICHIKUGA.ALD<br>
|
||||
* KICHIKUGB.ALD<br>
|
||||
* KICHIKUWA.ALD<br>
|
||||
* System39.ain<br>
|
||||
* 02.mp3<br>
|
||||
* 03.mp3<br>
|
||||
* …<br>
|
||||
</div>
|
||||
<p>2. Transfer the ZIP file from your PC to the device (e.g. via USB).</p>
|
||||
<p>3. Tap the menu button at the upper-right of this screen, select "Install from ZIP," and choose the ZIP you transferred.</p>
|
||||
]]>
|
||||
</string>
|
||||
</resources>
|
||||
|
||||
@@ -30,7 +30,8 @@ finds System 3.x game files (*.ALD) from the current directory.
|
||||
*-game* _game_::
|
||||
Enables game-specific hacks. Usually auto-detected, but must be specified for
|
||||
games with modified / translated titles. Possible values are: `toushin2`,
|
||||
`rance3_eng`, `rance4_eng`, `rance4_v2`, `persiom`, `agake`.
|
||||
`rance2`, `rance3`, `rance3_eng`, `rance4_eng`, `rance4_v2`, `persiom`,
|
||||
`agake`.
|
||||
|
||||
*-savedir* _dir_::
|
||||
Directory to save game state files. If _dir_ begins with '~', it is expanded
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
install(FILES
|
||||
MTLc3m.ttf
|
||||
MTLc3m.ttf.license
|
||||
mincho.otf
|
||||
mincho.otf.license
|
||||
DESTINATION share/xsystem35/fonts)
|
||||
|
||||
# pyftsubset is included in fonttools.
|
||||
|
||||
@@ -58,6 +58,8 @@ Game Compatibility
|
||||
| 妻みぐい2 | Supported | |
|
||||
| シェル・クレイル | Supported | |
|
||||
| ナイトデーモン | Supported | |
|
||||
| Nor | Unsupported | |
|
||||
| 翡翠の眸 | Unsupported | |
|
||||
| 学園KING | Supported | From アリスCD |
|
||||
| 学園KING 番外編 | Supported | From アリスCD |
|
||||
| 蒼海に墜ちて | Supported | From アリスCD |
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
// NanoJPEG -- KeyJ's Tiny Baseline JPEG Decoder
|
||||
// version 1.3.5 (2016-11-14)
|
||||
// Copyright (c) 2009-2016 Martin J. Fiedler <martin.fiedler@gmx.net>
|
||||
// published under the terms of the MIT license
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
+4
-4
@@ -33,7 +33,7 @@
|
||||
#include "ags.h"
|
||||
#include "pms.h"
|
||||
#include "qnt.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "ngraph.h"
|
||||
#include "dri.h"
|
||||
#include "ald_manager.h"
|
||||
@@ -73,21 +73,21 @@ static surface_t *sf_getcg(void *b, size_t size) {
|
||||
cg->alpha = cg->pic;
|
||||
cg->pic = NULL;
|
||||
sf = sf_create_alpha(cg->width, cg->height);
|
||||
sdl_drawImageAlphaMap(cg, sf, 0, 0);
|
||||
gfx_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);
|
||||
gfx_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);
|
||||
gfx_drawImage24(cg, sf, 0, 0, 255);
|
||||
break;
|
||||
default:
|
||||
WARNING("Unknown Cg Type");
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "surface.h"
|
||||
#include "sdl_core.h"
|
||||
#include "effect.h"
|
||||
#include "ags.h"
|
||||
#include "input.h"
|
||||
#include "graph.h"
|
||||
@@ -24,17 +24,17 @@ void gpx_effect(int no,
|
||||
|
||||
*endtype = 0;
|
||||
|
||||
enum sdl_effect_type type = from_sact_effect(no);
|
||||
enum effect_type type = from_sact_effect(no);
|
||||
if (type == EFFECT_INVALID) {
|
||||
WARNING("Unimplemented effect %d", no);
|
||||
type = EFFECT_CROSSFADE;
|
||||
}
|
||||
SDL_Rect rect = { wx, wy, width, height };
|
||||
struct sdl_effect *eff = sdl_effect_init(&rect, dst, dx, dy, src, sx, sy, type);
|
||||
struct effect *eff = 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);
|
||||
sdl_effect_finish(eff);
|
||||
ags_runEffect(time, false, (ags_EffectStepFunc)effect_step, eff);
|
||||
effect_finish(eff);
|
||||
|
||||
switch (no) {
|
||||
case SACT_EFFECT_FADEOUT:
|
||||
|
||||
+4
-4
@@ -11,7 +11,7 @@
|
||||
#include "graph.h"
|
||||
#include "ngraph.h"
|
||||
#include "ags.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
|
||||
/**
|
||||
* surface から surface にコピーなどをする際に、転送元と転送先のsurface
|
||||
@@ -33,8 +33,8 @@
|
||||
*/
|
||||
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 };
|
||||
SDL_Rect src_window = { 0, 0, ss->width, ss->height };
|
||||
SDL_Rect dst_window = { 0, 0, ds->width, ds->height };
|
||||
return ags_clipCopyRect(&src_window, &dst_window, sx, sy, dx, dy, sw, sh);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ void gr_copy(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int
|
||||
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 *view = gfx_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;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "portab.h"
|
||||
#include "graphics.h"
|
||||
#include "ags.h"
|
||||
#include "sprite.h"
|
||||
|
||||
@@ -42,7 +41,7 @@ struct _night {
|
||||
// graph
|
||||
// cginfo_t *cg[CGMAX];
|
||||
|
||||
MyRectangle updaterect;
|
||||
SDL_Rect updaterect;
|
||||
|
||||
FontType fonttype;
|
||||
int fontsize;
|
||||
|
||||
@@ -53,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 = main_surface->w;
|
||||
sp->cursize.height = main_surface->h;
|
||||
sp->width = main_surface->w;
|
||||
sp->height = main_surface->h;
|
||||
sp->update = nt_sp_draw_wall;
|
||||
}
|
||||
|
||||
|
||||
+13
-14
@@ -7,7 +7,6 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "utfsjis.h"
|
||||
#include "ags.h"
|
||||
#include "nact.h"
|
||||
@@ -217,7 +216,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
|
||||
char *msg;
|
||||
sprite_t *sp;
|
||||
bool needupdate = false;
|
||||
MyRectangle uparea = {0,0,0,0};
|
||||
SDL_Rect uparea = {0,0,0,0};
|
||||
int savex;
|
||||
|
||||
if (night.msgbuf[0] == '\0') return;
|
||||
@@ -236,7 +235,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
|
||||
char mbuf[20];
|
||||
int cw, delta, wcnt;
|
||||
|
||||
wcnt = sdl_getTicks();
|
||||
wcnt = sys_get_ticks();
|
||||
|
||||
mbuf[0] = '\0';
|
||||
msg = get_char(msg, mbuf, sizeof(mbuf) -1);
|
||||
@@ -267,7 +266,7 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
|
||||
needupdate = false;
|
||||
|
||||
// keywait
|
||||
delta = sdl_getTicks() - wcnt;
|
||||
delta = sys_get_ticks() - wcnt;
|
||||
if (delta < wSpeed) {
|
||||
if (sys_keywait(wSpeed - delta, KEYWAIT_NONCANCELABLE)) {
|
||||
|
||||
@@ -284,8 +283,8 @@ static void ntmsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB
|
||||
|
||||
// Waitなしの出力は最後にupdate
|
||||
if (needupdate) {
|
||||
uparea.w = sp->cursize.width;
|
||||
uparea.h = min(sp->cursize.height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace);
|
||||
uparea.w = sp->width;
|
||||
uparea.h = min(sp->height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace);
|
||||
nt_sp_updateme_part(sp, uparea.x, uparea.y, uparea.w, uparea.h);
|
||||
}
|
||||
|
||||
@@ -311,14 +310,14 @@ static int ntmsg_keywait() {
|
||||
night.waitkey = -1;
|
||||
|
||||
while (night.waitkey == -1 && !nact->is_quit) {
|
||||
int st = sdl_getTicks();
|
||||
int st = sys_get_ticks();
|
||||
int interval = 25;
|
||||
|
||||
if (!night.zhiding) {
|
||||
interval = night.sp[SPNO_MSG_KEYANIM]->u.anime.interval;
|
||||
hakanim(i++);
|
||||
}
|
||||
sys_keywait(interval - (sdl_getTicks() - st), KEYWAIT_NONCANCELABLE);
|
||||
sys_keywait(interval - (sys_get_ticks() - st), KEYWAIT_NONCANCELABLE);
|
||||
}
|
||||
|
||||
night.waittype = KEYWAIT_NONE;
|
||||
@@ -355,8 +354,8 @@ static void set_align(char *msg, sprite_t *sp, int wSize) {
|
||||
|
||||
maxchar = max(maxchar, c);
|
||||
line++;
|
||||
sp->u.msg.dspcur.x = (sp->cursize.width - (maxchar * wSize/2)) /2;
|
||||
sp->u.msg.dspcur.y = (sp->cursize.height - (line * (wSize+2))) /2;
|
||||
sp->u.msg.dspcur.x = (sp->width - (maxchar * wSize/2)) /2;
|
||||
sp->u.msg.dspcur.y = (sp->height - (line * (wSize+2))) /2;
|
||||
break;
|
||||
case 2:
|
||||
sp->u.msg.dspcur.x = msgframe_2.x;
|
||||
@@ -436,14 +435,14 @@ static void hakanim(int i) {
|
||||
sp->show = show;
|
||||
}
|
||||
|
||||
void ntmsg_update(sprite_t *sp, MyRectangle *r) {
|
||||
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.height};
|
||||
void ntmsg_update(sprite_t *sp, SDL_Rect *r) {
|
||||
SDL_Rect sp_rect = {0, 0, sp->width, sp->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;
|
||||
int w = sp->width;
|
||||
int h = sp->height;
|
||||
if (!ags_clipCopyRect(&sp_rect, r, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@ 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);
|
||||
void ntmsg_update(sprite_t *sp, SDL_Rect *r);
|
||||
|
||||
#endif /* __NT_MSG_H__ */
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "input.h"
|
||||
#include "sdl_core.h"
|
||||
#include "scheduler.h"
|
||||
#include "xsystem35.h"
|
||||
#include "nact.h"
|
||||
|
||||
+10
-10
@@ -28,11 +28,11 @@ sprite_t *nt_sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
sp->cur = sp->loc;
|
||||
|
||||
if (sp->curcg == NULL) {
|
||||
sp->cursize.width = 0;
|
||||
sp->cursize.height = 0;
|
||||
sp->width = 0;
|
||||
sp->height = 0;
|
||||
} else {
|
||||
sp->cursize.width = sp->curcg->sf->w;
|
||||
sp->cursize.height = sp->curcg->sf->h;
|
||||
sp->width = sp->curcg->sf->w;
|
||||
sp->height = sp->curcg->sf->h;
|
||||
}
|
||||
sp->update = DEFAULT_UPDATE;
|
||||
|
||||
@@ -58,8 +58,8 @@ sprite_t *nt_sp_msg_new(int no, int x, int y, int width, int height) {
|
||||
sp->loc.x = x;
|
||||
sp->loc.y = y;
|
||||
sp->cur = sp->loc;
|
||||
sp->cursize.width = width;
|
||||
sp->cursize.height = height;
|
||||
sp->width = width;
|
||||
sp->height = height;
|
||||
sp->u.msg.dspcur.x = 0;
|
||||
sp->u.msg.dspcur.y = 0;
|
||||
sp->u.msg.canvas = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
@@ -107,11 +107,11 @@ void nt_sp_set_cg(sprite_t *sp, int no) {
|
||||
cg = no ? nt_scg_addref(no) : NULL;
|
||||
|
||||
if (cg == NULL) {
|
||||
sp->cursize.width = 0;
|
||||
sp->cursize.height = 0;
|
||||
sp->width = 0;
|
||||
sp->height = 0;
|
||||
} else {
|
||||
sp->cursize.width = cg->sf->w;
|
||||
sp->cursize.height = cg->sf->h;
|
||||
sp->width = cg->sf->w;
|
||||
sp->height = cg->sf->h;
|
||||
}
|
||||
|
||||
sp->curcg = cg;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#define __SPRITE_H__
|
||||
|
||||
#include "portab.h"
|
||||
#include "graphics.h"
|
||||
#include <SDL_rect.h>
|
||||
|
||||
#define DEFAULT_UPDATE nt_sp_draw
|
||||
|
||||
@@ -72,7 +72,8 @@ struct _sprite {
|
||||
|
||||
int no;
|
||||
|
||||
MyDimension cursize;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
cginfo_t *curcg;
|
||||
cginfo_t *cg1, *cg2, *cg3;
|
||||
@@ -81,11 +82,11 @@ struct _sprite {
|
||||
|
||||
int blendrate;
|
||||
|
||||
MyPoint loc;
|
||||
SDL_Point loc;
|
||||
|
||||
MyPoint cur;
|
||||
SDL_Point cur;
|
||||
|
||||
void (* update)(struct _sprite *sp, MyRectangle *updatearea);
|
||||
void (* update)(struct _sprite *sp, SDL_Rect *updatearea);
|
||||
|
||||
union {
|
||||
struct {
|
||||
@@ -97,7 +98,7 @@ struct _sprite {
|
||||
|
||||
struct {
|
||||
struct SDL_Surface *canvas;
|
||||
MyPoint dspcur;
|
||||
SDL_Point dspcur;
|
||||
} msg;
|
||||
} u;
|
||||
};
|
||||
@@ -120,12 +121,12 @@ 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_draw_wall(sprite_t *sp, SDL_Rect *r);
|
||||
void nt_sp_clear_updatelist(void);
|
||||
|
||||
/* in nt_sprite_draw.c */
|
||||
void nt_sp_draw(sprite_t *sp, MyRectangle *r);
|
||||
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r);
|
||||
void nt_sp_draw(sprite_t *sp, SDL_Rect *r);
|
||||
void nt_sp_draw_scg(sprite_t *sp, SDL_Rect *r);
|
||||
|
||||
/* in nt_sprite_eupdate.c */
|
||||
void nt_sp_eupdate(int type, int time, int cancel);
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "sprite.h"
|
||||
|
||||
/*
|
||||
@@ -37,7 +36,7 @@
|
||||
@param sp: 描画するスプライト
|
||||
@param r : 再描画する領域
|
||||
*/
|
||||
void nt_sp_draw(sprite_t *sp, MyRectangle *r) {
|
||||
void nt_sp_draw(sprite_t *sp, SDL_Rect *r) {
|
||||
if (sp == NULL) return;
|
||||
cginfo_t *cg = sp->curcg;
|
||||
if (cg == NULL) return;
|
||||
@@ -69,7 +68,7 @@ void nt_sp_draw(sprite_t *sp, MyRectangle *r) {
|
||||
}
|
||||
|
||||
// BlendScreenによる描画
|
||||
void nt_sp_draw_scg(sprite_t *sp, MyRectangle *r) {
|
||||
void nt_sp_draw_scg(sprite_t *sp, SDL_Rect *r) {
|
||||
if (sp == NULL) return;
|
||||
cginfo_t *cg = sp->curcg;
|
||||
if (cg == NULL) return;
|
||||
|
||||
@@ -28,7 +28,8 @@
|
||||
#include "ags.h"
|
||||
#include "input.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "effect.h"
|
||||
|
||||
/*
|
||||
効果つき画面更新
|
||||
@@ -44,25 +45,25 @@ void nt_sp_eupdate(int no, int time, int cancel) {
|
||||
|
||||
nt_sp_update_all(false);
|
||||
|
||||
enum sdl_effect_type type = from_sact_effect(no - 100);
|
||||
enum 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, main_surface->w, main_surface->h };
|
||||
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, 0, 0, sdl_getDIB(), 0, 0, type);
|
||||
struct effect *eff = effect_init(&rect, NULL, 0, 0, gfx_getDIB(), 0, 0, type);
|
||||
|
||||
int sttime, curtime;
|
||||
sttime = curtime = sdl_getTicks();
|
||||
sttime = curtime = sys_get_ticks();
|
||||
int edtime = curtime + time;
|
||||
|
||||
while ((curtime = sdl_getTicks()) < edtime) {
|
||||
sdl_effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
|
||||
int rest = 16 - (sdl_getTicks() - curtime);
|
||||
while ((curtime = sys_get_ticks()) < edtime) {
|
||||
effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
|
||||
int rest = 16 - (sys_get_ticks() - curtime);
|
||||
int key = sys_keywait(rest, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
|
||||
if (cancel && key)
|
||||
break;
|
||||
}
|
||||
sdl_effect_finish(eff);
|
||||
effect_finish(eff);
|
||||
ags_updateFull();
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "system.h"
|
||||
#include "list.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "sprite.h"
|
||||
|
||||
// スプライト再描画間の間に変更のあったスプライトの領域の和
|
||||
@@ -41,22 +40,22 @@ static SList *updatearea;
|
||||
static SList *updatelist;
|
||||
|
||||
static void disjunction(void* region, void* data);
|
||||
static MyRectangle get_updatearea();
|
||||
static SDL_Rect get_updatearea();
|
||||
static void do_update_each(void* data, void* userdata);
|
||||
|
||||
// 領域1と領域2をすべて含む矩形領域を計算
|
||||
static void disjunction(void* region, void* data) {
|
||||
MyRectangle *r1 = (MyRectangle *)region;
|
||||
MyRectangle *r2 = (MyRectangle *)data;
|
||||
SDL_Rect *r1 = (SDL_Rect *)region;
|
||||
SDL_Rect *r2 = (SDL_Rect *)data;
|
||||
SDL_UnionRect(r1, r2, r2);
|
||||
free(r1);
|
||||
}
|
||||
|
||||
// 更新の必要なスプライトの領域の和をとってクリッピングする
|
||||
static MyRectangle get_updatearea() {
|
||||
MyRectangle clip = {0, 0, 0, 0};
|
||||
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
|
||||
MyRectangle result;
|
||||
static SDL_Rect get_updatearea() {
|
||||
SDL_Rect clip = {0, 0, 0, 0};
|
||||
SDL_Rect screen = {0, 0, main_surface->w, main_surface->h};
|
||||
SDL_Rect result;
|
||||
|
||||
slist_foreach(updatearea, disjunction, &clip);
|
||||
|
||||
@@ -75,7 +74,7 @@ static MyRectangle get_updatearea() {
|
||||
// updatelist に登録してあるすべてのスプライトを更新
|
||||
static void do_update_each(void* data, void* userdata) {
|
||||
sprite_t *sp = (sprite_t *)data;
|
||||
MyRectangle *r = (MyRectangle *)userdata;
|
||||
SDL_Rect *r = (SDL_Rect *)userdata;
|
||||
|
||||
// 非表示の場合はなにもしない
|
||||
if (!sp->show) return;
|
||||
@@ -92,7 +91,7 @@ static void do_update_each(void* data, void* userdata) {
|
||||
*/
|
||||
void nt_sp_update_all(bool syncscreen) {
|
||||
// 画面全体を更新領域に
|
||||
MyRectangle r = {0, 0, main_surface->w, main_surface->h };
|
||||
SDL_Rect r = {0, 0, main_surface->w, main_surface->h };
|
||||
|
||||
// updatelistに登録してあるスプライトを再描画
|
||||
// updatelistはスプライトの番号順に並んでいる
|
||||
@@ -111,7 +110,7 @@ void nt_sp_update_all(bool syncscreen) {
|
||||
updateme(_part)で登録した更新が必要なspriteの和の領域をupdate
|
||||
*/
|
||||
void nt_sp_update_clipped() {
|
||||
MyRectangle r;
|
||||
SDL_Rect r;
|
||||
|
||||
// 更新領域の確定
|
||||
r = get_updatearea();
|
||||
@@ -131,16 +130,16 @@ void nt_sp_update_clipped() {
|
||||
@param sp: 更新するスプライト
|
||||
*/
|
||||
void nt_sp_updateme(sprite_t *sp) {
|
||||
MyRectangle *r;
|
||||
SDL_Rect *r;
|
||||
|
||||
if (sp == NULL) return;
|
||||
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
|
||||
if (sp->width == 0 || sp->height == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r = malloc(sizeof(SDL_Rect));
|
||||
r->x = sp->cur.x;
|
||||
r->y = sp->cur.y;
|
||||
r->w = sp->cursize.width;
|
||||
r->h = sp->cursize.height;
|
||||
r->w = sp->width;
|
||||
r->h = sp->height;
|
||||
|
||||
updatearea = slist_append(updatearea, r);
|
||||
|
||||
@@ -157,12 +156,12 @@ void nt_sp_updateme(sprite_t *sp) {
|
||||
@param h: 更新領域高さ
|
||||
*/
|
||||
void nt_sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
MyRectangle *r;
|
||||
SDL_Rect *r;
|
||||
|
||||
if (sp == NULL) return;
|
||||
if (w == 0 || h == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r = malloc(sizeof(SDL_Rect));
|
||||
r->x = sp->cur.x + x;
|
||||
r->y = sp->cur.y + y;
|
||||
r->w = w;
|
||||
@@ -204,6 +203,6 @@ void nt_sp_clear_updatelist(void) {
|
||||
}
|
||||
|
||||
// デフォルトの壁紙update
|
||||
void nt_sp_draw_wall(sprite_t *sp, MyRectangle *area) {
|
||||
void nt_sp_draw_wall(sprite_t *sp, SDL_Rect *area) {
|
||||
SDL_FillRect(main_surface, area, SDL_MapRGB(main_surface->format, 0, 0, 0));
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#include "nact.h"
|
||||
#include "alk.h"
|
||||
#include "music.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "input.h"
|
||||
#include "cg.h"
|
||||
#include "jpeg.h"
|
||||
@@ -52,9 +52,9 @@ static void ndd_run(int demonum) {
|
||||
if (mus)
|
||||
musbgm_play(mus, 0, 100, 0);
|
||||
|
||||
uint32_t start = sdl_getTicks();
|
||||
uint32_t start = sys_get_ticks();
|
||||
while (!nact->is_quit) {
|
||||
int i = (sdl_getTicks() - start) / (1000 / FPS);
|
||||
int i = (sys_get_ticks() - start) / (1000 / FPS);
|
||||
if (i >= alk->datanum)
|
||||
break;
|
||||
|
||||
@@ -69,12 +69,12 @@ static void ndd_run(int demonum) {
|
||||
WARNING("Cannot decode CG %d in %s", i, alk_path);
|
||||
}
|
||||
|
||||
int wait_ms = (i + 1) * (1000 / FPS) - (sdl_getTicks() - start);
|
||||
int wait_ms = (i + 1) * (1000 / FPS) - (sys_get_ticks() - start);
|
||||
if (wait_ms > 0) {
|
||||
if (sys_keywait(wait_ms, KEYWAIT_CANCELABLE))
|
||||
break;
|
||||
} else {
|
||||
sdl_updateScreen();
|
||||
gfx_updateScreen();
|
||||
if (sys_getInputInfo())
|
||||
break;
|
||||
}
|
||||
|
||||
+12
-12
@@ -25,10 +25,9 @@
|
||||
#define __SACT_H__
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <SDL_rect.h>
|
||||
#include "portab.h"
|
||||
#include "list.h"
|
||||
#include "graphics.h"
|
||||
#include "ags.h"
|
||||
#include "sacttimer.h"
|
||||
#include "variable.h"
|
||||
@@ -107,7 +106,8 @@ struct _sprite {
|
||||
int numsound1, numsound2, numsound3;
|
||||
|
||||
// 初期 sprite の大きさ(cg1の大きさ)
|
||||
MyDimension cursize;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
// それぞれの状態で表示する CG
|
||||
cginfo_t *cg1, *cg2, *cg3;
|
||||
@@ -126,10 +126,10 @@ struct _sprite {
|
||||
int freezed_state;
|
||||
|
||||
// 表示位置 (SetPos)
|
||||
MyPoint loc;
|
||||
SDL_Point loc;
|
||||
|
||||
// 現在のスプライトの表示位置
|
||||
MyPoint cur;
|
||||
SDL_Point cur;
|
||||
|
||||
// event callback
|
||||
int (* eventcb)(struct _sprite *sp, agsevent_t *e); // for key/mouse
|
||||
@@ -146,7 +146,7 @@ struct _sprite {
|
||||
|
||||
// move command 用パラメータ
|
||||
struct {
|
||||
MyPoint to; // 移動先
|
||||
SDL_Point to; // 移動先
|
||||
int time; // 移動完了時間
|
||||
int speed; // 移動速度
|
||||
int starttime; // 移動開始時刻
|
||||
@@ -157,7 +157,7 @@ struct _sprite {
|
||||
// SACT.Numeral用パラメータ
|
||||
struct {
|
||||
int cg[10];
|
||||
MyPoint pos;
|
||||
SDL_Point pos;
|
||||
int span;
|
||||
} numeral;
|
||||
|
||||
@@ -171,7 +171,7 @@ struct _sprite {
|
||||
// ゲットスプライト
|
||||
struct {
|
||||
bool dragging; // ドラッグ中
|
||||
MyPoint dragstart; // ドラッグ開始位置
|
||||
SDL_Point dragstart; // ドラッグ開始位置
|
||||
} get;
|
||||
|
||||
// プットスプライト
|
||||
@@ -191,7 +191,7 @@ struct _sprite {
|
||||
struct {
|
||||
SList *buf; // 表示する文字のリスト
|
||||
struct SDL_Surface *canvas;
|
||||
MyPoint dspcur; // 現在の表示位置
|
||||
SDL_Point dspcur; // 現在の表示位置
|
||||
} msg;
|
||||
} u;
|
||||
};
|
||||
@@ -213,7 +213,7 @@ struct _sact {
|
||||
cginfo_t *cg[CGMAX]; // cgまたはCG_xxで作った CG
|
||||
|
||||
// 座標系の原点
|
||||
MyPoint origin;
|
||||
SDL_Point origin;
|
||||
|
||||
// 文字列 replce 用
|
||||
SList *strreplace;
|
||||
@@ -247,7 +247,7 @@ struct _sact {
|
||||
int movestarttime; // 一斉に移動を開始するための開始時間
|
||||
int movecurtime;
|
||||
|
||||
MyRectangle updaterect; // 更新が必要なspriteの領域の和
|
||||
SDL_Rect updaterect; // 更新が必要なspriteの領域の和
|
||||
|
||||
// sact timer
|
||||
stimer_t timer[65536];
|
||||
@@ -281,7 +281,7 @@ struct _sact {
|
||||
|
||||
// バックログ
|
||||
bool logging;
|
||||
List *log;
|
||||
List *log; // UTF-8 strings
|
||||
};
|
||||
typedef struct _sact sact_t;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "sact.h"
|
||||
#include "pms.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "effect.h"
|
||||
#include "mmap.h"
|
||||
|
||||
// SACTEFAM を使ったマスク
|
||||
@@ -91,10 +91,10 @@ void sp_eupdate_amap(int index, int time, int cancel) {
|
||||
return;
|
||||
}
|
||||
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);
|
||||
sp_update_all(false); // old = gfx_texture, new = main_surface
|
||||
struct effect *eff = effect_sactamask_init(mask_sf);
|
||||
ags_runEffect(time * 10, cancel, (ags_EffectStepFunc)effect_step, eff);
|
||||
effect_finish(eff);
|
||||
ags_updateFull();
|
||||
|
||||
SDL_FreeSurface(mask_sf);
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#include "sact.h"
|
||||
#include "sactcg.h"
|
||||
#include "cg.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
|
||||
#define SPCG_ASSERT_NO(no) \
|
||||
if ((no) > (CGMAX -1)) { \
|
||||
@@ -118,9 +118,9 @@ void scg_create_reverse(int wNumCG, int wNumSrcCG, int wReverseX, int wReverseY)
|
||||
|
||||
SDL_Surface *sf = SDL_ConvertSurface(src->sf, src->sf->format, 0);
|
||||
if (wReverseX)
|
||||
sdl_FlipSurfaceHorizontal(sf);
|
||||
gfx_FlipSurfaceHorizontal(sf);
|
||||
if (wReverseY)
|
||||
sdl_FlipSurfaceVertical(sf);
|
||||
gfx_FlipSurfaceVertical(sf);
|
||||
scg_new(CG_REVERSE, wNumCG, sf);
|
||||
}
|
||||
|
||||
@@ -175,7 +175,7 @@ static SDL_Surface *blend(SDL_Surface *base, int x, int y, SDL_Surface *blend, i
|
||||
} else if (alpha == 255) {
|
||||
memcpy(dstpp + 1, srcpp + 1, 3);
|
||||
} else {
|
||||
for (int 1 = 0; k < 4; k++) {
|
||||
for (int k = 1; k < 4; k++) {
|
||||
dstpp[k] = (dstpp[k] * (255 - alpha) + srcpp[k] * alpha) / 255;
|
||||
}
|
||||
}
|
||||
|
||||
+17
-19
@@ -36,12 +36,13 @@
|
||||
#include "nact.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "drawtext.h"
|
||||
#include "utfsjis.h"
|
||||
#include "gfx.h"
|
||||
#include "ags.h"
|
||||
#include "font.h"
|
||||
|
||||
#define LOGMSG_LINES 6
|
||||
|
||||
static const char *logmsg_utf8[LOGMSG_LINES] = {
|
||||
static char *logmsg[LOGMSG_LINES] = {
|
||||
"\n",
|
||||
"※バックログ操作方法※",
|
||||
"[ESC]またはマウス右クリックでゲームに戻る",
|
||||
@@ -56,7 +57,7 @@ static const char *logmsg_utf8[LOGMSG_LINES] = {
|
||||
PageUP/Downで1ページ送り
|
||||
*/
|
||||
|
||||
#define FONTSIZEINDEX 10
|
||||
#define INDEX_FONTSIZE 10
|
||||
#define FONTSIZE 20
|
||||
#define LOGLINENUM (main_surface->h / FONTSIZE)
|
||||
static int curline;
|
||||
@@ -68,6 +69,10 @@ static void draw_log() {
|
||||
char pinfo[256];
|
||||
List *node;
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
load_mincho_font();
|
||||
#endif
|
||||
|
||||
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);
|
||||
@@ -80,8 +85,8 @@ static void draw_log() {
|
||||
// ページ位置情報
|
||||
len = snprintf(pinfo, sizeof(pinfo) -1, "%d/%d", curline, list_length(sact.log));
|
||||
|
||||
dt_setfont(FONT_GOTHIC, FONTSIZEINDEX);
|
||||
dt_drawtext_col(main_surface, main_surface->w - FONTSIZEINDEX *len /2, 0, pinfo, 255, 255, 255);
|
||||
ags_setFont(FONT_GOTHIC, INDEX_FONTSIZE);
|
||||
gfx_drawString(main_surface->w - INDEX_FONTSIZE * len / 2, 0, pinfo, 255);
|
||||
|
||||
// 表示始め位置
|
||||
node = list_nth(sact.log, list_length(sact.log) - curline);
|
||||
@@ -93,11 +98,11 @@ static void draw_log() {
|
||||
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);
|
||||
ags_setFont(FONT_MINCHO, FONTSIZE);
|
||||
} else {
|
||||
dt_setfont(FONT_GOTHIC, FONTSIZE);
|
||||
ags_setFont(FONT_GOTHIC, FONTSIZE);
|
||||
}
|
||||
dt_drawtext_col(main_surface, 0, y, str, 255, 255, 255);
|
||||
gfx_drawString(0, y, str, 255);
|
||||
}
|
||||
y += FONTSIZE;
|
||||
cur--;
|
||||
@@ -113,13 +118,7 @@ bool sblog_start(void) {
|
||||
if (sact.version < 120)
|
||||
return false;
|
||||
|
||||
static char *logmsg[LOGMSG_LINES];
|
||||
if (!logmsg[0]) {
|
||||
for (int i = 0; i < LOGMSG_LINES; i++)
|
||||
logmsg[i] = fromUTF8(logmsg_utf8[i]);
|
||||
}
|
||||
|
||||
// 説明文章を追加
|
||||
// Append instruction text
|
||||
for (int i = 0; i < LOGMSG_LINES; i++)
|
||||
sact.log = list_append(sact.log, logmsg[i]);
|
||||
|
||||
@@ -138,10 +137,9 @@ void sblog_end(void) {
|
||||
|
||||
SDL_FreeSurface(back);
|
||||
|
||||
// 説明文章を削除
|
||||
// Remove instruction text
|
||||
for (i = 0; i < LOGMSG_LINES; i++) {
|
||||
node = list_last(sact.log);
|
||||
sact.log = list_remove(sact.log, node->data);
|
||||
sact.log = list_remove(sact.log, logmsg[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "randMT.h"
|
||||
|
||||
#define M_PIf ((float)M_PI)
|
||||
@@ -78,9 +77,9 @@ void sp_quake_screen(int type, int p1, int p2, int time, int cancel) {
|
||||
|
||||
if (type > 1) return;
|
||||
|
||||
sttime = sdl_getTicks();
|
||||
sttime = sys_get_ticks();
|
||||
edtime = time * 10 + sttime;
|
||||
while ((curtime = sdl_getTicks()) < edtime) {
|
||||
while ((curtime = sys_get_ticks()) < edtime) {
|
||||
int adjx, adjy;
|
||||
|
||||
cb[type]((float)(curtime - sttime)/(edtime - sttime), p1, p2, &adjx, &adjy);
|
||||
|
||||
+11
-11
@@ -145,11 +145,11 @@ void sp_new(int no, int cg1, int cg2, int cg3, int type) {
|
||||
|
||||
// cg1の大きさをスプライトの大きさとする
|
||||
if (sp->curcg == NULL) {
|
||||
sp->cursize.width = 0;
|
||||
sp->cursize.height = 0;
|
||||
sp->width = 0;
|
||||
sp->height = 0;
|
||||
} else {
|
||||
sp->cursize.width = sp->curcg->sf->w;
|
||||
sp->cursize.height = sp->curcg->sf->h;
|
||||
sp->width = sp->curcg->sf->w;
|
||||
sp->height = sp->curcg->sf->h;
|
||||
}
|
||||
|
||||
sp->freezed_state = 0; // 状態固定は無し
|
||||
@@ -201,8 +201,8 @@ void sp_new_msg(int no, int x, int y, int width, int height) {
|
||||
sp->loc.y = y - sact.origin.y;
|
||||
sp->u.msg.dspcur.x = 0; // 文字描画開始位置
|
||||
sp->u.msg.dspcur.y = 0;
|
||||
sp->cursize.width = width; // スプライトの大きさ
|
||||
sp->cursize.height = height;
|
||||
sp->width = width; // スプライトの大きさ
|
||||
sp->height = height;
|
||||
sp->cur = sp->loc;
|
||||
sp->u.msg.buf = NULL;
|
||||
|
||||
@@ -224,10 +224,10 @@ void sp_set_wall_paper(int no) {
|
||||
|
||||
if (sp->curcg) { // display specified CG
|
||||
sp->update = DEFAULT_UPDATE;
|
||||
sp->cursize.width = sp->curcg->sf->w;
|
||||
sp->cursize.height = sp->curcg->sf->h;
|
||||
sp->width = sp->curcg->sf->w;
|
||||
sp->height = sp->curcg->sf->h;
|
||||
} else { // Black
|
||||
sp->cursize.height = main_surface->h;
|
||||
sp->height = main_surface->h;
|
||||
sp->curcg = NULL;
|
||||
sp->update = sp_draw_wall;
|
||||
}
|
||||
@@ -516,8 +516,8 @@ bool sp_query_size(int wNum, int *vw, int *vh) {
|
||||
|
||||
if (sp->type == SPRITE_NONE) goto errexit;
|
||||
|
||||
*vw = sp->cursize.width;
|
||||
*vh = sp->cursize.height;
|
||||
*vw = sp->width;
|
||||
*vh = sp->height;
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ags.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
|
||||
@@ -44,7 +43,7 @@ static int eventCB_ANIM(sprite_t *sp, agsevent_t *e) {
|
||||
if (e->type != AGSEVENT_TIMER) return 0;
|
||||
|
||||
// 現在時刻の取得
|
||||
now = sdl_getTicks();
|
||||
now = sys_get_ticks();
|
||||
|
||||
// 指定時間までスキップ
|
||||
if ((now - sp->u.anime.starttime) < sp->u.anime.interval) return 0;
|
||||
@@ -85,7 +84,7 @@ void sp_anime_setup(sprite_t *sp) {
|
||||
int n = 0;
|
||||
|
||||
sp->u.anime.interval = 500; // デフォルトの間隔 0.5秒
|
||||
sp->u.anime.starttime = sdl_getTicks(); // 開始時刻
|
||||
sp->u.anime.starttime = sys_get_ticks(); // 開始時刻
|
||||
sp->u.anime.tick = 0; // カウンタ初期化
|
||||
|
||||
// アニメパターンはいくつあるか
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "effect.h"
|
||||
|
||||
/*
|
||||
効果つき画面更新
|
||||
@@ -45,25 +46,25 @@ void sp_eupdate(int type, int time, int cancel) {
|
||||
|
||||
sp_update_all(false);
|
||||
|
||||
enum sdl_effect_type sdl_effect = from_sact_effect(type);
|
||||
if (sdl_effect == EFFECT_INVALID) {
|
||||
enum effect_type effect = from_sact_effect(type);
|
||||
if (effect == EFFECT_INVALID) {
|
||||
WARNING("Unimplemented effect %d", type);
|
||||
type = EFFECT_CROSSFADE;
|
||||
}
|
||||
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);
|
||||
struct effect *eff = effect_init(&rect, NULL, 0, 0, gfx_getDIB(), 0, 0, effect);
|
||||
|
||||
int sttime, curtime;
|
||||
sttime = curtime = sdl_getTicks();
|
||||
sttime = curtime = sys_get_ticks();
|
||||
int edtime = curtime + time * 10;
|
||||
|
||||
while ((curtime = sdl_getTicks()) < edtime) {
|
||||
sdl_effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
|
||||
int rest = 16 - (sdl_getTicks() - curtime);
|
||||
while ((curtime = sys_get_ticks()) < edtime) {
|
||||
effect_step(eff, (float)(curtime - sttime) / (edtime - sttime));
|
||||
int rest = 16 - (sys_get_ticks() - curtime);
|
||||
int key = sys_keywait(rest, cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE);
|
||||
if (cancel && key)
|
||||
break;
|
||||
}
|
||||
sdl_effect_finish(eff);
|
||||
effect_finish(eff);
|
||||
ags_updateFull();
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "menu.h"
|
||||
#include "input.h"
|
||||
#include "nact.h"
|
||||
@@ -213,7 +212,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
switch (e->type) {
|
||||
case AGSEVENT_KEY_PRESS:
|
||||
if (e->code == KEY_Z) {
|
||||
cur = sdl_getTicks();
|
||||
cur = sys_get_ticks();
|
||||
if (!sact.zhiding) {
|
||||
slist_foreach(sact.sp_zhide, cb_defocused_zkey, &update);
|
||||
sact.zhiding = true;
|
||||
@@ -243,7 +242,7 @@ static void cb_waitkey_simple(agsevent_t *e) {
|
||||
case AGSEVENT_KEY_RELEASE:
|
||||
switch(e->code) {
|
||||
case KEY_Z:
|
||||
cur = sdl_getTicks();
|
||||
cur = sys_get_ticks();
|
||||
if (500 < (cur - sact.zofftime) || !sact.zdooff) {
|
||||
slist_foreach(sact.sp_zhide, cb_focused_zkey, &update);
|
||||
sact.zhiding = false;
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "list.h"
|
||||
#include "sdl_core.h"
|
||||
#include "ags.h"
|
||||
#include "nact.h"
|
||||
#include "input.h"
|
||||
@@ -67,7 +66,7 @@ static void hidesprite(sprite_t *sp) {
|
||||
スプライトがドロップされた時の各種処理を含む
|
||||
*/
|
||||
static bool waitcond(int endtime) {
|
||||
int curtime = sdl_getTicks();
|
||||
int curtime = sys_get_ticks();
|
||||
if (curtime >= endtime) return true;
|
||||
|
||||
if (sact.dropped) {
|
||||
@@ -133,7 +132,7 @@ void sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeou
|
||||
{
|
||||
// とりあえず、現在のマウス位置を送って、switch sprite の
|
||||
// 状態を更新しておく
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
sys_getMouseInfo(&p, false);
|
||||
agsevent_t agse = {
|
||||
.type = AGSEVENT_MOUSE_MOTION,
|
||||
@@ -144,7 +143,7 @@ void sp_keywait(int *vOK, int *vRND, int *vD01, int *vD02, int *vD03, int timeou
|
||||
}
|
||||
|
||||
// 終了時間の計算
|
||||
curtime = sdl_getTicks();
|
||||
curtime = sys_get_ticks();
|
||||
endtime = timeout < 0 ? INT_MAX : (curtime + timeout * 10);
|
||||
|
||||
// スプライトキー待ちメイン
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#include "nact.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
|
||||
/*
|
||||
|
||||
@@ -161,14 +160,14 @@ void spev_move_waitend(sprite_t *sp, int dx, int dy, int time) {
|
||||
sp->move.time = 0;
|
||||
|
||||
sact.movelist = slist_append(sact.movelist, sp);
|
||||
sact.movestarttime = sdl_getTicks();
|
||||
sact.movestarttime = sys_get_ticks();
|
||||
slist_foreach(sact.movelist, spev_move_setup, NULL);
|
||||
slist_free(sact.movelist);
|
||||
sact.movelist = NULL;
|
||||
|
||||
while (sp->move.moving) {
|
||||
nact->callback();
|
||||
sdl_wait_vsync();
|
||||
sys_wait_vsync();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,7 +186,7 @@ void spev_wait4moving_sp() {
|
||||
|
||||
while (sp->move.moving) {
|
||||
nact->callback();
|
||||
sdl_wait_vsync();
|
||||
sys_wait_vsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-14
@@ -29,7 +29,6 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "ags.h"
|
||||
#include "nact.h"
|
||||
#include "input.h"
|
||||
@@ -241,7 +240,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
sprite_t *sp;
|
||||
int len = 0; // 処理した文字数?
|
||||
bool needupdate = false;
|
||||
MyRectangle uparea = {0,0,0,0};
|
||||
SDL_Rect uparea = {0,0,0,0};
|
||||
|
||||
// wRSize == 0 -> ルビ無し(SACT.MessageOutputからの呼出)
|
||||
|
||||
@@ -268,7 +267,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
char mbuf[20], rbuf[20];
|
||||
int cw, delta, wcnt;
|
||||
|
||||
wcnt = sdl_getTicks();
|
||||
wcnt = sys_get_ticks();
|
||||
|
||||
mbuf[0] = rbuf[0] = '\0';
|
||||
msg = get_char(msg, mbuf, rbuf, sizeof(mbuf) -1);
|
||||
@@ -316,7 +315,7 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
needupdate = false;
|
||||
|
||||
// keywait
|
||||
delta = sdl_getTicks() - wcnt;
|
||||
delta = sys_get_ticks() - wcnt;
|
||||
if (delta < wSpeed) {
|
||||
if (sys_keywait(wSpeed - delta, KEYWAIT_NONCANCELABLE)) {
|
||||
|
||||
@@ -335,8 +334,8 @@ void smsg_out(int wNum, int wSize, int wColorR, int wColorG, int wColorB, int wF
|
||||
|
||||
// Waitなしの出力は最後にupdate
|
||||
if (needupdate) {
|
||||
uparea.w = sp->cursize.width;
|
||||
uparea.h = min(sp->cursize.height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace + wRSize);
|
||||
uparea.w = sp->width;
|
||||
uparea.h = min(sp->height, uparea.y - sp->u.msg.dspcur.y + wLineSpace + wLineSpace + wRSize);
|
||||
sp_updateme_part(sp, uparea.x, uparea.y, uparea.w, uparea.h);
|
||||
}
|
||||
|
||||
@@ -420,7 +419,7 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
|
||||
sact.waitkey = -1;
|
||||
|
||||
while (sact.waitkey == -1 && !nact->is_quit) {
|
||||
int st = sdl_getTicks();
|
||||
int st = sys_get_ticks();
|
||||
int interval = 25;
|
||||
|
||||
// アニメパターンがある場合、その更新
|
||||
@@ -434,7 +433,7 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
|
||||
update_mark(minfo[j].sp, minfo[j].cg);
|
||||
i++;
|
||||
}
|
||||
sys_keywait(interval - (sdl_getTicks() - st), KEYWAIT_NONCANCELABLE);
|
||||
sys_keywait(interval - (sys_get_ticks() - st), KEYWAIT_NONCANCELABLE);
|
||||
}
|
||||
|
||||
sact.waittype = KEYWAIT_NONE;
|
||||
@@ -447,13 +446,13 @@ int smsg_keywait(int wNum1, int wNum2, int msglen) {
|
||||
@param sp: 再描画するスプライト
|
||||
*/
|
||||
void smsg_update(sprite_t *sp) {
|
||||
SDL_Rect sp_rect = {0, 0, sp->cursize.width, sp->cursize.height};
|
||||
SDL_Rect sp_rect = {0, 0, sp->width, sp->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;
|
||||
int w = sp->width;
|
||||
int h = sp->height;
|
||||
if (!ags_clipCopyRect(&sp_rect, &sact.updaterect, &sx, &sy, &dx, &dy, &w, &h)) {
|
||||
return;
|
||||
}
|
||||
@@ -534,7 +533,7 @@ static void append_to_log(char *msg) {
|
||||
static void sactlog_newline() {
|
||||
if (sact.logging) {
|
||||
if (sact.msgbuf2[0] == '\0') return;
|
||||
sact.log = list_append(sact.log, strdup(sact.msgbuf2));
|
||||
sact.log = list_append(sact.log, toUTF8(sact.msgbuf2));
|
||||
sact.msgbuf2[0] = '\0';
|
||||
}
|
||||
}
|
||||
@@ -547,10 +546,10 @@ static void set_align(char *msg, sprite_t *sp, int wSize, int wAlign) {
|
||||
|
||||
switch (wAlign) {
|
||||
case 1: // センタリング
|
||||
adjx = (sp->cursize.width - mlen) / 2;
|
||||
adjx = (sp->width - mlen) / 2;
|
||||
break;
|
||||
case 2: // 右寄せ
|
||||
adjx = (sp->cursize.width - mlen);
|
||||
adjx = (sp->width - mlen);
|
||||
break;
|
||||
}
|
||||
sp->u.msg.dspcur.x = max(0, adjx);
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "input.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
#include "randMT.h"
|
||||
|
||||
/*
|
||||
@@ -49,9 +48,9 @@ void sp_quake_sprite(int wType, int wAmplitudeX, int wAmplitudeY, int wCount, in
|
||||
int i = 0, key;
|
||||
SList *node;
|
||||
|
||||
edtime = wCount * 10 + sdl_getTicks();
|
||||
edtime = wCount * 10 + sys_get_ticks();
|
||||
|
||||
while ((curtime = sdl_getTicks()) < edtime) {
|
||||
while ((curtime = sys_get_ticks()) < edtime) {
|
||||
if (wType == 0) { // 全てのスプライトを同じように動かす
|
||||
int adjx = (int)(genrand() * wAmplitudeX/2);
|
||||
int adjy = (int)(genrand() * wAmplitudeY/2);
|
||||
|
||||
@@ -60,8 +60,8 @@ static int sel_main();
|
||||
* マージン内はsprite内部とは判断しない
|
||||
*/
|
||||
static bool sp_is_insprite2(sprite_t *sp, int x, int y, int margin) {
|
||||
MyPoint p = {x, y};
|
||||
MyRectangle r = {
|
||||
SDL_Point p = {x, y};
|
||||
SDL_Rect r = {
|
||||
sp->cur.x + margin,
|
||||
sp->cur.y + margin,
|
||||
sp->curcg->sf->w - 2 * margin,
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "nact.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
#include "sdl_core.h"
|
||||
|
||||
/*
|
||||
|
||||
@@ -63,7 +62,7 @@ static void tevent_callback(agsevent_t *e) {
|
||||
int update = 0;
|
||||
|
||||
// SP_MOVE の同期移動のためのカウンタの読み込み
|
||||
sact.movecurtime = sdl_getTicks();
|
||||
sact.movecurtime = sys_get_ticks();
|
||||
|
||||
for (node = sact.teventlisteners; node; node = node->next) {
|
||||
sprite_t *sp = (sprite_t *)node->data;
|
||||
|
||||
@@ -28,9 +28,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
#include "sact.h"
|
||||
#include "sprite.h"
|
||||
|
||||
@@ -43,16 +41,16 @@ static void do_update_each(void* data, void* userdata);
|
||||
|
||||
// 領域1と領域2をすべて含む矩形領域を計算
|
||||
static void disjunction(void* region, void* data) {
|
||||
MyRectangle *r1 = (MyRectangle *)region;
|
||||
MyRectangle *r2 = (MyRectangle *)data;
|
||||
SDL_Rect *r1 = (SDL_Rect *)region;
|
||||
SDL_Rect *r2 = (SDL_Rect *)data;
|
||||
SDL_UnionRect(r1, r2, r2);
|
||||
free(r1);
|
||||
}
|
||||
|
||||
// 更新の必要なスプライトの領域の和をとってクリッピングする
|
||||
static void get_updatearea() {
|
||||
MyRectangle clip = {0, 0, 0, 0};
|
||||
MyRectangle screen = {0, 0, main_surface->w, main_surface->h};
|
||||
SDL_Rect clip = {0, 0, 0, 0};
|
||||
SDL_Rect screen = {0, 0, main_surface->w, main_surface->h};
|
||||
|
||||
slist_foreach(updatearea, disjunction, &clip);
|
||||
|
||||
@@ -93,7 +91,7 @@ void sp_update_all(bool syncscreen) {
|
||||
// スプライト移動がある場合は移動開始
|
||||
if (sact.movelist) {
|
||||
// 移動開始時間を合わせる
|
||||
sact.movestarttime = sdl_getTicks();
|
||||
sact.movestarttime = sys_get_ticks();
|
||||
slist_foreach(sact.movelist, spev_move_setup, NULL);
|
||||
slist_free(sact.movelist);
|
||||
sact.movelist = NULL;
|
||||
@@ -149,16 +147,16 @@ void sp_update_clipped() {
|
||||
@param sp: 更新するスプライト
|
||||
*/
|
||||
void sp_updateme(sprite_t *sp) {
|
||||
MyRectangle *r;
|
||||
SDL_Rect *r;
|
||||
|
||||
if (sp == NULL) return;
|
||||
if (sp->cursize.width == 0 || sp->cursize.height == 0) return;
|
||||
if (sp->width == 0 || sp->height == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r = malloc(sizeof(SDL_Rect));
|
||||
r->x = sp->cur.x;
|
||||
r->y = sp->cur.y;
|
||||
r->w = sp->cursize.width;
|
||||
r->h = sp->cursize.height;
|
||||
r->w = sp->width;
|
||||
r->h = sp->height;
|
||||
|
||||
updatearea = slist_append(updatearea, r);
|
||||
|
||||
@@ -175,12 +173,12 @@ void sp_updateme(sprite_t *sp) {
|
||||
@param h: 更新領域高さ
|
||||
*/
|
||||
void sp_updateme_part(sprite_t *sp, int x, int y, int w, int h) {
|
||||
MyRectangle *r;
|
||||
SDL_Rect *r;
|
||||
|
||||
if (sp == NULL) return;
|
||||
if (w == 0 || h == 0) return;
|
||||
|
||||
r = malloc(sizeof(MyRectangle));
|
||||
r = malloc(sizeof(SDL_Rect));
|
||||
r->x = sp->cur.x + x;
|
||||
r->y = sp->cur.y + y;
|
||||
r->w = w;
|
||||
|
||||
@@ -36,13 +36,12 @@
|
||||
#include "nact.h"
|
||||
#include "ags.h"
|
||||
#include "music.h"
|
||||
#include "sdl_core.h"
|
||||
#include "hacks.h"
|
||||
|
||||
#define SLOT 40
|
||||
|
||||
static MyRectangle maprect; /* アニメーション表示領域 */
|
||||
static MyRectangle mapback; /* 背景セーブ領域 */
|
||||
static SDL_Rect maprect; /* アニメーション表示領域 */
|
||||
static SDL_Rect mapback; /* 背景セーブ領域 */
|
||||
static int mapback_p5; /* 背景転送先 X */
|
||||
static int mapback_p6; /* 背景転送先 Y */
|
||||
|
||||
@@ -451,7 +450,7 @@ static void PlayAnimeData() {
|
||||
dib = ags_getDIB();
|
||||
|
||||
for (loop = 0; loop < p1; loop++) {
|
||||
int cnt = sdl_getTicks();
|
||||
int cnt = sys_get_ticks();
|
||||
is_backcopied = false;
|
||||
|
||||
for (i = 0; i < SLOT; i++) {
|
||||
@@ -528,9 +527,9 @@ static void PlayAnimeData() {
|
||||
if (is_backcopied && !SDL_RectEmpty(&maprect))
|
||||
ags_updateArea(maprect.x, maprect.y, maprect.w, maprect.h);
|
||||
|
||||
int now = sdl_getTicks();
|
||||
int now = sys_get_ticks();
|
||||
if (now - cnt < interval) {
|
||||
sdl_sleep(interval - (now-cnt));
|
||||
sys_sleep(interval - (now-cnt));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#include "system.h"
|
||||
#include "xsystem35.h"
|
||||
#include "modules.h"
|
||||
#include "sdl_core.h"
|
||||
#include "input.h"
|
||||
#include "menu.h"
|
||||
|
||||
@@ -54,7 +53,7 @@ static void OutputMessageBox(void) { /* 0 */
|
||||
char *title_utf8 = toUTF8(svar_get(title));
|
||||
char *msg_utf8 = toUTF8(svar_get(msg));
|
||||
|
||||
sdl_showMessageBox(MESSAGEBOX_INFO, title_utf8, msg_utf8);
|
||||
sys_show_message_box(MESSAGEBOX_INFO, title_utf8, msg_utf8);
|
||||
|
||||
free(title_utf8);
|
||||
free(msg_utf8);
|
||||
|
||||
@@ -71,6 +71,7 @@ int dt_drawtext_col(SDL_Surface *sf, int x, int y, char *buf, int r, int g, int
|
||||
if (glyph == NULL) return 0;
|
||||
|
||||
SDL_Rect rect = {x, y, glyph->w, glyph->h};
|
||||
SDL_SetSurfaceBlendMode(glyph, SDL_BLENDMODE_NONE);
|
||||
SDL_BlitSurface(glyph, NULL, sf, &rect);
|
||||
SDL_FreeSurface(glyph);
|
||||
return rect.w;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#ifndef __DRAWTEXT_H__
|
||||
#define __DRAWTEXT_H__
|
||||
|
||||
#include "graphics.h"
|
||||
#include "font.h"
|
||||
|
||||
struct SDL_Surface;
|
||||
|
||||
|
||||
@@ -44,8 +44,8 @@ static void gre_BlendUseAMap(surface_t *dst, int dx, int dy, surface_t *src, int
|
||||
|
||||
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 };
|
||||
SDL_Rect src_window = { 0, 0, src->width, src->height };
|
||||
SDL_Rect 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) {
|
||||
|
||||
@@ -22,7 +22,7 @@ typedef struct {
|
||||
|
||||
static void *mapdata[NUM_MAPS];
|
||||
static int setChipParam_index;
|
||||
static MyRectangle chip_params[NUM_LAYERS];
|
||||
static SDL_Rect chip_params[NUM_LAYERS];
|
||||
static int window_width;
|
||||
static int window_height;
|
||||
static int map_width;
|
||||
@@ -68,7 +68,7 @@ static void MakeMapSetChipParam() {
|
||||
WARNING("unexpected MakeMapSeChipParam call");
|
||||
return;
|
||||
}
|
||||
MyRectangle *r = &chip_params[setChipParam_index++];
|
||||
SDL_Rect *r = &chip_params[setChipParam_index++];
|
||||
r->x = p1;
|
||||
r->y = p2;
|
||||
r->w = p3;
|
||||
@@ -93,9 +93,9 @@ static void MakeMapDraw() {
|
||||
int c1 = a1[index];
|
||||
int c2 = a2[index];
|
||||
int c3 = a3[index];
|
||||
MyRectangle *r1 = &chip_params[0];
|
||||
MyRectangle *r2 = &chip_params[1];
|
||||
MyRectangle *r3 = &chip_params[2];
|
||||
SDL_Rect *r1 = &chip_params[0];
|
||||
SDL_Rect *r2 = &chip_params[1];
|
||||
SDL_Rect *r3 = &chip_params[2];
|
||||
surface_t *dib = ags_getDIB();
|
||||
if (c3) {
|
||||
ags_copyArea(r3->x + c3 * r3->w, r3->y, r3->w, r3->h, dstX + x * r3->w, dstY + y * r3->h);
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#include "alk.h"
|
||||
#include "input.h"
|
||||
#include "bgm.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "cg.h"
|
||||
#include "jpeg.h"
|
||||
|
||||
@@ -72,9 +72,9 @@ static void Run() {
|
||||
|
||||
musbgm_play(TDEMO_MUSIC_NO, 0, 100, 0);
|
||||
|
||||
uint32_t start = sdl_getTicks();
|
||||
uint32_t start = sys_get_ticks();
|
||||
while (!nact->is_quit) {
|
||||
int i = (sdl_getTicks() - start) / (1000 / FPS);
|
||||
int i = (sys_get_ticks() - start) / (1000 / FPS);
|
||||
if (i >= alk->datanum)
|
||||
break;
|
||||
|
||||
@@ -89,12 +89,12 @@ static void Run() {
|
||||
WARNING("Cannot decode CG %d", i);
|
||||
}
|
||||
|
||||
int wait_ms = (i + 1) * (1000 / FPS) - (sdl_getTicks() - start);
|
||||
int wait_ms = (i + 1) * (1000 / FPS) - (sys_get_ticks() - start);
|
||||
if (wait_ms > 0) {
|
||||
if (sys_keywait(wait_ms, KEYWAIT_CANCELABLE))
|
||||
break;
|
||||
} else {
|
||||
sdl_updateScreen();
|
||||
gfx_updateScreen();
|
||||
if (sys_getInputInfo())
|
||||
break;
|
||||
}
|
||||
|
||||
+8
-8
@@ -59,9 +59,14 @@ target_sources(xsystem35 PRIVATE
|
||||
cursor.c
|
||||
dri.c
|
||||
ecopy.c
|
||||
effect.c
|
||||
event.c
|
||||
filecheck.c
|
||||
font.c
|
||||
hacks.c
|
||||
gfx_draw.c
|
||||
gfx_image.c
|
||||
gfx_video.c
|
||||
image.c
|
||||
input.c
|
||||
jpeg.c
|
||||
@@ -82,13 +87,8 @@ target_sources(xsystem35 PRIVATE
|
||||
savedata.c
|
||||
scenario.c
|
||||
scheduler.c
|
||||
sdl_cursor.c
|
||||
sdl_draw.c
|
||||
sdl_effect.c
|
||||
sdl_event.c
|
||||
sdl_image.c
|
||||
sdl_video.c
|
||||
selection.c
|
||||
system.c
|
||||
texthook.c
|
||||
variable.c
|
||||
vsp.c
|
||||
@@ -125,7 +125,7 @@ elseif (ANDROID)
|
||||
elseif (ENABLE_GTK)
|
||||
target_sources(xsystem35 PRIVATE menu.c menu_callback.c menu_gui.c s39init.c)
|
||||
else ()
|
||||
target_sources(xsystem35 PRIVATE menu_sdl.c sdl_input.c)
|
||||
target_sources(xsystem35 PRIVATE menu_sdl.c editor.c)
|
||||
endif()
|
||||
|
||||
if (HAVE_WEBP)
|
||||
@@ -170,7 +170,7 @@ if (EMSCRIPTEN)
|
||||
-sALLOW_MEMORY_GROWTH=1
|
||||
-sNO_EXIT_RUNTIME=1
|
||||
-sEXPORTED_FUNCTIONS=_main,_malloc
|
||||
-sEXPORTED_RUNTIME_METHODS=FS,IDBFS,getValue,addRunDependency,removeRunDependency,stringToUTF8OnStack
|
||||
-sEXPORTED_RUNTIME_METHODS=FS,IDBFS,HEAPU8,HEAP16,getValue,addRunDependency,removeRunDependency,stringToUTF8OnStack
|
||||
--emit-tsd=xsystem35.d.ts
|
||||
)
|
||||
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
#include "xsystem35.h"
|
||||
#include "scenario.h"
|
||||
#include "ags.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "effect.h"
|
||||
#include "event.h"
|
||||
#include "alpha_plane.h"
|
||||
#include "utfsjis.h"
|
||||
#include "input.h"
|
||||
@@ -81,25 +83,25 @@ static void initPal(void) {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
nact->ags.pal[i].a = 255;
|
||||
}
|
||||
sdl_setPalette(nact->ags.pal, 0, 256);
|
||||
gfx_setPalette(nact->ags.pal, 0, 256);
|
||||
palette_changed();
|
||||
}
|
||||
|
||||
bool ags_check_param(int *x, int *y, int *w, int *h) {
|
||||
if (*x >= nact->ags.world_size.width) {
|
||||
WARNING("Illegal Param x = %d (max=%d)(@%03x:%05x)", *x, nact->ags.world_size.width, sl_getPage(), sl_getIndex());
|
||||
if (*x >= nact->ags.world_width) {
|
||||
WARNING("Illegal Param x = %d (max=%d)(@%03x:%05x)", *x, nact->ags.world_width, sl_getPage(), sl_getIndex());
|
||||
return false;
|
||||
}
|
||||
if (*y >= nact->ags.world_size.height) {
|
||||
WARNING("Illegal Param y = %d (max=%d)", *y, nact->ags.world_size.height);
|
||||
if (*y >= nact->ags.world_height) {
|
||||
WARNING("Illegal Param y = %d (max=%d)", *y, nact->ags.world_height);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (*x < 0) { *w += *x; *x = 0; }
|
||||
if (*y < 0) { *h += *y; *y = 0; }
|
||||
|
||||
if ((*x + *w) > nact->ags.world_size.width) { *w = nact->ags.world_size.width - *x;}
|
||||
if ((*y + *h) > nact->ags.world_size.height) { *h = nact->ags.world_size.height - *y;}
|
||||
if ((*x + *w) > nact->ags.world_width) { *w = nact->ags.world_width - *x;}
|
||||
if ((*y + *h) > nact->ags.world_height) { *h = nact->ags.world_height - *y;}
|
||||
|
||||
if (*w <= 0) return false;
|
||||
if (*h <= 0) return false;
|
||||
@@ -108,11 +110,11 @@ bool ags_check_param(int *x, int *y, int *w, int *h) {
|
||||
}
|
||||
|
||||
bool ags_check_param_xy(int *x, int *y) {
|
||||
if (*x >= nact->ags.world_size.width) {
|
||||
if (*x >= nact->ags.world_width) {
|
||||
WARNING("Illegal Param x = %d", *x);
|
||||
return false;
|
||||
}
|
||||
if (*y >= nact->ags.world_size.height) {
|
||||
if (*y >= nact->ags.world_height) {
|
||||
WARNING("Illegal Param y = %d", *y);
|
||||
return false;
|
||||
}
|
||||
@@ -125,8 +127,8 @@ bool ags_check_param_xy(int *x, int *y) {
|
||||
|
||||
void ags_init(const char *render_driver, bool enable_zb) {
|
||||
nact->ags.mouse_warp_enabled = true;
|
||||
nact->ags.world_size.width = SYS35_DEFAULT_WIDTH;
|
||||
nact->ags.world_size.height = SYS35_DEFAULT_HEIGHT;
|
||||
nact->ags.world_width = SYS35_DEFAULT_WIDTH;
|
||||
nact->ags.world_height = SYS35_DEFAULT_HEIGHT;
|
||||
nact->ags.world_depth = SYS35_DEFAULT_DEPTH;
|
||||
nact->ags.view_area.x = 0;
|
||||
nact->ags.view_area.y = 0;
|
||||
@@ -139,7 +141,9 @@ void ags_init(const char *render_driver, bool enable_zb) {
|
||||
nact->ags.enable_zb = enable_zb;
|
||||
nact->ags.font_weight = enable_zb ? FONT_WEIGHT_BOLD : FONT_WEIGHT_NORMAL;
|
||||
|
||||
sdl_Initialize(render_driver);
|
||||
gfx_Initialize(render_driver);
|
||||
event_init();
|
||||
cursor_init();
|
||||
font_init();
|
||||
|
||||
initPal();
|
||||
@@ -148,7 +152,8 @@ void ags_init(const char *render_driver, bool enable_zb) {
|
||||
|
||||
void ags_remove(void) {
|
||||
ags_autorepeat(true);
|
||||
sdl_Remove();
|
||||
event_remove();
|
||||
gfx_Remove();
|
||||
}
|
||||
|
||||
void ags_reset(void) {
|
||||
@@ -159,8 +164,8 @@ void ags_reset(void) {
|
||||
}
|
||||
|
||||
void ags_setWorldSize(int width, int height, int depth) {
|
||||
nact->ags.world_size.width = width;
|
||||
nact->ags.world_size.height = height;
|
||||
nact->ags.world_width = width;
|
||||
nact->ags.world_height = height;
|
||||
nact->ags.world_depth = depth;
|
||||
|
||||
if (nact->ags.dib && nact->ags.dib->alpha) {
|
||||
@@ -168,9 +173,9 @@ void ags_setWorldSize(int width, int height, int depth) {
|
||||
nact->ags.dib->alpha = NULL;
|
||||
}
|
||||
|
||||
sdl_setWorldSize(width, height, depth);
|
||||
gfx_setWorldSize(width, height, depth);
|
||||
|
||||
nact->ags.dib = sdl_getDIB();
|
||||
nact->ags.dib = gfx_getDIB();
|
||||
|
||||
/* DIBが8以上の場合は、alpha plane を用意 */
|
||||
if (depth > 8) {
|
||||
@@ -188,29 +193,29 @@ void ags_setViewArea(int x, int y, int width, int height) {
|
||||
nact->ags.view_area.y = y;
|
||||
nact->ags.view_area.w = width;
|
||||
nact->ags.view_area.h = height;
|
||||
sdl_setWindowSize(width, height);
|
||||
gfx_setWindowSize(width, height);
|
||||
}
|
||||
|
||||
void ags_setWindowTitle(const char *title_utf8) {
|
||||
char buf[256];
|
||||
snprintf(buf, sizeof(buf), "XSystem35 Version %s: %s", VERSION, title_utf8);
|
||||
sdl_setWindowTitle(buf);
|
||||
gfx_setWindowTitle(buf);
|
||||
}
|
||||
|
||||
void ags_getDIBInfo(DispInfo *info) {
|
||||
info->width = nact->ags.world_size.width;
|
||||
info->height = nact->ags.world_size.height;
|
||||
info->width = nact->ags.world_width;
|
||||
info->height = nact->ags.world_height;
|
||||
info->depth = nact->ags.world_depth;
|
||||
}
|
||||
|
||||
void ags_getViewAreaInfo(DispInfo *info) {
|
||||
sdl_getWindowInfo(info);
|
||||
gfx_getWindowInfo(NULL, NULL, &info->depth);
|
||||
info->width = nact->ags.view_area.w;
|
||||
info->height = nact->ags.view_area.h;
|
||||
}
|
||||
|
||||
void ags_getWindowInfo(DispInfo *info) {
|
||||
sdl_getWindowInfo(info);
|
||||
gfx_getWindowInfo(&info->width, &info->height, &info->depth);
|
||||
}
|
||||
|
||||
void ags_setExposeSwitch(bool expose) {
|
||||
@@ -221,13 +226,13 @@ void ags_updateArea(int x, int y, int w, int h) {
|
||||
if (fade_outed || !need_update)
|
||||
return;
|
||||
|
||||
MyRectangle r = {x, y, w, h}, update;
|
||||
SDL_Rect r = {x, y, w, h}, update;
|
||||
if (SDL_IntersectRect(&nact->ags.view_area, &r, &update)) {
|
||||
MyPoint p = {
|
||||
SDL_Point p = {
|
||||
update.x - nact->ags.view_area.x,
|
||||
update.y - nact->ags.view_area.y
|
||||
};
|
||||
sdl_updateArea(&update, &p);
|
||||
gfx_updateArea(&update, &p);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,14 +240,14 @@ void ags_updateFull() {
|
||||
if (fade_outed || !need_update)
|
||||
return;
|
||||
|
||||
MyRectangle r = {
|
||||
SDL_Rect r = {
|
||||
nact->ags.view_area.x,
|
||||
nact->ags.view_area.y,
|
||||
min(nact->ags.view_area.w, nact->ags.world_size.width),
|
||||
min(nact->ags.view_area.h, nact->ags.world_size.height)
|
||||
min(nact->ags.view_area.w, nact->ags.world_width),
|
||||
min(nact->ags.view_area.h, nact->ags.world_height)
|
||||
};
|
||||
MyPoint p = {0, 0};
|
||||
sdl_updateArea(&r, &p);
|
||||
SDL_Point p = {0, 0};
|
||||
gfx_updateArea(&r, &p);
|
||||
}
|
||||
|
||||
void ags_setPalettes(SDL_Color *src, int dst, int cnt) {
|
||||
@@ -261,47 +266,47 @@ void ags_setPalette(int no, int red, int green, int blue) {
|
||||
|
||||
void ags_setPaletteToSystem(int src, int cnt) {
|
||||
if (!fade_outed)
|
||||
sdl_setPalette(nact->ags.pal, src, cnt);
|
||||
gfx_setPalette(nact->ags.pal, src, cnt);
|
||||
}
|
||||
|
||||
void ags_drawRectangle(int x, int y, int w, int h, int col) {
|
||||
if (!ags_check_param(&x, &y, &w, &h)) return;
|
||||
|
||||
sdl_drawRectangle(x, y, w, h, col);
|
||||
gfx_drawRectangle(x, y, w, h, col);
|
||||
}
|
||||
|
||||
void ags_fillRectangle(int x, int y, int w, int h, int col) {
|
||||
if (!ags_check_param(&x, &y, &w, &h)) return;
|
||||
|
||||
sdl_fillRectangle(x, y, w, h, col);
|
||||
gfx_fillRectangle(x, y, w, h, col);
|
||||
}
|
||||
|
||||
void ags_drawLine(int x0, int y0, int x1, int y1, int col) {
|
||||
if (!ags_check_param_xy(&x0, &y0)) return;
|
||||
if (!ags_check_param_xy(&x1, &y1)) return;
|
||||
|
||||
sdl_drawLine(x0, y0, x1, y1, col);
|
||||
gfx_drawLine(x0, y0, x1, y1, col);
|
||||
}
|
||||
|
||||
void ags_copyArea(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyArea(sx, sy, w, h, dx, dy);
|
||||
gfx_copyArea(sx, sy, w, h, dx, dy);
|
||||
}
|
||||
|
||||
void ags_scaledCopyArea(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int mirror_sw) {
|
||||
if (!ags_check_param(&sx, &sy, &sw, &sh)) return;
|
||||
if (!ags_check_param(&dx, &dy, &dw, &dh)) return;
|
||||
|
||||
sdl_scaledCopyArea(sx, sy, sw, sh, dx, dy, dw, dh, mirror_sw);
|
||||
gfx_scaledCopyArea(sx, sy, sw, sh, dx, dy, dw, dh, mirror_sw);
|
||||
}
|
||||
|
||||
void ags_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, int col) {
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyAreaSP(sx, sy, w, h, dx, dy, col);
|
||||
gfx_copyAreaSP(sx, sy, w, h, dx, dy, col);
|
||||
}
|
||||
|
||||
void ags_wrapColor(int x, int y, int w, int h, int p1, int p2) {
|
||||
@@ -309,13 +314,18 @@ void ags_wrapColor(int x, int y, int w, int h, int p1, int p2) {
|
||||
|
||||
if (!ags_check_param(&x, &y, &w, &h)) return;
|
||||
|
||||
sdl_wrapColor(x, y, w, h, p1, p2);
|
||||
gfx_wrapColor(x, y, w, h, p1, p2);
|
||||
}
|
||||
|
||||
void ags_getPixel(int x, int y, Palette *cell) {
|
||||
void ags_getPixel(int x, int y, PixelColor *cell) {
|
||||
if (!ags_check_param_xy(&x, &y)) return;
|
||||
|
||||
sdl_getPixel(x, y, cell);
|
||||
uint32_t pixel = gfx_getPixel(x, y);
|
||||
if (main_surface->format->BitsPerPixel == 8) {
|
||||
cell->index = pixel;
|
||||
} else {
|
||||
SDL_GetRGB(pixel, main_surface->format, &cell->r, &cell->g, &cell->b);
|
||||
}
|
||||
}
|
||||
|
||||
void ags_copyPaletteShift(int sx, int sy, int w, int h, int dx, int dy, uint8_t sprite) {
|
||||
@@ -357,7 +367,7 @@ void ags_changeColorArea(int sx, int sy, int w, int h, int dst, int src, int cnt
|
||||
void* ags_saveRegion(int x, int y, int w, int h) {
|
||||
if (!ags_check_param(&x, &y, &w, &h)) return NULL;
|
||||
|
||||
return (void *)sdl_saveRegion(x, y, w, h);
|
||||
return (void *)gfx_saveRegion(x, y, w, h);
|
||||
}
|
||||
|
||||
void ags_restoreRegion(void *region, int x, int y) {
|
||||
@@ -365,7 +375,7 @@ void ags_restoreRegion(void *region, int x, int y) {
|
||||
|
||||
if (!ags_check_param_xy(&x, &y)) return;
|
||||
|
||||
sdl_restoreRegion(region, x, y);
|
||||
gfx_restoreRegion(region, x, y);
|
||||
}
|
||||
|
||||
void ags_putRegion(void *region, int x, int y) {
|
||||
@@ -373,16 +383,16 @@ void ags_putRegion(void *region, int x, int y) {
|
||||
|
||||
if (!ags_check_param_xy(&x, &y)) return;
|
||||
|
||||
sdl_putRegion(region, x, y);
|
||||
gfx_putRegion(region, x, y);
|
||||
}
|
||||
|
||||
void ags_delRegion(void *region) {
|
||||
if (region == NULL) return;
|
||||
|
||||
sdl_delRegion(region);
|
||||
gfx_delRegion(region);
|
||||
}
|
||||
|
||||
int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out) {
|
||||
int ags_drawString(int x, int y, const char *src, int col, SDL_Rect *rect_out) {
|
||||
if (!ags_check_param_xy(&x, &y)) {
|
||||
if (rect_out) {
|
||||
rect_out->x = x;
|
||||
@@ -393,7 +403,7 @@ int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out
|
||||
return 0;
|
||||
}
|
||||
|
||||
MyRectangle adj;
|
||||
SDL_Rect adj;
|
||||
char *utf8 = toUTF8(src);
|
||||
switch(nact->ags.text_decoration_type) {
|
||||
case TEXT_DECORATION_NONE:
|
||||
@@ -401,46 +411,46 @@ int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out
|
||||
adj.x = 0; adj.y = 0; adj.w = 0; adj.h = 0;
|
||||
break;
|
||||
case TEXT_DECORATION_DROP_SHADOW_BOTTOM:
|
||||
sdl_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
|
||||
adj.x = 0; adj.y = 0; adj.w = 0; adj.h = 1;
|
||||
break;
|
||||
case TEXT_DECORATION_DROP_SHADOW_RIGHT:
|
||||
sdl_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
|
||||
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 0;
|
||||
break;
|
||||
case TEXT_DECORATION_DROP_SHADOW_BOTTOM_RIGHT:
|
||||
sdl_drawString(x +1, y +1, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x +1, y +1, utf8, nact->ags.text_decoration_color);
|
||||
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 1;
|
||||
break;
|
||||
case TEXT_DECORATION_OUTLINE:
|
||||
sdl_drawString(x -1, y, utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x, y -1, utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x -1, y, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x +1, y, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x, y -1, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x, y +1, utf8, nact->ags.text_decoration_color);
|
||||
adj.x = -1; adj.y = -1; adj.w = 2; adj.h = 2;
|
||||
break;
|
||||
case TEXT_DECORATION_BOLD_HORIZONTAL:
|
||||
sdl_drawString(x +1, y, utf8, col);
|
||||
gfx_drawString(x +1, y, utf8, col);
|
||||
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 0;
|
||||
break;
|
||||
case TEXT_DECORATION_BOLD_VERTICAL:
|
||||
sdl_drawString(x, y +1, utf8, col);
|
||||
gfx_drawString(x, y +1, utf8, col);
|
||||
adj.x = 0; adj.y = 0; adj.w = 0; adj.h = 1;
|
||||
break;
|
||||
case TEXT_DECORATION_BOLD_HORIZONTAL_VERTICAL:
|
||||
sdl_drawString(x +1, y +1, utf8, col);
|
||||
gfx_drawString(x +1, y +1, utf8, col);
|
||||
adj.x = 0; adj.y = 0; adj.w = 1; adj.h = 1;
|
||||
break;
|
||||
case TEXT_DECORATION_DROP_SHADOW_OUTLINE:
|
||||
sdl_drawString(x -1, y , utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x +1, y , utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x , y -1, utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x , y +1, utf8, nact->ags.text_decoration_color);
|
||||
sdl_drawString(x +2, y +2, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x -1, y , utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x +1, y , utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x , y -1, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x , y +1, utf8, nact->ags.text_decoration_color);
|
||||
gfx_drawString(x +2, y +2, utf8, nact->ags.text_decoration_color);
|
||||
adj.x = -1; adj.y = -1; adj.w = 3; adj.h = 3;
|
||||
break;
|
||||
}
|
||||
SDL_Rect r = sdl_drawString(x, y, utf8, col);
|
||||
SDL_Rect r = gfx_drawString(x, y, utf8, col);
|
||||
if (rect_out) {
|
||||
rect_out->x = r.x + adj.x;
|
||||
rect_out->y = r.y + adj.y;
|
||||
@@ -461,13 +471,13 @@ SDL_Surface *ags_drawStringToSurface(const char *str, int r, int g, int b) {
|
||||
void ags_drawCg(cgdata *cg, int x, int y, int brightness, int sprite_color, bool alpha_blend) {
|
||||
switch (cg->depth) {
|
||||
case 8:
|
||||
sdl_drawImage8(cg, x, y, sprite_color);
|
||||
gfx_drawImage8(cg, x, y, sprite_color);
|
||||
break;
|
||||
case 16:
|
||||
sdl_drawImage16(cg, nact->ags.dib, x, y, brightness, alpha_blend);
|
||||
gfx_drawImage16(cg, nact->ags.dib, x, y, brightness, alpha_blend);
|
||||
break;
|
||||
case 24:
|
||||
sdl_drawImage24(cg, nact->ags.dib, x, y, brightness);
|
||||
gfx_drawImage24(cg, nact->ags.dib, x, y, brightness);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -478,7 +488,7 @@ void ags_copyArea_shadow(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, 255);
|
||||
gfx_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, 255);
|
||||
}
|
||||
|
||||
void ags_copyArea_transparent(int sx, int sy, int w, int h, int dx, int dy, int col) {
|
||||
@@ -487,7 +497,7 @@ void ags_copyArea_transparent(int sx, int sy, int w, int h, int dx, int dy, int
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyAreaSP(sx, sy, w, h, dx, dy, col);
|
||||
gfx_copyAreaSP(sx, sy, w, h, dx, dy, col);
|
||||
}
|
||||
|
||||
void ags_copyArea_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
@@ -496,7 +506,7 @@ void ags_copyArea_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int l
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyAreaSP16_alphaLevel(sx, sy, w, h, dx, dy, lv);
|
||||
gfx_copyAreaSP16_alphaLevel(sx, sy, w, h, dx, dy, lv);
|
||||
}
|
||||
|
||||
void ags_copyArea_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
@@ -505,14 +515,14 @@ void ags_copyArea_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int l
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyAreaSP16_alphaBlend(sx, sy, w, h, dx, dy, lv);
|
||||
gfx_copyAreaSP16_alphaBlend(sx, sy, w, h, dx, dy, lv);
|
||||
}
|
||||
|
||||
MyRectangle ags_floodFill(int x, int y, int col) {
|
||||
SDL_Rect ags_floodFill(int x, int y, int col) {
|
||||
if (!ags_check_param_xy(&x, &y))
|
||||
return (MyRectangle){};
|
||||
return (SDL_Rect){};
|
||||
|
||||
return sdl_floodFill(x, y, col);
|
||||
return gfx_floodFill(x, y, col);
|
||||
}
|
||||
|
||||
void ags_copyFromAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flg) {
|
||||
@@ -521,7 +531,7 @@ void ags_copyFromAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_C
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copy_from_alpha(sx, sy, w, h, dx, dy, flg);
|
||||
gfx_copy_from_alpha(sx, sy, w, h, dx, dy, flg);
|
||||
}
|
||||
|
||||
void ags_copyToAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flg) {
|
||||
@@ -530,7 +540,7 @@ void ags_copyToAlpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COP
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copy_to_alpha(sx, sy, w, h, dx, dy, flg);
|
||||
gfx_copy_to_alpha(sx, sy, w, h, dx, dy, flg);
|
||||
}
|
||||
|
||||
void ags_alpha_uppercut(int sx, int sy, int w, int h, int s, int d) {
|
||||
@@ -592,10 +602,10 @@ void ags_alpha_setPixel(int x, int y, int w, int h, uint8_t *b) {
|
||||
|
||||
void ags_runEffect(int duration_ms, bool cancelable, ags_EffectStepFunc step, void *arg) {
|
||||
unsigned wflags = cancelable ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE;
|
||||
int start = sdl_getTicks();
|
||||
for (int t = 0; t < duration_ms; t = sdl_getTicks() - start) {
|
||||
int start = sys_get_ticks();
|
||||
for (int t = 0; t < duration_ms; t = sys_get_ticks() - start) {
|
||||
step(arg, (float)t / duration_ms);
|
||||
int key = sys_keywait(start + t + 16 - sdl_getTicks(), wflags);
|
||||
int key = sys_keywait(start + t + 16 - sys_get_ticks(), wflags);
|
||||
if (cancelable && key) {
|
||||
nact->waitcancel_key = key;
|
||||
break;
|
||||
@@ -604,22 +614,22 @@ void ags_runEffect(int duration_ms, bool cancelable, ags_EffectStepFunc step, vo
|
||||
step(arg, 1.0);
|
||||
}
|
||||
|
||||
static void fade(int duration, bool cancelable, enum sdl_effect_type type) {
|
||||
static void fade(int duration, bool cancelable, enum effect_type type) {
|
||||
nact->waitcancel_key = 0;
|
||||
|
||||
SDL_Rect rect = {0, 0, nact->ags.view_area.w, nact->ags.view_area.h};
|
||||
struct sdl_effect *eff = sdl_effect_init(
|
||||
struct effect *eff = effect_init(
|
||||
&rect, NULL, 0, 0,
|
||||
sdl_getDIB(), nact->ags.view_area.x, nact->ags.view_area.y,
|
||||
gfx_getDIB(), nact->ags.view_area.x, nact->ags.view_area.y,
|
||||
type);
|
||||
ags_runEffect(duration, cancelable, (ags_EffectStepFunc)sdl_effect_step, eff);
|
||||
sdl_effect_finish(eff);
|
||||
ags_runEffect(duration, cancelable, (ags_EffectStepFunc)effect_step, eff);
|
||||
effect_finish(eff);
|
||||
}
|
||||
|
||||
void ags_fadeIn(int rate, bool flag) {
|
||||
fade_outed = false;
|
||||
if (nact->ags.world_depth == 8)
|
||||
sdl_setPalette(nact->ags.pal, 0, 256);
|
||||
gfx_setPalette(nact->ags.pal, 0, 256);
|
||||
|
||||
if (!need_update)
|
||||
return;
|
||||
@@ -627,7 +637,7 @@ void ags_fadeIn(int rate, bool flag) {
|
||||
int duration = rate * 16 * 1000 / 60;
|
||||
fade(duration, flag, nact->ags.world_depth == 8 ? EFFECT_FADEIN : EFFECT_DITHERING_FADEIN);
|
||||
|
||||
sdl_updateAll(&nact->ags.view_area);
|
||||
gfx_updateAll(&nact->ags.view_area);
|
||||
}
|
||||
|
||||
void ags_fadeOut(int rate, bool flag) {
|
||||
@@ -642,14 +652,14 @@ void ags_fadeOut(int rate, bool flag) {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
pal[i] = (SDL_Color){0, 0, 0, 255};
|
||||
}
|
||||
sdl_setPalette(pal, 0, 256);
|
||||
gfx_setPalette(pal, 0, 256);
|
||||
}
|
||||
}
|
||||
|
||||
void ags_whiteIn(int rate, bool flag) {
|
||||
fade_outed = false;
|
||||
if (nact->ags.world_depth == 8)
|
||||
sdl_setPalette(nact->ags.pal, 0, 256);
|
||||
gfx_setPalette(nact->ags.pal, 0, 256);
|
||||
|
||||
if (!need_update)
|
||||
return;
|
||||
@@ -657,7 +667,7 @@ void ags_whiteIn(int rate, bool flag) {
|
||||
int duration = rate * 16 * 1000 / 60;
|
||||
fade(duration, flag, nact->ags.world_depth == 8 ? EFFECT_WHITEIN : EFFECT_DITHERING_WHITEIN);
|
||||
|
||||
sdl_updateAll(&nact->ags.view_area);
|
||||
gfx_updateAll(&nact->ags.view_area);
|
||||
}
|
||||
|
||||
void ags_whiteOut(int rate, bool flag) {
|
||||
@@ -670,7 +680,7 @@ void ags_whiteOut(int rate, bool flag) {
|
||||
if (nact->ags.world_depth == 8) {
|
||||
SDL_Color pal[256];
|
||||
memset(&pal, 255, sizeof(pal));
|
||||
sdl_setPalette(pal, 0, 256);
|
||||
gfx_setPalette(pal, 0, 256);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -692,7 +702,7 @@ void ags_setTextDecorationColor(int col) {
|
||||
|
||||
void ags_setCursorType(int type) {
|
||||
if (nact->ags.noimagecursor && type >= 100) return;
|
||||
sdl_setCursorType(type);
|
||||
cursor_set_type(type);
|
||||
}
|
||||
|
||||
void ags_loadCursor(int p1,int p2) {
|
||||
@@ -715,26 +725,26 @@ void ags_setCursorLocation(int x, int y, bool is_dibgeo, bool for_selection) {
|
||||
// We can't move the actual cursor in the browser, but can change the
|
||||
// internal mouse coordinates. This can help with keyboard/gamepad
|
||||
// navigation.
|
||||
sdl_setCursorInternalLocation(x, y);
|
||||
event_set_mouse_internal_location(x, y);
|
||||
EM_ASM({ xsystem35.shell.showMouseMoveEffect($0, $1); }, x, y);
|
||||
sdl_sleep(cursor_move_time);
|
||||
sys_sleep(cursor_move_time);
|
||||
}
|
||||
#else
|
||||
if (nact->ags.mouse_warp_enabled) {
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
sys_getMouseInfo(&p, is_dibgeo);
|
||||
int dx = x - p.x;
|
||||
int dy = y - p.y;
|
||||
for (int i = 1; i < 8; i++) {
|
||||
int xi = ((dx*i*i*i) >> 9) - ((3*dx*i*i)>> 6) + ((3*dx*i) >> 3) + p.x;
|
||||
int yi = ((dy*i*i*i) >> 9) - ((3*dy*i*i)>> 6) + ((3*dy*i) >> 3) + p.y;
|
||||
sdl_setCursorLocation(xi, yi);
|
||||
sdl_sleep(cursor_move_time / 7);
|
||||
event_set_mouse_location(xi, yi);
|
||||
sys_sleep(cursor_move_time / 7);
|
||||
}
|
||||
sdl_setCursorLocation(x, y);
|
||||
event_set_mouse_location(x, y);
|
||||
} else if (!for_selection) {
|
||||
sdl_setCursorInternalLocation(x, y);
|
||||
sdl_sleep(cursor_move_time);
|
||||
event_set_mouse_internal_location(x, y);
|
||||
sys_sleep(cursor_move_time);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -758,7 +768,7 @@ void ags_copyArea_shadow_withrate(int sx, int sy, int w, int h, int dx, int dy,
|
||||
if (!ags_check_param(&sx, &sy, &w, &h)) return;
|
||||
if (!ags_check_param(&dx, &dy, &w, &h)) return;
|
||||
|
||||
sdl_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, lv);
|
||||
gfx_copyAreaSP16_shadow(sx, sy, w, h, dx, dy, lv);
|
||||
}
|
||||
|
||||
void ags_setCursorMoveTime(int msec) {
|
||||
@@ -774,10 +784,14 @@ surface_t *ags_getDIB() {
|
||||
}
|
||||
|
||||
void ags_autorepeat(bool enable) {
|
||||
sdl_setAutoRepeat(enable);
|
||||
if (enable) {
|
||||
// SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||
} else {
|
||||
// SDL_EnableKeyRepeat(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
bool ags_clipCopyRect(const MyRectangle *sw, const MyRectangle *dw, int *sx, int *sy, int *dx, int *dy, int *w, int *h) {
|
||||
bool ags_clipCopyRect(const SDL_Rect *sw, const SDL_Rect *dw, int *sx, int *sy, int *dx, int *dy, int *w, int *h) {
|
||||
// Clip source rectangle to source window
|
||||
SDL_Rect sr = {*sx, *sy, *w, *h};
|
||||
if (!SDL_IntersectRect(&sr, sw, &sr))
|
||||
|
||||
@@ -29,22 +29,7 @@
|
||||
#include <SDL_surface.h>
|
||||
#include "portab.h"
|
||||
#include "cg.h"
|
||||
#include "graphics.h"
|
||||
|
||||
/* マウスカーソルの種類 */
|
||||
#define CURSOR_ARROW 1
|
||||
#define CURSOR_CROSS 2
|
||||
#define CURSOR_IBEAM 3
|
||||
#define CURSOR_ICON 4
|
||||
#define CURSOR_NO 5
|
||||
#define CURSOR_SIZE 6
|
||||
#define CURSOR_SIZEALL 7
|
||||
#define CURSOR_SIZENESW 8
|
||||
#define CURSOR_SIZENS 9
|
||||
#define CURSOR_SIZENWSE 10
|
||||
#define CURSOR_SIZEWE 11
|
||||
#define CURSOR_UPARROW 12
|
||||
#define CURSOR_WAIT 13
|
||||
#include "font.h"
|
||||
|
||||
/* RGB <-> alpha plane copy type */
|
||||
typedef enum {
|
||||
@@ -111,13 +96,26 @@ typedef enum {
|
||||
TEXT_DECORATION_DROP_SHADOW_OUTLINE = 10,
|
||||
} TextDecorationType;
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint8_t r, g, b;
|
||||
uint32_t index;
|
||||
} PixelColor;
|
||||
|
||||
typedef struct {
|
||||
int width;
|
||||
int height;
|
||||
int depth;
|
||||
} DispInfo;
|
||||
|
||||
struct _ags {
|
||||
SDL_Color pal[256]; /* system palette */
|
||||
bool pal_changed; /* system palette has changed */
|
||||
|
||||
MyDimension world_size; /* size of off-screen */
|
||||
|
||||
MyRectangle view_area; /* view region in off-screen */
|
||||
int world_width;
|
||||
int world_height;
|
||||
|
||||
SDL_Rect view_area; /* view region in off-screen */
|
||||
|
||||
int world_depth; /* depth of off-screen (bits per pixel) */
|
||||
|
||||
@@ -174,7 +172,7 @@ extern void ags_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, int col
|
||||
extern void ags_copyArea_shadow_withrate(int sx, int sy, int w, int h, int dx, int dy, int lv);
|
||||
|
||||
extern void ags_wrapColor(int x, int y, int w, int h, int p1, int p2);
|
||||
extern void ags_getPixel(int x, int y, Palette *cell);
|
||||
extern void ags_getPixel(int x, int y, PixelColor *cell);
|
||||
extern void ags_copyPaletteShift(int sx, int sy, int w, int h, int dx, int dy, uint8_t sprite);
|
||||
extern void ags_changeColorArea(int x, int y, int w, int h, int dst, int src, int cnt);
|
||||
|
||||
@@ -183,14 +181,14 @@ extern void ags_restoreRegion(void *region, int x, int y);
|
||||
extern void ags_putRegion(void *region, int x, int y);
|
||||
extern void ags_delRegion(void *region);
|
||||
|
||||
extern int ags_drawString(int x, int y, const char *src, int col, MyRectangle *rect_out);
|
||||
extern int ags_drawString(int x, int y, const char *src, int col, SDL_Rect *rect_out);
|
||||
extern void ags_drawCg(cgdata *cg, int x, int y, int brightness, int sprite_color, bool alpha_blend);
|
||||
|
||||
extern void ags_copyArea_shadow(int sx, int sy, int w, int h, int dx, int dy);
|
||||
extern void ags_copyArea_transparent(int sx, int sy, int w, int h, int dx, int dy, int col);
|
||||
extern void ags_copyArea_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv);
|
||||
extern void ags_copyArea_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv);
|
||||
extern MyRectangle ags_floodFill(int x, int y, int col);
|
||||
extern SDL_Rect ags_floodFill(int x, int y, int col);
|
||||
extern void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt, bool cancel);
|
||||
extern void ags_eSpriteCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt, bool cancel, int spCol);
|
||||
|
||||
@@ -228,7 +226,7 @@ extern int ags_getCursorMoveTime();
|
||||
extern void ags_setAntialiasedStringMode(bool mode);
|
||||
extern bool ags_getAntialiasedStringMode();
|
||||
extern void ags_autorepeat(bool enable);
|
||||
extern bool ags_clipCopyRect(const MyRectangle *sr, const MyRectangle *dr, int *sx, int *sy, int *dx, int *dy, int *w, int *h);
|
||||
extern bool ags_clipCopyRect(const SDL_Rect *sr, const SDL_Rect *dr, int *sx, int *sy, int *dx, int *dy, int *w, int *h);
|
||||
|
||||
typedef void (*ags_EffectStepFunc)(void *, float);
|
||||
void ags_runEffect(int duration_ms, bool cancelable, ags_EffectStepFunc step, void *arg);
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "nact.h"
|
||||
#include "bgm.h"
|
||||
#include "bgi.h"
|
||||
#include "sdl_core.h"
|
||||
#include "system.h"
|
||||
|
||||
bool musbgm_init(DRIFILETYPE type, int base_no) {
|
||||
if (type == DRIFILE_BGM)
|
||||
@@ -84,6 +84,6 @@ void musbgm_wait(int no, int timeout) {
|
||||
for (int i = 0; i * 16 < timeout * 10; i++) {
|
||||
if (!musbgm_isplaying(no))
|
||||
break;
|
||||
sdl_wait_vsync();
|
||||
sys_wait_vsync();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include <stdlib.h>
|
||||
#include "portab.h"
|
||||
#include "LittleEndian.h"
|
||||
#include "graphics.h"
|
||||
#include "cg.h"
|
||||
#include "bmp.h"
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "portab.h"
|
||||
#include "cdrom.h"
|
||||
#include "scheduler.h"
|
||||
#include "system.h"
|
||||
|
||||
static bool cdrom_init(char *playlist) {
|
||||
return true;
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <SDL.h>
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "graphics.h"
|
||||
#include "nact.h"
|
||||
#include "ags.h"
|
||||
#include "cg.h"
|
||||
@@ -57,7 +56,7 @@ int cg_brightness;
|
||||
|
||||
/* CG表示位置に関する情報 */
|
||||
static CG_WHERETODISP loc_policy, loc_policy0;
|
||||
static MyPoint loc_where, loc_where0;
|
||||
static SDL_Point loc_where, loc_where0;
|
||||
|
||||
/* extracted cg data cache control object */
|
||||
static cacher *cacheid;
|
||||
@@ -65,7 +64,7 @@ static cacher *cacheid;
|
||||
/* static methods */
|
||||
static CG_TYPE check_cgformat(uint8_t *data);
|
||||
static void set_vspbank(uint8_t *pic, int bank, int width, int height);
|
||||
static MyPoint set_display_loc(cgdata *cg);
|
||||
static SDL_Point set_display_loc(cgdata *cg);
|
||||
static void clear_display_loc();
|
||||
static void display_cg(cgdata *cg, int x, int y, int sprite_color, bool alpha_blend);
|
||||
static cgdata *loader(int no);
|
||||
@@ -131,8 +130,8 @@ void cgdata_free(cgdata *cg) {
|
||||
* cg: cg information
|
||||
* return: x and y for display location
|
||||
*/
|
||||
static MyPoint set_display_loc(cgdata *cg) {
|
||||
MyPoint p;
|
||||
static SDL_Point set_display_loc(cgdata *cg) {
|
||||
SDL_Point p;
|
||||
|
||||
switch(loc_policy) {
|
||||
case OFFSET_ABSOLUTE_GC:
|
||||
@@ -288,7 +287,7 @@ void cg_set_display_location(int x, int y, CG_WHERETODISP policy) {
|
||||
*/
|
||||
void cg_load(int no, int flg) {
|
||||
cgdata *cg;
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
int i, bank = cg_vspPB;
|
||||
|
||||
/* load and extract cg */
|
||||
@@ -361,7 +360,7 @@ void cg_load(int no, int flg) {
|
||||
*/
|
||||
void cg_load_with_alpha(int cgno, int shadowno) {
|
||||
cgdata *cg = NULL, *scg;
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
|
||||
/* load pixel */
|
||||
if (cgno >= 0) {
|
||||
@@ -441,7 +440,7 @@ int cg_load_with_filename(char *fname_utf8, int x, int y) {
|
||||
long filesize;
|
||||
uint8_t *data;
|
||||
cgdata *cg = NULL;
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
|
||||
data = load_cg_from_file(fname_utf8, &status, &filesize);
|
||||
if (data == NULL) return status;
|
||||
@@ -490,9 +489,9 @@ int cg_load_with_filename(char *fname_utf8, int x, int y) {
|
||||
* no : file no for cg ( >= 0 )
|
||||
* info: information to be retored
|
||||
*/
|
||||
void cg_get_info(int no, MyRectangle *info) {
|
||||
void cg_get_info(int no, SDL_Rect *info) {
|
||||
cgdata *cg = loader(no);
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
|
||||
if (cg == NULL) {
|
||||
info->x = info->y = info->w = info->h = 0;
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
#ifndef __CG__
|
||||
#define __CG__
|
||||
|
||||
#include <SDL_rect.h>
|
||||
#include "portab.h"
|
||||
#include "graphics.h"
|
||||
|
||||
struct SDL_Surface;
|
||||
|
||||
@@ -80,7 +80,7 @@ extern void cg_set_display_location(int x, int y, CG_WHERETODISP policy);
|
||||
extern void cg_load(int no, int flg);
|
||||
extern void cg_load_with_alpha(int cgno, int shadowno);
|
||||
extern int cg_load_with_filename(char *fname_utf8, int x, int y);
|
||||
extern void cg_get_info(int no, MyRectangle *info);
|
||||
extern void cg_get_info(int no, SDL_Rect *info);
|
||||
extern void cg_clear_display_loc();
|
||||
extern void cgdata_free(cgdata *cg);
|
||||
extern struct SDL_Surface *cg_load_as_sdlsurface(int no);
|
||||
|
||||
+8
-8
@@ -38,7 +38,7 @@
|
||||
#include "utfsjis.h"
|
||||
#include "hankaku.h"
|
||||
#include "ags.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "ald_manager.h"
|
||||
#include "LittleEndian.h"
|
||||
#include "hacks.h"
|
||||
@@ -107,7 +107,7 @@ void commands2F04() {
|
||||
|
||||
void commands2F05() {
|
||||
/* 現在のテキスト表示位置をスタックにプッシュする */
|
||||
MyPoint loc;
|
||||
SDL_Point loc;
|
||||
msg_getMessageLocation(&loc);
|
||||
sl_pushTextLoc(loc.x, loc.y);
|
||||
TRACE("TPP:");
|
||||
@@ -706,7 +706,7 @@ void commands2F43() {
|
||||
int eLength = getCaliValue();
|
||||
int eColor = getCaliValue();
|
||||
|
||||
sdl_fillCircle(eX, eY, eLength, eColor);
|
||||
gfx_fillCircle(eX, eY, eLength, eColor);
|
||||
ags_updateArea(eX, eY, eLength, eLength);
|
||||
|
||||
TRACE("grDrawFillCircle %d, %d, %d, %d:", eX, eY, eLength, eColor);
|
||||
@@ -781,10 +781,10 @@ void commands2F4C() {
|
||||
int eWidth = getCaliValue();
|
||||
int eHeight = getCaliValue();
|
||||
|
||||
MyRectangle r = {eSrcX, eSrcY, eWidth, eHeight};
|
||||
MyPoint p = {eX, eY};
|
||||
SDL_Rect r = {eSrcX, eSrcY, eWidth, eHeight};
|
||||
SDL_Point p = {eX, eY};
|
||||
|
||||
sdl_updateArea(&r, &p);
|
||||
gfx_updateArea(&r, &p);
|
||||
|
||||
TRACE("grBlt %d, %d, %d, %d, %d, %d:",
|
||||
eX, eY, eSrcX, eSrcY, eWidth, eHeight);
|
||||
@@ -943,7 +943,7 @@ void commands2F5A() {
|
||||
char *t1;
|
||||
|
||||
t1 = toUTF8(sText);
|
||||
sdl_showMessageBox(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
|
||||
sys_show_message_box(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
|
||||
free(t1);
|
||||
|
||||
TRACE("strMessageBox %s:", sText);
|
||||
@@ -954,7 +954,7 @@ void commands2F5B() {
|
||||
char *t1;
|
||||
|
||||
t1 = toUTF8(svar_get(eNum));
|
||||
sdl_showMessageBox(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
|
||||
sys_show_message_box(MESSAGEBOX_INFO, nact->game_title_utf8, t1);
|
||||
free(t1);
|
||||
|
||||
TRACE("strMessageBoxStr %d:", eNum);
|
||||
|
||||
+2
-2
@@ -32,7 +32,7 @@
|
||||
#include "selection.h"
|
||||
#include "message.h"
|
||||
#include "input.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
|
||||
static void undeferr();
|
||||
|
||||
@@ -181,7 +181,7 @@ void exec_command(void) {
|
||||
int c0 = sl_getc();
|
||||
|
||||
if (c0 == BREAKPOINT) {
|
||||
sdl_updateScreen();
|
||||
gfx_updateScreen();
|
||||
c0 = dbg_handle_breakpoint(sl_getPage(), sl_getIndex() - 1);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -134,7 +134,7 @@ void commandB4() {
|
||||
}
|
||||
|
||||
void commandB10() {
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
int *x_var = getCaliVariable();
|
||||
int *y_var = getCaliVariable();
|
||||
|
||||
|
||||
+1
-1
@@ -265,7 +265,7 @@ void commandCP() {
|
||||
int y = getCaliValue();
|
||||
int color = getCaliValue();
|
||||
|
||||
MyRectangle rec = ags_floodFill(x, y, color);
|
||||
SDL_Rect rec = ags_floodFill(x, y, color);
|
||||
if (!SDL_RectEmpty(&rec))
|
||||
ags_updateArea(rec.x, rec.y, rec.w, rec.h);
|
||||
|
||||
|
||||
+6
-7
@@ -26,10 +26,9 @@
|
||||
#include "xsystem35.h"
|
||||
#include "scenario.h"
|
||||
#include "ags.h"
|
||||
#include "graphics.h"
|
||||
|
||||
typedef struct {
|
||||
MyRectangle r;
|
||||
SDL_Rect r;
|
||||
int pal;
|
||||
} Ecomtbl;
|
||||
|
||||
@@ -55,7 +54,7 @@ void commandES() {
|
||||
void commandEC() {
|
||||
int num = getCaliValue();
|
||||
Ecomtbl *e;
|
||||
MyRectangle *r;
|
||||
SDL_Rect *r;
|
||||
|
||||
if (num == 0) {
|
||||
r = &nact->ags.view_area;
|
||||
@@ -91,8 +90,8 @@ void commandEM() {
|
||||
int x = getCaliValue();
|
||||
int y = getCaliValue();
|
||||
|
||||
MyPoint p = {x, y};
|
||||
MyRectangle r = tbl[num - 1].r;
|
||||
SDL_Point p = {x, y};
|
||||
SDL_Rect r = tbl[num - 1].r;
|
||||
if (nact->patch_emen == 0) {
|
||||
r.w -= 1;
|
||||
r.h -= 1;
|
||||
@@ -108,11 +107,11 @@ void commandEN() {
|
||||
int x = getCaliValue();
|
||||
int y = getCaliValue();
|
||||
|
||||
MyPoint p = {x, y};
|
||||
SDL_Point p = {x, y};
|
||||
*var = 0;
|
||||
|
||||
for (int i = min; i <= max; i++) {
|
||||
MyRectangle r = tbl[i - 1].r;
|
||||
SDL_Rect r = tbl[i - 1].r;
|
||||
if (nact->patch_emen == 0) {
|
||||
r.w -= 1;
|
||||
r.h -= 1;
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ void commandG1() {
|
||||
|
||||
void commandGS() {
|
||||
/* num 番にリンクされているCGの座標とサイズを取得する */
|
||||
MyRectangle r;
|
||||
SDL_Rect r;
|
||||
int num = getCaliValue();
|
||||
int *var = getCaliVariable();
|
||||
|
||||
|
||||
+1
-2
@@ -28,7 +28,6 @@
|
||||
#include "xsystem35.h"
|
||||
#include "scenario.h"
|
||||
#include "ags.h"
|
||||
#include "sdl_core.h"
|
||||
#include "input.h"
|
||||
#include "msgskip.h"
|
||||
|
||||
@@ -102,7 +101,7 @@ void commandIM() {
|
||||
/* マウスカーソルの座標取得 */
|
||||
int *x_var = getCaliVariable();
|
||||
int *y_var = getCaliVariable();
|
||||
MyPoint p;
|
||||
SDL_Point p;
|
||||
|
||||
sysVar[0] = sys_getMouseInfo(&p, false);
|
||||
*x_var = p.x;
|
||||
|
||||
+4
-4
@@ -156,10 +156,10 @@ void commandPT0() {
|
||||
int *var = getCaliVariable();
|
||||
int x = getCaliValue();
|
||||
int y = getCaliValue();
|
||||
Palette cell;
|
||||
PixelColor cell;
|
||||
|
||||
ags_getPixel(x, y, &cell);
|
||||
*var = cell.pixel;
|
||||
*var = cell.index;
|
||||
|
||||
TRACE("PT0 %p,%d,%d:", var, x, y);
|
||||
}
|
||||
@@ -171,7 +171,7 @@ void commandPT1() {
|
||||
int *b_var = getCaliVariable();
|
||||
int x = getCaliValue();
|
||||
int y = getCaliValue();
|
||||
Palette cell;
|
||||
PixelColor cell;
|
||||
|
||||
ags_getPixel(x, y, &cell);
|
||||
*r_var = cell.r;
|
||||
@@ -187,7 +187,7 @@ void commandPT2() {
|
||||
int *low_var = getCaliVariable();
|
||||
int x = getCaliValue();
|
||||
int y = getCaliValue();
|
||||
Palette cell;
|
||||
PixelColor cell;
|
||||
int r, g, b, pic;
|
||||
|
||||
ags_getPixel(x, y, &cell);
|
||||
|
||||
+4
-5
@@ -27,7 +27,6 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include "portab.h"
|
||||
#include "sdl_core.h"
|
||||
#include "scheduler.h"
|
||||
#include "xsystem35.h"
|
||||
#include "scenario.h"
|
||||
@@ -760,7 +759,7 @@ void commandVA() { /* from Panyo */
|
||||
/* 開始 (p3=コマ数,0:無限(開始位置==終了位置のとき))*/
|
||||
inAnimation = true;
|
||||
VAcmd[p1].elaspCut = 0;
|
||||
VAcmd[p1].startTime = sdl_getTicks();
|
||||
VAcmd[p1].startTime = sys_get_ticks();
|
||||
VAcmd[p1].totalCut = p3;
|
||||
|
||||
if (p3 == 0) {
|
||||
@@ -784,7 +783,7 @@ void commandVA() { /* from Panyo */
|
||||
/* キー抜け無し ,p3=0は指定不可 */
|
||||
while(VAcmd[p1].state == VA_RUNNING) {
|
||||
va_animationAlone(p1);
|
||||
sdl_sleep(10);
|
||||
sys_sleep(10);
|
||||
}
|
||||
va_drawUnit(p1);
|
||||
va_updateUnit(p1);
|
||||
@@ -794,7 +793,7 @@ void commandVA() { /* from Panyo */
|
||||
VAcmd[p1].rewrite = true;
|
||||
while(VAcmd[p1].state == VA_RUNNING) {
|
||||
va_animationAlone(p1);
|
||||
sdl_sleep(10);
|
||||
sys_sleep(10);
|
||||
key = sys_getInputInfo();
|
||||
if (key != 0) {
|
||||
sysVar[0] = key;
|
||||
@@ -1003,7 +1002,7 @@ static void va_animationAlone(int i) {
|
||||
static void va_update() {
|
||||
bool proceeding = false;
|
||||
int i;
|
||||
int curTime = sdl_getTicks();
|
||||
int curTime = sys_get_ticks();
|
||||
|
||||
for (i = 0; i < VACMD_MAX; i++) {
|
||||
if (VAcmd[i].state == VA_RUNNING) {
|
||||
|
||||
+2
-3
@@ -31,7 +31,6 @@
|
||||
#include "input.h"
|
||||
#include "scenario.h"
|
||||
#include "cmd_check.h"
|
||||
#include "sdl_core.h"
|
||||
#include "scheduler.h"
|
||||
#include "music_cdrom.h"
|
||||
#include "hacks.h"
|
||||
@@ -68,14 +67,14 @@ unsigned Y3waitFlags = KEYWAIT_CANCELABLE;
|
||||
* delay, when a button is pressed.
|
||||
*
|
||||
* For Rance4 v2, this does not work because the UI loop also checks keyboard
|
||||
* status, so we use a different hack. See rance4v2_hack() in sdl_event.c.
|
||||
* status, so we use a different hack. See rance4v2_hack() in event.c.
|
||||
*/
|
||||
static void rance4_Y3_IM_hack() {
|
||||
static int count;
|
||||
|
||||
int button_pressed = sys_getInputInfo();
|
||||
if (!button_pressed) {
|
||||
sdl_wait_vsync();
|
||||
sys_wait_vsync();
|
||||
count = 0;
|
||||
}
|
||||
commandIM();
|
||||
|
||||
+8
-4
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "xsystem35.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "scheduler.h"
|
||||
#include "ags.h"
|
||||
#include "scenario.h"
|
||||
@@ -44,13 +44,13 @@ static struct {
|
||||
} counters[257]; // [0] for ZT 1-5, [1..256] for ZT 10-11
|
||||
|
||||
static void reset_counter(int num, int divisor, int offset) {
|
||||
counters[num].base = sdl_getTicks() - offset;
|
||||
counters[num].base = sys_get_ticks() - offset;
|
||||
counters[num].divisor = divisor;
|
||||
}
|
||||
|
||||
static uint32_t get_counter(int num) {
|
||||
scheduler_on_event(SCHEDULER_EVENT_TIMER_CHECK);
|
||||
return sdl_getTicks() - counters[num].base;
|
||||
return sys_get_ticks() - counters[num].base;
|
||||
}
|
||||
|
||||
void commandZC() {
|
||||
@@ -126,6 +126,10 @@ void commandZW() {
|
||||
int sw = getCaliValue();
|
||||
|
||||
if (sw < 256) {
|
||||
// System 3.5 has a bug in which ZW 1 does not disable message waiting,
|
||||
// and Rance 2 depends on it.
|
||||
if (game_id == GAME_RANCE2)
|
||||
sw = 2;
|
||||
nact->messagewait_enable = ((sw & 0xff) > 1);
|
||||
nact->messagewait_cancelled = false;
|
||||
} else {
|
||||
@@ -458,7 +462,7 @@ void commandZZ10() {
|
||||
/* スクリーンモードを取得する */
|
||||
int *var = getCaliVariable();
|
||||
|
||||
*var = sdl_isFullscreen() ? 1 : 0;
|
||||
*var = gfx_isFullscreen() ? 1 : 0;
|
||||
|
||||
TRACE("ZZ10 %d:",*var);
|
||||
}
|
||||
|
||||
+206
-2
@@ -23,13 +23,217 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "cursor.h"
|
||||
#include "LittleEndian.h"
|
||||
#include "ald_manager.h"
|
||||
#include "sdl_core.h"
|
||||
|
||||
#include "bitmaps/cursor_uparrow.xpm"
|
||||
|
||||
#define CURSOR_ARROW 1
|
||||
#define CURSOR_CROSS 2
|
||||
#define CURSOR_IBEAM 3
|
||||
#define CURSOR_ICON 4
|
||||
#define CURSOR_NO 5
|
||||
#define CURSOR_SIZE 6
|
||||
#define CURSOR_SIZEALL 7
|
||||
#define CURSOR_SIZENESW 8
|
||||
#define CURSOR_SIZENS 9
|
||||
#define CURSOR_SIZENWSE 10
|
||||
#define CURSOR_SIZEWE 11
|
||||
#define CURSOR_UPARROW 12
|
||||
#define CURSOR_WAIT 13
|
||||
|
||||
typedef struct {
|
||||
short idReserved; /* always set to 0 */
|
||||
short idType; /* always set to 1 */
|
||||
short idCount; /* number of cursor images,always set to 1 */
|
||||
/* immediately followed by idCount TCursorDirEntries */
|
||||
} CursorHeader;
|
||||
|
||||
typedef struct {
|
||||
unsigned char bWidth; /* Width */
|
||||
unsigned char bHeight; /* Height */
|
||||
unsigned char bColorCount;
|
||||
unsigned char bReserved;
|
||||
unsigned short wxHotspot;
|
||||
unsigned short wyHotspot;
|
||||
unsigned long dwBytesInRes; /* total number of bytes in image */
|
||||
unsigned long dwImageOffset;
|
||||
} TCursorDirEntry;
|
||||
|
||||
typedef struct {
|
||||
long biSize; /* sizeof(TBitmapInfoHeader) */
|
||||
long biWidth; /* width of bitmap */
|
||||
long biHeight; /* height of bitmap, see notes */
|
||||
short biPlanes; /* planes, always 1 */
|
||||
short biBitCount; /* number of color bits */
|
||||
long biCompression; /* compression used, 0 */
|
||||
long biSizeImage; /* size of the pixel data, see notes */
|
||||
long biXPelsPerMeter; /* not used, 0 */
|
||||
long biYPelsPerMeter; /* not used, 0 */
|
||||
long biClrUsed; /* # of colors used, set to 0 */
|
||||
long biClrImportant; /* important colors, set to 0 */
|
||||
short hotX;
|
||||
short hotY;
|
||||
} TBitmapInfoHeader;
|
||||
|
||||
/*
|
||||
biHeight=2*TIconDirEntry.bHeight;
|
||||
biSizeImage=ANDmask + XORmask;
|
||||
|
||||
XORmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight * biBitCount)/8;
|
||||
ANDmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight)/8;
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned char rgbBlue; /* blue component of color */
|
||||
unsigned char rgbGreen; /* green component of color */
|
||||
unsigned char rgbRed; /* red component of color */
|
||||
unsigned char rgbReserved; /* reserved, 0 */
|
||||
} TRGBQuad;
|
||||
|
||||
typedef struct {
|
||||
TBitmapInfoHeader icHeader; /* image header info */
|
||||
TRGBQuad *icColors; /* image palette */
|
||||
int xormasklen;
|
||||
int andmasklen;
|
||||
} CursorImage;
|
||||
|
||||
typedef struct {
|
||||
int cbSizeof;
|
||||
int cFrames;
|
||||
int cSteps;
|
||||
int cx;
|
||||
int cy;
|
||||
int cBitCount;
|
||||
int cPlanes;
|
||||
int jiffRate;
|
||||
int fl;
|
||||
|
||||
int *rate;
|
||||
int *seq;
|
||||
} AnimationCursorHeader ;
|
||||
|
||||
typedef struct {
|
||||
AnimationCursorHeader *header;
|
||||
CursorImage *images;
|
||||
} AniCursorImage;
|
||||
|
||||
static SDL_Cursor *cursor[256];
|
||||
|
||||
/* Stolen from the SDL mailing list */
|
||||
/* Creates a new mouse cursor from an XPM */
|
||||
|
||||
static SDL_Cursor *init_system_cursor(const char *image[]) {
|
||||
int i, row, col;
|
||||
Uint8 data[4*32];
|
||||
Uint8 mask[4*32];
|
||||
int hot_x, hot_y;
|
||||
|
||||
i = -1;
|
||||
for (row = 0; row < 32; row++) {
|
||||
for (col = 0; col < 32; col++) {
|
||||
if (col % 8) {
|
||||
data[i] <<= 1;
|
||||
mask[i] <<= 1;
|
||||
} else {
|
||||
i++;
|
||||
data[i] = mask[i] = 0;
|
||||
}
|
||||
switch (image[4 + row][col]) {
|
||||
case 'X':
|
||||
data[i] |= 0x01;
|
||||
mask[i] |= 0x01;
|
||||
break;
|
||||
case '.':
|
||||
mask[i] |= 0x01;
|
||||
break;
|
||||
case ' ':
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
sscanf(image[4 + row], "%d,%d", &hot_x, &hot_y);
|
||||
return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
|
||||
}
|
||||
|
||||
void cursor_init(void) {
|
||||
cursor[CURSOR_ARROW] = SDL_GetDefaultCursor();
|
||||
cursor[CURSOR_CROSS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR);
|
||||
cursor[CURSOR_IBEAM] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM);
|
||||
cursor[CURSOR_ICON] = SDL_GetDefaultCursor();
|
||||
cursor[CURSOR_NO] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO);
|
||||
cursor[CURSOR_SIZE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
|
||||
cursor[CURSOR_SIZEALL] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL);
|
||||
cursor[CURSOR_SIZENESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW);
|
||||
cursor[CURSOR_SIZENS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS);
|
||||
cursor[CURSOR_SIZENWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE);
|
||||
cursor[CURSOR_SIZEWE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE);
|
||||
cursor[CURSOR_UPARROW] = init_system_cursor(cursor_uparrow);
|
||||
cursor[CURSOR_WAIT] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAIT);
|
||||
}
|
||||
|
||||
static bool cursor_new(uint8_t* data, int no, CursorImage *cursorImage, TCursorDirEntry *cursordirentry) {
|
||||
int xormasklen, andmasklen, xornum;
|
||||
int i, j;
|
||||
int h = 0;
|
||||
|
||||
uint8_t *buf1, *buf2, *buf3, *buf4;
|
||||
|
||||
xornum = (cursordirentry->bWidth * cursordirentry->bHeight);
|
||||
xormasklen = (xornum * cursorImage->icHeader.biBitCount) / 8;
|
||||
NOTICE("Cursor: xormasklen==%d, xornum==%d", xormasklen, xornum);
|
||||
|
||||
andmasklen = xornum / 8;
|
||||
cursorImage->xormasklen = xormasklen;
|
||||
cursorImage->andmasklen = andmasklen;
|
||||
|
||||
buf1 = malloc(sizeof(uint8_t) * xornum);
|
||||
buf2 = malloc(sizeof(uint8_t) * xornum);
|
||||
buf3 = malloc(sizeof(uint8_t) * xornum);
|
||||
buf4 = malloc(sizeof(uint8_t) * xornum);
|
||||
|
||||
memcpy(buf1, data, min(xormasklen, xornum));
|
||||
data += xormasklen;
|
||||
|
||||
memcpy(buf2, data, min(andmasklen, xornum));
|
||||
data += andmasklen;
|
||||
|
||||
#define height cursordirentry->bHeight
|
||||
#define width cursordirentry->bWidth
|
||||
|
||||
for (j = 0; j < height; j++) {
|
||||
for (i = 0; i < width * cursorImage->icHeader.biBitCount /8; i++) {
|
||||
buf3[h] = buf1[(height-j-1)*height*cursorImage->icHeader.biBitCount/8+i];
|
||||
buf4[h] = 0xff ^ buf2[(height-j-1)*height*cursorImage->icHeader.biBitCount/8+i];
|
||||
h++;
|
||||
}
|
||||
}
|
||||
|
||||
if (cursor[no])
|
||||
SDL_FreeCursor(cursor[no]);
|
||||
cursor[no] = SDL_CreateCursor(buf3, buf4, 32, 32, cursordirentry->wxHotspot, cursordirentry->wyHotspot);
|
||||
|
||||
free(buf1);
|
||||
free(buf2);
|
||||
free(buf3);
|
||||
free(buf4);
|
||||
|
||||
#undef height
|
||||
#undef width
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void cursor_set_type(int type) {
|
||||
if (cursor[type] != NULL) {
|
||||
SDL_SetCursor(cursor[type]);
|
||||
}
|
||||
}
|
||||
|
||||
static CursorHeader cursorHeader;
|
||||
static TCursorDirEntry cursordirentry;
|
||||
@@ -293,7 +497,7 @@ static bool cursor_load_mono(uint8_t *d, int no) {
|
||||
pos += p1;
|
||||
|
||||
/* read pixedl data */
|
||||
if (!sdl_cursorNew(d + pos, no, &cursorImage, &cursordirentry)) {
|
||||
if (!cursor_new(d + pos, no, &cursorImage, &cursordirentry)) {
|
||||
WARNING("unable to read pixel data");
|
||||
return false;
|
||||
}
|
||||
|
||||
+3
-79
@@ -23,84 +23,8 @@
|
||||
#ifndef __CURSOR_H__
|
||||
#define __CURSOR_H__
|
||||
|
||||
#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
|
||||
|
||||
typedef struct {
|
||||
short idReserved; /* always set to 0 */
|
||||
short idType; /* always set to 1 */
|
||||
short idCount; /* number of cursor images,always set to 1 */
|
||||
/* immediately followed by idCount TCursorDirEntries */
|
||||
} CursorHeader;
|
||||
|
||||
typedef struct {
|
||||
unsigned char bWidth; /* Width */
|
||||
unsigned char bHeight; /* Height */
|
||||
unsigned char bColorCount;
|
||||
unsigned char bReserved;
|
||||
unsigned short wxHotspot;
|
||||
unsigned short wyHotspot;
|
||||
unsigned long dwBytesInRes; /* total number of bytes in image */
|
||||
unsigned long dwImageOffset;
|
||||
} TCursorDirEntry;
|
||||
|
||||
typedef struct {
|
||||
long biSize; /* sizeof(TBitmapInfoHeader) */
|
||||
long biWidth; /* width of bitmap */
|
||||
long biHeight; /* height of bitmap, see notes */
|
||||
short biPlanes; /* planes, always 1 */
|
||||
short biBitCount; /* number of color bits */
|
||||
long biCompression; /* compression used, 0 */
|
||||
long biSizeImage; /* size of the pixel data, see notes */
|
||||
long biXPelsPerMeter; /* not used, 0 */
|
||||
long biYPelsPerMeter; /* not used, 0 */
|
||||
long biClrUsed; /* # of colors used, set to 0 */
|
||||
long biClrImportant; /* important colors, set to 0 */
|
||||
short hotX;
|
||||
short hotY;
|
||||
} TBitmapInfoHeader;
|
||||
|
||||
/*
|
||||
biHeight=2*TIconDirEntry.bHeight;
|
||||
biSizeImage=ANDmask + XORmask;
|
||||
|
||||
XORmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight * biBitCount)/8;
|
||||
ANDmask=(TIconDirEntry.bWidth * TIconDirEntry.bHeight)/8;
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned char rgbBlue; /* blue component of color */
|
||||
unsigned char rgbGreen; /* green component of color */
|
||||
unsigned char rgbRed; /* red component of color */
|
||||
unsigned char rgbReserved; /* reserved, 0 */
|
||||
} TRGBQuad;
|
||||
|
||||
typedef struct {
|
||||
TBitmapInfoHeader icHeader; /* image header info */
|
||||
TRGBQuad *icColors; /* image palette */
|
||||
int xormasklen;
|
||||
int andmasklen;
|
||||
} CursorImage;
|
||||
|
||||
typedef struct {
|
||||
int cbSizeof;
|
||||
int cFrames;
|
||||
int cSteps;
|
||||
int cx;
|
||||
int cy;
|
||||
int cBitCount;
|
||||
int cPlanes;
|
||||
int jiffRate;
|
||||
int fl;
|
||||
|
||||
int *rate;
|
||||
int *seq;
|
||||
} AnimationCursorHeader ;
|
||||
|
||||
typedef struct {
|
||||
AnimationCursorHeader *header;
|
||||
CursorImage *images;
|
||||
} AniCursorImage;
|
||||
|
||||
extern void cursor_load(int no, int linkno);
|
||||
void cursor_init(void);
|
||||
void cursor_load(int no, int linkno);
|
||||
void cursor_set_type(int type);
|
||||
|
||||
#endif /* __CURSOR_H__ */
|
||||
|
||||
+7
-6
@@ -31,7 +31,8 @@
|
||||
#include "debugger_private.h"
|
||||
#include "debug_symbol.h"
|
||||
#include "msgqueue.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "event.h"
|
||||
#include "system.h"
|
||||
#include "nact.h"
|
||||
#include "variable.h"
|
||||
@@ -296,7 +297,7 @@ static void cmd_evaluate(cJSON *args, cJSON *resp) {
|
||||
}
|
||||
|
||||
static void cmd_continue(cJSON *args, cJSON *resp) {
|
||||
sdl_raiseWindow();
|
||||
gfx_raiseWindow();
|
||||
cJSON_AddBoolToObject(resp, "success", true);
|
||||
}
|
||||
|
||||
@@ -593,13 +594,13 @@ static int read_command_thread(void *data) {
|
||||
free(buf);
|
||||
break;
|
||||
}
|
||||
sdl_post_debugger_command(buf);
|
||||
event_post_debugger_command(buf);
|
||||
content_length = -1;
|
||||
} else {
|
||||
fprintf(stderr, "Unknown Debug Adapter Protocol header: %s", header);
|
||||
}
|
||||
}
|
||||
sdl_post_debugger_command(NULL); // end of messages
|
||||
event_post_debugger_command(NULL); // end of messages
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -617,7 +618,7 @@ static void dbg_dap_init(const char *path) {
|
||||
while (!initialized && !nact->is_quit) {
|
||||
SDL_Event e;
|
||||
SDL_WaitEvent(&e);
|
||||
sdl_handle_event(&e);
|
||||
event_handle_event(&e);
|
||||
while (!msgq_isempty(queue)) {
|
||||
char *msg = msgq_dequeue(queue);
|
||||
if (!msg)
|
||||
@@ -639,7 +640,7 @@ static void dbg_dap_repl(int bp_no) {
|
||||
while (continue_repl && !nact->is_quit) {
|
||||
SDL_Event e;
|
||||
SDL_WaitEvent(&e);
|
||||
sdl_handle_event(&e);
|
||||
event_handle_event(&e);
|
||||
while (!msgq_isempty(queue)) {
|
||||
char *msg = msgq_dequeue(queue);
|
||||
if (!msg)
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "system.h"
|
||||
#include "LittleEndian.h"
|
||||
#include "dri.h"
|
||||
#include "sdl_core.h"
|
||||
|
||||
static bool read_index(int volume, drifiles *d, FILE *fp) {
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
@@ -142,7 +141,7 @@ static void warn_missing_ald(drifiles *d, int no) {
|
||||
} else {
|
||||
snprintf(msgbuf, sizeof(msgbuf), "Cannot read resource #%d.", no);
|
||||
}
|
||||
sdl_showMessageBox(MESSAGEBOX_WARNING, "xsystem35", msgbuf);
|
||||
sys_show_message_box(MESSAGEBOX_WARNING, "xsystem35", msgbuf);
|
||||
}
|
||||
|
||||
dridata *dri_getdata(drifiles *d, int no) {
|
||||
|
||||
+33
-33
@@ -27,7 +27,7 @@
|
||||
#include <math.h>
|
||||
|
||||
#include "portab.h"
|
||||
#include "sdl_core.h"
|
||||
#include "gfx.h"
|
||||
#include "input.h"
|
||||
#include "ags.h"
|
||||
#include "system.h"
|
||||
@@ -39,19 +39,19 @@ static bool ecp_cancel;
|
||||
#define EC_WAIT \
|
||||
if ((key |= sys_getInputInfo()) && ecp_cancel) break; \
|
||||
do { \
|
||||
int wait_ms = cnt - sdl_getTicks(); \
|
||||
int wait_ms = cnt - sys_get_ticks(); \
|
||||
if (wait_ms >= 16) \
|
||||
key = sys_keywait(wait_ms, ecp_cancel ? KEYWAIT_CANCELABLE : KEYWAIT_NONCANCELABLE); \
|
||||
} while (0)
|
||||
|
||||
|
||||
static void eCopyUpdateArea(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
MyRectangle src = {sx, sy, w, h};
|
||||
MyPoint dst = {
|
||||
SDL_Rect src = {sx, sy, w, h};
|
||||
SDL_Point dst = {
|
||||
dx - nact->ags.view_area.x,
|
||||
dy - nact->ags.view_area.y
|
||||
};
|
||||
sdl_updateArea(&src, &dst);
|
||||
gfx_updateArea(&src, &dst);
|
||||
}
|
||||
|
||||
static int eCopyArea5(int sx, int sy, int w, int h, int dx, int dy, int opt) {
|
||||
@@ -60,7 +60,7 @@ static int eCopyArea5(int sx, int sy, int w, int h, int dx, int dy, int opt) {
|
||||
static int hx[16]={ 0,32,16,48, 0,32,16,48,16,48, 0,32,16,48, 0,32};
|
||||
static int hy[16]={ 0, 0,16,16,32,32,48,48, 0, 0,16,16,32,32,48,48};
|
||||
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < 16; i++) {
|
||||
cnt += waitcnt;
|
||||
for (y = 0; y < (h -63); y += 64) {
|
||||
@@ -81,7 +81,7 @@ static int eCopyArea6(int dx, int dy, int w, int h, int opt) {
|
||||
int i, x, y, key = 0, cnt;
|
||||
int waitcnt = opt == 0 ? 30 : opt;
|
||||
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < 7; i++) {
|
||||
cnt += waitcnt;
|
||||
for (x = 0; x < (w -63); x += 64) {
|
||||
@@ -105,18 +105,18 @@ static int eCopyArea9(int sx, int sy, int w, int h, int dx, int dy, int opt) {
|
||||
static int hintY[4] = {0,8,8,0};
|
||||
|
||||
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < 4; i++) {
|
||||
cnt+=waitcnt;
|
||||
for (y = 0; y < h -15; y+=16) {
|
||||
for (x = 0; x < (w -7); x+=16) {
|
||||
sdl_copyArea(sx + x + hintX[i],sy + y + hintY[i], 8, 8, dx + x + hintX[i], dy + y + hintY[i]);
|
||||
gfx_copyArea(sx + x + hintX[i],sy + y + hintY[i], 8, 8, dx + x + hintX[i], dy + y + hintY[i]);
|
||||
}
|
||||
}
|
||||
ags_updateArea(dx, dy, w, h);
|
||||
EC_WAIT;
|
||||
}
|
||||
sdl_copyArea(sx, sy, w, h, dx, dy);
|
||||
gfx_copyArea(sx, sy, w, h, dx, dy);
|
||||
ags_updateArea(dx, dy, w, h);
|
||||
return key;
|
||||
}
|
||||
@@ -125,7 +125,7 @@ static int eCopyArea16(int dx, int dy, int w, int h, int opt) {
|
||||
int i, x, key = 0, cnt;
|
||||
int waitcnt = opt == 0 ? 30 : opt;
|
||||
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < 8; i++) {
|
||||
cnt += waitcnt;
|
||||
for (x = 0; x < (w -15); x += 16) {
|
||||
@@ -143,7 +143,7 @@ static int eCopyArea17(int dx, int dy, int w, int h, int opt) {
|
||||
int waitcnt = opt == 0 ? 30 : opt;
|
||||
|
||||
#define E17X 18
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < E17X; i++) {
|
||||
cnt += waitcnt;
|
||||
for (y = 0; y < (h - E17X + 1); y += E17X) {
|
||||
@@ -159,7 +159,7 @@ static int eCopyArea22(int sx, int sy, int w, int h, int dx, int dy, int opt) {
|
||||
int i, x, y, key = 0, cnt;
|
||||
int waitcnt = opt == 0 ? 80 : opt;
|
||||
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < 2; i++) {
|
||||
cnt += waitcnt;
|
||||
for (y = 0; y < (h -3); y+=4) {
|
||||
@@ -184,12 +184,12 @@ static int eCopyArea23(int sx, int sy, int w, int h, int dx, int dy, int opt) {
|
||||
static int hintX[4] = {0,2,2,0};
|
||||
static int hintY[4] = {0,2,0,2};
|
||||
|
||||
cnt = sdl_getTicks();
|
||||
cnt = sys_get_ticks();
|
||||
for (i = 0; i < 4; i++) {
|
||||
cnt += waitcnt;
|
||||
for (y = 0; y < (h -3); y+=4) {
|
||||
for (x = 0; x < (w -3); x+=4) {
|
||||
sdl_copyArea(sx + x + hintX[i], sy + y + hintY[i], 2, 2,
|
||||
gfx_copyArea(sx + x + hintX[i], sy + y + hintY[i], 2, 2,
|
||||
dx + x + hintX[i], dy + y + hintY[i]);
|
||||
}
|
||||
}
|
||||
@@ -207,7 +207,7 @@ static int eCopyArea1000(int sx, int sy, int w, int h, int dx, int dy, int opt)
|
||||
}
|
||||
|
||||
static int eCopyArea2000(int sx, int sy, int w, int h, int dx, int dy, int opt) {
|
||||
sdl_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
|
||||
gfx_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
|
||||
ags_copyArea_alphaLevel(sx, sy, w, h, dx, dy, opt);
|
||||
ags_updateArea(dx, dy, w, h);
|
||||
return sys_getInputInfo();
|
||||
@@ -315,9 +315,9 @@ void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt
|
||||
|
||||
if (sw == NACT_EFFECT_MAGNIFY) {
|
||||
SDL_Rect target_rect = { sx, sy, w, h };
|
||||
struct sdl_effect *eff = sdl_effect_magnify_init(sdl_getDIB(), &nact->ags.view_area, &target_rect);
|
||||
ags_runEffect(duration(sw, opt, NULL), cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
|
||||
sdl_effect_finish(eff);
|
||||
struct effect *eff = effect_magnify_init(gfx_getDIB(), &nact->ags.view_area, &target_rect);
|
||||
ags_runEffect(duration(sw, opt, NULL), cancel, (ags_EffectStepFunc)effect_step, eff);
|
||||
effect_finish(eff);
|
||||
// Actual copy.
|
||||
ags_scaledCopyArea(
|
||||
sx, sy, w, h,
|
||||
@@ -326,24 +326,24 @@ void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt
|
||||
return;
|
||||
}
|
||||
|
||||
enum sdl_effect_type sdl_effect = from_nact_effect(sw);
|
||||
if (sdl_effect != EFFECT_INVALID) {
|
||||
enum effect_type effect = from_nact_effect(sw);
|
||||
if (effect != EFFECT_INVALID) {
|
||||
SDL_Rect rect = { dx - nact->ags.view_area.x, dy - nact->ags.view_area.y, w, h };
|
||||
// Note that we specify NULL (which means sdl_texture) for the old
|
||||
// surface rather than sdl_getDIB(). This is to use the current display
|
||||
// Note that we specify NULL (which means gfx_texture) for the old
|
||||
// surface rather than gfx_getDIB(). This is to use the current display
|
||||
// contents, not reflecting uncommitted palette changes.
|
||||
struct sdl_effect *eff = sdl_effect_init(&rect, NULL, rect.x, rect.y, sdl_getDIB(), sx, sy, sdl_effect);
|
||||
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
|
||||
sdl_effect_finish(eff);
|
||||
struct effect *eff = effect_init(&rect, NULL, rect.x, rect.y, gfx_getDIB(), sx, sy, effect);
|
||||
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)effect_step, eff);
|
||||
effect_finish(eff);
|
||||
|
||||
// Actual copy.
|
||||
switch (sw) {
|
||||
case NACT_EFFECT_FADEOUT:
|
||||
sdl_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
|
||||
gfx_fillRectangleRGB(dx, dy, w, h, 0, 0, 0);
|
||||
ags_updateArea(dx, dy, w, h);
|
||||
break;
|
||||
case NACT_EFFECT_WHITEOUT:
|
||||
sdl_fillRectangleRGB(dx, dy, w, h, 255, 255, 255);
|
||||
gfx_fillRectangleRGB(dx, dy, w, h, 255, 255, 255);
|
||||
ags_updateArea(dx, dy, w, h);
|
||||
break;
|
||||
default:
|
||||
@@ -363,7 +363,7 @@ void ags_eCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, int opt
|
||||
case 54:
|
||||
ags_copyArea(sx, sy, w, h, dx, dy);
|
||||
{
|
||||
MyRectangle r = {dx, dy, w, h}, update;
|
||||
SDL_Rect r = {dx, dy, w, h}, update;
|
||||
SDL_IntersectRect(&nact->ags.view_area, &r, &update);
|
||||
w = update.w;
|
||||
h = update.h;
|
||||
@@ -431,15 +431,15 @@ void ags_eSpriteCopyArea(int sx, int sy, int w, int h, int dx, int dy, int sw, i
|
||||
return;
|
||||
}
|
||||
|
||||
enum sdl_effect_type type = from_nact_sprite_effect(sw);
|
||||
enum effect_type type = from_nact_sprite_effect(sw);
|
||||
if (type == EFFECT_INVALID) {
|
||||
WARNING("Invalid effect: %d", sw);
|
||||
return;
|
||||
}
|
||||
SDL_Rect rect = { dx - nact->ags.view_area.x, dy - nact->ags.view_area.y, w, h };
|
||||
struct sdl_effect *eff = sdl_sprite_effect_init(&rect, dx, dy, sx, sy, spCol, type);
|
||||
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)sdl_effect_step, eff);
|
||||
sdl_effect_finish(eff);
|
||||
struct effect *eff = sprite_effect_init(&rect, dx, dy, sx, sy, spCol, type);
|
||||
ags_runEffect(duration(sw, opt, &rect), cancel, (ags_EffectStepFunc)effect_step, eff);
|
||||
effect_finish(eff);
|
||||
// Actual copy.
|
||||
if (sw == 5) {
|
||||
ags_copyArea_shadow(sx, sy, w, h, dx, dy);
|
||||
|
||||
@@ -21,10 +21,12 @@
|
||||
#include <string.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "editor.h"
|
||||
#include "event.h"
|
||||
#include "gfx.h"
|
||||
#include "menu.h"
|
||||
#include "nact.h"
|
||||
#include "system.h"
|
||||
|
||||
#define XMARGIN 3
|
||||
#define YMARGIN 2
|
||||
@@ -53,13 +55,13 @@ static void redraw() {
|
||||
};
|
||||
|
||||
if (*input->text) {
|
||||
int w = sdl_drawString(r.x, r.y, input->text, fgcolor).w;
|
||||
int w = gfx_drawString(r.x, r.y, input->text, fgcolor).w;
|
||||
r.x += w;
|
||||
r.w -= w;
|
||||
}
|
||||
|
||||
if (*input->composingText) {
|
||||
int w = sdl_drawString(r.x, r.y, input->composingText, fgcolor).w;
|
||||
int w = gfx_drawString(r.x, r.y, input->composingText, fgcolor).w;
|
||||
ags_fillRectangle(r.x, r.y + r.h, w, 2, fgcolor); // underline
|
||||
}
|
||||
|
||||
@@ -129,7 +131,7 @@ static bool handle_event(const SDL_Event *e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool sdl_inputString(INPUTSTRING_PARAM *p) {
|
||||
bool edit_string(INPUTSTRING_PARAM *p) {
|
||||
static char *buf;
|
||||
free(buf);
|
||||
buf = malloc(p->max * MAX_UTF8_BYTES_PAR_CHAR + 1);
|
||||
@@ -153,14 +155,14 @@ bool sdl_inputString(INPUTSTRING_PARAM *p) {
|
||||
ags_setFont(FONT_GOTHIC, p->h);
|
||||
redraw();
|
||||
|
||||
sdl_custom_event_handler = handle_event;
|
||||
event_custom_handler = handle_event;
|
||||
while (!input->done) {
|
||||
sdl_getKeyInfo(); // message pump
|
||||
event_get_key(); // message pump
|
||||
nact->callback();
|
||||
sdl_wait_vsync();
|
||||
sys_wait_vsync();
|
||||
}
|
||||
SDL_StopTextInput();
|
||||
sdl_custom_event_handler = NULL;
|
||||
event_custom_handler = NULL;
|
||||
|
||||
ags_restoreRegion(saved_region, s.rect.x, s.rect.y);
|
||||
ags_updateArea(s.rect.x, s.rect.y, s.rect.w, s.rect.h);
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright (C) 2025 kichikuou <KichikuouChrome@gmail.com>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
#ifndef __EDITOR_H__
|
||||
#define __EDITOR_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct inputstring_param;
|
||||
|
||||
bool edit_string(struct inputstring_param *);
|
||||
|
||||
#endif // __EDITOR_H__
|
||||
+275
-274
File diff suppressed because it is too large
Load Diff
+15
-4
@@ -20,6 +20,9 @@
|
||||
#ifndef __EFFECT_H__
|
||||
#define __EFFECT_H__
|
||||
|
||||
#include <SDL_surface.h>
|
||||
#include "ags.h"
|
||||
|
||||
// Effect types of the CE/CD command.
|
||||
enum nact_effect {
|
||||
NACT_EFFECT_PAN_IN_DOWN = 1,
|
||||
@@ -116,7 +119,7 @@ enum sact_effect {
|
||||
};
|
||||
|
||||
// Internal effect numbers.
|
||||
enum sdl_effect_type {
|
||||
enum effect_type {
|
||||
EFFECT_INVALID,
|
||||
EFFECT_CROSSFADE,
|
||||
EFFECT_FADEOUT,
|
||||
@@ -186,8 +189,16 @@ enum sdl_effect_type {
|
||||
EFFECT_SACTAMASK,
|
||||
};
|
||||
|
||||
enum sdl_effect_type from_nact_effect(enum nact_effect effect);
|
||||
enum sdl_effect_type from_nact_sprite_effect(enum nact_effect effect);
|
||||
enum sdl_effect_type from_sact_effect(enum sact_effect effect);
|
||||
enum effect_type from_nact_effect(enum nact_effect effect);
|
||||
enum effect_type from_nact_sprite_effect(enum nact_effect effect);
|
||||
enum effect_type from_sact_effect(enum sact_effect effect);
|
||||
|
||||
struct effect;
|
||||
struct effect *effect_init(SDL_Rect *rect, surface_t *old, int ox, int oy, surface_t *new, int nx, int ny, enum effect_type effect);
|
||||
struct effect *sprite_effect_init(SDL_Rect *rect, int dx, int dy, int sx, int sy, int col, enum effect_type type);
|
||||
struct effect *effect_magnify_init(surface_t *surface, SDL_Rect *view_rect, SDL_Rect *target_rect);
|
||||
struct effect *effect_sactamask_init(SDL_Surface *mask);
|
||||
void effect_step(struct effect *eff, float progress);
|
||||
void effect_finish(struct effect *eff);
|
||||
|
||||
#endif /* __EFFECT_H__ */
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* sdl_darw.c SDL event handler
|
||||
*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -18,7 +16,6 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
/* $Id: sdl_event.c,v 1.5 2001/12/16 17:12:56 chikama Exp $ */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -31,21 +28,24 @@
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
|
||||
#include "event.h"
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "debugger.h"
|
||||
#include "nact.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "gfx.h"
|
||||
#include "gfx_private.h"
|
||||
#include "scheduler.h"
|
||||
#include "menu.h"
|
||||
#include "input.h"
|
||||
#include "msgskip.h"
|
||||
#include "hacks.h"
|
||||
|
||||
static void sdl_getEvent(void);
|
||||
static void get_event(void);
|
||||
static void keyEventProsess(SDL_KeyboardEvent *e, bool pressed);
|
||||
|
||||
bool (*event_custom_handler)(const SDL_Event *);
|
||||
|
||||
static uint32_t custom_event_type = (uint32_t)-1;
|
||||
|
||||
enum CustomEventCode {
|
||||
@@ -61,7 +61,7 @@ bool RawKeyInfo[256];
|
||||
/* SDL Joystick */
|
||||
static int joyinfo=0;
|
||||
|
||||
static int sdl_keytable[SDL_NUM_SCANCODES] = {
|
||||
static int keytable[SDL_NUM_SCANCODES] = {
|
||||
[SDL_SCANCODE_A] = KEY_A,
|
||||
[SDL_SCANCODE_B] = KEY_B,
|
||||
[SDL_SCANCODE_C] = KEY_C,
|
||||
@@ -183,9 +183,53 @@ static int sdl_keytable[SDL_NUM_SCANCODES] = {
|
||||
[SDL_SCANCODE_RALT] = KEY_ALT,
|
||||
};
|
||||
|
||||
void sdl_event_init(void) {
|
||||
static int joy_device_index = -1;
|
||||
static SDL_Joystick *js;
|
||||
|
||||
static bool joy_open(int index) {
|
||||
if (js)
|
||||
return false;
|
||||
|
||||
js = SDL_JoystickOpen(index);
|
||||
if (!js)
|
||||
return false;
|
||||
|
||||
const char *name = SDL_JoystickName(js);
|
||||
int axes = SDL_JoystickNumAxes(js);
|
||||
int buttons = SDL_JoystickNumButtons(js);
|
||||
SDL_JoystickEventState(SDL_ENABLE);
|
||||
NOTICE("SDL joystick '%s' %d axes %d buttons", name, axes, buttons);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool joy_init(void) {
|
||||
SDL_Init(SDL_INIT_JOYSTICK);
|
||||
|
||||
if (joy_device_index >= 0)
|
||||
return joy_open(joy_device_index);
|
||||
|
||||
for (int i = 0; i < SDL_NumJoysticks(); i++) {
|
||||
if (joy_open(i))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void event_init(void) {
|
||||
if (custom_event_type == (uint32_t)-1)
|
||||
custom_event_type = SDL_RegisterEvents(1);
|
||||
joy_init();
|
||||
}
|
||||
|
||||
void event_remove(void) {
|
||||
if (js) {
|
||||
SDL_JoystickClose(js);
|
||||
js = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void event_set_joy_device_index(int index) {
|
||||
joy_device_index = index;
|
||||
}
|
||||
|
||||
static int mouse_to_rawkey(int button) {
|
||||
@@ -232,7 +276,34 @@ void send_agsevent(enum agsevent_type type, int code) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void sdl_setCursorInternalLocation(int x, int y) {
|
||||
void event_set_mouse_location(int x, int y) {
|
||||
// scale mouse x and y
|
||||
float scalex, scaley;
|
||||
SDL_RenderGetScale(gfx_renderer, &scalex, &scaley);
|
||||
x *= scalex;
|
||||
y *= scaley;
|
||||
|
||||
// calculate window borders
|
||||
int logw, logh;
|
||||
SDL_RenderGetLogicalSize(gfx_renderer, &logw, &logh);
|
||||
|
||||
float scalew, scaleh;
|
||||
scalew = logw * scalex;
|
||||
scaleh = logh * scaley;
|
||||
|
||||
int winw, winh;
|
||||
SDL_GetWindowSize(gfx_window, &winw, &winh);
|
||||
|
||||
float border_left = (winw - scalew) / 2;
|
||||
float border_top = (winh - scaleh) / 2;
|
||||
|
||||
// offset x and y by window borders
|
||||
x += border_left;
|
||||
y += border_top;
|
||||
SDL_WarpMouseInWindow(gfx_window, x, y);
|
||||
}
|
||||
|
||||
void event_set_mouse_internal_location(int x, int y) {
|
||||
mousex = x;
|
||||
mousey = y;
|
||||
send_agsevent(AGSEVENT_MOUSE_MOTION, 0);
|
||||
@@ -281,8 +352,8 @@ static void rance4v2_hack(void) {
|
||||
cancel_yield();
|
||||
}
|
||||
|
||||
void sdl_handle_event(SDL_Event *e) {
|
||||
if (sdl_custom_event_handler && sdl_custom_event_handler(e))
|
||||
void event_handle_event(SDL_Event *e) {
|
||||
if (event_custom_handler && event_custom_handler(e))
|
||||
return;
|
||||
|
||||
switch (e->type) {
|
||||
@@ -293,7 +364,7 @@ void sdl_handle_event(SDL_Event *e) {
|
||||
case SDL_WINDOWEVENT:
|
||||
switch (e->window.event) {
|
||||
case SDL_WINDOWEVENT_EXPOSED:
|
||||
sdl_dirty = true;
|
||||
gfx_dirty = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -303,7 +374,7 @@ void sdl_handle_event(SDL_Event *e) {
|
||||
break;
|
||||
#endif
|
||||
case SDL_APP_DIDENTERFOREGROUND:
|
||||
sdl_dirty = true;
|
||||
gfx_dirty = true;
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
keyEventProsess(&e->key, true);
|
||||
@@ -315,7 +386,7 @@ void sdl_handle_event(SDL_Event *e) {
|
||||
msgskip_activate(!msgskip_isActivated());
|
||||
break;
|
||||
case SDLK_F4:
|
||||
sdl_setFullscreen(!sdl_fs_on);
|
||||
gfx_setFullscreen(!gfx_fullscreen);
|
||||
break;
|
||||
}
|
||||
#ifdef __ANDROID__
|
||||
@@ -325,7 +396,7 @@ void sdl_handle_event(SDL_Event *e) {
|
||||
#endif
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
sdl_setCursorInternalLocation(e->motion.x, e->motion.y);
|
||||
event_set_mouse_internal_location(e->motion.x, e->motion.y);
|
||||
#ifdef _WIN32
|
||||
win_menu_onMouseMotion(e->motion.x, e->motion.y);
|
||||
#endif
|
||||
@@ -400,7 +471,7 @@ void sdl_handle_event(SDL_Event *e) {
|
||||
break;
|
||||
|
||||
case SDL_JOYDEVICEADDED:
|
||||
sdl_joy_open(e->jdevice.which);
|
||||
joy_open(e->jdevice.which);
|
||||
break;
|
||||
|
||||
case SDL_JOYAXISMOTION:
|
||||
@@ -479,7 +550,7 @@ void sdl_handle_event(SDL_Event *e) {
|
||||
}
|
||||
|
||||
/* Event処理 */
|
||||
static void sdl_getEvent(void) {
|
||||
static void get_event(void) {
|
||||
enum scheduler_event scheduler_event = SCHEDULER_EVENT_INPUT_CHECK_MISS;
|
||||
|
||||
fire_deferred_touch_event();
|
||||
@@ -487,7 +558,7 @@ static void sdl_getEvent(void) {
|
||||
SDL_Event e;
|
||||
while (SDL_PollEvent(&e)) {
|
||||
scheduler_event = SCHEDULER_EVENT_INPUT_CHECK_HIT;
|
||||
sdl_handle_event(&e);
|
||||
event_handle_event(&e);
|
||||
}
|
||||
scheduler_on_event(scheduler_event);
|
||||
if (game_id == GAME_RANCE4_V2)
|
||||
@@ -496,15 +567,15 @@ static void sdl_getEvent(void) {
|
||||
|
||||
/* キー情報の取得 */
|
||||
static void keyEventProsess(SDL_KeyboardEvent *e, bool pressed) {
|
||||
int code = sdl_keytable[e->keysym.scancode];
|
||||
int code = keytable[e->keysym.scancode];
|
||||
RawKeyInfo[code] = pressed;
|
||||
send_agsevent(pressed ? AGSEVENT_KEY_PRESS : AGSEVENT_KEY_RELEASE, code);
|
||||
}
|
||||
|
||||
int sdl_getKeyInfo() {
|
||||
int event_get_key(void) {
|
||||
int rt;
|
||||
|
||||
sdl_getEvent();
|
||||
get_event();
|
||||
|
||||
rt = ((RawKeyInfo[KEY_UP] || RawKeyInfo[KEY_PAD_8]) |
|
||||
((RawKeyInfo[KEY_DOWN] || RawKeyInfo[KEY_PAD_2]) << 1) |
|
||||
@@ -518,8 +589,8 @@ int sdl_getKeyInfo() {
|
||||
return rt;
|
||||
}
|
||||
|
||||
int sdl_getMouseInfo(MyPoint *p) {
|
||||
sdl_getEvent();
|
||||
int event_get_mouse(SDL_Point *p) {
|
||||
get_event();
|
||||
|
||||
if (p) {
|
||||
p->x = mousex;
|
||||
@@ -531,7 +602,7 @@ int sdl_getMouseInfo(MyPoint *p) {
|
||||
return m1 | m2;
|
||||
}
|
||||
|
||||
void sdl_getWheelInfo(int *forward, int *back) {
|
||||
void event_get_wheel(int *forward, int *back) {
|
||||
*forward = mouse_wheel_up;
|
||||
*back = mouse_wheel_down;
|
||||
|
||||
@@ -540,16 +611,16 @@ void sdl_getWheelInfo(int *forward, int *back) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void sdl_clearWheelInfo(void) {
|
||||
void event_clear_wheel(void) {
|
||||
mouse_wheel_up = mouse_wheel_down = 0;
|
||||
}
|
||||
|
||||
int sdl_getJoyInfo(void) {
|
||||
sdl_getEvent();
|
||||
int event_get_joy(void) {
|
||||
get_event();
|
||||
return joyinfo;
|
||||
}
|
||||
|
||||
void sdl_post_debugger_command(void *data) {
|
||||
void event_post_debugger_command(void *data) {
|
||||
SDL_Event event = {
|
||||
.user = {
|
||||
.type = custom_event_type,
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.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
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __EVENT_H__
|
||||
#define __EVENT_H__
|
||||
|
||||
#include "config.h"
|
||||
#include <SDL_events.h>
|
||||
#include "portab.h"
|
||||
|
||||
extern bool (*event_custom_handler)(const SDL_Event *);
|
||||
|
||||
void event_init(void);
|
||||
void event_remove(void);
|
||||
void event_set_joy_device_index(int index);
|
||||
void event_set_mouse_location(int x, int y);
|
||||
void event_set_mouse_internal_location(int x, int y);
|
||||
int event_get_key(void);
|
||||
int event_get_mouse(SDL_Point *p);
|
||||
void event_get_wheel(int *forward, int *back);
|
||||
void event_clear_wheel(void);
|
||||
int event_get_joy(void);
|
||||
void event_post_debugger_command(void *data);
|
||||
void event_handle_event(SDL_Event *e);
|
||||
|
||||
#endif // __EVENT_H__
|
||||
+1
-1
@@ -19,7 +19,7 @@
|
||||
#define CONCATENATE(x, y) x ## y
|
||||
#define CONCAT(x, y) CONCATENATE(x, y)
|
||||
|
||||
static SDL_Rect CONCAT(sdl_floodFill_, TYPE)(int x, int y, Uint32 col) {
|
||||
static SDL_Rect CONCAT(gfx_floodFill_, TYPE)(int x, int y, Uint32 col) {
|
||||
int old_color = *(TYPE *)PIXEL_AT(main_surface, x, y);
|
||||
if (old_color == col)
|
||||
return (SDL_Rect){};
|
||||
|
||||
+7
-7
@@ -35,7 +35,7 @@
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "font.h"
|
||||
#include "sdl_private.h"
|
||||
#include "gfx_private.h"
|
||||
#include "hacks.h"
|
||||
|
||||
typedef struct {
|
||||
@@ -130,9 +130,9 @@ SDL_Surface *font_get_glyph(const char *str_utf8, int r, int g, int b) {
|
||||
}
|
||||
|
||||
// SDL can't blit ARGB to an indexed bitmap properly, so we do it ourselves.
|
||||
static void sdl_drawAntiAlias_8bpp(int dstx, int dsty, SDL_Surface *src, uint8_t col)
|
||||
static void gfx_drawAntiAlias_8bpp(int dstx, int dsty, SDL_Surface *src, uint8_t col)
|
||||
{
|
||||
const SDL_Color* palette = sdl_palette->colors;
|
||||
const SDL_Color* palette = gfx_palette->colors;
|
||||
Uint8 cache[256*7];
|
||||
memset(cache, 0, 256);
|
||||
|
||||
@@ -154,7 +154,7 @@ static void sdl_drawAntiAlias_8bpp(int dstx, int dsty, SDL_Surface *src, uint8_t
|
||||
} else {
|
||||
// find nearest color in palette
|
||||
cache[*dp] |= 1 << alpha;
|
||||
int c = sdl_nearest_color(
|
||||
int c = gfx_nearest_color(
|
||||
(palette[col].r * alpha + palette[*dp].r * (7 - alpha)) / 7,
|
||||
(palette[col].g * alpha + palette[*dp].g * (7 - alpha)) / 7,
|
||||
(palette[col].b * alpha + palette[*dp].b * (7 - alpha)) / 7);
|
||||
@@ -186,9 +186,9 @@ SDL_Rect font_draw_glyph(int x, int y, const char *str_utf8, uint8_t cl) {
|
||||
antialias = false;
|
||||
|
||||
if (antialias) {
|
||||
fs = TTF_RenderUTF8_Blended(fontset->id, str_utf8, sdl_palette->colors[cl]);
|
||||
fs = TTF_RenderUTF8_Blended(fontset->id, str_utf8, gfx_palette->colors[cl]);
|
||||
} else {
|
||||
fs = TTF_RenderUTF8_Solid(fontset->id, str_utf8, sdl_palette->colors[cl]);
|
||||
fs = TTF_RenderUTF8_Solid(fontset->id, str_utf8, gfx_palette->colors[cl]);
|
||||
}
|
||||
if (!fs) {
|
||||
WARNING("Text rendering failed: %s", TTF_GetError());
|
||||
@@ -201,7 +201,7 @@ SDL_Rect font_draw_glyph(int x, int y, const char *str_utf8, uint8_t cl) {
|
||||
r_dst = (SDL_Rect){x, y, w, h};
|
||||
|
||||
if (main_surface->format->BitsPerPixel == 8 && antialias) {
|
||||
sdl_drawAntiAlias_8bpp(x, y, fs, cl);
|
||||
gfx_drawAntiAlias_8bpp(x, y, fs, cl);
|
||||
} else {
|
||||
r_src = (SDL_Rect){0, 0, w, h};
|
||||
SDL_BlitSurface(fs, &r_src, main_surface, &r_dst);
|
||||
|
||||
+6
-1
@@ -27,7 +27,12 @@
|
||||
#include <SDL_surface.h>
|
||||
#include "config.h"
|
||||
#include "portab.h"
|
||||
#include "graphics.h"
|
||||
|
||||
typedef enum {
|
||||
FONT_GOTHIC,
|
||||
FONT_MINCHO,
|
||||
} FontType;
|
||||
#define FONTTYPEMAX 2
|
||||
|
||||
#define FONT_WEIGHT_NORMAL 4
|
||||
#define FONT_WEIGHT_BOLD 7
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
|
||||
* 2025 kichikuou <KichikuouChrome@gmail.com>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
#ifndef __GFX_H__
|
||||
#define __GFX_H__
|
||||
|
||||
#include "config.h"
|
||||
#include <SDL_surface.h>
|
||||
#include "portab.h"
|
||||
#include "ags.h"
|
||||
|
||||
/* 初期化関係 */
|
||||
int gfx_Initialize(const char *render_driver);
|
||||
void gfx_Remove(void);
|
||||
|
||||
/* ウィンド関係 */
|
||||
void gfx_setWorldSize(int width, int height, int depth);
|
||||
void gfx_setWindowSize(int w, int h);
|
||||
void gfx_setWindowTitle(char *name);
|
||||
void gfx_getWindowInfo(int *width, int *height, int *depth);
|
||||
void gfx_setFullscreen(bool on);
|
||||
bool gfx_isFullscreen(void);
|
||||
void gfx_raiseWindow(void);
|
||||
surface_t *gfx_getDIB(void);
|
||||
void gfx_setIntegerScaling(bool enable);
|
||||
SDL_Surface *gfx_createSurfaceView(SDL_Surface *sf, int x, int y, int w, int h);
|
||||
|
||||
/* 画面更新 */
|
||||
void gfx_updateArea(SDL_Rect *src, SDL_Point *dst);
|
||||
void gfx_updateAll(SDL_Rect *view_rect);
|
||||
void gfx_updateScreen(void);
|
||||
|
||||
/* パレット関係 */
|
||||
void gfx_setPalette(SDL_Color *pal, int first, int count);
|
||||
|
||||
/* 描画関係 */
|
||||
void gfx_drawRectangle(int x, int y, int w, int h, uint8_t c);
|
||||
void gfx_fillRectangle(int x, int y, int w, int h, uint8_t c);
|
||||
void gfx_fillRectangleRGB(int x, int y, int w, int h, uint8_t r, uint8_t g, uint8_t b);
|
||||
void gfx_fillCircle(int left, int top, int diameter, uint8_t c);
|
||||
void gfx_drawLine(int x1, int y1, int x2, int y2, uint8_t c);
|
||||
SDL_Rect gfx_floodFill(int x, int y, int col);
|
||||
SDL_Rect gfx_drawString(int x, int y, const char *str_utf8, uint8_t col);
|
||||
void gfx_copyArea(int sx,int sy, int w, int h, int dx, int dy);
|
||||
void gfx_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, uint8_t sp);
|
||||
void gfx_wrapColor(int sx, int sy, int w, int h, uint8_t cl, int rate);
|
||||
void gfx_scaledCopyArea(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int mirror);
|
||||
void gfx_drawImage8(cgdata *cg, int x, int y, int sprite_color);
|
||||
void gfx_drawImage16(cgdata *cg, surface_t *sf, int x, int y, int brightness, bool alpha_blend);
|
||||
void gfx_drawImage24(cgdata *cg, surface_t *sf, int x, int y, int brightness);
|
||||
void gfx_drawImageAlphaMap(cgdata *cg, surface_t *sf, int x, int y);
|
||||
void gfx_copyAreaSP16_shadow(int sx, int sy, int w, int h, int dx, int dy, int lv);
|
||||
void gfx_copyAreaSP16_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv);
|
||||
void gfx_copyAreaSP16_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv);
|
||||
void gfx_copy_from_alpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag);
|
||||
void gfx_copy_to_alpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag);
|
||||
uint32_t gfx_getPixel(int x, int y);
|
||||
void gfx_putRegion(void *src, int x, int y);
|
||||
void gfx_restoreRegion(void *src, int x, int y);
|
||||
void* gfx_saveRegion(int x, int y, int w, int h);
|
||||
void gfx_delRegion(void *src);
|
||||
void gfx_FlipSurfaceHorizontal(SDL_Surface *s);
|
||||
void gfx_FlipSurfaceVertical(SDL_Surface *s);
|
||||
|
||||
bool save_screenshot(const char* path);
|
||||
|
||||
#endif /* __GFX_H__ */
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* sdl_darw.c SDL draw to surface
|
||||
* gfx_draw.c SDL draw to surface
|
||||
*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
|
||||
*
|
||||
@@ -18,7 +18,7 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
/* $Id: sdl_draw.c,v 1.13 2003/01/25 01:34:50 chikama Exp $ */
|
||||
/* $Id: gfx_draw.c,v 1.13 2003/01/25 01:34:50 chikama Exp $ */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -34,76 +34,38 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "scheduler.h"
|
||||
#include "gfx.h"
|
||||
#include "gfx_private.h"
|
||||
#include "font.h"
|
||||
#include "ags.h"
|
||||
#include "image.h"
|
||||
#include "nact.h"
|
||||
#include "debugger.h"
|
||||
|
||||
static void sdl_pal_check(void) {
|
||||
static void gfx_pal_check(void) {
|
||||
if (nact->ags.pal_changed) {
|
||||
nact->ags.pal_changed = false;
|
||||
sdl_setPalette(nact->ags.pal, 0, 256);
|
||||
gfx_setPalette(nact->ags.pal, 0, 256);
|
||||
}
|
||||
}
|
||||
|
||||
static Uint32 palette_color(uint8_t c) {
|
||||
if (main_surface->format->BitsPerPixel == 8)
|
||||
return c;
|
||||
return SDL_MapRGB(main_surface->format, sdl_palette->colors[c].r, sdl_palette->colors[c].g, sdl_palette->colors[c].b);
|
||||
return SDL_MapRGB(main_surface->format, gfx_palette->colors[c].r, gfx_palette->colors[c].g, gfx_palette->colors[c].b);
|
||||
}
|
||||
|
||||
void sdl_updateScreen(void) {
|
||||
if (!sdl_dirty)
|
||||
void gfx_updateScreen(void) {
|
||||
if (!gfx_dirty)
|
||||
return;
|
||||
SDL_RenderClear(sdl_renderer);
|
||||
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
|
||||
SDL_RenderPresent(sdl_renderer);
|
||||
sdl_dirty = false;
|
||||
}
|
||||
|
||||
uint32_t sdl_getTicks(void) {
|
||||
return SDL_GetTicks();
|
||||
}
|
||||
|
||||
void sdl_sleep(int msec) {
|
||||
sdl_updateScreen();
|
||||
dbg_onsleep();
|
||||
#ifdef __EMSCRIPTEN__
|
||||
emscripten_sleep(msec);
|
||||
#else
|
||||
SDL_Delay(msec);
|
||||
#endif
|
||||
scheduler_on_event(SCHEDULER_EVENT_SLEEP);
|
||||
}
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EM_JS(void, wait_vsync, (void), {
|
||||
// We need a `return` here for JSPI support (ASYNCIFY=2).
|
||||
return Asyncify.handleSleep(function(wakeUp) {
|
||||
window.requestAnimationFrame(function() {
|
||||
wakeUp();
|
||||
});
|
||||
});
|
||||
});
|
||||
#endif
|
||||
|
||||
void sdl_wait_vsync() {
|
||||
sdl_updateScreen();
|
||||
dbg_onsleep();
|
||||
#ifdef __EMSCRIPTEN__
|
||||
wait_vsync();
|
||||
#else
|
||||
SDL_Delay(16);
|
||||
#endif
|
||||
scheduler_on_event(SCHEDULER_EVENT_SLEEP);
|
||||
SDL_RenderClear(gfx_renderer);
|
||||
SDL_RenderCopy(gfx_renderer, gfx_texture, NULL, NULL);
|
||||
SDL_RenderPresent(gfx_renderer);
|
||||
gfx_dirty = false;
|
||||
}
|
||||
|
||||
/* off-screen の指定領域を Main Window へ転送 */
|
||||
void sdl_updateArea(MyRectangle *rect, MyPoint *dst) {
|
||||
void gfx_updateArea(SDL_Rect *rect, SDL_Point *dst) {
|
||||
SDL_Rect sw = {0, 0, main_surface->w, main_surface->h};
|
||||
SDL_Rect dw = {0, 0, view_w, view_h};
|
||||
SDL_Rect sr = {rect->x, rect->y, rect->w, rect->h};
|
||||
@@ -114,26 +76,26 @@ void sdl_updateArea(MyRectangle *rect, MyPoint *dst) {
|
||||
dr.h = sr.h;
|
||||
|
||||
SDL_Surface *sf;
|
||||
SDL_LockTextureToSurface(sdl_texture, &dr, &sf);
|
||||
SDL_LockTextureToSurface(gfx_texture, &dr, &sf);
|
||||
SDL_BlitSurface(main_surface, &sr, sf, NULL);
|
||||
SDL_UnlockTexture(sdl_texture);
|
||||
SDL_UnlockTexture(gfx_texture);
|
||||
|
||||
sdl_dirty = true;
|
||||
gfx_dirty = true;
|
||||
}
|
||||
|
||||
/* 全画面更新 */
|
||||
void sdl_updateAll(MyRectangle *view_rect) {
|
||||
sdl_updateArea(view_rect, &(MyPoint){0, 0});
|
||||
void gfx_updateAll(SDL_Rect *view_rect) {
|
||||
gfx_updateArea(view_rect, &(SDL_Point){0, 0});
|
||||
}
|
||||
|
||||
/* Color の複数個指定 */
|
||||
void sdl_setPalette(SDL_Color *pal, int first, int count) {
|
||||
SDL_SetPaletteColors(sdl_palette, pal, first, count);
|
||||
void gfx_setPalette(SDL_Color *pal, int first, int count) {
|
||||
SDL_SetPaletteColors(gfx_palette, pal + first, first, count);
|
||||
}
|
||||
|
||||
/* 矩形の描画 */
|
||||
void sdl_drawRectangle(int x, int y, int w, int h, uint8_t c) {
|
||||
sdl_pal_check();
|
||||
void gfx_drawRectangle(int x, int y, int w, int h, uint8_t c) {
|
||||
gfx_pal_check();
|
||||
Uint32 col = palette_color(c);
|
||||
|
||||
SDL_Rect rect = {x, y, w, 1};
|
||||
@@ -150,14 +112,14 @@ void sdl_drawRectangle(int x, int y, int w, int h, uint8_t c) {
|
||||
}
|
||||
|
||||
/* 矩形塗りつぶし */
|
||||
void sdl_fillRectangle(int x, int y, int w, int h, uint8_t c) {
|
||||
sdl_pal_check();
|
||||
void gfx_fillRectangle(int x, int y, int w, int h, uint8_t c) {
|
||||
gfx_pal_check();
|
||||
|
||||
SDL_Rect rect = {x, y, w, h};
|
||||
SDL_FillRect(main_surface, &rect, palette_color(c));
|
||||
}
|
||||
|
||||
void sdl_fillRectangleRGB(int x, int y, int w, int h, uint8_t r, uint8_t g, uint8_t b) {
|
||||
void gfx_fillRectangleRGB(int x, int y, int w, int h, uint8_t r, uint8_t g, uint8_t b) {
|
||||
if (main_surface->format->BitsPerPixel == 8)
|
||||
return;
|
||||
|
||||
@@ -165,7 +127,7 @@ void sdl_fillRectangleRGB(int x, int y, int w, int h, uint8_t r, uint8_t g, uint
|
||||
SDL_FillRect(main_surface, &rect, SDL_MapRGB(main_surface->format, r, g, b));
|
||||
}
|
||||
|
||||
void sdl_fillCircle(int left, int top, int diameter, uint8_t c) {
|
||||
void gfx_fillCircle(int left, int top, int diameter, uint8_t c) {
|
||||
diameter &= ~1;
|
||||
if (diameter <= 0)
|
||||
return;
|
||||
@@ -188,7 +150,7 @@ void sdl_fillCircle(int left, int top, int diameter, uint8_t c) {
|
||||
}
|
||||
|
||||
/* 領域コピー */
|
||||
void sdl_copyArea(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
void gfx_copyArea(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
if (sx == dx && sy == dy)
|
||||
return;
|
||||
|
||||
@@ -197,15 +159,15 @@ void sdl_copyArea(int sx, int sy, int w, int h, int dx, int dy) {
|
||||
|
||||
SDL_Rect intersect;
|
||||
if (SDL_IntersectRect(&r_src, &r_dst, &intersect)) {
|
||||
void* region = sdl_saveRegion(sx, sy, w, h);
|
||||
sdl_restoreRegion(region, dx, dy);
|
||||
void* region = gfx_saveRegion(sx, sy, w, h);
|
||||
gfx_restoreRegion(region, dx, dy);
|
||||
} else {
|
||||
SDL_BlitSurface(main_surface, &r_src, main_surface, &r_dst);
|
||||
}
|
||||
}
|
||||
|
||||
static void sdl_dib_sprite_copy(SDL_Surface *dst, int sx, int sy, int w, int h, int dx, int dy, uint8_t sp) {
|
||||
sdl_pal_check();
|
||||
static void gfx_dib_sprite_copy(SDL_Surface *dst, int sx, int sy, int w, int h, int dx, int dy, uint8_t sp) {
|
||||
gfx_pal_check();
|
||||
|
||||
Uint32 col = palette_color(sp);
|
||||
SDL_SetColorKey(main_surface, SDL_TRUE, col);
|
||||
@@ -220,29 +182,29 @@ static void sdl_dib_sprite_copy(SDL_Surface *dst, int sx, int sy, int w, int h,
|
||||
/*
|
||||
* dib に指定のパレット sp を抜いてコピー
|
||||
*/
|
||||
void sdl_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, uint8_t sp) {
|
||||
sdl_dib_sprite_copy(main_surface, sx, sy, w, h, dx, dy, sp);
|
||||
void gfx_copyAreaSP(int sx, int sy, int w, int h, int dx, int dy, uint8_t sp) {
|
||||
gfx_dib_sprite_copy(main_surface, sx, sy, w, h, dx, dy, sp);
|
||||
}
|
||||
|
||||
SDL_Surface *sdl_dib_to_surface_colorkey(int x, int y, int w, int h, int sp) {
|
||||
SDL_Surface *gfx_dib_to_surface_colorkey(int x, int y, int w, int h, int sp) {
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_FillRect(s, NULL, 0);
|
||||
sdl_dib_sprite_copy(s, x, y, w, h, 0, 0, sp);
|
||||
gfx_dib_sprite_copy(s, x, y, w, h, 0, 0, sp);
|
||||
return s;
|
||||
}
|
||||
|
||||
void sdl_drawImage8(cgdata *cg, int dx, int dy, int sprite_color) {
|
||||
void gfx_drawImage8(cgdata *cg, int dx, int dy, int sprite_color) {
|
||||
int w = cg->width;
|
||||
int h = cg->height;
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
cg->pic, w, h, 8, w, SDL_PIXELFORMAT_INDEX8);
|
||||
|
||||
sdl_pal_check();
|
||||
gfx_pal_check();
|
||||
|
||||
if (main_surface->format->BitsPerPixel > 8 && cg->pal) {
|
||||
SDL_SetPaletteColors(s->format->palette, cg->pal, 0, 256);
|
||||
} else {
|
||||
SDL_SetSurfacePalette(s, sdl_palette);
|
||||
SDL_SetSurfacePalette(s, gfx_palette);
|
||||
}
|
||||
|
||||
if (sprite_color != -1)
|
||||
@@ -255,11 +217,11 @@ void sdl_drawImage8(cgdata *cg, int dx, int dy, int sprite_color) {
|
||||
}
|
||||
|
||||
/* 直線描画 */
|
||||
void sdl_drawLine(int x1, int y1, int x2, int y2, uint8_t c) {
|
||||
sdl_pal_check();
|
||||
void gfx_drawLine(int x1, int y1, int x2, int y2, uint8_t c) {
|
||||
gfx_pal_check();
|
||||
|
||||
SDL_Renderer *renderer = SDL_CreateSoftwareRenderer(main_surface);
|
||||
SDL_SetRenderDrawColor(renderer, sdl_palette->colors[c].r, sdl_palette->colors[c].g, sdl_palette->colors[c].b, SDL_ALPHA_OPAQUE);
|
||||
SDL_SetRenderDrawColor(renderer, gfx_palette->colors[c].r, gfx_palette->colors[c].g, gfx_palette->colors[c].b, SDL_ALPHA_OPAQUE);
|
||||
SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
|
||||
SDL_DestroyRenderer(renderer);
|
||||
}
|
||||
@@ -274,28 +236,28 @@ void sdl_drawLine(int x1, int y1, int x2, int y2, uint8_t c) {
|
||||
#include "flood.h"
|
||||
#undef TYPE
|
||||
|
||||
SDL_Rect sdl_floodFill(int x, int y, int c) {
|
||||
SDL_Rect gfx_floodFill(int x, int y, int c) {
|
||||
Uint32 col = palette_color(c);
|
||||
|
||||
switch (main_surface->format->BytesPerPixel) {
|
||||
case 1:
|
||||
return sdl_floodFill_uint8_t(x, y, col);
|
||||
return gfx_floodFill_uint8_t(x, y, col);
|
||||
case 2:
|
||||
return sdl_floodFill_uint16_t(x, y, col);
|
||||
return gfx_floodFill_uint16_t(x, y, col);
|
||||
case 4:
|
||||
return sdl_floodFill_uint32_t(x, y, col);
|
||||
return gfx_floodFill_uint32_t(x, y, col);
|
||||
default:
|
||||
WARNING("sdl_floodFill: unsupported DIB format");
|
||||
WARNING("gfx_floodFill: unsupported DIB format");
|
||||
return (SDL_Rect){};
|
||||
}
|
||||
}
|
||||
|
||||
int sdl_nearest_color(int r, int g, int b) {
|
||||
int gfx_nearest_color(int r, int g, int b) {
|
||||
int i, col, mind = INT_MAX;
|
||||
for (i = 0; i < 256; i++) {
|
||||
int dr = r - sdl_palette->colors[i].r;
|
||||
int dg = g - sdl_palette->colors[i].g;
|
||||
int db = b - sdl_palette->colors[i].b;
|
||||
int dr = r - gfx_palette->colors[i].r;
|
||||
int dg = g - gfx_palette->colors[i].g;
|
||||
int db = b - gfx_palette->colors[i].b;
|
||||
int d = dr*dr*30 + dg*dg*59 + db*db*11;
|
||||
if (d < mind) {
|
||||
mind = d;
|
||||
@@ -305,15 +267,15 @@ int sdl_nearest_color(int r, int g, int b) {
|
||||
return col;
|
||||
}
|
||||
|
||||
SDL_Rect sdl_drawString(int x, int y, const char *str_utf8, uint8_t col) {
|
||||
sdl_pal_check();
|
||||
SDL_Rect gfx_drawString(int x, int y, const char *str_utf8, uint8_t col) {
|
||||
gfx_pal_check();
|
||||
return font_draw_glyph(x, y, str_utf8, col);
|
||||
}
|
||||
|
||||
/*
|
||||
* 指定範囲にパレット col を rate の割合で重ねる CK1
|
||||
*/
|
||||
void sdl_wrapColor(int sx, int sy, int w, int h, uint8_t c, int rate) {
|
||||
void gfx_wrapColor(int sx, int sy, int w, int h, uint8_t c, int rate) {
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, main_surface->format->BitsPerPixel, main_surface->format->format);
|
||||
assert(s->format->BitsPerPixel > 8);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* sdl_image.c image操作 for SDL
|
||||
* gfx_image.c image操作 for SDL
|
||||
*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
|
||||
*
|
||||
@@ -18,7 +18,7 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
/* $Id: sdl_image.c,v 1.23 2003/07/20 19:30:16 chikama Exp $ */
|
||||
/* $Id: gfx_image.c,v 1.23 2003/07/20 19:30:16 chikama Exp $ */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -28,14 +28,14 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "gfx.h"
|
||||
#include "gfx_private.h"
|
||||
#include "cg.h"
|
||||
#include "nact.h"
|
||||
#include "alpha_plane.h"
|
||||
#include "image.h"
|
||||
|
||||
void sdl_FlipSurfaceHorizontal(SDL_Surface *s) {
|
||||
void gfx_FlipSurfaceHorizontal(SDL_Surface *s) {
|
||||
#if SDL_VERSION_ATLEAST(3, 2, 0)
|
||||
SDL_FlipSurface(s, SDL_FLIP_HORIZONTAL);
|
||||
#else
|
||||
@@ -57,7 +57,7 @@ void sdl_FlipSurfaceHorizontal(SDL_Surface *s) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void sdl_FlipSurfaceVertical(SDL_Surface *s) {
|
||||
void gfx_FlipSurfaceVertical(SDL_Surface *s) {
|
||||
#if SDL_VERSION_ATLEAST(3, 2, 0)
|
||||
SDL_FlipSurface(s, SDL_FLIP_VERTICAL);
|
||||
#else
|
||||
@@ -76,28 +76,28 @@ void sdl_FlipSurfaceVertical(SDL_Surface *s) {
|
||||
}
|
||||
|
||||
// Scaled copy in main_surface
|
||||
void sdl_scaledCopyArea(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int mirror) {
|
||||
void gfx_scaledCopyArea(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int mirror) {
|
||||
SDL_Rect src_rect = {sx, sy, sw, sh};
|
||||
SDL_Rect dst_rect = {dx, dy, dw, dh};
|
||||
// NOTE: SDL_BlitScaled() does not support 8-bit surfaces.
|
||||
SDL_SoftStretch(main_surface, &src_rect, main_surface, &dst_rect);
|
||||
if (mirror) {
|
||||
SDL_IntersectRect(&dst_rect, &(SDL_Rect){0, 0, main_surface->w, main_surface->h}, &dst_rect);
|
||||
SDL_Surface *view = sdl_createSurfaceView(main_surface, dst_rect.x, dst_rect.y, dst_rect.w, dst_rect.h);
|
||||
SDL_Surface *view = gfx_createSurfaceView(main_surface, dst_rect.x, dst_rect.y, dst_rect.w, dst_rect.h);
|
||||
if (mirror & 1)
|
||||
sdl_FlipSurfaceVertical(view);
|
||||
gfx_FlipSurfaceVertical(view);
|
||||
if (mirror & 2)
|
||||
sdl_FlipSurfaceHorizontal(view);
|
||||
gfx_FlipSurfaceHorizontal(view);
|
||||
SDL_FreeSurface(view);
|
||||
}
|
||||
}
|
||||
|
||||
void sdl_drawImage16(cgdata *cg, surface_t *sf, int dx, int dy, int brightness, bool alpha_blend) {
|
||||
void gfx_drawImage16(cgdata *cg, surface_t *sf, int dx, int dy, int brightness, bool alpha_blend) {
|
||||
int w = cg->width;
|
||||
int h = cg->height;
|
||||
|
||||
if (cg->alpha && !alpha_blend) {
|
||||
sdl_drawImageAlphaMap(cg, sf, dx, dy);
|
||||
gfx_drawImageAlphaMap(cg, sf, dx, dy);
|
||||
}
|
||||
|
||||
SDL_Surface *s;
|
||||
@@ -136,9 +136,9 @@ void sdl_drawImage16(cgdata *cg, surface_t *sf, int dx, int dy, int brightness,
|
||||
SDL_FreeSurface(s);
|
||||
}
|
||||
|
||||
void sdl_drawImage24(cgdata *cg, surface_t *sf, int x, int y, int brightness) {
|
||||
void gfx_drawImage24(cgdata *cg, surface_t *sf, int x, int y, int brightness) {
|
||||
if (cg->alpha) {
|
||||
sdl_drawImageAlphaMap(cg, sf, x, y);
|
||||
gfx_drawImageAlphaMap(cg, sf, x, y);
|
||||
}
|
||||
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
@@ -151,7 +151,7 @@ void sdl_drawImage24(cgdata *cg, surface_t *sf, int x, int y, int brightness) {
|
||||
SDL_FreeSurface(s);
|
||||
}
|
||||
|
||||
void sdl_drawImageAlphaMap(cgdata *cg, surface_t *sf, int x, int y) {
|
||||
void gfx_drawImageAlphaMap(cgdata *cg, surface_t *sf, int x, int y) {
|
||||
if (!cg->alpha || !sf->alpha) return;
|
||||
|
||||
uint8_t *a_src = cg->alpha;
|
||||
@@ -164,14 +164,14 @@ void sdl_drawImageAlphaMap(cgdata *cg, surface_t *sf, int x, int y) {
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Surface *sdl_dib_to_surface_with_alpha(int x, int y, int w, int h) {
|
||||
SDL_Surface *gfx_dib_to_surface_with_alpha(int x, int y, int w, int h) {
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, SDL_PIXELFORMAT_ARGB8888);
|
||||
|
||||
SDL_Rect r_src = {x, y, w, h};
|
||||
SDL_BlitSurface(main_surface, &r_src, s, NULL);
|
||||
|
||||
uint8_t *p_ds = ALPHA_AT(s, 0, 0);
|
||||
uint8_t *adata = GETOFFSET_ALPHA(sdl_dibinfo, x, y);
|
||||
uint8_t *adata = GETOFFSET_ALPHA(gfx_dibinfo, x, y);
|
||||
for (int y = 0; y < h; y++) {
|
||||
uint8_t *p_src = adata;
|
||||
uint8_t *p_dst = p_ds;
|
||||
@@ -179,14 +179,14 @@ SDL_Surface *sdl_dib_to_surface_with_alpha(int x, int y, int w, int h) {
|
||||
*p_dst = *(p_src++);
|
||||
p_dst += 4;
|
||||
}
|
||||
adata += sdl_dibinfo->width;
|
||||
adata += gfx_dibinfo->width;
|
||||
p_ds += s->pitch;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
void sdl_copyAreaSP16_shadow(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
SDL_Surface *s = sdl_dib_to_surface_with_alpha(sx, sy, w, h);
|
||||
void gfx_copyAreaSP16_shadow(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
SDL_Surface *s = gfx_dib_to_surface_with_alpha(sx, sy, w, h);
|
||||
if (lv < 255)
|
||||
SDL_SetSurfaceAlphaMod(s, lv);
|
||||
|
||||
@@ -195,7 +195,7 @@ void sdl_copyAreaSP16_shadow(int sx, int sy, int w, int h, int dx, int dy, int l
|
||||
SDL_FreeSurface(s);
|
||||
}
|
||||
|
||||
void sdl_copyAreaSP16_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
void gfx_copyAreaSP16_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
SDL_Rect r_src = {sx, sy, w, h};
|
||||
SDL_Rect r_dst = {dx, dy, w, h};
|
||||
SDL_SetSurfaceBlendMode(main_surface, SDL_BLENDMODE_BLEND);
|
||||
@@ -205,7 +205,7 @@ void sdl_copyAreaSP16_alphaBlend(int sx, int sy, int w, int h, int dx, int dy, i
|
||||
SDL_SetSurfaceBlendMode(main_surface, SDL_BLENDMODE_NONE);
|
||||
}
|
||||
|
||||
void sdl_copyAreaSP16_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
void gfx_copyAreaSP16_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, int lv) {
|
||||
SDL_Rect r_src = {sx, sy, w, h};
|
||||
SDL_Rect r_dst = {dx, dy, w, h};
|
||||
SDL_SetSurfaceBlendMode(main_surface, SDL_BLENDMODE_BLEND);
|
||||
@@ -216,53 +216,42 @@ void sdl_copyAreaSP16_alphaLevel(int sx, int sy, int w, int h, int dx, int dy, i
|
||||
SDL_SetSurfaceBlendMode(main_surface, SDL_BLENDMODE_NONE);
|
||||
}
|
||||
|
||||
void sdl_copy_from_alpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag) {
|
||||
void gfx_copy_from_alpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag) {
|
||||
image_copy_from_alpha(nact->ags.dib, sx, sy, w, h, dx, dy, flag);
|
||||
}
|
||||
|
||||
void sdl_copy_to_alpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag) {
|
||||
void gfx_copy_to_alpha(int sx, int sy, int w, int h, int dx, int dy, ALPHA_DIB_COPY_TYPE flag) {
|
||||
image_copy_to_alpha(nact->ags.dib, sx, sy, w, h, dx, dy, flag);
|
||||
}
|
||||
|
||||
/*
|
||||
* dib のピクセル情報を取得
|
||||
*/
|
||||
void sdl_getPixel(int x, int y, Palette *cell) {
|
||||
uint32_t gfx_getPixel(int x, int y) {
|
||||
uint8_t *p = PIXEL_AT(main_surface, x, y);
|
||||
if (main_surface->format->BitsPerPixel == 8) {
|
||||
cell->pixel = *p;
|
||||
} else {
|
||||
Uint32 cl=0;
|
||||
|
||||
switch (main_surface->format->BytesPerPixel) {
|
||||
case 2:
|
||||
{
|
||||
unsigned short *pp = (unsigned short *)p;
|
||||
cl = *pp;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
|
||||
switch (main_surface->format->BytesPerPixel) {
|
||||
case 1:
|
||||
return *p;
|
||||
case 2:
|
||||
return *(unsigned short *)p;
|
||||
case 3:
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
cl = (p[2]<<16)+(p[1]<<8) + p[0];
|
||||
return (p[2]<<16)+(p[1]<<8) + p[0];
|
||||
#else
|
||||
cl = (p[0]<<16)+(p[1]<<8) + p[2];
|
||||
return (p[0]<<16)+(p[1]<<8) + p[2];
|
||||
#endif
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
Uint32 *pp = (Uint32 *)p;
|
||||
cl = *pp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
SDL_GetRGB(cl, main_surface->format, &cell->r, &cell->g, &cell->b);
|
||||
case 4:
|
||||
return *(Uint32 *)p;
|
||||
default:
|
||||
return 0; // cannot happen
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* dib から領域の切り出し
|
||||
*/
|
||||
void* sdl_saveRegion(int x, int y, int w, int h) {
|
||||
void* gfx_saveRegion(int x, int y, int w, int h) {
|
||||
SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, w, h, main_surface->format->BitsPerPixel, main_surface->format->format);
|
||||
if (main_surface->format->BitsPerPixel == 8)
|
||||
memcpy(s->format->palette->colors, main_surface->format->palette->colors,
|
||||
@@ -276,14 +265,14 @@ void* sdl_saveRegion(int x, int y, int w, int h) {
|
||||
/*
|
||||
* セーブした領域を破棄
|
||||
*/
|
||||
void sdl_delRegion(void *psrc) {
|
||||
void gfx_delRegion(void *psrc) {
|
||||
SDL_FreeSurface((SDL_Surface *)psrc);
|
||||
}
|
||||
|
||||
/*
|
||||
* dib にセーブした領域を回復
|
||||
*/
|
||||
void sdl_putRegion(void *psrc, int x, int y) {
|
||||
void gfx_putRegion(void *psrc, int x, int y) {
|
||||
SDL_Surface *src = (SDL_Surface *)psrc;
|
||||
|
||||
SDL_Rect r_src = {0, 0, src->w, src->h};
|
||||
@@ -295,8 +284,8 @@ void sdl_putRegion(void *psrc, int x, int y) {
|
||||
/*
|
||||
* dib に dstを描画後、後始末
|
||||
*/
|
||||
void sdl_restoreRegion(void *psrc, int x, int y) {
|
||||
void gfx_restoreRegion(void *psrc, int x, int y) {
|
||||
SDL_Surface *src = (SDL_Surface *)psrc;
|
||||
sdl_putRegion(src, x ,y);
|
||||
gfx_putRegion(src, x ,y);
|
||||
SDL_FreeSurface(src);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* sdl_private.h SDL only private data
|
||||
* gfx_private.h SDL only private data
|
||||
*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
|
||||
*
|
||||
@@ -18,7 +18,7 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
/* $Id: sdl_private.h,v 1.4 2002/04/29 05:48:21 chikama Exp $ */
|
||||
/* $Id: gfx_private.h,v 1.4 2002/04/29 05:48:21 chikama Exp $ */
|
||||
|
||||
#ifndef __SDL_PRIVATE_H__
|
||||
#define __SDL_PRIVATE_H__
|
||||
@@ -30,22 +30,18 @@
|
||||
#include "portab.h"
|
||||
#include "ags.h"
|
||||
|
||||
extern SDL_Window *sdl_window;
|
||||
extern SDL_Renderer *sdl_renderer;
|
||||
extern SDL_Texture *sdl_texture;
|
||||
extern SDL_Palette *sdl_palette;
|
||||
extern surface_t *sdl_dibinfo;
|
||||
extern SDL_Window *gfx_window;
|
||||
extern SDL_Renderer *gfx_renderer;
|
||||
extern SDL_Texture *gfx_texture;
|
||||
extern SDL_Palette *gfx_palette;
|
||||
extern surface_t *gfx_dibinfo;
|
||||
extern int view_w;
|
||||
extern int view_h;
|
||||
extern bool sdl_dirty;
|
||||
extern bool sdl_fs_on;
|
||||
extern bool (*sdl_custom_event_handler)(const SDL_Event *);
|
||||
extern bool gfx_dirty;
|
||||
extern bool gfx_fullscreen;
|
||||
|
||||
void sdl_event_init(void);
|
||||
void sdl_cursor_init(void);
|
||||
int sdl_nearest_color(int r, int g, int b);
|
||||
bool sdl_joy_open(int index);
|
||||
SDL_Surface *sdl_dib_to_surface_with_alpha(int x, int y, int w, int h);
|
||||
SDL_Surface *sdl_dib_to_surface_colorkey(int x, int y, int w, int h, int col);
|
||||
int gfx_nearest_color(int r, int g, int b);
|
||||
SDL_Surface *gfx_dib_to_surface_with_alpha(int x, int y, int w, int h);
|
||||
SDL_Surface *gfx_dib_to_surface_colorkey(int x, int y, int w, int h, int col);
|
||||
|
||||
#endif /* __SDL_PRIVATE_H__ */
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* sdl_video.c SDL video init
|
||||
* gfx_video.c SDL video init
|
||||
*
|
||||
* Copyright (C) 2000- Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
|
||||
*
|
||||
@@ -18,7 +18,7 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
/* $Id: sdl_video.c,v 1.11 2003/01/04 17:01:02 chikama Exp $ */
|
||||
/* $Id: gfx_video.c,v 1.11 2003/01/04 17:01:02 chikama Exp $ */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -31,98 +31,60 @@
|
||||
|
||||
#include "portab.h"
|
||||
#include "system.h"
|
||||
#include "sdl_core.h"
|
||||
#include "sdl_private.h"
|
||||
#include "gfx.h"
|
||||
#include "gfx_private.h"
|
||||
#include "xsystem35.h"
|
||||
#include "image.h"
|
||||
|
||||
SDL_Window *sdl_window;
|
||||
SDL_Renderer *sdl_renderer;
|
||||
SDL_Texture *sdl_texture;
|
||||
SDL_Window *gfx_window;
|
||||
SDL_Renderer *gfx_renderer;
|
||||
SDL_Texture *gfx_texture;
|
||||
SDL_Surface *main_surface; // offscreen surface
|
||||
SDL_Palette *sdl_palette;
|
||||
surface_t *sdl_dibinfo;
|
||||
SDL_Palette *gfx_palette;
|
||||
surface_t *gfx_dibinfo;
|
||||
int view_w;
|
||||
int view_h;
|
||||
bool sdl_dirty;
|
||||
bool sdl_fs_on;
|
||||
bool (*sdl_custom_event_handler)(const SDL_Event *);
|
||||
bool gfx_dirty;
|
||||
bool gfx_fullscreen;
|
||||
|
||||
static void window_init(const char *render_driver);
|
||||
static void makeDIB(int width, int height, int depth);
|
||||
|
||||
static int joy_device_index = -1;
|
||||
|
||||
static SDL_Joystick *js;
|
||||
|
||||
bool sdl_joy_open(int index) {
|
||||
if (js)
|
||||
return false;
|
||||
|
||||
js = SDL_JoystickOpen(index);
|
||||
if (!js)
|
||||
return false;
|
||||
|
||||
const char *name = SDL_JoystickName(js);
|
||||
int axes = SDL_JoystickNumAxes(js);
|
||||
int buttons = SDL_JoystickNumButtons(js);
|
||||
SDL_JoystickEventState(SDL_ENABLE);
|
||||
NOTICE("SDL joystick '%s' %d axes %d buttons", name, axes, buttons);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool joy_open(void) {
|
||||
if (joy_device_index >= 0)
|
||||
return sdl_joy_open(joy_device_index);
|
||||
|
||||
for (int i = 0; i < SDL_NumJoysticks(); i++) {
|
||||
if (sdl_joy_open(i))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* SDL の初期化 */
|
||||
int sdl_Initialize(const char *render_driver) {
|
||||
int gfx_Initialize(const char *render_driver) {
|
||||
window_init(render_driver);
|
||||
|
||||
/* offscreen Pixmap */
|
||||
makeDIB(SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT, SYS35_DEFAULT_DEPTH);
|
||||
|
||||
sdl_event_init();
|
||||
sdl_cursor_init();
|
||||
|
||||
sdl_setWindowSize(SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT);
|
||||
|
||||
gfx_setWindowSize(SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT);
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
// Prevent SDL from calling emscripten_exit_fullscreen on visibilitychange
|
||||
emscripten_set_visibilitychange_callback(NULL, 0, NULL);
|
||||
#endif
|
||||
|
||||
joy_open();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sdl_Remove(void) {
|
||||
if (sdl_palette)
|
||||
SDL_FreePalette(sdl_palette);
|
||||
void gfx_Remove(void) {
|
||||
if (gfx_palette)
|
||||
SDL_FreePalette(gfx_palette);
|
||||
if (main_surface)
|
||||
SDL_FreeSurface(main_surface);
|
||||
if (sdl_renderer)
|
||||
SDL_DestroyRenderer(sdl_renderer);
|
||||
if (js)
|
||||
SDL_JoystickClose(js);
|
||||
if (gfx_renderer)
|
||||
SDL_DestroyRenderer(gfx_renderer);
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
/* name is UTF-8 */
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EM_JS(void, sdl_setWindowTitle, (char *name), {
|
||||
EM_JS(void, gfx_setWindowTitle, (char *name), {
|
||||
xsystem35.shell.setWindowTitle(UTF8ToString(name));
|
||||
});
|
||||
#else
|
||||
void sdl_setWindowTitle(char *name) {
|
||||
SDL_SetWindowTitle(sdl_window, name);
|
||||
void gfx_setWindowTitle(char *name) {
|
||||
SDL_SetWindowTitle(gfx_window, name);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -132,7 +94,7 @@ static void window_init(const char *render_driver) {
|
||||
SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0");
|
||||
SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0");
|
||||
|
||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK);
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
// Stop SDL from calling emscripten_sleep() in functions that are called
|
||||
@@ -153,12 +115,12 @@ static void window_init(const char *render_driver) {
|
||||
#else
|
||||
Uint32 flags = SDL_WINDOW_RESIZABLE;
|
||||
#endif
|
||||
sdl_window = SDL_CreateWindow(
|
||||
gfx_window = SDL_CreateWindow(
|
||||
title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||
SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT, flags);
|
||||
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0);
|
||||
SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
|
||||
sdl_palette = SDL_AllocPalette(256);
|
||||
gfx_renderer = SDL_CreateRenderer(gfx_window, -1, 0);
|
||||
SDL_SetRenderDrawColor(gfx_renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
|
||||
gfx_palette = SDL_AllocPalette(256);
|
||||
}
|
||||
|
||||
static void makeDIB(int width, int height, int depth) {
|
||||
@@ -187,43 +149,43 @@ static void makeDIB(int width, int height, int depth) {
|
||||
main_surface = SDL_CreateRGBSurfaceWithFormat(0, width, height, depth, format);
|
||||
|
||||
if (main_surface->format->BitsPerPixel == 8) {
|
||||
SDL_SetSurfacePalette(main_surface, sdl_palette);
|
||||
SDL_SetSurfacePalette(main_surface, gfx_palette);
|
||||
}
|
||||
|
||||
if (sdl_dibinfo) {
|
||||
free(sdl_dibinfo);
|
||||
if (gfx_dibinfo) {
|
||||
free(gfx_dibinfo);
|
||||
}
|
||||
|
||||
sdl_dibinfo = calloc(1, sizeof(surface_t));
|
||||
sdl_dibinfo->width = width;
|
||||
sdl_dibinfo->height = height;
|
||||
sdl_dibinfo->alpha = NULL;
|
||||
sdl_dibinfo->sdl_surface = main_surface;
|
||||
gfx_dibinfo = calloc(1, sizeof(surface_t));
|
||||
gfx_dibinfo->width = width;
|
||||
gfx_dibinfo->height = height;
|
||||
gfx_dibinfo->alpha = NULL;
|
||||
gfx_dibinfo->sdl_surface = main_surface;
|
||||
|
||||
image_setdepth(main_surface->format->BitsPerPixel);
|
||||
}
|
||||
|
||||
/* offscreen の設定 */
|
||||
void sdl_setWorldSize(int width, int height, int depth) {
|
||||
void gfx_setWorldSize(int width, int height, int depth) {
|
||||
makeDIB(width, height, depth);
|
||||
SDL_FillRect(main_surface, NULL, 0);
|
||||
}
|
||||
|
||||
/* display の size と depth の取得 */
|
||||
void sdl_getWindowInfo(DispInfo *info) {
|
||||
void gfx_getWindowInfo(int *width, int *height, int *depth) {
|
||||
SDL_DisplayMode dm;
|
||||
SDL_GetCurrentDisplayMode(0, &dm);
|
||||
info->width = dm.w;
|
||||
info->height = dm.h;
|
||||
info->depth = SDL_BITSPERPIXEL(dm.format);
|
||||
if (width) *width = dm.w;
|
||||
if (height) *height = dm.h;
|
||||
if (depth) *depth = SDL_BITSPERPIXEL(dm.format);
|
||||
}
|
||||
|
||||
/* DIBの取得 */
|
||||
surface_t *sdl_getDIB(void) {
|
||||
return sdl_dibinfo;
|
||||
surface_t *gfx_getDIB(void) {
|
||||
return gfx_dibinfo;
|
||||
}
|
||||
|
||||
SDL_Surface *sdl_createSurfaceView(SDL_Surface *sf, int x, int y, int w, int h) {
|
||||
SDL_Surface *gfx_createSurfaceView(SDL_Surface *sf, int x, int y, int w, int h) {
|
||||
uint8_t *pixels = sf->pixels;
|
||||
pixels += y * sf->pitch + x * sf->format->BytesPerPixel;
|
||||
SDL_Surface *view = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
@@ -233,73 +195,50 @@ SDL_Surface *sdl_createSurfaceView(SDL_Surface *sf, int x, int y, int w, int h)
|
||||
return view;
|
||||
}
|
||||
|
||||
/* AutoRepeat の設定 */
|
||||
void sdl_setAutoRepeat(bool enable) {
|
||||
if (enable) {
|
||||
// SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||
} else {
|
||||
// SDL_EnableKeyRepeat(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void sdl_setFullscreen(bool on) {
|
||||
void gfx_setFullscreen(bool on) {
|
||||
#ifndef __EMSCRIPTEN__
|
||||
if (on == sdl_fs_on)
|
||||
if (on == gfx_fullscreen)
|
||||
return;
|
||||
SDL_SetWindowFullscreen(sdl_window, on ? SDL_WINDOW_FULLSCREEN_DESKTOP: 0);
|
||||
sdl_fs_on = on;
|
||||
SDL_SetWindowFullscreen(gfx_window, on ? SDL_WINDOW_FULLSCREEN_DESKTOP: 0);
|
||||
gfx_fullscreen = on;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool sdl_isFullscreen(void) {
|
||||
return sdl_fs_on;
|
||||
bool gfx_isFullscreen(void) {
|
||||
return gfx_fullscreen;
|
||||
}
|
||||
|
||||
void sdl_raiseWindow(void) {
|
||||
SDL_RaiseWindow(sdl_window);
|
||||
void gfx_raiseWindow(void) {
|
||||
SDL_RaiseWindow(gfx_window);
|
||||
}
|
||||
|
||||
void sdl_setWindowSize(int w, int h) {
|
||||
void gfx_setWindowSize(int w, int h) {
|
||||
if (w == view_w && h == view_h) return;
|
||||
|
||||
view_w = w;
|
||||
view_h = h;
|
||||
|
||||
#ifndef __ANDROID__
|
||||
SDL_SetWindowSize(sdl_window, w, h);
|
||||
SDL_SetWindowSize(gfx_window, w, h);
|
||||
#endif
|
||||
SDL_RenderSetLogicalSize(sdl_renderer, w, h);
|
||||
if (sdl_texture)
|
||||
SDL_DestroyTexture(sdl_texture);
|
||||
sdl_texture = SDL_CreateTexture(
|
||||
sdl_renderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, w, h);
|
||||
SDL_RenderSetLogicalSize(gfx_renderer, w, h);
|
||||
if (gfx_texture)
|
||||
SDL_DestroyTexture(gfx_texture);
|
||||
gfx_texture = SDL_CreateTexture(
|
||||
gfx_renderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, w, h);
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EM_ASM( xsystem35.shell.windowSizeChanged(); );
|
||||
#endif
|
||||
}
|
||||
|
||||
void sdl_showMessageBox(enum messagebox_type type, const char* title_utf8, const char* message_utf8) {
|
||||
uint32_t flags = 0;
|
||||
switch (type) {
|
||||
case MESSAGEBOX_ERROR: flags = SDL_MESSAGEBOX_ERROR; break;
|
||||
case MESSAGEBOX_WARNING: flags = SDL_MESSAGEBOX_WARNING; break;
|
||||
case MESSAGEBOX_INFO: flags = SDL_MESSAGEBOX_INFORMATION; break;
|
||||
}
|
||||
SDL_ShowSimpleMessageBox(flags, title_utf8, message_utf8, sdl_window);
|
||||
}
|
||||
|
||||
void sdl_setJoyDeviceIndex(int index) {
|
||||
joy_device_index = index;
|
||||
}
|
||||
|
||||
void sdl_setIntegerScaling(bool enable) {
|
||||
SDL_RenderSetIntegerScale(sdl_renderer, enable);
|
||||
void gfx_setIntegerScaling(bool enable) {
|
||||
SDL_RenderSetIntegerScale(gfx_renderer, enable);
|
||||
}
|
||||
|
||||
bool EMSCRIPTEN_KEEPALIVE save_screenshot(const char* path) {
|
||||
SDL_Rect *r = &nact->ags.view_area;
|
||||
SDL_Surface *view = sdl_createSurfaceView(main_surface, r->x, r->y, r->w, r->h);
|
||||
SDL_Surface *view = gfx_createSurfaceView(main_surface, r->x, r->y, r->w, r->h);
|
||||
bool ok = SDL_SaveBMP(view, path) == 0;
|
||||
SDL_FreeSurface(view);
|
||||
return ok;
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* graphics.h graphics related definition
|
||||
*
|
||||
* 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: graphics.h,v 1.24 2000/11/25 13:09:04 chikama Exp $ */
|
||||
|
||||
#ifndef __GRAPHICS__
|
||||
#define __GRAPHICS__
|
||||
|
||||
#include "portab.h"
|
||||
#include <SDL_rect.h>
|
||||
#include <SDL_pixels.h>
|
||||
|
||||
typedef struct {
|
||||
uint8_t r,g,b;
|
||||
uint32_t pixel;
|
||||
} Palette;
|
||||
|
||||
typedef SDL_Point MyPoint;
|
||||
|
||||
typedef struct {
|
||||
int width;
|
||||
int height;
|
||||
} MyDimension;
|
||||
|
||||
typedef SDL_Rect MyRectangle;
|
||||
|
||||
typedef struct {
|
||||
int width;
|
||||
int height;
|
||||
int depth;
|
||||
} DispInfo;
|
||||
|
||||
typedef enum {
|
||||
FONT_GOTHIC,
|
||||
FONT_MINCHO,
|
||||
} FontType;
|
||||
#define FONTTYPEMAX 2
|
||||
|
||||
#endif /* !__GRAPHICS__ */
|
||||
@@ -27,6 +27,7 @@
|
||||
#define GT_TOSHIN2 "闘神都市Ⅱ for Win95 "
|
||||
#define GT_RANCE4 "Rance4 -教団の遺産- For Win95 "
|
||||
#define GT_RANCE4_V2 "RanceⅣ -教団の遺産- for Windows "
|
||||
#define GT_RANCE2 "RANCE2"
|
||||
#define GT_RANCE3 "Rance3"
|
||||
#define GT_RANCE3_ENG "Rance3"
|
||||
#define GT_RANCE4_ENG "Rance4 -Legacy of the Sect- For Win95 "
|
||||
@@ -42,6 +43,8 @@ bool daiakuji_cx_hack;
|
||||
void enable_hack_by_gameid(const char *gameid) {
|
||||
if (!strcmp(gameid, "toushin2"))
|
||||
game_id = GAME_TT2;
|
||||
else if (!strcmp(gameid, "rance2"))
|
||||
game_id = GAME_RANCE2;
|
||||
else if (!strcmp(gameid, "rance3"))
|
||||
game_id = GAME_RANCE3;
|
||||
else if (!strcmp(gameid, "rance3_eng"))
|
||||
@@ -69,6 +72,8 @@ void enable_hack_by_title(const char *title_utf8) {
|
||||
game_id = GAME_TT2;
|
||||
else if (!strcmp(title_utf8, GT_RANCE4_V2))
|
||||
game_id = GAME_RANCE4_V2;
|
||||
else if (!strcmp(title_utf8, GT_RANCE2))
|
||||
game_id = GAME_RANCE2;
|
||||
else if (!strcmp(title_utf8, GT_RANCE3))
|
||||
game_id = GAME_RANCE3;
|
||||
else if (!strcmp(title_utf8, GT_RANCE3_ENG))
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
enum gameId {
|
||||
GAME_UNKNOWN = 0,
|
||||
GAME_TT2,
|
||||
GAME_RANCE2,
|
||||
GAME_RANCE3,
|
||||
GAME_RANCE3_ENG,
|
||||
GAME_RANCE4_ENG,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user