Compare commits
1 Commits
master
...
experiment
Author | SHA1 | Date | |
---|---|---|---|
|
3b3a80d7de |
2
.github/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
build_init.bat
|
||||
jdk.ini
|
515
.github/build.sh
vendored
@ -1,515 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
if [[ -z ${BSH_BUILD_PLATFORM-} ]]; then >&2 echo "BSH_BUILD_PLATFORM not set"; exit 1; fi
|
||||
if [[ -z ${BSH_HOST_ARCH-} ]]; then >&2 echo "BSH_HOST_ARCH not set"; exit 1; fi
|
||||
if [[ -z ${BSH_HOST_PLATFORM-} ]]; then >&2 echo "BSH_HOST_PLATFORM not set"; exit 1; fi
|
||||
if [[ -z ${BSH_HOST_LIBC-} ]]; then >&2 echo "BSH_HOST_LIBC not set"; exit 1; fi
|
||||
if [[ -z ${BSH_STATIC_DYNAMIC-} ]]; then >&2 echo "BSH_STATIC_DYNAMIC not set"; exit 1; fi
|
||||
if [[ -z ${BSH_DEBUG_RELEASE-} ]]; then >&2 echo "BSH_DEBUG_RELEASE not set"; exit 1; fi
|
||||
if [[ -z ${RELEASE_NAME-} ]]; then >&2 echo "RELEASE_NAME not set"; exit 1; fi
|
||||
if [[ -z ${RELEASE_TYPE-} ]]; then >&2 echo "RELEASE_TYPE not set"; exit 1; fi
|
||||
if [[ -z ${MOD_ID-} ]]; then >&2 echo "MOD_ID not set"; exit 1; fi
|
||||
if [[ -z ${SEPARATE_DEBUG-} ]]; then >&2 echo "SEPARATE_DEBUG not set"; exit 1; fi
|
||||
if [[ -z ${PACKAGE_MODE-} ]]; then >&2 echo "PACKAGE_MODE not set"; exit 1; fi
|
||||
if [[ -z ${ASSET_PATH-} ]]; then >&2 echo "ASSET_PATH not set"; exit 1; fi
|
||||
if [[ -z ${DEBUG_ASSET_PATH-} ]]; then >&2 echo "DEBUG_ASSET_PATH not set"; exit 1; fi
|
||||
if [[ -z ${APP_NAME-} ]]; then >&2 echo "APP_NAME not set"; exit 1; fi
|
||||
if [[ -z ${APP_COMMENT-} ]]; then >&2 echo "APP_COMMENT not set"; exit 1; fi
|
||||
if [[ -z ${APP_EXE-} ]]; then >&2 echo "APP_EXE not set"; exit 1; fi
|
||||
if [[ -z ${APP_ID-} ]]; then >&2 echo "APP_ID not set"; exit 1; fi
|
||||
if [[ -z ${APP_DATA-} ]]; then >&2 echo "APP_DATA not set"; exit 1; fi
|
||||
if [[ -z ${APP_VENDOR-} ]]; then >&2 echo "APP_VENDOR not set"; exit 1; fi
|
||||
|
||||
case $BSH_HOST_ARCH-$BSH_HOST_PLATFORM-$BSH_HOST_LIBC-$BSH_STATIC_DYNAMIC in
|
||||
x86_64-linux-gnu-static) ;;
|
||||
x86_64-linux-gnu-dynamic) ;;
|
||||
x86_64-windows-mingw-static) ;;
|
||||
x86_64-windows-mingw-dynamic) ;;
|
||||
x86_64-windows-msvc-static) ;;
|
||||
x86_64-windows-msvc-dynamic) ;;
|
||||
x86-windows-msvc-static) ;;
|
||||
x86-windows-msvc-dynamic) ;;
|
||||
x86_64-darwin-macos-static) ;;
|
||||
x86_64-darwin-macos-dynamic) ;;
|
||||
aarch64-darwin-macos-static) ;;
|
||||
aarch64-darwin-macos-dynamic) ;;
|
||||
x86-android-bionic-static) ;;
|
||||
x86_64-android-bionic-static) ;;
|
||||
arm-android-bionic-static) ;;
|
||||
aarch64-android-bionic-static) ;;
|
||||
wasm32-emscripten-emscripten-static) ;;
|
||||
*) >&2 echo "configuration $BSH_HOST_ARCH-$BSH_HOST_PLATFORM-$BSH_HOST_LIBC-$BSH_STATIC_DYNAMIC is not supported" && exit 1;;
|
||||
esac
|
||||
|
||||
if [[ $BSH_HOST_PLATFORM == android ]]; then
|
||||
android_platform=android-31
|
||||
if [[ -z "${JAVA_HOME_8_X64-}" ]]; then
|
||||
>&2 echo "JAVA_HOME_8_X64 not set"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z "${ANDROID_SDK_ROOT-}" ]]; then
|
||||
>&2 echo "ANDROID_SDK_ROOT not set"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z "${ANDROID_NDK_LATEST_HOME-}" ]]; then
|
||||
>&2 echo "ANDROID_NDK_LATEST_HOME not set"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z ${BSH_NO_PACKAGES-} ]]; then
|
||||
case $BSH_HOST_PLATFORM in
|
||||
android)
|
||||
(
|
||||
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/tools/bin:$PATH
|
||||
sdkmanager "platforms;$android_platform"
|
||||
)
|
||||
;;
|
||||
windows)
|
||||
if [[ $BSH_BUILD_PLATFORM-$BSH_HOST_LIBC == windows-mingw ]]; then
|
||||
pacman -S --noconfirm --needed mingw-w64-ucrt-x86_64-gcc
|
||||
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
|
||||
pacman -S --noconfirm --needed mingw-w64-ucrt-x86_64-{cmake,7zip,jq} patch
|
||||
else
|
||||
pacman -S --noconfirm --needed mingw-w64-ucrt-x86_64-{pkgconf,bzip2,luajit,jsoncpp,curl,SDL2,libpng,meson,fftw,jq}
|
||||
fi
|
||||
export PKG_CONFIG=$(which pkg-config.exe)
|
||||
fi
|
||||
;;
|
||||
linux)
|
||||
sudo apt update
|
||||
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
|
||||
sudo apt install libc6-dev libc6-dev-i386
|
||||
else
|
||||
sudo apt install libluajit-5.1-dev libcurl4-openssl-dev libfftw3-dev zlib1g-dev libsdl2-dev libbz2-dev libjsoncpp-dev
|
||||
fi
|
||||
;;
|
||||
darwin)
|
||||
brew install pkg-config binutils
|
||||
if [[ $BSH_STATIC_DYNAMIC != static ]]; then
|
||||
brew install luajit curl fftw zlib sdl2 bzip2 jsoncpp
|
||||
fi
|
||||
;;
|
||||
emscripten)
|
||||
git clone https://github.com/emscripten-core/emsdk.git --branch 3.1.30
|
||||
cd emsdk
|
||||
./emsdk install latest
|
||||
./emsdk activate latest
|
||||
. ./emsdk_env.sh
|
||||
cd ..
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
function inplace_sed() {
|
||||
local subst=$1
|
||||
local path=$2
|
||||
if [[ $BSH_BUILD_PLATFORM == darwin ]]; then
|
||||
sed -i "" -e $subst $path
|
||||
else
|
||||
sed -i $subst $path
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == windows-msvc ]]; then
|
||||
case $BSH_HOST_ARCH in
|
||||
x86_64) vs_env_arch=x64;;
|
||||
x86) vs_env_arch=x86;;
|
||||
esac
|
||||
VS_ENV_PARAMS=$vs_env_arch$'\t'-vcvars_ver=14.1
|
||||
. ./.github/vs-env.sh
|
||||
elif [[ $BSH_HOST_PLATFORM == darwin ]]; then
|
||||
# may need export SDKROOT=$(xcrun --show-sdk-path --sdk macosx11.1)
|
||||
CC=clang
|
||||
CXX=clang++
|
||||
if [[ $BSH_HOST_ARCH == aarch64 ]]; then
|
||||
macos_min_ver=11.0
|
||||
CC+=" -arch arm64"
|
||||
CXX+=" -arch arm64"
|
||||
else
|
||||
macos_min_ver=10.13
|
||||
CC+=" -arch x86_64"
|
||||
CXX+=" -arch x86_64"
|
||||
fi
|
||||
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
|
||||
export MACOSX_DEPLOYMENT_TARGET=$macos_min_ver
|
||||
fi
|
||||
export CC
|
||||
export CXX
|
||||
elif [[ $BSH_HOST_PLATFORM == android ]]; then
|
||||
case $BSH_HOST_ARCH in
|
||||
x86_64) android_toolchain_prefix=x86_64-linux-android ; android_system_version=21; android_arch_abi=x86_64 ;;
|
||||
x86) android_toolchain_prefix=i686-linux-android ; android_system_version=21; android_arch_abi=x86 ;;
|
||||
aarch64) android_toolchain_prefix=aarch64-linux-android ; android_system_version=21; android_arch_abi=arm64-v8a ;;
|
||||
arm) android_toolchain_prefix=armv7a-linux-androideabi; android_system_version=21; android_arch_abi=armeabi-v7a;;
|
||||
esac
|
||||
android_toolchain_dir=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64
|
||||
CC=$android_toolchain_dir/bin/$android_toolchain_prefix$android_system_version-clang
|
||||
CXX=$android_toolchain_dir/bin/$android_toolchain_prefix$android_system_version-clang++
|
||||
LD=$android_toolchain_dir/bin/$android_toolchain_prefix-ld
|
||||
AR=$android_toolchain_dir/bin/llvm-ar
|
||||
echo $AR
|
||||
CC+=" -fPIC"
|
||||
CXX+=" -fPIC"
|
||||
LD+=" -fPIC"
|
||||
export CC
|
||||
export CXX
|
||||
export LD
|
||||
export AR
|
||||
else
|
||||
export CC=gcc
|
||||
export CXX=g++
|
||||
fi
|
||||
|
||||
if [[ -d build ]]; then
|
||||
rm -r build
|
||||
fi
|
||||
|
||||
c_args=
|
||||
c_link_args=
|
||||
if [[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC != windows-msvc ]]; then
|
||||
c_args+=\'-ffunction-sections\',
|
||||
c_args+=\'-fdata-sections\',
|
||||
if [[ $BSH_HOST_PLATFORM == darwin ]]; then
|
||||
c_link_args+=\'-Wl,-dead_strip\',
|
||||
else
|
||||
c_link_args+=\'-Wl,--gc-sections\',
|
||||
fi
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM-$BSH_STATIC_DYNAMIC == darwin-static ]]; then
|
||||
c_args+=\'-mmacosx-version-min=$macos_min_ver\',
|
||||
c_link_args+=\'-mmacosx-version-min=$macos_min_ver\',
|
||||
fi
|
||||
|
||||
meson_configure=meson$'\t'setup
|
||||
if [[ $BSH_DEBUG_RELEASE == release ]]; then
|
||||
meson_configure+=$'\t'-Dbuildtype=debugoptimized
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM == darwin ]]; then
|
||||
meson_configure+=$'\t'-Dmanifest_macos_min_ver=$macos_min_ver
|
||||
else
|
||||
meson_configure+=$'\t'-Dmanifest_date=$(date --iso-8601)
|
||||
fi
|
||||
meson_configure+=$'\t'-Dapp_name=$APP_NAME
|
||||
meson_configure+=$'\t'-Dapp_comment=$APP_COMMENT
|
||||
meson_configure+=$'\t'-Dapp_exe=$APP_EXE
|
||||
meson_configure+=$'\t'-Dapp_id=$APP_ID
|
||||
meson_configure+=$'\t'-Dapp_data=$APP_DATA
|
||||
meson_configure+=$'\t'-Dapp_vendor=$APP_VENDOR
|
||||
meson_configure+=$'\t'-Dstrip=false
|
||||
meson_configure+=$'\t'-Db_staticpic=false
|
||||
meson_configure+=$'\t'-Dmod_id=$MOD_ID
|
||||
case $BSH_HOST_ARCH-$BSH_HOST_PLATFORM-$BSH_HOST_LIBC-$BSH_DEBUG_RELEASE in
|
||||
x86_64-linux-gnu-debug) ;&
|
||||
x86_64-windows-mingw-debug) ;&
|
||||
x86_64-windows-msvc-debug) ;&
|
||||
x86_64-darwin-macos-debug)
|
||||
meson_configure+=$'\t'-Dbuild_render=true
|
||||
meson_configure+=$'\t'-Dbuild_font=true
|
||||
;;
|
||||
esac
|
||||
if [[ $PACKAGE_MODE == nohttp ]]; then
|
||||
meson_configure+=$'\t'-Dhttp=false
|
||||
fi
|
||||
if [[ $PACKAGE_MODE == nolua ]]; then
|
||||
meson_configure+=$'\t'-Dlua=none
|
||||
fi
|
||||
if [[ $PACKAGE_MODE == backendvs ]]; then
|
||||
meson_configure+=$'\t'-Dbackend=vs
|
||||
# meson 1.2.3 configures vs projects that bring their own manifest, which conflicts with ours
|
||||
# TODO: remove this patch once https://github.com/mesonbuild/meson/pull/12472 makes it into a release that we can use
|
||||
meson_configure+=$'\t'-Dwindows_utf8cp=false
|
||||
fi
|
||||
if [[ $BSH_STATIC_DYNAMIC == static ]]; then
|
||||
meson_configure+=$'\t'-Dstatic=prebuilt
|
||||
if [[ $BSH_HOST_PLATFORM == windows ]]; then
|
||||
if [[ $BSH_HOST_LIBC == msvc ]]; then
|
||||
meson_configure+=$'\t'-Db_vscrt=static_from_buildtype
|
||||
else
|
||||
c_link_args+=\'-static\',
|
||||
c_link_args+=\'-static-libgcc\',
|
||||
c_link_args+=\'-static-libstdc++\',
|
||||
fi
|
||||
elif [[ $BSH_HOST_PLATFORM == linux ]]; then
|
||||
c_link_args+=\'-static-libgcc\',
|
||||
c_link_args+=\'-static-libstdc++\',
|
||||
fi
|
||||
else
|
||||
if [[ "$BSH_HOST_PLATFORM-$BSH_HOST_LIBC $BSH_BUILD_PLATFORM" == "windows-mingw windows" ]]; then
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2=true
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_include_dir=/ucrt64/include
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_lib_dir=/ucrt64/lib
|
||||
fi
|
||||
if [[ $BSH_BUILD_PLATFORM == linux ]]; then
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2=true
|
||||
fi
|
||||
if [[ $BSH_BUILD_PLATFORM == darwin ]]; then
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2=true
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_lib_dir=/usr/local/opt/bzip2/lib
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_include_dir=/usr/local/opt/bzip2/include
|
||||
meson_configure+=$'\t'-Dworkaround_elusive_bzip2_static=true
|
||||
fi
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM == linux ]] && [[ $BSH_HOST_ARCH != aarch64 ]]; then
|
||||
# certain file managers can't run PIEs https://bugzilla.gnome.org/show_bug.cgi?id=737849
|
||||
meson_configure+=$'\t'-Db_pie=false
|
||||
c_link_args+=\'-no-pie\',
|
||||
fi
|
||||
stable_or_beta=no
|
||||
if [[ $RELEASE_TYPE == beta ]]; then
|
||||
meson_configure+=$'\t'-Dbeta=true
|
||||
stable_or_beta=yes
|
||||
fi
|
||||
if [[ $RELEASE_TYPE == stable ]]; then
|
||||
stable_or_beta=yes
|
||||
fi
|
||||
if [[ $stable_or_beta == yes ]]; then
|
||||
xyz=$(echo $RELEASE_NAME | cut -d 'v' -f 2 | cut -d 'b' -f 1) # $RELEASE_NAME is vX.Y.Z or vX.Y.Zb
|
||||
display_version_major=$(echo $xyz | cut -d '.' -f 1)
|
||||
display_version_minor=$(echo $xyz | cut -d '.' -f 2)
|
||||
build_num=$(echo $xyz | cut -d '.' -f 3)
|
||||
if [[ $MOD_ID != 0 ]]; then
|
||||
meson_configure+=$'\t'-Ddisplay_version_major=$display_version_major
|
||||
meson_configure+=$'\t'-Ddisplay_version_minor=$display_version_minor
|
||||
meson_configure+=$'\t'-Dbuild_num=$build_num
|
||||
fi
|
||||
fi
|
||||
if [[ $RELEASE_TYPE == snapshot ]]; then
|
||||
build_num=$(echo $RELEASE_NAME | cut -d '-' -f 2) # $RELEASE_NAME is snapshot-X
|
||||
meson_configure+=$'\t'-Dsnapshot=true
|
||||
if [[ $MOD_ID != 0 ]]; then
|
||||
meson_configure+=$'\t'-Dbuild_num=$build_num
|
||||
fi
|
||||
fi
|
||||
if [[ $RELEASE_TYPE == snapshot ]] && [[ $MOD_ID != 0 ]]; then
|
||||
>&2 echo "mods and snapshots do not mix"
|
||||
exit 1
|
||||
fi
|
||||
if [[ $RELEASE_TYPE == snapshot ]] || [[ $MOD_ID != 0 ]]; then
|
||||
meson_configure+=$'\t'-Dupdate_server=starcatcher.us/TPT
|
||||
if [[ $BSH_HOST_PLATFORM == emscripten ]]; then
|
||||
meson_configure+=$'\t'-Dserver=tptserv.starcatcher.us
|
||||
meson_configure+=$'\t'-Dstatic_server=tptserv.starcatcher.us/Static
|
||||
fi
|
||||
fi
|
||||
if [[ $RELEASE_TYPE != dev ]]; then
|
||||
meson_configure+=$'\t'-Dignore_updates=false
|
||||
fi
|
||||
if [[ "$BSH_HOST_PLATFORM-$BSH_HOST_LIBC" == "windows-mingw" ]]; then
|
||||
meson_configure+=$'\t'--cross-file=.github/mingw-ghactions.ini
|
||||
# there is some mingw bug that only ever manifests on ghactions which makes MakeIco.exe use tons of memory and fail
|
||||
# TODO: remove this hack once we figure out how to fix that
|
||||
meson_configure+=$'\t'-Dwindows_icons=false
|
||||
fi
|
||||
if [[ $BSH_DEBUG_RELEASE-$BSH_STATIC_DYNAMIC == release-static ]]; then
|
||||
meson_configure+=$'\t'-Db_lto=true
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM-$BSH_HOST_ARCH == darwin-aarch64 ]]; then
|
||||
meson_configure+=$'\t'--cross-file=.github/macaa64-ghactions.ini
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM == emscripten ]]; then
|
||||
meson_configure+=$'\t'--cross-file=.github/emscripten-ghactions.ini
|
||||
fi
|
||||
if [[ $RELEASE_TYPE == tptlibsdev ]] && ([[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == windows-msvc ]] || [[ $BSH_STATIC_DYNAMIC == static ]]); then
|
||||
if [[ -z ${TPTLIBSREMOTE-} ]]; then
|
||||
if [[ -z "${GITHUB_REPOSITORY_OWNER-}" ]]; then
|
||||
>&2 echo "GITHUB_REPOSITORY_OWNER not set"
|
||||
exit 1
|
||||
fi
|
||||
tptlibsremote=https://github.com/$GITHUB_REPOSITORY_OWNER/tpt-libs
|
||||
else
|
||||
tptlibsremote=$TPTLIBSREMOTE
|
||||
fi
|
||||
tptlibsbranch=$(echo $RELEASE_NAME | cut -d '-' -f 2-) # $RELEASE_NAME is tptlibsdev-BRANCH
|
||||
if [[ -d build-tpt-libs ]] && [[ ${TPTLIBSRESET-} == yes ]]; then
|
||||
rm -rf build-tpt-libs
|
||||
fi
|
||||
if [[ ! -d build-tpt-libs/tpt-libs ]]; then
|
||||
mkdir -p build-tpt-libs
|
||||
cd build-tpt-libs
|
||||
git clone $tptlibsremote --branch $tptlibsbranch --depth 1
|
||||
cd ..
|
||||
fi
|
||||
tpt_libs_vtag=v00000000000000
|
||||
if [[ ! -f build-tpt-libs/tpt-libs/.ok ]]; then
|
||||
cd build-tpt-libs/tpt-libs
|
||||
BSH_VTAG=$tpt_libs_vtag ./.github/build.sh
|
||||
touch .ok
|
||||
cd ../../subprojects
|
||||
for i in tpt-libs-prebuilt-*; do
|
||||
if [[ -d $i ]]; then
|
||||
rm -r $i
|
||||
fi
|
||||
done
|
||||
7z x ../build-tpt-libs/tpt-libs/temp/libraries.zip
|
||||
cd ..
|
||||
fi
|
||||
meson_configure+=$'\t'-Dtpt_libs_vtag=$tpt_libs_vtag
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM == android ]]; then
|
||||
android_platform_jar=$ANDROID_SDK_ROOT/platforms/$android_platform/android.jar
|
||||
if ! [[ -f $android_platform_jar ]]; then
|
||||
>&2 echo "$android_platform_jar not found"
|
||||
exit 1
|
||||
fi
|
||||
meson_configure+=$'\t'--cross-file=android/cross/$BSH_HOST_ARCH.ini
|
||||
cat << ANDROID_INI > .github/android-ghactions.ini
|
||||
[constants]
|
||||
andriod_ndk_toolchain_bin = '$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin'
|
||||
andriod_sdk_build_tools = '$ANDROID_SDK_ROOT/build-tools/32.0.0'
|
||||
|
||||
[properties]
|
||||
# android_ndk_toolchain_prefix comes from the correct cross-file in ./android/cross
|
||||
android_ndk_toolchain_prefix = android_ndk_toolchain_prefix
|
||||
android_platform = '$android_platform'
|
||||
android_platform_jar = '$android_platform_jar'
|
||||
java_runtime_jar = '$JAVA_HOME_8_X64/jre/lib/rt.jar'
|
||||
|
||||
[binaries]
|
||||
# android_ndk_toolchain_prefix comes from the correct cross-file in ./android/cross
|
||||
c = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang')
|
||||
cpp = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang++')
|
||||
strip = andriod_ndk_toolchain_bin / 'llvm-strip'
|
||||
javac = '$JAVA_HOME_8_X64/bin/javac'
|
||||
jar = '$JAVA_HOME_8_X64/bin/jar'
|
||||
d8 = andriod_sdk_build_tools / 'd8'
|
||||
aapt = andriod_sdk_build_tools / 'aapt'
|
||||
aapt2 = andriod_sdk_build_tools / 'aapt2'
|
||||
zipalign = andriod_sdk_build_tools / 'zipalign'
|
||||
apksigner = andriod_sdk_build_tools / 'apksigner'
|
||||
ANDROID_INI
|
||||
meson_configure+=$'\t'--cross-file=.github/android-ghactions.ini
|
||||
fi
|
||||
meson_configure+=$'\t'-Dc_args=[$c_args]
|
||||
meson_configure+=$'\t'-Dcpp_args=[$c_args]
|
||||
meson_configure+=$'\t'-Dc_link_args=[$c_link_args]
|
||||
meson_configure+=$'\t'-Dcpp_link_args=[$c_link_args]
|
||||
$meson_configure build
|
||||
cd build
|
||||
|
||||
function verify_version_component() {
|
||||
local key=$1
|
||||
local expected=$2
|
||||
local actual=$(jq -r '.[] | select(.name == "'$key'") | .value' < meson-info/intro-buildoptions.json)
|
||||
if [[ $actual != $expected ]]; then
|
||||
>&2 echo "meson option $key expected to be $expected, is instead $actual"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
if [[ $stable_or_beta == yes ]] && [[ $MOD_ID == 0 ]]; then
|
||||
verify_version_component display_version_major $display_version_major
|
||||
verify_version_component display_version_minor $display_version_minor
|
||||
verify_version_component build_num $build_num
|
||||
verify_version_component upstream_version_major $display_version_major
|
||||
verify_version_component upstream_version_minor $display_version_minor
|
||||
verify_version_component upstream_build_num $build_num
|
||||
fi
|
||||
if [[ $RELEASE_TYPE == snapshot ]] && [[ $MOD_ID == 0 ]]; then
|
||||
verify_version_component build_num $build_num
|
||||
verify_version_component upstream_build_num $build_num
|
||||
fi
|
||||
|
||||
strip=strip
|
||||
objcopy=objcopy
|
||||
strip_target=$ASSET_PATH
|
||||
if [[ $BSH_HOST_PLATFORM == android ]]; then
|
||||
strip=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-$strip
|
||||
objcopy=$ANDROID_NDK_LATEST_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-$objcopy
|
||||
strip_target=lib$APP_EXE.so
|
||||
fi
|
||||
if [[ $PACKAGE_MODE == appimage ]]; then
|
||||
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == linux-gnu, but this may change later
|
||||
meson configure -Dcan_install=no -Dignore_updates=true -Dbuild_render=false -Dbuild_font=false
|
||||
strip_target=$APP_EXE
|
||||
fi
|
||||
meson_compile=meson$'\t'compile
|
||||
meson_compile+=$'\t'-v
|
||||
if [[ $BSH_BUILD_PLATFORM == windows ]] && [[ $PACKAGE_MODE != backendvs ]]; then
|
||||
set +e
|
||||
meson_compile+=$'\t'--ninja-args='["-d","keeprsp"]'
|
||||
$meson_compile
|
||||
ninja_code=$?
|
||||
set -e
|
||||
cat $APP_EXE.exe.rsp
|
||||
[[ $ninja_code == 0 ]];
|
||||
echo # rsps don't usually have a newline at the end
|
||||
if [[ "$BSH_HOST_PLATFORM-$BSH_STATIC_DYNAMIC $BSH_BUILD_PLATFORM" == "windows-dynamic windows" ]]; then
|
||||
# on windows we provide the dynamic dependencies also; makes sense to check for their presence
|
||||
# msys ldd works fine but only on windows build machines
|
||||
if ldd $APP_EXE | grep "not found"; then
|
||||
exit 1 # ldd | grep will have printed missing deps
|
||||
fi
|
||||
fi
|
||||
else
|
||||
$meson_compile
|
||||
fi
|
||||
|
||||
if [[ $SEPARATE_DEBUG == yes ]] && [[ $BSH_HOST_PLATFORM-$BSH_HOST_LIBC != windows-msvc ]]; then
|
||||
$objcopy --only-keep-debug $strip_target $DEBUG_ASSET_PATH
|
||||
$strip --strip-debug --strip-unneeded $strip_target
|
||||
$objcopy --add-gnu-debuglink $DEBUG_ASSET_PATH $strip_target
|
||||
chmod -x $DEBUG_ASSET_PATH
|
||||
fi
|
||||
if [[ $BSH_HOST_PLATFORM == android ]]; then
|
||||
$JAVA_HOME_8_X64/bin/keytool -genkeypair -keystore keystore.jks -alias androidkey -validity 10000 -keyalg RSA -keysize 2048 -keypass bagelsbagels -storepass bagelsbagels -dname "CN=nobody"
|
||||
meson configure -Dandroid_keystore=$(realpath keystore.jks)
|
||||
ANDROID_KEYSTORE_PASS=bagelsbagels ninja android/$APP_EXE.apk
|
||||
mv android/$APP_EXE.apk $APP_EXE.apk
|
||||
fi
|
||||
if [[ $PACKAGE_MODE == dmg ]]; then
|
||||
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == darwin-macos
|
||||
appdir=$APP_NAME.app
|
||||
mkdir $appdir
|
||||
mkdir $appdir/Contents
|
||||
cp resources/Info.plist $appdir/Contents/Info.plist
|
||||
mkdir $appdir/Contents/MacOS
|
||||
cp $APP_EXE $appdir/Contents/MacOS/$APP_EXE
|
||||
mkdir $appdir/Contents/Resources
|
||||
mkdir icon_exe.iconset
|
||||
cp ../resources/generated_icons/icon_exe_16.png icon_exe.iconset/icon_16x16.png
|
||||
cp ../resources/generated_icons/icon_exe_32.png icon_exe.iconset/icon_32x32.png
|
||||
cp ../resources/generated_icons/icon_exe.png icon_exe.iconset/icon_128x128.png
|
||||
iconutil -c icns icon_exe.iconset
|
||||
cp icon_exe.icns $appdir/Contents/Resources/icon_exe.icns
|
||||
mkdir icon_cps.iconset
|
||||
cp ../resources/generated_icons/icon_cps_16.png icon_cps.iconset/icon_16x16.png
|
||||
cp ../resources/generated_icons/icon_cps_32.png icon_cps.iconset/icon_32x32.png
|
||||
cp ../resources/generated_icons/icon_cps.png icon_cps.iconset/icon_128x128.png
|
||||
iconutil -c icns icon_cps.iconset
|
||||
cp icon_cps.icns $appdir/Contents/Resources/icon_cps.icns
|
||||
mkdir dmgroot
|
||||
mv $appdir dmgroot/$appdir
|
||||
cp ../LICENSE dmgroot/LICENSE
|
||||
cp ../README.md dmgroot/README.md
|
||||
hdiutil create -format UDZO -volname $APP_NAME -fs HFS+ -srcfolder dmgroot -o $ASSET_PATH
|
||||
elif [[ $PACKAGE_MODE == emscripten ]]; then
|
||||
tar cvf $ASSET_PATH $APP_EXE.js $APP_EXE.worker.js $APP_EXE.wasm
|
||||
elif [[ $PACKAGE_MODE == appimage ]]; then
|
||||
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == linux-gnu, but this may change later
|
||||
case $BSH_HOST_ARCH in
|
||||
aarch64) appimage_arch=aarch64;;
|
||||
arm) appimage_arch=armhf ;;
|
||||
x86) appimage_arch=i686 ;;
|
||||
x86_64) appimage_arch=x86_64 ;;
|
||||
esac
|
||||
curl -fsSLo appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-$appimage_arch.AppImage"
|
||||
curl -fsSLo AppRun "https://github.com/AppImage/AppImageKit/releases/download/continuous/AppRun-$appimage_arch"
|
||||
chmod +x appimagetool
|
||||
chmod +x AppRun
|
||||
appdir=bagels.AppDir # doesn't matter, won't be visible in the resulting appimage
|
||||
mkdir -p $appdir/usr/bin
|
||||
mkdir -p $appdir/usr/share/metainfo
|
||||
mkdir -p $appdir/usr/share/applications
|
||||
mkdir -p $appdir/usr/share/icons
|
||||
cp $APP_EXE $appdir/usr/bin/$APP_EXE
|
||||
mv AppRun $appdir/AppRun
|
||||
cp ../resources/icon_exe.svg $appdir/$APP_VENDOR-$APP_EXE.svg
|
||||
cp resources/powder.desktop $appdir/$APP_ID.desktop
|
||||
cp resources/appdata.xml $appdir/usr/share/metainfo/$APP_ID.appdata.xml
|
||||
cp $appdir/$APP_VENDOR-$APP_EXE.svg $appdir/usr/share/icons/$APP_VENDOR-$APP_EXE.svg
|
||||
cp $appdir/$APP_ID.desktop $appdir/usr/share/applications/$APP_ID.desktop
|
||||
./appimagetool $appdir $ASSET_PATH
|
||||
fi
|
4
.github/create-release.sh
vendored
@ -1,4 +0,0 @@
|
||||
set -euo pipefail
|
||||
IFS=$'\t\n'
|
||||
|
||||
gh release create --draft --verify-tag --title $RELEASE_NAME $GITHUB_REF_NAME
|
11
.github/emscripten-ghactions.ini
vendored
@ -1,11 +0,0 @@
|
||||
[binaries]
|
||||
c = 'emcc'
|
||||
cpp = 'em++'
|
||||
strip = 'emstrip'
|
||||
ar = 'emar'
|
||||
|
||||
[host_machine]
|
||||
system = 'emscripten'
|
||||
cpu_family = 'wasm32'
|
||||
cpu = 'wasm32'
|
||||
endian = 'little'
|
11
.github/macaa64-ghactions.ini
vendored
@ -1,11 +0,0 @@
|
||||
[binaries]
|
||||
c = [ 'clang', '-arch', 'arm64' ]
|
||||
cpp = [ 'clang++', '-arch', 'arm64' ]
|
||||
objcpp = [ 'clang++', '-arch', 'arm64' ]
|
||||
strip = 'strip'
|
||||
|
||||
[host_machine]
|
||||
system = 'darwin'
|
||||
cpu_family = 'aarch64'
|
||||
cpu = 'armv8'
|
||||
endian = 'little'
|
14
.github/mingw-ghactions.ini
vendored
@ -1,14 +0,0 @@
|
||||
[constants]
|
||||
prefix = 'x86_64-w64-mingw32'
|
||||
|
||||
[binaries]
|
||||
c = prefix + '-gcc'
|
||||
cpp = prefix + '-g++'
|
||||
strip = prefix + '-strip'
|
||||
windres = prefix + '-windres'
|
||||
|
||||
[host_machine]
|
||||
system = 'windows'
|
||||
cpu_family = 'x86_64'
|
||||
cpu = 'x86_64'
|
||||
endian = 'little'
|
1
.github/mod_id.txt
vendored
@ -1 +0,0 @@
|
||||
0
|
216
.github/prepare.py
vendored
@ -1,216 +0,0 @@
|
||||
import datetime
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
ref = os.getenv('GITHUB_REF')
|
||||
event_name = os.getenv('GITHUB_EVENT_NAME')
|
||||
publish_hostport = os.getenv('PUBLISH_HOSTPORT')
|
||||
|
||||
def set_output(key, value):
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write(f"{key}={value}\n")
|
||||
|
||||
match_stable = re.fullmatch(r'refs/tags/v([0-9]+)\.([0-9]+)\.([0-9]+)', ref)
|
||||
match_beta = re.fullmatch(r'refs/tags/v([0-9]+)\.([0-9]+)\.([0-9]+)b', ref)
|
||||
match_snapshot = re.fullmatch(r'refs/tags/snapshot-([0-9]+)', ref)
|
||||
match_tptlibsdev = re.fullmatch(r'refs/heads/tptlibsdev-(.*)', ref)
|
||||
match_alljobs = re.fullmatch(r'refs/heads/(.*)-alljobs', ref)
|
||||
do_release = False
|
||||
do_priority = 10
|
||||
if event_name == 'pull_request':
|
||||
do_priority = 0
|
||||
if match_stable:
|
||||
release_type = 'stable'
|
||||
release_name = 'v%s.%s.%s' % (match_stable.group(1), match_stable.group(2), match_stable.group(3))
|
||||
do_release = True
|
||||
do_priority = 0
|
||||
elif match_beta:
|
||||
release_type = 'beta'
|
||||
release_name = 'v%s.%s.%sb' % (match_beta.group(1), match_beta.group(2), match_beta.group(3))
|
||||
do_release = True
|
||||
do_priority = 0
|
||||
elif match_snapshot:
|
||||
release_type = 'snapshot'
|
||||
release_name = 'snapshot-%s' % match_snapshot.group(1)
|
||||
do_release = True
|
||||
do_priority = 0
|
||||
elif match_tptlibsdev:
|
||||
release_type = 'tptlibsdev'
|
||||
release_name = 'tptlibsdev-%s' % match_tptlibsdev.group(1)
|
||||
do_priority = 0
|
||||
else:
|
||||
release_type = 'dev'
|
||||
release_name = 'dev'
|
||||
if match_alljobs:
|
||||
do_priority = 0
|
||||
do_publish = publish_hostport and do_release
|
||||
|
||||
set_output('release_type', release_type)
|
||||
set_output('release_name', release_name)
|
||||
|
||||
subprocess.run([ 'meson', 'setup', '-Dprepare=true', 'build-prepare' ], check = True)
|
||||
build_options = {}
|
||||
with open('build-prepare/meson-info/intro-buildoptions.json') as f:
|
||||
for option in json.loads(f.read()):
|
||||
build_options[option['name']] = option['value']
|
||||
|
||||
if int(build_options['mod_id']) == 0 and os.path.exists('.github/mod_id.txt'):
|
||||
with open('.github/mod_id.txt') as f:
|
||||
build_options['mod_id'] = f.read()
|
||||
|
||||
if int(build_options['mod_id']) == 0:
|
||||
if release_type == 'stable':
|
||||
pass
|
||||
elif release_type == 'beta':
|
||||
build_options['app_name' ] += ' Beta'
|
||||
build_options['app_comment'] += ' - Beta'
|
||||
build_options['app_exe' ] += 'beta'
|
||||
build_options['app_id' ] += 'beta'
|
||||
elif release_type == 'snapshot':
|
||||
build_options['app_name' ] += ' Snapshot'
|
||||
build_options['app_comment'] += ' - Snapshot'
|
||||
build_options['app_exe' ] += 'snapshot'
|
||||
build_options['app_id' ] += 'snapshot'
|
||||
else:
|
||||
build_options['app_name' ] += ' Dev'
|
||||
build_options['app_comment'] += ' - Dev'
|
||||
build_options['app_exe' ] += 'dev'
|
||||
build_options['app_id' ] += 'dev'
|
||||
|
||||
set_output('mod_id' , build_options['mod_id' ])
|
||||
set_output('app_name' , build_options['app_name' ])
|
||||
set_output('app_comment', build_options['app_comment'])
|
||||
set_output('app_exe' , build_options['app_exe' ])
|
||||
set_output('app_id' , build_options['app_id' ])
|
||||
set_output('app_data' , build_options['app_data' ])
|
||||
set_output('app_vendor' , build_options['app_vendor' ])
|
||||
|
||||
app_exe = build_options['app_exe']
|
||||
app_name = build_options['app_name']
|
||||
app_name_slug = re.sub('[^A-Za-z0-9]', '_', app_name)
|
||||
|
||||
build_matrix = []
|
||||
publish_matrix = []
|
||||
# consider disabling line wrapping to edit this monstrosity
|
||||
for arch, platform, libc, statdyn, bplatform, runson, suffix, publish, artifact, dbgsuffix, mode, starcatcher, dbgrel, priority in [
|
||||
( 'x86_64', 'linux', 'gnu', 'static', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
|
||||
( 'x86_64', 'linux', 'gnu', 'static', 'linux', 'ubuntu-20.04', '', True, True, '.dbg', None, 'x86_64-lin-gcc-static', 'release', 10 ),
|
||||
( 'x86_64', 'linux', 'gnu', 'static', 'linux', 'ubuntu-20.04', '', False, True, '.dbg', 'appimage', None, 'release', 0 ), # priority = 0: appimage release
|
||||
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 10 ),
|
||||
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, 'nohttp', None, 'debug', 10 ),
|
||||
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, 'nolua', None, 'debug', 10 ),
|
||||
( 'x86_64', 'linux', 'gnu', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'release', 10 ),
|
||||
# ( 'x86_64', 'windows', 'mingw', 'static', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 10 ), # ubuntu-20.04 doesn't have windows TLS headers somehow and I haven't yet figured out how to get them; worse, it's a different toolchain
|
||||
# ( 'x86_64', 'windows', 'mingw', 'static', 'linux', 'ubuntu-20.04', '', False, True, '.dbg', None, None, 'release', 10 ), # ubuntu-20.04 doesn't have windows TLS headers somehow and I haven't yet figured out how to get them; worse, it's a different toolchain
|
||||
# ( 'x86_64', 'windows', 'mingw', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'debug', 10 ), # ubuntu-20.04 doesn't have ucrt64-capable mingw >_>
|
||||
# ( 'x86_64', 'windows', 'mingw', 'dynamic', 'linux', 'ubuntu-20.04', '', False, False, None, None, None, 'release', 10 ), # ubuntu-20.04 doesn't have ucrt64-capable mingw >_>
|
||||
( 'x86_64', 'windows', 'mingw', 'static', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
|
||||
( 'x86_64', 'windows', 'mingw', 'static', 'windows', 'windows-2019', '.exe', False, True, '.dbg', None, None, 'release', 10 ),
|
||||
( 'x86_64', 'windows', 'mingw', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 10 ),
|
||||
( 'x86_64', 'windows', 'mingw', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'release', 10 ),
|
||||
( 'x86_64', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
|
||||
( 'x86_64', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', True, True, '.pdb', None,'x86_64-win-msvc-static', 'release', 10 ),
|
||||
( 'x86_64', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 10 ),
|
||||
# ( 'x86_64', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, 'backendvs', None, 'debug', 0 ), # priority = 0: backend=vs build
|
||||
( 'x86_64', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'release', 10 ),
|
||||
( 'x86', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 0 ), # priority = 0: static debug build
|
||||
( 'x86', 'windows', 'msvc', 'static', 'windows', 'windows-2019', '.exe', True, True, '.pdb', None, 'i686-win-msvc-static', 'release', 10 ),
|
||||
( 'x86', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'debug', 10 ),
|
||||
( 'x86', 'windows', 'msvc', 'dynamic', 'windows', 'windows-2019', '.exe', False, False, None, None, None, 'release', 10 ),
|
||||
( 'x86_64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 0 ), # priority = 0: static debug build
|
||||
( 'x86_64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', True, True, None, 'dmg', 'x86_64-mac-gcc-static', 'release', 10 ), # I have no idea how to separate debug info on macos
|
||||
( 'x86_64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 10 ),
|
||||
( 'x86_64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'release', 10 ),
|
||||
( 'aarch64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 0 ), # priority = 0: static debug build
|
||||
( 'aarch64', 'darwin', 'macos', 'static', 'darwin', 'macos-12', '.dmg', True, True, None, 'dmg', 'arm64-mac-gcc-static', 'release', 10 ),
|
||||
# ( 'aarch64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'debug', 10 ), # macos-11.0 is x86_64 and I haven't yet figured out how to get homebrew to install aarch64 libs on x86_64
|
||||
# ( 'aarch64', 'darwin', 'macos', 'dynamic', 'darwin', 'macos-12', '.dmg', False, False, None, 'dmg', None, 'release', 10 ), # macos-11.0 is x86_64 and I haven't yet figured out how to get homebrew to install aarch64 libs on x86_64
|
||||
( 'x86', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
|
||||
( 'x86', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'i686-and-gcc-static', 'release', 10 ),
|
||||
( 'x86_64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
|
||||
( 'x86_64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'x86_64-and-gcc-static', 'release', 10 ),
|
||||
( 'arm', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
|
||||
( 'arm', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'arm-and-gcc-static', 'release', 10 ),
|
||||
( 'aarch64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
|
||||
( 'aarch64', 'android', 'bionic', 'static', 'linux', 'ubuntu-20.04', '.apk', True, True, '.dbg', None, 'arm64-and-gcc-static', 'release', 10 ),
|
||||
( 'wasm32', 'emscripten', 'emscripten', 'static', 'linux', 'ubuntu-20.04', '.tar', False, False, None, None, None, 'debug', 0 ), # priority = 0: rarely used debug build
|
||||
( 'wasm32', 'emscripten', 'emscripten', 'static', 'linux', 'ubuntu-20.04', '.tar', True, True, None, 'emscripten', 'wasm32-ems-static', 'release', 10 ), # I have no idea how to separate debug info on emscripten
|
||||
]:
|
||||
if priority < do_priority:
|
||||
continue
|
||||
job_name = f'build'
|
||||
if starcatcher:
|
||||
job_name += f'+target=starcatcher-{starcatcher}'
|
||||
else:
|
||||
job_name += f'+target={arch}-{platform}-{libc}-{statdyn}-{dbgrel}'
|
||||
if mode:
|
||||
job_name += f'+mode={mode}'
|
||||
if bplatform != platform:
|
||||
job_name += f'+bplatform={bplatform}'
|
||||
if not mode:
|
||||
mode = 'default'
|
||||
separate_debug = True
|
||||
if not dbgsuffix:
|
||||
dbgsuffix = 'BOGUS'
|
||||
separate_debug = False
|
||||
if not starcatcher:
|
||||
starcatcher = 'BOGUS'
|
||||
if publish:
|
||||
assert artifact
|
||||
if dbgrel != 'release':
|
||||
assert not publish
|
||||
assert not artifact
|
||||
asset_path = f'{app_exe}{suffix}'
|
||||
asset_name = f'{app_exe}-{release_name}-{arch}-{platform}-{libc}{suffix}'
|
||||
debug_asset_path = f'{app_exe}{dbgsuffix}'
|
||||
debug_asset_name = f'{app_exe}-{release_name}-{arch}-{platform}-{libc}{dbgsuffix}'
|
||||
if mode == 'appimage':
|
||||
asset_path = f'{app_name_slug}-{arch}.AppImage'
|
||||
asset_name = f'{app_name_slug}-{arch}.AppImage'
|
||||
debug_asset_path = f'{app_name_slug}-{arch}.AppImage.dbg'
|
||||
debug_asset_name = f'{app_name_slug}-{arch}.AppImage.dbg'
|
||||
starcatcher_name = f'powder-{release_name}-{starcatcher}{suffix}'
|
||||
msys2_bash = (bplatform == 'windows' and libc == 'mingw')
|
||||
shell = 'bash'
|
||||
if msys2_bash:
|
||||
shell = 'msys2 {0}'
|
||||
build_matrix.append({
|
||||
'bsh_build_platform': bplatform, # part of the unique portion of the matrix
|
||||
'bsh_host_arch': arch, # part of the unique portion of the matrix
|
||||
'bsh_host_platform': platform, # part of the unique portion of the matrix
|
||||
'bsh_host_libc': libc, # part of the unique portion of the matrix
|
||||
'bsh_static_dynamic': statdyn, # part of the unique portion of the matrix
|
||||
'bsh_debug_release': dbgrel, # part of the unique portion of the matrix
|
||||
'runs_on': runson,
|
||||
'force_msys2_bash': msys2_bash and 'yes' or 'no',
|
||||
'package_suffix': suffix,
|
||||
'package_mode': mode,
|
||||
'publish': publish and 'yes' or 'no',
|
||||
'artifact': artifact and 'yes' or 'no',
|
||||
'separate_debug': separate_debug and 'yes' or 'no',
|
||||
'asset_path': asset_path,
|
||||
'asset_name': asset_name,
|
||||
'debug_asset_path': debug_asset_path,
|
||||
'debug_asset_name': debug_asset_name,
|
||||
'job_name': job_name,
|
||||
'shell': shell,
|
||||
})
|
||||
if publish:
|
||||
publish_matrix.append({
|
||||
'bsh_build_platform': bplatform, # part of the unique portion of the matrix
|
||||
'bsh_host_arch': arch, # part of the unique portion of the matrix
|
||||
'bsh_host_platform': platform, # part of the unique portion of the matrix
|
||||
'bsh_host_libc': libc, # part of the unique portion of the matrix
|
||||
'bsh_static_dynamic': statdyn, # part of the unique portion of the matrix
|
||||
'asset_path': asset_path,
|
||||
'asset_name': asset_name,
|
||||
'starcatcher_name': starcatcher_name,
|
||||
})
|
||||
|
||||
set_output('build_matrix', json.dumps({ 'include': build_matrix }))
|
||||
set_output('publish_matrix', json.dumps({ 'include': publish_matrix }))
|
||||
set_output('do_release', do_release and 'yes' or 'no')
|
||||
set_output('do_publish', do_publish and 'yes' or 'no')
|
20
.github/starcatcher-publish.sh
vendored
@ -1,20 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
cat << NETRC > ~/.netrc
|
||||
machine $(echo $PUBLISH_HOSTPORT | cut -d ':' -f 1)
|
||||
login $PUBLISH_USERNAME
|
||||
password $PUBLISH_PASSWORD
|
||||
NETRC
|
||||
chmod 660 ~/.netrc
|
||||
|
||||
mountpoint=ftpmnt
|
||||
mkdir $mountpoint
|
||||
curlftpfs "$PUBLISH_HOSTPORT" $mountpoint -o ssl,ciphers='ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256'
|
||||
if [[ -z ${PUBLISH_ACCESSCHECK-} ]]; then
|
||||
cp $PUBLISH_FILENAME $mountpoint/${PUBLISH_DIRECTORY:-.}/
|
||||
fi
|
||||
fusermount -u $mountpoint
|
||||
rmdir $mountpoint
|
10
.github/starcatcher-release.sh
vendored
@ -1,10 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
curl "https://starcatcher.us/TPT/perform-release.lua?mod=$MOD_ID&type=$RELEASE_TYPE&name=$RELEASE_NAME&commit=$GITHUB_SHA" > perform_release
|
||||
if ! grep "Release complete" < perform_release > /dev/null; then
|
||||
cat perform_release
|
||||
exit 1
|
||||
fi
|
12
.github/upload-release-asset.sh
vendored
@ -1,12 +0,0 @@
|
||||
set -euo pipefail
|
||||
IFS=$'\t\n'
|
||||
|
||||
temp=.temp
|
||||
mkdir $temp
|
||||
cp $ASSET_PATH $temp/$ASSET_NAME
|
||||
(
|
||||
cd $temp
|
||||
gh release upload $GITHUB_REF_NAME $ASSET_NAME
|
||||
)
|
||||
rm -r $temp
|
||||
echo browser_download_url=https://github.com/$GITHUB_REPOSITORY/releases/download/$GITHUB_REF_NAME/$ASSET_NAME >> $GITHUB_OUTPUT
|
31
.github/vs-env.sh
vendored
@ -1,31 +0,0 @@
|
||||
set -euo pipefail
|
||||
IFS=$'\t\n'
|
||||
|
||||
IFS=$'\t\n\r'
|
||||
for i in $("$(env | grep '^ProgramFiles(x86)=' | cut -d = -f 2-)/Microsoft Visual Studio/Installer/vswhere.exe" \
|
||||
-sort \
|
||||
-prerelease \
|
||||
-requiresAny \
|
||||
-requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \
|
||||
-requires Microsoft.VisualStudio.Workload.WDExpress \
|
||||
-products \* \
|
||||
-utf8 \
|
||||
-property installationPath); do
|
||||
if ! [ -z ${VS_ENV_FILTER-} ]; then
|
||||
if ! echo $i | grep $VS_ENV_FILTER >/dev/null; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
vs_install_dir=$i
|
||||
break
|
||||
done
|
||||
IFS=$'\t\n'
|
||||
|
||||
for i in $(MSYS_NO_PATHCONV=1 cmd /c "$vs_install_dir\\VC\\Auxiliary\\Build\\vcvarsall.bat" $VS_ENV_PARAMS \& env \& exit /b); do
|
||||
set +e
|
||||
export "$i" 2>/dev/null
|
||||
echo $i | grep ERROR
|
||||
set -e
|
||||
done
|
||||
|
||||
cl
|
182
.github/workflows/build.yaml
vendored
@ -1,182 +0,0 @@
|
||||
name: build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
tags:
|
||||
- 'v*.*'
|
||||
- 'snapshot-*'
|
||||
- 'tptlibsdev-*'
|
||||
pull_request:
|
||||
branches:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
prepare:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
do_release: ${{ steps.prepare.outputs.do_release }}
|
||||
build_matrix: ${{ steps.prepare.outputs.build_matrix }}
|
||||
publish_matrix: ${{ steps.prepare.outputs.publish_matrix }}
|
||||
release_type: ${{ steps.prepare.outputs.release_type }}
|
||||
release_name: ${{ steps.prepare.outputs.release_name }}
|
||||
mod_id: ${{ steps.prepare.outputs.mod_id }}
|
||||
app_name: ${{ steps.prepare.outputs.app_name }}
|
||||
app_comment: ${{ steps.prepare.outputs.app_comment }}
|
||||
app_exe: ${{ steps.prepare.outputs.app_exe }}
|
||||
app_id: ${{ steps.prepare.outputs.app_id }}
|
||||
app_data: ${{ steps.prepare.outputs.app_data }}
|
||||
app_vendor: ${{ steps.prepare.outputs.app_vendor }}
|
||||
do_publish: ${{ steps.prepare.outputs.do_publish }}
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- run: python -m pip install meson==1.2.3 ninja # TODO: go back to using latest meson once https://github.com/mesonbuild/meson/pull/12544 is live
|
||||
- id: prepare
|
||||
run: python ./.github/prepare.py
|
||||
env:
|
||||
PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
|
||||
GITHUB_REF: ${{ github.ref }}
|
||||
- if: steps.prepare.outputs.do_publish == 'yes'
|
||||
run: sudo apt update && sudo apt install curlftpfs && bash -c './.github/starcatcher-publish.sh'
|
||||
env:
|
||||
PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
|
||||
PUBLISH_USERNAME: ${{ secrets.STARCATCHER_PUBLISH_USERNAME }}
|
||||
PUBLISH_PASSWORD: ${{ secrets.STARCATCHER_PUBLISH_PASSWORD }}
|
||||
PUBLISH_ACCESSCHECK: yes
|
||||
- if: steps.prepare.outputs.do_release == 'yes'
|
||||
id: create_release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
RELEASE_NAME: ${{ steps.prepare.outputs.release_name }}
|
||||
run: bash -c './.github/create-release.sh'
|
||||
build:
|
||||
runs-on: ${{ matrix.runs_on }}
|
||||
name: ${{ matrix.job_name }}
|
||||
needs: [prepare]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJSON(needs.prepare.outputs.build_matrix) }}
|
||||
defaults:
|
||||
run:
|
||||
shell: ${{ matrix.shell }}
|
||||
steps:
|
||||
- if: matrix.force_msys2_bash == 'yes'
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: UCRT64
|
||||
update: true
|
||||
path-type: strict
|
||||
cache: true
|
||||
# this list doesn't have to mirror the one in build.sh perfectly
|
||||
# but the packages listed here get cached properly and take less time to install
|
||||
install: >-
|
||||
git
|
||||
curl
|
||||
mingw-w64-ucrt-x86_64-gcc
|
||||
mingw-w64-ucrt-x86_64-pkgconf
|
||||
mingw-w64-ucrt-x86_64-bzip2
|
||||
mingw-w64-ucrt-x86_64-luajit
|
||||
mingw-w64-ucrt-x86_64-jsoncpp
|
||||
mingw-w64-ucrt-x86_64-curl
|
||||
mingw-w64-ucrt-x86_64-SDL2
|
||||
mingw-w64-ucrt-x86_64-libpng
|
||||
mingw-w64-ucrt-x86_64-meson
|
||||
mingw-w64-ucrt-x86_64-python
|
||||
mingw-w64-ucrt-x86_64-python-pip
|
||||
mingw-w64-ucrt-x86_64-fftw
|
||||
mingw-w64-ucrt-x86_64-cmake
|
||||
mingw-w64-ucrt-x86_64-7zip
|
||||
mingw-w64-ucrt-x86_64-jq
|
||||
patch
|
||||
- run: git config --global core.autocrlf false
|
||||
- uses: actions/checkout@v4
|
||||
- if: matrix.force_msys2_bash != 'yes'
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- if: matrix.force_msys2_bash != 'yes'
|
||||
run: python -m pip install meson==1.2.3 ninja # TODO: go back to using latest meson once https://github.com/mesonbuild/meson/pull/12544 is live
|
||||
- if: matrix.bsh_build_platform == 'darwin'
|
||||
run: brew install bash coreutils
|
||||
- run: bash -c './.github/build.sh'
|
||||
env:
|
||||
BSH_HOST_ARCH: ${{ matrix.bsh_host_arch }}
|
||||
BSH_HOST_PLATFORM: ${{ matrix.bsh_host_platform }}
|
||||
BSH_HOST_LIBC: ${{ matrix.bsh_host_libc }}
|
||||
BSH_STATIC_DYNAMIC: ${{ matrix.bsh_static_dynamic }}
|
||||
BSH_BUILD_PLATFORM: ${{ matrix.bsh_build_platform }}
|
||||
BSH_DEBUG_RELEASE: ${{ matrix.bsh_debug_release }}
|
||||
RELEASE_NAME: ${{ needs.prepare.outputs.release_name }}
|
||||
RELEASE_TYPE: ${{ needs.prepare.outputs.release_type }}
|
||||
MOD_ID: ${{ needs.prepare.outputs.mod_id }}
|
||||
APP_NAME: ${{ needs.prepare.outputs.app_name }}
|
||||
APP_COMMENT: ${{ needs.prepare.outputs.app_comment }}
|
||||
APP_EXE: ${{ needs.prepare.outputs.app_exe }}
|
||||
APP_ID: ${{ needs.prepare.outputs.app_id }}
|
||||
APP_DATA: ${{ needs.prepare.outputs.app_data }}
|
||||
APP_VENDOR: ${{ needs.prepare.outputs.app_vendor }}
|
||||
SEPARATE_DEBUG: ${{ matrix.separate_debug }}
|
||||
PACKAGE_MODE: ${{ matrix.package_mode }}
|
||||
ASSET_PATH: ${{ matrix.asset_path }}
|
||||
DEBUG_ASSET_PATH: ${{ matrix.debug_asset_path }}
|
||||
- if: needs.prepare.outputs.do_release == 'yes' && matrix.publish == 'yes' # TODO-NTL: ship licenses
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ASSET_PATH: build/${{ matrix.asset_path }}
|
||||
ASSET_NAME: ${{ matrix.asset_name }}
|
||||
run: bash -c './.github/upload-release-asset.sh'
|
||||
- if: needs.prepare.outputs.do_release == 'yes' && matrix.publish == 'yes' && matrix.separate_debug == 'yes'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ASSET_PATH: build/${{ matrix.debug_asset_path }}
|
||||
ASSET_NAME: ${{ matrix.debug_asset_name }}
|
||||
run: bash -c './.github/upload-release-asset.sh'
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: matrix.artifact == 'yes'
|
||||
with:
|
||||
path: build/${{ matrix.asset_path }}
|
||||
name: ${{ matrix.asset_name }}
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: matrix.artifact == 'yes' && matrix.separate_debug == 'yes'
|
||||
with:
|
||||
path: build/${{ matrix.debug_asset_path }}
|
||||
name: ${{ matrix.debug_asset_name }}
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build, prepare]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJSON(needs.prepare.outputs.publish_matrix) }}
|
||||
if: needs.prepare.outputs.do_publish == 'yes'
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.asset_name }}
|
||||
- run: mv ${{ matrix.asset_path }} ${{ matrix.starcatcher_name }}
|
||||
- run: sudo apt update && sudo apt install curlftpfs && bash -c './.github/starcatcher-publish.sh'
|
||||
env:
|
||||
PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
|
||||
PUBLISH_USERNAME: ${{ secrets.STARCATCHER_PUBLISH_USERNAME }}
|
||||
PUBLISH_PASSWORD: ${{ secrets.STARCATCHER_PUBLISH_PASSWORD }}
|
||||
PUBLISH_DIRECTORY: ${{ secrets.STARCATCHER_PUBLISH_DIRECTORY }}
|
||||
PUBLISH_FILENAME: ${{ matrix.starcatcher_name }}
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build, publish, prepare]
|
||||
if: needs.prepare.outputs.do_publish == 'yes'
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false
|
||||
- uses: actions/checkout@v4
|
||||
- run: ./.github/starcatcher-release.sh
|
||||
env:
|
||||
RELEASE_NAME: ${{ needs.prepare.outputs.release_name }}
|
||||
RELEASE_TYPE: ${{ needs.prepare.outputs.release_type }}
|
||||
MOD_ID: ${{ needs.prepare.outputs.mod_id }}
|
||||
GITHUB_SHA: ${{ github.sha }}
|
93
.gitignore
vendored
@ -1,47 +1,34 @@
|
||||
# Misc extensions, system files
|
||||
*.zip
|
||||
*.txt
|
||||
*.gz
|
||||
*.out
|
||||
*.sh
|
||||
*.py
|
||||
*.png
|
||||
*.ppm
|
||||
*nohup.out
|
||||
*.swp
|
||||
*~
|
||||
.DS_Store
|
||||
|
||||
# Build files
|
||||
build*/*
|
||||
*.o
|
||||
*.exe
|
||||
*.dmg
|
||||
*.user
|
||||
*.dll
|
||||
*.a
|
||||
*.la
|
||||
|
||||
# Legacy SCons files
|
||||
config.log
|
||||
*.sconsign.dblite
|
||||
*.sconf_temp
|
||||
/site_scons/
|
||||
/generated/
|
||||
|
||||
# User data
|
||||
/stamps/
|
||||
/Saves/
|
||||
/scripts/
|
||||
/recordings/
|
||||
*.def
|
||||
*~
|
||||
*.pref
|
||||
*.lua
|
||||
screenshot_*
|
||||
|
||||
# Visual studio
|
||||
/Debug/
|
||||
/Release/
|
||||
/includes/
|
||||
*.sh
|
||||
stdout.txt
|
||||
stderr.txt
|
||||
build*/*
|
||||
stamps/*
|
||||
Saves/*
|
||||
scripts/*
|
||||
generated/*
|
||||
includes/*
|
||||
recordings/
|
||||
font/*
|
||||
generate
|
||||
Makefile.me
|
||||
*.xcodeproj
|
||||
.DS_Store
|
||||
*.plist
|
||||
*.lproj
|
||||
*.vcxproj*
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.user
|
||||
*.filter
|
||||
*.sln
|
||||
@ -61,34 +48,24 @@ screenshot_*
|
||||
*.unsuccessfulbuild
|
||||
*.pdb
|
||||
*.db
|
||||
|
||||
# QtCreator / KDevelop
|
||||
*.user
|
||||
*.config
|
||||
*.creator*
|
||||
*.cflags
|
||||
*.cxxflags
|
||||
*.files
|
||||
*.includes
|
||||
*.kdev4
|
||||
/.kdev4
|
||||
|
||||
# Other IDEs / misc
|
||||
.vscode/
|
||||
.vs/
|
||||
*.sublime-*
|
||||
*.project
|
||||
*.cproject
|
||||
*.settings
|
||||
*.cbp
|
||||
*.layout
|
||||
*.config
|
||||
*.creator*
|
||||
*.files
|
||||
*.includes
|
||||
config.log
|
||||
*.sconsign.dblite
|
||||
*.sconf_temp
|
||||
*.gch
|
||||
*.pyc
|
||||
*.xcodeproj
|
||||
*.plist
|
||||
*.lproj
|
||||
*.opensdf
|
||||
*.sdf
|
||||
/font/
|
||||
compile_commands.json
|
||||
ignore/
|
||||
site_scons/site_tools/mfprogram/*.pyc
|
||||
site_scons/site_tools/gch/*.pyc
|
||||
.vscode/
|
||||
.vs/
|
||||
|
||||
screenshot_*
|
||||
|
54
README.md
@ -1,4 +1,4 @@
|
||||
The Powder Toy - April 2024
|
||||
The Powder Toy - February 2019
|
||||
==========================
|
||||
|
||||
Get the latest version [from the Powder Toy website](https://powdertoy.co.uk/Download.html).
|
||||
@ -10,12 +10,15 @@ Have you ever wanted to blow something up? Or maybe you always dreamt of operati
|
||||
|
||||
The Powder Toy is a free physics sandbox game, which simulates air pressure and velocity, heat, gravity and a countless number of interactions between different substances! The game provides you with various building materials, liquids, gases and electronic components which can be used to construct complex machines, guns, bombs, realistic terrains and almost anything else. You can then mine them and watch cool explosions, add intricate wirings, play with little stickmen or operate your machine. You can browse and play thousands of different saves made by the community or upload your own – we welcome your creations!
|
||||
|
||||
There is a Lua API – you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development.
|
||||
There is a Lua API – you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development. TPT is compiled using scons.
|
||||
|
||||
Build instructions
|
||||
===========================================================================
|
||||
|
||||
See the _Powder Toy Development Help_ section [on the main page of the wiki](https://powdertoy.co.uk/Wiki/W/Main_Page.html).
|
||||
sudo apt-get install build-essential libsdl2-dev libbz2-dev zlib1g-dev liblua5.1.0-dev git scons libfftw3-dev libcurl4-openssl-dev
|
||||
scons
|
||||
|
||||
For a list of flags for `scons`, see [the Powder Toy wiki](https://powdertoy.co.uk/Wiki/W/Scons_command_line_flags.html).
|
||||
|
||||
Thanks
|
||||
===========================================================================
|
||||
@ -25,39 +28,25 @@ Thanks
|
||||
* Skresanov Savely
|
||||
* cracker64
|
||||
* Catelite
|
||||
* Victoria Hoyle
|
||||
* Bryan Hoyle
|
||||
* Nathan Cousins
|
||||
* jacksonmj
|
||||
* Felix Wallin
|
||||
* Lieuwe Mosch
|
||||
* Anthony Boot
|
||||
* Me4502
|
||||
* Matthew "me4502"
|
||||
* MaksProg
|
||||
* jacob1
|
||||
* mniip
|
||||
* LBPHacker
|
||||
|
||||
Libraries and other assets used
|
||||
===========================================================================
|
||||
|
||||
* [BSON](https://github.com/interactive-matter/bson-c)
|
||||
* [bzip2](http://www.bzip.org/)
|
||||
* [FFTW](http://fftw.org/)
|
||||
* [JsonCpp](https://github.com/open-source-parsers/jsoncpp)
|
||||
* [libcurl](https://curl.se/libcurl/)
|
||||
* [libpng](http://www.libpng.org/pub/png/libpng.html)
|
||||
* [Lua](https://www.lua.org/)
|
||||
* [LuaJIT](https://luajit.org/)
|
||||
* [Mallangche](https://github.com/JammPark/Mallangche)
|
||||
* [mbedtls](https://www.trustedfirmware.org/projects/mbed-tls/)
|
||||
* [SDL](https://libsdl.org/)
|
||||
* [zlib](https://www.zlib.net/)
|
||||
|
||||
Instructions
|
||||
===========================================================================
|
||||
|
||||
Click on the elements with the mouse and draw in the field, like in MS Paint. The rest of the game is learning what happens next.
|
||||
|
||||
|
||||
Controls
|
||||
===========================================================================
|
||||
|
||||
@ -82,7 +71,6 @@ Controls
|
||||
| I | Invert Pressure and Velocity map |
|
||||
| W | Cycle gravity modes (use with Ctrl when STK2 is out) |
|
||||
| Y | Cycle air modes |
|
||||
| Ctrl + E | Cycle edge modes |
|
||||
| B | Enter decoration editor menu |
|
||||
| Ctrl + B | Toggle decorations on/off |
|
||||
| N | Toggle Newtonian Gravity on/off |
|
||||
@ -108,21 +96,17 @@ Controls
|
||||
| Shift + R | Horizontal mirror for selected area when pasting stamps |
|
||||
| Ctrl + Shift + R | Vertical mirror for selected area when pasting stamps |
|
||||
| R | Rotate selected area counterclockwise when pasting stamps |
|
||||
| F11 | Toggle fullscreen |
|
||||
|
||||
|
||||
|
||||
Command Line
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
| Command | Description | Example |
|
||||
| --------------------- | ------------------------------------------------ | --------------------------------------------|
|
||||
| `scale:SIZE` | Change window scale factor | `scale:2` |
|
||||
| `kiosk` | Fullscreen mode | |
|
||||
| `proxy:SERVER[:PORT]` | Proxy server to use | `proxy:wwwcache.lancs.ac.uk:8080` |
|
||||
| `open FILE` | Opens the file as a stamp or game save | |
|
||||
| `ddir DIRECTORY` | Directory used for saving stamps and preferences | |
|
||||
| `ptsave:SAVEID` | Open online save, used by ptsave: URLs | `ptsave:2198` |
|
||||
| `disable-network` | Disables internet connections | |
|
||||
| `disable-bluescreen` | Disable bluescreen handler | |
|
||||
| `redirect` | Redirects output to stdout.txt / stderr.txt | |
|
||||
| `cafile:CAFILE` | Set certificate bundle path | `cafile:/etc/ssl/certs/ca-certificates.crt` |
|
||||
| `capath:CAPATH` | Set certificate directory path | `capath:/etc/ssl/certs` |
|
||||
| Command | Description | Example |
|
||||
| --------------------- | ------------------------------------------------ | --------------------------------- |
|
||||
| `scale:SIZE` | Change window scale factor | `scale:2` |
|
||||
| `kiosk` | Fullscreen mode | |
|
||||
| `proxy:SERVER[:PORT]` | Proxy server to use | `proxy:wwwcache.lancs.ac.uk:8080` |
|
||||
| `open FILE` | Opens the file as a stamp or game save | |
|
||||
| `ddir DIRECTORY` | Directory used for saving stamps and preferences | |
|
||||
| `ptsave:SAVEID` | Open online save, used by ptsave: URLs | `ptsave:2198` |
|
||||
|
603
SConscript
Normal file
@ -0,0 +1,603 @@
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import platform
|
||||
import atexit
|
||||
import time
|
||||
import SCons.Util
|
||||
|
||||
|
||||
# because of an implementation detail commandlines are limited to 10000 characters on windows using mingw. the following fix was copied from
|
||||
# http://scons.org/wiki/LongCmdLinesOnWin32 and circumvents this issue.
|
||||
class ourSpawn:
|
||||
def ourspawn(self, sh, escape, cmd, args, env):
|
||||
newargs = ' '.join(args[1:])
|
||||
cmdline = cmd + " " + newargs
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
||||
proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, env=env)
|
||||
data, err = proc.communicate()
|
||||
rv = proc.wait()
|
||||
if rv:
|
||||
print("=====")
|
||||
print(err)
|
||||
print("=====")
|
||||
return rv
|
||||
def SetupSpawn(env):
|
||||
buf = ourSpawn()
|
||||
buf.ourenv = env
|
||||
env['SPAWN'] = buf.ourspawn
|
||||
|
||||
def FatalError(message):
|
||||
print(message)
|
||||
raise SystemExit(1)
|
||||
|
||||
#wrapper around SCons' AddOption
|
||||
def AddSconsOption(name, default, hasArgs, help):
|
||||
AddOption("--{0}".format(name), dest=name, action=("store" if hasArgs else "store_true"), default=default, help=help)
|
||||
|
||||
AddSconsOption('win', False, False, "Target Windows.")
|
||||
AddSconsOption('lin', False, False, "Target Linux.")
|
||||
AddSconsOption('mac', False, False, "Target Mac OS X.")
|
||||
AddSconsOption('msvc', False, False, "Use the Microsoft Visual Studio compiler.")
|
||||
AddSconsOption("tool", False, True, "Tool prefix appended before gcc/g++.")
|
||||
|
||||
AddSconsOption('beta', False, False, "Beta build.")
|
||||
AddSconsOption('no-install-prompt', False, False, "Disable the \"do you want to install Powder Toy?\" prompt.")
|
||||
AddSconsOption('save-version', False, True, "Save version.")
|
||||
AddSconsOption('minor-version', False, True, "Minor version.")
|
||||
AddSconsOption('build-number', False, True, "Build number.")
|
||||
AddSconsOption('snapshot', False, False, "Snapshot build.")
|
||||
AddSconsOption('snapshot-id', False, True, "Snapshot build ID.")
|
||||
|
||||
AddSconsOption('64bit', False, False, "Compile a 64 bit binary.")
|
||||
AddSconsOption('32bit', False, False, "Compile a 32 bit binary.")
|
||||
AddSconsOption("universal", False, False, "compile universal binaries on Mac OS X.")
|
||||
AddSconsOption('no-sse', False, False, "Disable SSE optimizations.")
|
||||
AddSconsOption('sse', True, False, "Enable SSE optimizations (default).")
|
||||
AddSconsOption('sse2', True, False, "Enable SSE2 optimizations (default).")
|
||||
AddSconsOption('sse3', False, False, "Enable SSE3 optimizations.")
|
||||
AddSconsOption('native', False, False, "Enable optimizations specific to your cpu.")
|
||||
AddSconsOption('release', False, False, "Enable loop / compiling optimizations.")
|
||||
|
||||
AddSconsOption('debugging', False, False, "Compile with debug symbols.")
|
||||
AddSconsOption('symbols', False, False, "Preserve (don't strip) symbols")
|
||||
AddSconsOption('static', False, False, "Compile statically.")
|
||||
AddSconsOption('opengl', False, False, "Build with OpenGL interface support.")
|
||||
AddSconsOption('opengl-renderer', False, False, "Build with OpenGL renderer support (turns on --opengl).") #Note: this has nothing to do with --renderer, only tells the game to render particles with opengl
|
||||
AddSconsOption('renderer', False, False, "Build the save renderer.")
|
||||
AddSconsOption('font', False, False, "Build the font editor.")
|
||||
|
||||
AddSconsOption('wall', False, False, "Error on all warnings.")
|
||||
AddSconsOption('no-warnings', False, False, "Disable all compiler warnings.")
|
||||
AddSconsOption('nolua', False, False, "Disable Lua.")
|
||||
AddSconsOption('luajit', False, False, "Enable LuaJIT.")
|
||||
AddSconsOption('lua52', False, False, "Compile using lua 5.2.")
|
||||
AddSconsOption('nofft', False, False, "Disable FFT.")
|
||||
AddSconsOption('nohttp', False, False, "Disable http requests and libcurl.")
|
||||
AddSconsOption("output", False, True, "Executable output name.")
|
||||
|
||||
|
||||
#detect platform automatically, but it can be overrided
|
||||
tool = GetOption('tool')
|
||||
isX86 = platform.machine() in ["amd64", "AMD64", "i386", "i686", "x86", "x86_64"]
|
||||
platform = compilePlatform = platform.system()
|
||||
if GetOption('win'):
|
||||
platform = "Windows"
|
||||
elif GetOption('lin'):
|
||||
platform = "Linux"
|
||||
elif GetOption('mac'):
|
||||
platform = "Darwin"
|
||||
elif compilePlatform not in ["Linux", "Windows", "Darwin", "FreeBSD"]:
|
||||
FatalError("Unknown platform: {0}".format(platform))
|
||||
|
||||
msvc = GetOption('msvc')
|
||||
if msvc and platform != "Windows":
|
||||
FatalError("Error: --msvc only works on windows")
|
||||
|
||||
#Create SCons Environment
|
||||
if GetOption('msvc'):
|
||||
env = Environment(tools=['default'], ENV=os.environ, TARGET_ARCH='x86')
|
||||
elif platform == "Windows" and not GetOption('msvc'):
|
||||
env = Environment(tools=['mingw'], ENV=os.environ)
|
||||
else:
|
||||
env = Environment(tools=['default'], ENV=os.environ)
|
||||
|
||||
#attempt to automatically find cross compiler
|
||||
if not tool and compilePlatform == "Linux" and platform == "Windows" and compilePlatform != platform:
|
||||
if not GetOption('64bit'):
|
||||
crossList = ["mingw32", "i686-w64-mingw32", "i386-mingw32msvc", "i486-mingw32msvc", "i586-mingw32msvc", "i686-mingw32msvc"]
|
||||
else:
|
||||
crossList = ["x86_64-w64-mingw32", "amd64-mingw32msvc"]
|
||||
for i in crossList:
|
||||
#found a cross compiler, set tool here, which will update everything in env later
|
||||
if WhereIs("{0}-g++".format(i)):
|
||||
tool = i+"-"
|
||||
break
|
||||
if not tool:
|
||||
print("Could not automatically find cross compiler, use --tool to specify manually")
|
||||
|
||||
#set tool prefix
|
||||
#more things may need to be set (http://clam-project.org/clam/trunk/CLAM/scons/sconstools/crossmingw.py), but this works for us
|
||||
if tool:
|
||||
env['CC'] = tool+env['CC']
|
||||
env['CXX'] = tool+env['CXX']
|
||||
if platform == "Windows":
|
||||
env['RC'] = tool+env['RC']
|
||||
env['STRIP'] = tool+'strip'
|
||||
if os.path.isdir("/usr/{0}/bin".format(tool[:-1])):
|
||||
env['ENV']['PATH'] = "/usr/{0}/bin:{1}".format(tool[:-1], os.environ['PATH'])
|
||||
|
||||
#copy environment variables because scons doesn't do this by default
|
||||
for var in ["CC","CXX","LD","LIBPATH","STRIP"]:
|
||||
if var in os.environ:
|
||||
env[var] = os.environ[var]
|
||||
print("copying environment variable {0}={1!r}".format(var,os.environ[var]))
|
||||
# variables containing several space separated things
|
||||
for var in ["CFLAGS","CCFLAGS","CXXFLAGS","LINKFLAGS","CPPDEFINES","CPPPATH"]:
|
||||
if var in os.environ:
|
||||
if var in env:
|
||||
env[var] += SCons.Util.CLVar(os.environ[var])
|
||||
else:
|
||||
env[var] = SCons.Util.CLVar(os.environ[var])
|
||||
print("copying environment variable {0}={1!r}".format(var,os.environ[var]))
|
||||
|
||||
#Used for intro text / executable name, actual bit flags are only set if the --64bit/--32bit command line args are given
|
||||
def add32bitflags(env):
|
||||
env["BIT"] = 32
|
||||
def add64bitflags(env):
|
||||
if platform == "Windows":
|
||||
env.Append(CPPDEFINES=['__CRT__NO_INLINE'])
|
||||
env.Append(LINKFLAGS=['-Wl,--stack=16777216'])
|
||||
env.Append(CPPDEFINES=['_64BIT'])
|
||||
env["BIT"] = 64
|
||||
#add 32/64 bit defines before configuration
|
||||
if GetOption('64bit'):
|
||||
env.Append(LINKFLAGS=['-m64'])
|
||||
env.Append(CCFLAGS=['-m64'])
|
||||
add64bitflags(env)
|
||||
elif GetOption('32bit'):
|
||||
env.Append(LINKFLAGS=['-m32'])
|
||||
env.Append(CCFLAGS=['-m32'])
|
||||
add32bitflags(env)
|
||||
|
||||
if GetOption('universal'):
|
||||
if platform != "Darwin":
|
||||
FatalError("Error: --universal only works on Mac OS X")
|
||||
else:
|
||||
env.Append(CCFLAGS=['-arch', 'i386', '-arch', 'x86_64'])
|
||||
env.Append(LINKFLAGS=['-arch', 'i386', '-arch', 'x86_64'])
|
||||
|
||||
env.Append(CPPPATH=['src/', 'data/', 'generated/'])
|
||||
if GetOption("msvc"):
|
||||
if GetOption("static"):
|
||||
env.Append(LIBPATH=['StaticLibs/'])
|
||||
else:
|
||||
env.Append(LIBPATH=['Libraries/'])
|
||||
env.Append(CPPPATH=['includes/', 'resources/'])
|
||||
|
||||
#Check 32/64 bit
|
||||
def CheckBit(context):
|
||||
context.Message('Checking if 64 bit... ')
|
||||
program = """#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
int main() {
|
||||
printf("%d", (int)sizeof(size_t));
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
ret = context.TryCompile(program, '.c')
|
||||
if ret == 0:
|
||||
return False
|
||||
ret = context.TryRun(program, '.c')
|
||||
if ret[1] == '':
|
||||
return False
|
||||
context.Result(int(ret[1]) == 8)
|
||||
if int(ret[1]) == 8:
|
||||
print("Adding 64 bit compile flags")
|
||||
add64bitflags(context.env)
|
||||
elif int(ret[1]) == 4:
|
||||
print("Adding 32 bit compile flags")
|
||||
add32bitflags(context.env)
|
||||
return ret[1]
|
||||
|
||||
#Custom function to check for Mac OS X frameworks
|
||||
def CheckFramework(context, framework):
|
||||
import SCons.Conftest
|
||||
#Extreme hack, TODO: maybe think of a better one (like replicating CheckLib here) or at least just fix the message
|
||||
oldLinkFlags = env["LINKFLAGS"]
|
||||
context.env.Append(LINKFLAGS=["-framework", framework])
|
||||
context.Display("Checking for Darwin Framework {0}...".format(framework))
|
||||
ret = SCons.Conftest.CheckLib(context, ["m"], autoadd = 0)
|
||||
context.did_show_result = 1
|
||||
if not ret:
|
||||
context.env.Append(LINKFLAGS=["-framework", framework])
|
||||
if framework != "Cocoa":
|
||||
env.Append(CPPPATH=['/Library/Frameworks/{0}.framework/Headers/'.format(framework)])
|
||||
else:
|
||||
context.env.Replace(LINKFLAGS=oldLinkFlags)
|
||||
return not ret
|
||||
|
||||
#function that finds libraries and appends them to LIBS
|
||||
def findLibs(env, conf):
|
||||
#Windows specific libs
|
||||
if platform == "Windows":
|
||||
if msvc:
|
||||
libChecks = ['shell32', 'wsock32', 'user32', 'Advapi32', 'ws2_32', 'Wldap32', 'crypt32']
|
||||
if GetOption('static'):
|
||||
libChecks += ['imm32', 'version', 'Ole32', 'OleAut32']
|
||||
for i in libChecks:
|
||||
if not conf.CheckLib(i):
|
||||
FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly")
|
||||
else:
|
||||
if not conf.CheckLib('mingw32') or not conf.CheckLib('ws2_32'):
|
||||
FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly")
|
||||
|
||||
if not GetOption('renderer') and not conf.CheckLib('SDL2main'):
|
||||
FatalError("libSDL2main not found or not installed")
|
||||
|
||||
#Look for SDL
|
||||
runSdlConfig = platform == "Linux" or compilePlatform == "Linux" or platform == "FreeBSD"
|
||||
if platform == "Darwin" and conf.CheckFramework("SDL2"):
|
||||
runSdlConfig = False
|
||||
elif not conf.CheckLib("SDL2"):
|
||||
FatalError("SDL2 development library not found or not installed")
|
||||
|
||||
if runSdlConfig:
|
||||
try:
|
||||
env.ParseConfig('sdl2-config --cflags')
|
||||
if GetOption('static'):
|
||||
env.ParseConfig('sdl2-config --static-libs')
|
||||
else:
|
||||
env.ParseConfig('sdl2-config --libs')
|
||||
except:
|
||||
pass
|
||||
|
||||
#look for SDL.h
|
||||
if conf.CheckCHeader('SDL2/SDL.h'):
|
||||
env.Append(CPPDEFINES=["SDL_INC"])
|
||||
elif not conf.CheckCHeader('SDL.h'):
|
||||
FatalError("SDL.h not found")
|
||||
|
||||
if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'):
|
||||
#Look for Lua
|
||||
if platform == "FreeBSD":
|
||||
luaver = "lua-5.1"
|
||||
else:
|
||||
luaver = "lua5.1"
|
||||
if GetOption('luajit'):
|
||||
if not conf.CheckLib(['luajit-5.1', 'luajit5.1', 'luajit2.0', 'luajit', 'libluajit']):
|
||||
FatalError("luajit development library not found or not installed")
|
||||
env.Append(CPPDEFINES=["LUAJIT"])
|
||||
luaver = "luajit"
|
||||
elif GetOption('lua52'):
|
||||
if not conf.CheckLib(['lua5.2', 'lua-5.2', 'lua52', 'lua']):
|
||||
FatalError("lua5.2 development library not found or not installed")
|
||||
env.Append(CPPDEFINES=["LUA_COMPAT_ALL"])
|
||||
if platform == "FreeBSD":
|
||||
luaver = "lua-5.2"
|
||||
else:
|
||||
luaver = "lua5.2"
|
||||
else:
|
||||
if not conf.CheckLib(['lua5.1', 'lua-5.1', 'lua51', 'lua']):
|
||||
if platform != "Darwin" or not conf.CheckFramework("Lua"):
|
||||
FatalError("lua5.1 development library not found or not installed")
|
||||
foundpkg = False
|
||||
if platform == "Linux" or platform == "FreeBSD":
|
||||
try:
|
||||
env.ParseConfig("pkg-config --cflags {0}".format(luaver))
|
||||
env.ParseConfig("pkg-config --libs {0}".format(luaver))
|
||||
env.Append(CPPDEFINES=["LUA_R_INCL"])
|
||||
foundpkg = True
|
||||
except:
|
||||
pass
|
||||
if not foundpkg:
|
||||
#Look for lua.h
|
||||
foundheader = False
|
||||
if GetOption('luajit'):
|
||||
foundheader = conf.CheckCHeader('luajit-2.0/lua.h')
|
||||
elif GetOption('lua52'):
|
||||
foundheader = conf.CheckCHeader('lua5.2/lua.h') or conf.CheckCHeader('lua52/lua.h')
|
||||
else:
|
||||
foundheader = conf.CheckCHeader('lua5.1/lua.h') or conf.CheckCHeader('lua51/lua.h')
|
||||
if not foundheader:
|
||||
if conf.CheckCHeader('lua.h'):
|
||||
env.Append(CPPDEFINES=["LUA_R_INCL"])
|
||||
else:
|
||||
FatalError("lua.h not found")
|
||||
|
||||
#needed for static lua compiles (in some cases)
|
||||
if platform == "Linux":
|
||||
conf.CheckLib('dl')
|
||||
|
||||
#Look for fftw
|
||||
if not GetOption('nofft') and not GetOption('renderer') and not conf.CheckLib(['fftw3f', 'fftw3f-3', 'libfftw3f-3', 'libfftw3f']):
|
||||
FatalError("fftw3f development library not found or not installed")
|
||||
|
||||
#Look for bz2
|
||||
if not conf.CheckLib(['bz2', 'libbz2']):
|
||||
FatalError("bz2 development library not found or not installed")
|
||||
|
||||
#Check bz2 header too for some reason
|
||||
if not conf.CheckCHeader('bzlib.h'):
|
||||
FatalError("bzip2 headers not found")
|
||||
|
||||
#Look for libz
|
||||
if not conf.CheckLib(['z', 'zlib']):
|
||||
FatalError("libz not found or not installed")
|
||||
|
||||
#Look for libcurl
|
||||
useCurl = not GetOption('nohttp') and not GetOption('renderer')
|
||||
if useCurl and not conf.CheckLib(['curl', 'libcurl']):
|
||||
FatalError("libcurl not found or not installed")
|
||||
|
||||
if useCurl and (platform == "Linux" or compilePlatform == "Linux" or platform == "FreeBSD"):
|
||||
if GetOption('static'):
|
||||
env.ParseConfig("curl-config --static-libs")
|
||||
else:
|
||||
env.ParseConfig("curl-config --libs")
|
||||
|
||||
#Look for pthreads
|
||||
if not conf.CheckLib(['pthread', 'pthreadVC2']):
|
||||
FatalError("pthreads development library not found or not installed")
|
||||
|
||||
if msvc:
|
||||
if not conf.CheckHeader('dirent.h') or not conf.CheckHeader('fftw3.h') or not conf.CheckHeader('pthread.h') or not conf.CheckHeader('zlib.h'):
|
||||
FatalError("Required headers not found")
|
||||
else:
|
||||
#Look for libm
|
||||
if not conf.CheckLib('m'):
|
||||
FatalError("libm not found or not installed")
|
||||
|
||||
#Look for OpenGL libraries
|
||||
if GetOption('opengl'):
|
||||
if platform == "Linux" or platform == "FreeBSD":
|
||||
if not conf.CheckLib('GL'):
|
||||
FatalError("libGL not found or not installed")
|
||||
try:
|
||||
env.ParseConfig('pkg-config --libs glew gl glu')
|
||||
except:
|
||||
FatalError(sys.exc_info()[0])
|
||||
|
||||
elif platform == "Windows":
|
||||
if not conf.CheckLib('opengl32'):
|
||||
FatalError("opengl32 not found or not installed")
|
||||
if not conf.CheckLib('glew32'):
|
||||
FatalError("glew32 not found or not installed")
|
||||
elif platform == "Darwin":
|
||||
if not conf.CheckFramework("OpenGL"):
|
||||
FatalError("OpenGL framework not found or not installed")
|
||||
|
||||
if platform == "Linux" or platform == "FreeBSD":
|
||||
if not conf.CheckLib('X11'):
|
||||
FatalError("X11 development library not found or not installed")
|
||||
|
||||
if not conf.CheckLib('rt'):
|
||||
FatalError("librt not found or not installed")
|
||||
elif platform == "Windows":
|
||||
#These need to go last
|
||||
if not conf.CheckLib('gdi32') or not conf.CheckLib('winmm') or (not msvc and not conf.CheckLib('dxguid')):
|
||||
FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly")
|
||||
elif platform == "Darwin":
|
||||
if not conf.CheckFramework("Cocoa"):
|
||||
FatalError("Cocoa framework not found or not installed")
|
||||
|
||||
if GetOption('clean'):
|
||||
import shutil
|
||||
try:
|
||||
shutil.rmtree("generated/")
|
||||
except:
|
||||
print("couldn't remove build/generated/")
|
||||
elif not GetOption('help'):
|
||||
conf = Configure(env)
|
||||
conf.AddTest('CheckFramework', CheckFramework)
|
||||
conf.AddTest('CheckBit', CheckBit)
|
||||
if not conf.CheckCC() or not conf.CheckCXX():
|
||||
FatalError("compiler not correctly configured")
|
||||
if platform == compilePlatform and isX86 and not GetOption('32bit') and not GetOption('64bit') and not GetOption('msvc'):
|
||||
conf.CheckBit()
|
||||
findLibs(env, conf)
|
||||
env = conf.Finish()
|
||||
|
||||
if not msvc:
|
||||
env.Append(CXXFLAGS=['-std=c++11', '-U__STRICT_ANSI__'])
|
||||
env.Append(CXXFLAGS=['-Wno-invalid-offsetof'])
|
||||
if platform == "Linux":
|
||||
env.Append(CXXFLAGS=['-Wno-unused-result'])
|
||||
|
||||
|
||||
#Add platform specific flags and defines
|
||||
if platform == "Windows":
|
||||
env.Append(CPPDEFINES=["WIN", "_WIN32_WINNT=0x0501", "_USING_V110_SDK71_"])
|
||||
if msvc:
|
||||
env.Append(CCFLAGS=['/Gm', '/Zi', '/EHsc', '/FS', '/GS']) #enable minimal rebuild, ?, enable exceptions, allow -j to work in debug builds, enable security check
|
||||
if GetOption('renderer'):
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
|
||||
else:
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS,"5.01"'])
|
||||
env.Append(LINKFLAGS=['/OPT:REF', '/OPT:ICF'])
|
||||
env.Append(CPPDEFINES=['_SCL_SECURE_NO_WARNINGS']) #Disable warnings about 'std::print'
|
||||
if GetOption('static'):
|
||||
env.Append(LINKFLAGS=['/NODEFAULTLIB:msvcrt.lib', '/LTCG'])
|
||||
elif not GetOption('debugging'):
|
||||
env.Append(LINKFLAGS=['/NODEFAULTLIB:msvcrtd.lib'])
|
||||
else:
|
||||
env.Append(LINKFLAGS=['-mwindows'])
|
||||
elif platform == "Linux" or platform == "FreeBSD":
|
||||
env.Append(CPPDEFINES=['LIN'])
|
||||
elif platform == "Darwin":
|
||||
env.Append(CPPDEFINES=['MACOSX'])
|
||||
#env.Append(LINKFLAGS=['-headerpad_max_install_names']) #needed in some cross compiles
|
||||
if GetOption('luajit'):
|
||||
env.Append(LINKFLAGS=['-pagezero_size', '10000', '-image_base', '100000000'])
|
||||
|
||||
|
||||
#Add architecture flags and defines
|
||||
if isX86:
|
||||
env.Append(CPPDEFINES='X86')
|
||||
if not GetOption('no-sse'):
|
||||
if GetOption('sse'):
|
||||
if msvc:
|
||||
if not GetOption('sse2'):
|
||||
env.Append(CCFLAGS=['/arch:SSE'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['-msse'])
|
||||
env.Append(CPPDEFINES=['X86_SSE'])
|
||||
if GetOption('sse2'):
|
||||
if msvc:
|
||||
env.Append(CCFLAGS=['/arch:SSE2'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['-msse2'])
|
||||
env.Append(CPPDEFINES=['X86_SSE2'])
|
||||
if GetOption('sse3'):
|
||||
if msvc:
|
||||
FatalError("--sse3 doesn't work with --msvc")
|
||||
else:
|
||||
env.Append(CCFLAGS=['-msse3'])
|
||||
env.Append(CPPDEFINES=['X86_SSE3'])
|
||||
if GetOption('native') and not msvc:
|
||||
env.Append(CCFLAGS=['-march=native'])
|
||||
|
||||
|
||||
#Add optimization flags and defines
|
||||
if GetOption('debugging'):
|
||||
if msvc:
|
||||
env.Append(CCFLAGS=['/Od'])
|
||||
if GetOption('static'):
|
||||
env.Append(CCFLAGS=['/MTd'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['/MDd'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['-Wall', '-g'])
|
||||
env.Append(CPPDEFINES=['DEBUG'])
|
||||
elif GetOption('release'):
|
||||
if msvc:
|
||||
# Certain options (like /GL and /GS) cause TPT to be flagged as a virus. Don't include them
|
||||
env.Append(CCFLAGS=['/O2', '/Oy-', '/fp:fast'])
|
||||
if GetOption('static'):
|
||||
env.Append(CCFLAGS=['/MT'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['/MD'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['-O3', '-ftree-vectorize', '-funsafe-math-optimizations', '-ffast-math', '-fomit-frame-pointer'])
|
||||
if platform != "Darwin":
|
||||
env.Append(CCFLAGS=['-funsafe-loop-optimizations'])
|
||||
|
||||
if GetOption('static'):
|
||||
if platform == "Windows":
|
||||
env.Append(CPPDEFINES=['CURL_STATICLIB'])
|
||||
if compilePlatform == "Windows" and not msvc:
|
||||
env.Append(CPPDEFINES=['_PTW32_STATIC_LIB'])
|
||||
else:
|
||||
env.Append(CPPDEFINES=['PTW32_STATIC_LIB'])
|
||||
if msvc:
|
||||
env.Append(CPPDEFINES=['ZLIB_WINAPI'])
|
||||
else:
|
||||
env.Append(LINKFLAGS=['-Wl,-Bstatic'])
|
||||
|
||||
|
||||
#Add other flags and defines
|
||||
if not GetOption('nofft') and not GetOption('renderer'):
|
||||
env.Append(CPPDEFINES=['GRAVFFT'])
|
||||
if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'):
|
||||
env.Append(CPPDEFINES=['LUACONSOLE'])
|
||||
if GetOption('nohttp') or GetOption('renderer'):
|
||||
env.Append(CPPDEFINES=['NOHTTP'])
|
||||
|
||||
if GetOption('renderer'):
|
||||
env.Append(CPPDEFINES=['RENDERER'])
|
||||
|
||||
if GetOption('font'):
|
||||
env.Append(CPPDEFINES=['FONTEDITOR'])
|
||||
|
||||
if GetOption("wall"):
|
||||
if msvc:
|
||||
env.Append(CCFLAGS=['/WX'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['-Werror'])
|
||||
elif GetOption("no-warnings"):
|
||||
if msvc:
|
||||
env.Append(CCFLAGS=['/W0'])
|
||||
else:
|
||||
env.Append(CCFLAGS=['-w'])
|
||||
|
||||
|
||||
#Add version defines
|
||||
if GetOption('save-version'):
|
||||
env.Append(CPPDEFINES=["SAVE_VERSION={0}".format(GetOption('save-version'))])
|
||||
|
||||
if GetOption('minor-version'):
|
||||
env.Append(CPPDEFINES=["MINOR_VERSION={0}".format(GetOption('minor-version'))])
|
||||
|
||||
if GetOption('build-number'):
|
||||
env.Append(CPPDEFINES=["BUILD_NUM={0}".format(GetOption('build-number'))])
|
||||
|
||||
if GetOption('snapshot-id'):
|
||||
env.Append(CPPDEFINES=["SNAPSHOT", "SNAPSHOT_ID={0}".format(GetOption('snapshot-id'))])
|
||||
elif GetOption('snapshot'):
|
||||
env.Append(CPPDEFINES=["SNAPSHOT", "SNAPSHOT_ID={0}".format(str(int(time.time())))])
|
||||
|
||||
if GetOption('beta'):
|
||||
env.Append(CPPDEFINES=['BETA'])
|
||||
if GetOption('no-install-prompt'):
|
||||
env.Append(CPPDEFINES=['NO_INSTALL_CHECK'])
|
||||
|
||||
|
||||
#Generate list of sources to compile
|
||||
sources = Glob("src/*.cpp") + Glob("src/*/*.cpp") + Glob("src/*/*/*.cpp") + Glob("generated/*.cpp") + Glob("data/*.cpp")
|
||||
if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'):
|
||||
sources += Glob("src/lua/socket/*.c") + Glob("src/lua/LuaCompat.c")
|
||||
|
||||
if platform == "Windows":
|
||||
sources += env.RES('resources/powder-res.rc')
|
||||
if not msvc:
|
||||
sources = filter(lambda source: not 'src\\simulation\\Gravity.cpp' in str(source), sources)
|
||||
sources = filter(lambda source: not 'src/simulation/Gravity.cpp' in str(source), sources)
|
||||
envCopy = env.Clone()
|
||||
envCopy.Append(CCFLAGS='-mstackrealign')
|
||||
sources += envCopy.Object('src/simulation/Gravity.cpp')
|
||||
#elif platform == "Darwin":
|
||||
# sources += ["src/SDLMain.m"]
|
||||
|
||||
|
||||
#Program output name
|
||||
if GetOption('output'):
|
||||
programName = GetOption('output')
|
||||
else:
|
||||
programName = "powder"
|
||||
if GetOption('renderer'):
|
||||
programName = "render"
|
||||
if GetOption('font'):
|
||||
programName = "font"
|
||||
if "BIT" in env and env["BIT"] == 64:
|
||||
programName += "64"
|
||||
if isX86 and GetOption('no-sse'):
|
||||
programName += "-legacy"
|
||||
if platform == "Windows":
|
||||
programName = programName.capitalize()
|
||||
programName += ".exe"
|
||||
elif platform == "Darwin":
|
||||
programName += "-x"
|
||||
|
||||
#strip binary after compilation
|
||||
def strip():
|
||||
global programName
|
||||
global env
|
||||
try:
|
||||
os.system("{0} {1}/{2}".format(env['STRIP'] if 'STRIP' in env else "strip", GetOption('builddir'), programName))
|
||||
except:
|
||||
print("Couldn't strip binary")
|
||||
if not GetOption('debugging') and not GetOption('symbols') and not GetOption('clean') and not GetOption('help') and not msvc:
|
||||
atexit.register(strip)
|
||||
|
||||
#Long command line fix for mingw on windows
|
||||
if compilePlatform == "Windows" and not msvc:
|
||||
SetupSpawn(env)
|
||||
|
||||
#Once we get here, finally compile
|
||||
env.Decider('MD5-timestamp')
|
||||
SetOption('implicit_cache', 1)
|
||||
t = env.Program(target=programName, source=sources)
|
||||
Default(t)
|
28
SConstruct
Normal file
@ -0,0 +1,28 @@
|
||||
import sys
|
||||
#run generator.py
|
||||
if not GetOption('clean'):
|
||||
if sys.version_info[0] < 3:
|
||||
execfile("generator.py")
|
||||
else:
|
||||
with open("generator.py") as f:
|
||||
code = compile(f.read(), "generator.py", 'exec')
|
||||
exec(code)
|
||||
|
||||
AddOption('--builddir',dest="builddir",default="build",help="Directory to build to.")
|
||||
SConscript('SConscript', variant_dir=GetOption('builddir'), duplicate=0)
|
||||
if GetOption('clean'):
|
||||
import os, shutil
|
||||
try:
|
||||
shutil.rmtree(".sconf_temp/")
|
||||
except:
|
||||
print("couldn't remove .sconf_temp/")
|
||||
|
||||
try:
|
||||
shutil.rmtree("generated/")
|
||||
except:
|
||||
print("couldn't remove generated/")
|
||||
|
||||
try:
|
||||
os.remove(".sconsign.dblite")
|
||||
except:
|
||||
print("couldn't remove .sconsign.dblite")
|
19
TODO
Normal file
@ -0,0 +1,19 @@
|
||||
HTTP API:
|
||||
Make it OO,
|
||||
Use STL (i.e std::string for url, etc)
|
||||
|
||||
RequestBroker:
|
||||
APIRequest:
|
||||
Standard StatusParser and Status object ( {Status: 0, Error = "Danger, Will Robinson!"} )
|
||||
Request:
|
||||
Some way of identifying multiple requests destined for the same listener
|
||||
|
||||
Client/Server API:
|
||||
Make more use of APIRequest so we can get rid of the pooey, flakey threading in PreviewView, etc
|
||||
|
||||
Interface General:
|
||||
Try to use the "Activity" model for some simpler interfaces instead of code-heavy M-V-C
|
||||
Move interfaces into separate folder
|
||||
|
||||
Interface Elements:
|
||||
Vertical Scrolling for Textbox,
|
@ -1,69 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="@APPID@"
|
||||
android:versionCode="@BUILD_NUM@"
|
||||
android:versionName="@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@.@BUILD_NUM@"
|
||||
android:installLocation="auto"
|
||||
>
|
||||
<uses-sdk
|
||||
android:minSdkVersion="21"
|
||||
android:targetSdkVersion="30"
|
||||
/>
|
||||
<uses-feature
|
||||
android:glEsVersion="0x00020000"
|
||||
/>
|
||||
<uses-feature
|
||||
android:name="android.hardware.touchscreen"
|
||||
android:required="false"
|
||||
/>
|
||||
<uses-feature
|
||||
android:name="android.hardware.bluetooth"
|
||||
android:required="false"
|
||||
/>
|
||||
<uses-feature
|
||||
android:name="android.hardware.gamepad"
|
||||
android:required="false"
|
||||
/>
|
||||
<uses-feature
|
||||
android:name="android.hardware.usb.host"
|
||||
android:required="false"
|
||||
/>
|
||||
<uses-feature
|
||||
android:name="android.hardware.type.pc"
|
||||
android:required="false"
|
||||
/>
|
||||
@ANDROID_PERMISSIONS@
|
||||
<application
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:allowBackup="true"
|
||||
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
|
||||
android:hardwareAccelerated="true"
|
||||
@ANDROID_PROPERTIES@
|
||||
>
|
||||
<activity
|
||||
android:name=".PowderActivity"
|
||||
android:screenOrientation="landscape"
|
||||
android:label="@string/app_name"
|
||||
android:alwaysRetainTaskState="true"
|
||||
android:launchMode="singleInstance"
|
||||
android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
|
||||
android:preferMinimalPostProcessing="true"
|
||||
android:exported="true"
|
||||
>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<!-- <intent-filter>
|
||||
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="*/*" />
|
||||
</intent-filter> -->
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
@ -1,42 +0,0 @@
|
||||
package @APPID@;
|
||||
|
||||
import org.libsdl.app.SDLActivity;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Enumeration;
|
||||
import java.io.IOException;
|
||||
import java.util.Base64;
|
||||
|
||||
public class PowderActivity extends SDLActivity
|
||||
{
|
||||
public static String getCertificateBundle()
|
||||
{
|
||||
String allPems = "";
|
||||
try {
|
||||
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
|
||||
if (ks != null) {
|
||||
ks.load(null, null);
|
||||
Enumeration<String> aliases = ks.aliases();
|
||||
while (aliases.hasMoreElements()) {
|
||||
String alias = (String)aliases.nextElement();
|
||||
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate)ks.getCertificate(alias);
|
||||
allPems += "-----BEGIN CERTIFICATE-----\n" + Base64.getMimeEncoder().encodeToString(cert.getEncoded()) + "\n-----END CERTIFICATE-----\n";;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
} catch (KeyStoreException e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
} catch (java.security.cert.CertificateException e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
}
|
||||
return allPems;
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
import os
|
||||
import os.path
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
(
|
||||
script,
|
||||
zipalign,
|
||||
build_dir,
|
||||
unsigned_name,
|
||||
unaligned_name,
|
||||
) = sys.argv
|
||||
|
||||
unaligned_path = os.path.join(build_dir, unaligned_name)
|
||||
unsigned_path = os.path.join(build_dir, unsigned_name)
|
||||
|
||||
if os.path.exists(unsigned_path):
|
||||
os.remove(unsigned_path)
|
||||
|
||||
if subprocess.run([
|
||||
zipalign,
|
||||
'-f', '4',
|
||||
unaligned_path,
|
||||
unsigned_path,
|
||||
]).returncode:
|
||||
sys.exit(1)
|
@ -1,104 +0,0 @@
|
||||
import os
|
||||
import os.path
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
(
|
||||
script,
|
||||
d8,
|
||||
aapt,
|
||||
aapt2,
|
||||
source_dir,
|
||||
build_dir,
|
||||
private_name,
|
||||
unaligned_name,
|
||||
sha_name,
|
||||
android_jar,
|
||||
sdl_jar,
|
||||
powder_jar,
|
||||
tpt_arch,
|
||||
debug_release,
|
||||
manifest_xml,
|
||||
*resources,
|
||||
) = sys.argv
|
||||
|
||||
if tpt_arch == 'x86':
|
||||
android_arch = 'x86'
|
||||
if tpt_arch == 'arm':
|
||||
android_arch = 'armeabi-v7a'
|
||||
if tpt_arch == 'aarch64':
|
||||
android_arch = 'arm64-v8a'
|
||||
if tpt_arch == 'x86_64':
|
||||
android_arch = 'x86_64'
|
||||
|
||||
sha_packaged_name = 'libpowder.so'
|
||||
|
||||
manifest_path = os.path.join(build_dir, manifest_xml)
|
||||
sha_path = os.path.join(build_dir, sha_name)
|
||||
unaligned_path = os.path.join(build_dir, unaligned_name)
|
||||
private_dir = os.path.join(build_dir, private_name)
|
||||
arch_dir = os.path.join(private_dir, 'lib', android_arch)
|
||||
sha_lib_path = os.path.join(arch_dir, sha_packaged_name)
|
||||
flat_dir = os.path.join(private_dir, 'flat')
|
||||
|
||||
if os.path.exists(arch_dir):
|
||||
shutil.rmtree(arch_dir)
|
||||
os.makedirs(arch_dir)
|
||||
if os.path.exists(sha_lib_path):
|
||||
os.remove(sha_lib_path)
|
||||
if os.path.exists(unaligned_path):
|
||||
os.remove(unaligned_path)
|
||||
if os.path.exists(flat_dir):
|
||||
shutil.rmtree(flat_dir)
|
||||
os.makedirs(flat_dir)
|
||||
|
||||
if subprocess.run([
|
||||
aapt2,
|
||||
'compile',
|
||||
'-o', os.path.join(private_dir, 'flat'),
|
||||
*resources,
|
||||
], cwd = build_dir).returncode:
|
||||
sys.exit(1)
|
||||
|
||||
aapt2_link_inputs = []
|
||||
for root, dirs, files in os.walk(flat_dir):
|
||||
for name in files:
|
||||
if name.endswith(".flat"):
|
||||
aapt2_link_inputs.append(os.path.join(root, name))
|
||||
if subprocess.run([
|
||||
aapt2,
|
||||
'link',
|
||||
'-o', unaligned_path,
|
||||
'-I', android_jar,
|
||||
'--manifest', manifest_path,
|
||||
*aapt2_link_inputs,
|
||||
]).returncode:
|
||||
sys.exit(1)
|
||||
|
||||
shutil.copy(sha_path, sha_lib_path)
|
||||
if subprocess.run([
|
||||
aapt,
|
||||
'add',
|
||||
unaligned_path,
|
||||
os.path.join('lib', android_arch, sha_packaged_name),
|
||||
], cwd = private_dir).returncode:
|
||||
sys.exit(1)
|
||||
|
||||
if subprocess.run([
|
||||
d8,
|
||||
os.path.join(build_dir, sdl_jar),
|
||||
os.path.join(build_dir, powder_jar),
|
||||
'--' + debug_release,
|
||||
'--lib', android_jar,
|
||||
'--min-api', '21',
|
||||
], cwd = private_dir).returncode:
|
||||
sys.exit(1)
|
||||
|
||||
if subprocess.run([
|
||||
aapt,
|
||||
'add',
|
||||
unaligned_path,
|
||||
'classes.dex',
|
||||
], cwd = private_dir).returncode:
|
||||
sys.exit(1)
|
@ -1,8 +0,0 @@
|
||||
[constants]
|
||||
android_ndk_toolchain_prefix = 'aarch64-linux-android21-'
|
||||
|
||||
[host_machine]
|
||||
system = 'android'
|
||||
cpu_family = 'aarch64'
|
||||
cpu = 'armv8'
|
||||
endian = 'little'
|
@ -1,8 +0,0 @@
|
||||
[constants]
|
||||
android_ndk_toolchain_prefix = 'armv7a-linux-androideabi21-'
|
||||
|
||||
[host_machine]
|
||||
system = 'android'
|
||||
cpu_family = 'arm'
|
||||
cpu = 'armv7a'
|
||||
endian = 'little'
|
@ -1,8 +0,0 @@
|
||||
[constants]
|
||||
android_ndk_toolchain_prefix = 'i686-linux-android21-'
|
||||
|
||||
[host_machine]
|
||||
system = 'android'
|
||||
cpu_family = 'x86'
|
||||
cpu = 'i686'
|
||||
endian = 'little'
|
@ -1,8 +0,0 @@
|
||||
[constants]
|
||||
android_ndk_toolchain_prefix = 'x86_64-linux-android21-'
|
||||
|
||||
[host_machine]
|
||||
system = 'android'
|
||||
cpu_family = 'x86_64'
|
||||
cpu = 'amd64'
|
||||
endian = 'little'
|
272
android/debug.sh
@ -1,272 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# mainly based on https://www.sh-zam.com/2019/05/debugging-krita-on-android.html
|
||||
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
function get_buildoption() {
|
||||
jq -r '.[] | select(.name == "'$1'") | .value' < meson-info/intro-buildoptions.json
|
||||
}
|
||||
|
||||
function get_cpp_compiler() {
|
||||
jq -r '.[] | select(.name == "'$1'") | .target_sources.[] | select(.language == "cpp") | .compiler.[]' < meson-info/intro-targets.json
|
||||
}
|
||||
|
||||
# customize
|
||||
default_app_id=uk.co.powdertoy.tpt
|
||||
default_app_exe=powder
|
||||
default_lldb_server=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/17/lib/linux/aarch64/lldb-server
|
||||
default_lldb_client=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/lldb.sh
|
||||
in_build_site=no
|
||||
if which jq >/dev/null && [[ -f meson-info/intro-buildoptions.json ]]; then
|
||||
>&2 echo "[+] pwd is a build site, auto-detecting parameters"
|
||||
in_build_site=yes
|
||||
default_app_id=$(get_buildoption app_id)
|
||||
default_app_exe=$(get_buildoption app_exe)
|
||||
found_lldb=no
|
||||
compiler_path=$(get_cpp_compiler $default_app_exe)
|
||||
for line in $compiler_path; do
|
||||
# iterate over the command array (might be for example [ "ccache", "aarch64-linux-android21-clang++" ])
|
||||
if (echo $line | grep toolchains && basename $line | grep android | grep clang++) >/dev/null; then
|
||||
arch=$(basename $line | cut -d '-' -f 1)
|
||||
default_lldb_server=$(realpath $(dirname $line)/../lib/clang/*/lib/linux/$arch/lldb-server)
|
||||
default_lldb_client=$(realpath $(dirname $line)/lldb.sh)
|
||||
found_lldb=yes
|
||||
fi
|
||||
done
|
||||
if [[ $found_lldb != yes ]]; then
|
||||
>&2 echo "[-] cannot determine LLDB paths from compiler command array:"
|
||||
for line in $compiler_path; do
|
||||
>&2 echo "[-] - $line"
|
||||
done
|
||||
exit 1
|
||||
fi
|
||||
>&2 echo "[+] APP_ID: $default_app_id"
|
||||
>&2 echo "[+] APP_EXE: $default_app_exe"
|
||||
>&2 echo "[+] LLDB_SERVER: $default_lldb_server"
|
||||
>&2 echo "[+] LLDB_CLIENT: $default_lldb_client"
|
||||
else
|
||||
>&2 echo "[+] pwd is not a build site, not auto-detecting parameters"
|
||||
fi
|
||||
app_id=${APP_ID:-$default_app_id}
|
||||
app_exe=${APP_EXE:-$default_app_exe}
|
||||
lldb_server=${LLDB_SERVER:-$default_lldb_server}
|
||||
lldb_server_port=${LLDB_SERVER_PORT:-9998}
|
||||
jdb_port=${JDB_PORT:-13456}
|
||||
lldb_client=${LLDB_CLIENT:-$default_lldb_client}
|
||||
meson=${MESON:-meson}
|
||||
adb=${ADB:-adb}
|
||||
jdb=${JDB:-jdb}
|
||||
|
||||
# don't customize unless necessary
|
||||
app_activity=${APP_ACTIVITY:-PowderActivity}
|
||||
lldb_server_staging=${LLDB_SERVER_STAGING:-/data/local/tmp/lldb-server}
|
||||
lldb_server_remote=${LLDB_SERVER_REMOTE:-lldb-server}
|
||||
pidof_retry_count=${PIDOF_RETRY_COUNT:-20}
|
||||
pidof_retry_delay=${PIDOF_RETRY_DELAY:-0.1}
|
||||
|
||||
function check_which() {
|
||||
if ! which $1 >/dev/null; then
|
||||
>&2 echo "[-] can't run $1"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function check_env() {
|
||||
if ! [[ -f $lldb_server ]]; then
|
||||
>&2 echo "[-] $lldb_server doesn't exist"
|
||||
return 1
|
||||
fi
|
||||
check_which $lldb_client
|
||||
check_which $adb
|
||||
check_which $jdb
|
||||
}
|
||||
|
||||
function check_adb() {
|
||||
$adb shell whoami >/dev/null
|
||||
}
|
||||
|
||||
function maybe_install_app() {
|
||||
if [[ $in_build_site != yes ]]; then
|
||||
return 0
|
||||
fi
|
||||
android_keystore=$(get_buildoption android_keystore)
|
||||
android_keyalias=$(get_buildoption android_keyalias)
|
||||
if [[ -z ${ANDROID_KEYSTORE_PASS-} ]]; then
|
||||
>&2 echo "[-] ANDROID_KEYSTORE_PASS not set"
|
||||
>&2 echo
|
||||
>&2 cat << HELP
|
||||
The current directory seems to be a build site, but ANDROID_KEYSTORE_PASS is not set, so android/$app_exe.apk cannot be invoked. If you don't have a keystore yet, create one with:
|
||||
|
||||
ANDROID_KEYSTORE_PASS=bagelsbagels keytool -genkey \\
|
||||
-keystore $android_keystore \\
|
||||
-alias $android_keyalias \\
|
||||
-storepass:env ANDROID_KEYSTORE_PASS \\
|
||||
-keypass:env ANDROID_KEYSTORE_PASS \\
|
||||
-dname CN=bagels
|
||||
|
||||
Then try again with:
|
||||
|
||||
ANDROID_KEYSTORE_PASS=bagelsbagels $0
|
||||
|
||||
Naturally, replace bagelsbagels with an appropriate password.
|
||||
HELP
|
||||
exit 1
|
||||
fi
|
||||
>&2 echo "[+] meson compiling android/$app_exe.apk"
|
||||
if ! $meson compile sign-apk; then
|
||||
>&2 echo "[-] failed"
|
||||
return 1
|
||||
fi
|
||||
>&2 echo "[+] adb installing android/$app_exe.apk"
|
||||
if ! $adb install android/$app_exe.apk; then
|
||||
>&2 echo "[-] failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function check_debuggable() {
|
||||
$adb shell run-as $app_id whoami >/dev/null
|
||||
}
|
||||
|
||||
function find_lldb_server() {
|
||||
$adb shell run-as $app_id pgrep $lldb_server_remote >/dev/null
|
||||
}
|
||||
|
||||
function kill_lldb_server() {
|
||||
if ! $adb shell run-as $app_id pkill $lldb_server_remote; then
|
||||
>&2 echo "[-] failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function adb_forward() {
|
||||
>&2 echo "[+] adb forwarding tcp:$jdb_port jdwp:$pid"
|
||||
if ! ($adb forward tcp:$jdb_port jdwp:$pid | grep $jdb_port >/dev/null); then
|
||||
>&2 echo "[+] failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function adb_unforward() {
|
||||
$adb forward --remove tcp:$jdb_port
|
||||
}
|
||||
|
||||
function undo_current_adb_forward() {
|
||||
>&2 echo "[+] adb un-forwarding orphaned tcp:$jdb_port"
|
||||
adb_unforward
|
||||
}
|
||||
|
||||
function maybe_undo_previous_adb_forward() {
|
||||
if $adb forward --list | grep tcp:$jdb_port; then
|
||||
>&2 echo "[+] adb un-forwarding orphaned tcp:$jdb_port"
|
||||
adb_unforward
|
||||
fi
|
||||
}
|
||||
|
||||
function maybe_kill_previous_lldb_server() {
|
||||
if find_lldb_server; then
|
||||
>&2 echo "[+] killing orphaned $lldb_server_remote"
|
||||
kill_lldb_server
|
||||
fi
|
||||
}
|
||||
|
||||
function kill_current_lldb_server() {
|
||||
>&2 echo "[+] killing $lldb_server_remote"
|
||||
kill_lldb_server
|
||||
}
|
||||
|
||||
function start_app() {
|
||||
>&2 echo "[+] starting $app_id/.$app_activity"
|
||||
set +e
|
||||
$adb shell am start -D -n "$app_id/.$app_activity" >/dev/null
|
||||
set -e
|
||||
local i
|
||||
local maybe_pid
|
||||
local pidof_result
|
||||
for ((i = 0; i <= $pidof_retry_count; i++)); do
|
||||
set +e
|
||||
maybe_pid=$($adb shell pidof $app_id)
|
||||
pidof_result=$?
|
||||
set -e
|
||||
if [[ $pidof_result == 0 ]]; then
|
||||
pid=$maybe_pid
|
||||
break
|
||||
fi
|
||||
sleep $pidof_retry_delay
|
||||
done
|
||||
if [[ -z ${pid-} ]]; then
|
||||
>&2 echo "[-] failed"
|
||||
return 1
|
||||
fi
|
||||
echo $pid
|
||||
}
|
||||
|
||||
function jdb_attach() {
|
||||
>&2 echo "[+] attaching jdb in the background"
|
||||
$jdb -attach localhost:$jdb_port >/dev/null 2>/dev/null &
|
||||
disown $!
|
||||
# at some point jdb exits because it doesn't have an stdin... fine by me
|
||||
}
|
||||
|
||||
function maybe_deploy_lldb_server() {
|
||||
if ! $adb shell [[ -f $lldb_server_staging ]]; then
|
||||
>&2 echo "[+] $lldb_server_remote not present on host, deploying"
|
||||
if ! ($adb push $lldb_server $lldb_server_staging && $adb shell chmod +x $lldb_server_staging); then
|
||||
>&2 echo "[-] failed"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function start_lldb_server() {
|
||||
if ! $adb shell run-as $app_id pgrep $lldb_server_remote >/dev/null; then
|
||||
>&2 echo "[+] $lldb_server_remote not running on host, starting"
|
||||
$adb shell run-as $app_id cp $lldb_server_staging /data/data/$app_id/$lldb_server_remote
|
||||
$adb shell run-as $app_id ./$lldb_server_remote platform --server --listen "*:$lldb_server_port" >/dev/null 2>/dev/null &
|
||||
disown $!
|
||||
if ! $adb shell run-as $app_id pgrep $lldb_server_remote >/dev/null; then
|
||||
>&2 echo "[-] failed"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function start_lldb() {
|
||||
local pid=$1
|
||||
>&2 echo "[+] starting $lldb_client"
|
||||
local lldb_init=$(mktemp)
|
||||
cat - << LLDB_INIT > $lldb_init
|
||||
platform select remote-android
|
||||
platform connect connect://localhost:$lldb_server_port
|
||||
attach $pid
|
||||
continue
|
||||
LLDB_INIT
|
||||
local lldb_status
|
||||
set +e
|
||||
$lldb_client --source $lldb_init
|
||||
lldb_status=$?
|
||||
set -e
|
||||
>&2 echo "[+] $lldb_client exited with status $lldb_status"
|
||||
rm $lldb_init
|
||||
}
|
||||
|
||||
check_env
|
||||
check_adb
|
||||
maybe_install_app
|
||||
check_debuggable
|
||||
maybe_kill_previous_lldb_server
|
||||
maybe_undo_previous_adb_forward
|
||||
if [[ ${1-} == clean ]]; then
|
||||
>&2 echo "[+] done"
|
||||
exit 0
|
||||
fi
|
||||
maybe_deploy_lldb_server
|
||||
start_lldb_server
|
||||
pid=$(start_app)
|
||||
adb_forward
|
||||
jdb_attach
|
||||
start_lldb $pid
|
||||
kill_current_lldb_server
|
||||
undo_current_adb_forward
|
||||
>&2 echo "[+] done"
|
@ -1,25 +0,0 @@
|
||||
import os
|
||||
import os.path
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
(
|
||||
script,
|
||||
adb,
|
||||
build_dir,
|
||||
phony,
|
||||
apk_name,
|
||||
) = sys.argv
|
||||
|
||||
apk_path = os.path.join(build_dir, apk_name)
|
||||
phony_path = os.path.join(build_dir, phony)
|
||||
|
||||
if os.path.exists(phony_path):
|
||||
os.remove(phony_path)
|
||||
|
||||
if subprocess.run([
|
||||
adb,
|
||||
'install',
|
||||
apk_path,
|
||||
]).returncode:
|
||||
sys.exit(1)
|
@ -1,105 +0,0 @@
|
||||
android_manifest_xml = configure_file(
|
||||
input: 'AndroidManifest.template.xml',
|
||||
output: 'AndroidManifest.xml',
|
||||
configuration: conf_data,
|
||||
)
|
||||
powder_jar_sources = configure_file(
|
||||
input: 'PowderActivity.template.java',
|
||||
output: 'PowderActivity.java',
|
||||
configuration: conf_data,
|
||||
)
|
||||
|
||||
subdir('res')
|
||||
|
||||
python3 = find_program('python3')
|
||||
android_platform_jar = meson.get_external_property('android_platform_jar')
|
||||
java_runtime_jar = meson.get_external_property('java_runtime_jar')
|
||||
android_keystore = get_option('android_keystore')
|
||||
sdl_jar = tpt_libs.get_variable('sdl_jar')
|
||||
powder_jar = custom_target(
|
||||
'powder-jar',
|
||||
output: app_exe + '.jar',
|
||||
command: [
|
||||
python3,
|
||||
files('powder-jar.py'),
|
||||
find_program('javac'),
|
||||
find_program('jar'),
|
||||
meson.current_source_dir(),
|
||||
meson.project_build_root(),
|
||||
'@PRIVATE_DIR@',
|
||||
'@OUTPUT@',
|
||||
android_platform_jar,
|
||||
java_runtime_jar,
|
||||
sdl_jar,
|
||||
is_debug ? 'debug' : 'release',
|
||||
powder_jar_sources,
|
||||
],
|
||||
)
|
||||
unaligned_apk = custom_target(
|
||||
'build-apk',
|
||||
output: app_exe + '.unaligned.apk',
|
||||
input: powder_sha,
|
||||
command: [
|
||||
python3,
|
||||
files('build-apk.py'),
|
||||
find_program('d8'),
|
||||
find_program('aapt'),
|
||||
find_program('aapt2'),
|
||||
meson.current_source_dir(),
|
||||
meson.project_build_root(),
|
||||
'@PRIVATE_DIR@',
|
||||
'@OUTPUT@',
|
||||
'@INPUT@',
|
||||
android_platform_jar,
|
||||
sdl_jar,
|
||||
powder_jar,
|
||||
host_arch,
|
||||
is_debug ? 'debug' : 'release',
|
||||
android_manifest_xml,
|
||||
android_resources,
|
||||
],
|
||||
)
|
||||
unsigned_apk = custom_target(
|
||||
'align-apk',
|
||||
output: app_exe + '.unsigned.apk',
|
||||
input: unaligned_apk,
|
||||
command: [
|
||||
python3,
|
||||
files('align-apk.py'),
|
||||
find_program('zipalign'),
|
||||
meson.project_build_root(),
|
||||
'@OUTPUT@',
|
||||
'@INPUT@',
|
||||
],
|
||||
)
|
||||
signed_apk = custom_target(
|
||||
'sign-apk',
|
||||
output: app_exe + '.apk',
|
||||
input: unsigned_apk,
|
||||
command: [
|
||||
python3,
|
||||
files('sign-apk.py'),
|
||||
find_program('apksigner'),
|
||||
meson.project_build_root(),
|
||||
'@OUTPUT@',
|
||||
'@INPUT@',
|
||||
android_keystore,
|
||||
get_option('android_keyalias'),
|
||||
],
|
||||
)
|
||||
adb = find_program('adb', required: false)
|
||||
if adb.found()
|
||||
install_apk = custom_target(
|
||||
'install-apk',
|
||||
input: signed_apk,
|
||||
output: 'install-apk',
|
||||
command: [ python3, files('install-apk.py'), adb, meson.project_build_root(), '@OUTPUT@', '@INPUT@' ],
|
||||
)
|
||||
custom_target(
|
||||
'run-apk',
|
||||
input: [ signed_apk, install_apk ],
|
||||
build_always_stale: true,
|
||||
output: 'run-apk',
|
||||
command: [ python3, files('run-apk.py'), adb, meson.project_build_root(), '@OUTPUT@', '@INPUT0@', app_id ],
|
||||
)
|
||||
endif
|
@ -1,54 +0,0 @@
|
||||
import os
|
||||
import os.path
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
(
|
||||
script,
|
||||
javac,
|
||||
jar,
|
||||
source_dir,
|
||||
build_dir,
|
||||
private_name,
|
||||
powder_jar_name,
|
||||
android_jar,
|
||||
java_runtime,
|
||||
sdl_jar,
|
||||
debug_release,
|
||||
*javac_sources,
|
||||
) = sys.argv
|
||||
|
||||
powder_jar_path = os.path.join(build_dir, powder_jar_name)
|
||||
private_dir = os.path.join(build_dir, private_name)
|
||||
class_dir = os.path.join(private_dir, 'class')
|
||||
|
||||
if os.path.exists(powder_jar_path):
|
||||
os.remove(powder_jar_path)
|
||||
if os.path.exists(class_dir):
|
||||
shutil.rmtree(class_dir)
|
||||
os.makedirs(class_dir)
|
||||
|
||||
if subprocess.run([
|
||||
javac,
|
||||
'-d', class_dir,
|
||||
'-source', '1.8',
|
||||
'-target', '1.8',
|
||||
'-bootclasspath', java_runtime,
|
||||
'-classpath', os.pathsep.join([ android_jar, sdl_jar ]),
|
||||
*javac_sources,
|
||||
], cwd = build_dir).returncode:
|
||||
sys.exit(1)
|
||||
|
||||
jar_inputs = []
|
||||
for root, dirs, files in os.walk(class_dir):
|
||||
for name in files:
|
||||
if name.endswith(".class"):
|
||||
jar_inputs.append(os.path.relpath(os.path.join(root, name), start = class_dir))
|
||||
if subprocess.run([
|
||||
jar,
|
||||
'cMf',
|
||||
powder_jar_path,
|
||||
*jar_inputs,
|
||||
], cwd = class_dir).returncode:
|
||||
sys.exit(1)
|
@ -1,7 +0,0 @@
|
||||
android_resources = files(
|
||||
'values/colors.xml',
|
||||
'values/styles.xml',
|
||||
)
|
||||
|
||||
subdir('values')
|
||||
subdir('mipmap-mdpi')
|
@ -1 +0,0 @@
|
||||
android_resources += fs.copyfile(rendered_icons['icon_exe'], 'ic_launcher.png')
|
@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="colorPrimary">#3F51B5</color>
|
||||
<color name="colorPrimaryDark">#303F9F</color>
|
||||
<color name="colorAccent">#FF4081</color>
|
||||
</resources>
|
@ -1,5 +0,0 @@
|
||||
android_resources += configure_file(
|
||||
input: 'strings.template.xml',
|
||||
output: 'strings.xml',
|
||||
configuration: conf_data,
|
||||
)
|
@ -1,3 +0,0 @@
|
||||
<resources>
|
||||
<string name="app_name">@APPNAME@</string>
|
||||
</resources>
|
@ -1,4 +0,0 @@
|
||||
<resources>
|
||||
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
|
||||
</style>
|
||||
</resources>
|
@ -1,25 +0,0 @@
|
||||
import os
|
||||
import os.path
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
(
|
||||
script,
|
||||
adb,
|
||||
build_dir,
|
||||
phony,
|
||||
apk_name,
|
||||
app_id,
|
||||
) = sys.argv
|
||||
|
||||
apk_path = os.path.join(build_dir, apk_name)
|
||||
|
||||
if subprocess.run([
|
||||
adb,
|
||||
'shell',
|
||||
'am',
|
||||
'start',
|
||||
'--activity-clear-top',
|
||||
'-n', app_id + '/.PowderActivity',
|
||||
]).returncode:
|
||||
sys.exit(1)
|
@ -1,35 +0,0 @@
|
||||
import os
|
||||
import os.path
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
(
|
||||
script,
|
||||
apksigner,
|
||||
build_dir,
|
||||
apk_name,
|
||||
unsigned_name,
|
||||
android_keystore,
|
||||
android_keyalias,
|
||||
) = sys.argv
|
||||
|
||||
if 'ANDROID_KEYSTORE_PASS' not in os.environ:
|
||||
print('ANDROID_KEYSTORE_PASS not set')
|
||||
sys.exit(1)
|
||||
|
||||
unsigned_path = os.path.join(build_dir, unsigned_name)
|
||||
apk_path = os.path.join(build_dir, apk_name)
|
||||
|
||||
if os.path.exists(apk_path):
|
||||
os.remove(apk_path)
|
||||
|
||||
if subprocess.run([
|
||||
apksigner,
|
||||
'sign',
|
||||
'--ks', android_keystore,
|
||||
'--ks-key-alias', android_keyalias,
|
||||
'--ks-pass', 'env:ANDROID_KEYSTORE_PASS',
|
||||
'--out', apk_path,
|
||||
unsigned_path,
|
||||
]).returncode:
|
||||
sys.exit(1)
|
@ -1,3 +0,0 @@
|
||||
# This file is used by the starcatcher.us update server to pull changelogs for mod releases
|
||||
# Erase and replace the changelog for every release, do not just append changes to the end
|
||||
# Lines starting with # and empty lines are ignored
|
@ -1,25 +0,0 @@
|
||||
[constants]
|
||||
andriod_ndk_toolchain_bin = '/opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin'
|
||||
|
||||
[properties]
|
||||
# only needed if you want to run the custom target powder_apk (powder.apk)
|
||||
# android_ndk_toolchain_prefix comes from the correct cross-file in ./android/cross
|
||||
android_ndk_toolchain_prefix = android_ndk_toolchain_prefix
|
||||
android_platform = 'android-30'
|
||||
android_platform_jar = '/opt/android-sdk/platforms/' + android_platform + '/android.jar'
|
||||
java_runtime_jar = '/usr/lib/jvm/java-8-openjdk/jre/lib/rt.jar'
|
||||
|
||||
[binaries]
|
||||
c = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang')
|
||||
# c = [ 'ccache', andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang') ]
|
||||
cpp = andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang++')
|
||||
# cpp = [ 'ccache', andriod_ndk_toolchain_bin / (android_ndk_toolchain_prefix + 'clang++') ]
|
||||
strip = andriod_ndk_toolchain_bin / 'llvm-strip'
|
||||
# only needed if you want to run the custom target powder_apk (powder.apk)
|
||||
javac = '/usr/lib/jvm/java-8-openjdk/bin/javac'
|
||||
jar = '/usr/lib/jvm/java-8-openjdk/bin/jar'
|
||||
d8 = '/opt/android-sdk/build-tools/32.0.0/d8'
|
||||
aapt = '/opt/android-sdk/build-tools/32.0.0/aapt'
|
||||
aapt2 = '/opt/android-sdk/build-tools/32.0.0/aapt2'
|
||||
zipalign = '/opt/android-sdk/build-tools/32.0.0/zipalign'
|
||||
apksigner = '/opt/android-sdk/build-tools/32.0.0/apksigner'
|
@ -1,11 +0,0 @@
|
||||
[binaries]
|
||||
c = [ 'clang', '-arch', 'arm64' ]
|
||||
cpp = [ 'clang++', '-arch', 'arm64' ]
|
||||
objcpp = [ 'clang++', '-arch', 'arm64' ]
|
||||
strip = 'strip'
|
||||
|
||||
[host_machine]
|
||||
system = 'darwin'
|
||||
cpu_family = 'aarch64'
|
||||
cpu = 'armv8'
|
||||
endian = 'little'
|
@ -1,14 +0,0 @@
|
||||
[constants]
|
||||
prefix = 'x86_64-w64-mingw32'
|
||||
|
||||
[binaries]
|
||||
c = prefix + '-gcc'
|
||||
cpp = prefix + '-g++'
|
||||
strip = prefix + '-strip'
|
||||
windres = prefix + '-windres'
|
||||
|
||||
[host_machine]
|
||||
system = 'windows'
|
||||
cpu_family = 'x86_64'
|
||||
cpu = 'x86_64'
|
||||
endian = 'little'
|
59
data/IntroText.h
Normal file
@ -0,0 +1,59 @@
|
||||
#pragma once
|
||||
const char *const introTextData =
|
||||
"\blThe Powder Toy - Version " MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " - https://powdertoy.co.uk, irc.freenode.net #powder\n"
|
||||
"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\n"
|
||||
"\n"
|
||||
"\bgControl+C/V/X are Copy, Paste and cut respectively.\n"
|
||||
"\bgTo choose a material, hover over one of the icons on the right, it will show a selection of elements in that group.\n"
|
||||
"\bgPick your material from the menu using mouse left/right buttons.\n"
|
||||
"Draw freeform lines by dragging your mouse left/right button across the drawing area.\n"
|
||||
"Shift+drag will create straight lines of particles.\n"
|
||||
"Ctrl+drag will result in filled rectangles.\n"
|
||||
"Ctrl+Shift+click will flood-fill a closed area.\n"
|
||||
"Use the mouse scroll wheel, or '[' and ']', to change the tool size for particles.\n"
|
||||
"Middle click or Alt+Click to \"sample\" the particles.\n"
|
||||
"Ctrl+Z will act as Undo.\n"
|
||||
"\n\boUse 'Z' for a zoom tool. Click to make the drawable zoom window stay around. Use the wheel to change the zoom strength.\n"
|
||||
"The spacebar can be used to pause physics. Use 'F' to step ahead by one frame.\n"
|
||||
"Use 'S' to save parts of the window as 'stamps'. 'L' loads the most recent stamp, 'K' shows a library of stamps you saved.\n"
|
||||
"Use 'P' to take a screenshot and save it into the current directory.\n"
|
||||
"Use 'H' to toggle the HUD. Use 'D' to toggle debug mode in the HUD.\n"
|
||||
"\n"
|
||||
"Contributors: \bgStanislaw K Skowronek (Designed the original Powder Toy),\n"
|
||||
"\bgSimon Robertshaw, Skresanov Savely, cracker64, Catelite, Bryan Hoyle, Nathan Cousins, jacksonmj,\n"
|
||||
"\bgFelix Wallin, Lieuwe Mosch, Anthony Boot, Matthew \"me4502\", MaksProg, jacob1, mniip, LBPHacker\n"
|
||||
"\n"
|
||||
#ifndef BETA
|
||||
"\bgTo use online features such as saving, you need to register at: \brhttps://powdertoy.co.uk/Register.html\n"
|
||||
#else
|
||||
"\brThis is a BETA, you cannot save things publicly. If you are planning on publishing any saves, use the release version\n"
|
||||
#endif
|
||||
"\n"
|
||||
"\bt" MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) "." MTOS(BUILD_NUM) " " IDENT_PLATFORM " "
|
||||
#ifdef SNAPSHOT
|
||||
"SNAPSHOT " MTOS(SNAPSHOT_ID) " "
|
||||
#elif MOD_ID > 0
|
||||
"MODVER " MTOS(SNAPSHOT_ID) " "
|
||||
#endif
|
||||
#ifdef X86
|
||||
"X86 "
|
||||
#endif
|
||||
#ifdef X86_SSE
|
||||
"X86_SSE "
|
||||
#endif
|
||||
#ifdef X86_SSE2
|
||||
"X86_SSE2 "
|
||||
#endif
|
||||
#ifdef X86_SSE3
|
||||
"X86_SSE3 "
|
||||
#endif
|
||||
#ifdef LUACONSOLE
|
||||
"LUACONSOLE "
|
||||
#endif
|
||||
#ifdef GRAVFFT
|
||||
"GRAVFFT "
|
||||
#endif
|
||||
#ifdef REALISTIC
|
||||
"REALISTIC"
|
||||
#endif
|
||||
;
|
89
data/Shaders.h
Normal file
@ -0,0 +1,89 @@
|
||||
#pragma once
|
||||
|
||||
const char *const fireFragment = "#version 120\n\
|
||||
uniform sampler2D fireAlpha;\
|
||||
void main () {\
|
||||
vec4 texColor = texture2D(fireAlpha, gl_PointCoord);\
|
||||
gl_FragColor = vec4(gl_Color.rgb, texColor.a*gl_Color.a);\
|
||||
}";
|
||||
const char *const fireVertex = "#version 120\n\
|
||||
void main(void)\
|
||||
{\
|
||||
gl_Position = ftransform();;\
|
||||
gl_FrontColor = gl_Color;\
|
||||
}";
|
||||
const char *const lensFragment = "#version 120\n\
|
||||
uniform sampler2D pTex;\
|
||||
uniform sampler2D tfX;\
|
||||
uniform sampler2D tfY;\
|
||||
uniform float xres;\
|
||||
uniform float yres;\
|
||||
void main () {\
|
||||
vec4 transformX = texture2D(tfX, vec2(gl_TexCoord[0].s, -gl_TexCoord[0].t));\
|
||||
vec4 transformY = -texture2D(tfY, vec2(gl_TexCoord[0].s, -gl_TexCoord[0].t));\
|
||||
transformX.r /= xres;\
|
||||
transformY.g /= yres;\
|
||||
vec4 texColor = vec4(\
|
||||
texture2D(pTex, gl_TexCoord[0].st-vec2(transformX.r*0.75, transformY.g*0.75)).r,\
|
||||
texture2D(pTex, gl_TexCoord[0].st-vec2(transformX.r*0.875, transformY.g*0.875)).g,\
|
||||
texture2D(pTex, gl_TexCoord[0].st-vec2(transformX.r, transformY.g)).b,\
|
||||
1.0\
|
||||
);\
|
||||
gl_FragColor = texColor;\
|
||||
}";
|
||||
const char *const lensVertex = "#version 120\n\
|
||||
void main(void)\
|
||||
{\
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;\
|
||||
gl_Position = ftransform();;\
|
||||
gl_FrontColor = gl_Color;\
|
||||
}";
|
||||
const char *const airVFragment = "#version 120\n\
|
||||
uniform sampler2D airX;\
|
||||
uniform sampler2D airY;\
|
||||
uniform sampler2D airP;\
|
||||
void main () {\
|
||||
vec4 texX = texture2D(airX, gl_TexCoord[0].st);\
|
||||
vec4 texY = texture2D(airY, gl_TexCoord[0].st);\
|
||||
vec4 texP = texture2D(airP, gl_TexCoord[0].st);\
|
||||
gl_FragColor = vec4(abs(texX.r)/2.0, texP.b/2.0, abs(texY.g)/2.0, 1.0);\
|
||||
}";
|
||||
const char *const airVVertex = "#version 120\n\
|
||||
void main(void)\
|
||||
{\
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;\
|
||||
gl_Position = ftransform();;\
|
||||
gl_FrontColor = gl_Color;\
|
||||
}";
|
||||
const char *const airPFragment = "#version 120\n\
|
||||
uniform sampler2D airX;\
|
||||
uniform sampler2D airY;\
|
||||
uniform sampler2D airP;\
|
||||
void main () {\
|
||||
vec4 texP = texture2D(airP, gl_TexCoord[0].st);\
|
||||
gl_FragColor = vec4(max(texP.b/2.0, 0), 0, abs(min(texP.b/2.0, 0)), 1.0);\
|
||||
}";
|
||||
const char *const airPVertex = "#version 120\n\
|
||||
void main(void)\
|
||||
{\
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;\
|
||||
gl_Position = ftransform();;\
|
||||
gl_FrontColor = gl_Color;\
|
||||
}";
|
||||
const char *const airCFragment = "#version 120\n\
|
||||
uniform sampler2D airX;\
|
||||
uniform sampler2D airY;\
|
||||
uniform sampler2D airP;\
|
||||
void main () {\
|
||||
vec4 texX = texture2D(airX, gl_TexCoord[0].st);\
|
||||
vec4 texY = texture2D(airY, gl_TexCoord[0].st);\
|
||||
vec4 texP = texture2D(airP, gl_TexCoord[0].st);\
|
||||
gl_FragColor = vec4(max(texP.b/2.0, 0), 0, abs(min(texP.b/2.0, 0)), 1.0) + vec4(abs(texX.r)/8.0, abs(texX.r)/8.0, abs(texX.r)/8.0, 1.0) + vec4(abs(texY.g)/8.0, abs(texY.g)/8.0, abs(texY.g)/8.0, 1.0);\
|
||||
}";
|
||||
const char *const airCVertex = "#version 120\n\
|
||||
void main(void)\
|
||||
{\
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;\
|
||||
gl_Position = ftransform();;\
|
||||
gl_FrontColor = gl_Color;\
|
||||
}";
|
305
data/font.cpp
Normal file
@ -0,0 +1,305 @@
|
||||
#ifndef FONTEDITOR
|
||||
extern const unsigned char font_data[] = {
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x70, 0x1C, 0xC3, 0x20, 0x00, 0x47, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0xC0, 0x4C, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x19, 0xCC, 0xE0, 0x3F, 0xCC, 0xF0, 0x2F, 0xCC, 0x90, 0x09, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x30, 0xD0, 0x3F, 0x33, 0xE1, 0x07, 0xF4, 0x12, 0x33, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0xD0, 0xE2, 0xCC, 0x1C, 0xDE, 0x01, 0x3C, 0x40, 0xB7, 0x34, 0x33, 0x8B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x7D, 0x30, 0x0C, 0x13, 0xD0, 0x32, 0xB3, 0x33, 0x1C, 0x7D, 0x07, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0xC0, 0x34, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x34, 0x1D, 0x07, 0x03, 0x07, 0x1D, 0x34, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x07, 0x1D, 0x34, 0x30, 0x34, 0x1D, 0x07, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x44, 0xD0, 0x1C, 0x64, 0xF0, 0x3F, 0x64, 0xD0, 0x1C, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0xE0, 0x2F, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0D, 0x03, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x80, 0x02, 0x0C, 0xA0, 0x00, 0x03, 0x28, 0xC0, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xF8, 0xE0, 0x39, 0x07, 0x33, 0x32, 0x03, 0xB3, 0x38, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x36, 0xC0, 0x00, 0x03, 0x0C, 0x74, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x34, 0x41, 0x03, 0x0A, 0x2C, 0x70, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFC, 0x71, 0x34, 0x01, 0x03, 0x1E, 0x00, 0x33, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x37, 0x1C, 0x73, 0x34, 0xBF, 0x03, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x00, 0x57, 0xE0, 0x2F, 0x00, 0x13, 0x30, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD3, 0x00, 0x07, 0xF0, 0x1F, 0x03, 0x33, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x34, 0x80, 0x03, 0x0E, 0x38, 0xD0, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x34, 0x03, 0xD3, 0x1F, 0x03, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x34, 0x03, 0xC3, 0x3F, 0x40, 0x23, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x07, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x04, 0x00, 0x0C, 0x0D, 0x03, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC3, 0x0B, 0x1B, 0xC0, 0x0B, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0x90, 0x83, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFD, 0x71, 0x30, 0x81, 0x03, 0x0E, 0x34, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x1D, 0x30, 0xE7, 0x37, 0x73, 0x1C, 0xE3, 0x2F, 0x07, 0x00, 0xFD, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xD0, 0x1D, 0x47, 0x33, 0x30, 0xFF, 0x33, 0x30, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xBF, 0x30, 0x38, 0x43, 0xF3, 0x1F, 0x43, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x31, 0x00, 0x03, 0x70, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x1D, 0x43, 0x33, 0x30, 0x03, 0x33, 0x34, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFF, 0x32, 0x00, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x10, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFF, 0x33, 0x10, 0x03, 0xF0, 0x0B, 0x03, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xF4, 0xD1, 0x34, 0x03, 0x30, 0x3E, 0x03, 0x73, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x47, 0x33, 0x30, 0x03, 0xF3, 0x3F, 0x03, 0x33, 0x30, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x1D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x10, 0x0D, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0x70, 0x34, 0x4C, 0x03, 0x37, 0xC0, 0x0B, 0x30, 0x0B, 0x0C, 0x0B, 0x47, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x10, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x1F, 0x3D, 0x7B, 0x3B, 0xE3, 0x32, 0x83, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0x70, 0xD0, 0x3C, 0x30, 0x37, 0xCC, 0x28, 0x33, 0xDC, 0x0C, 0x3C, 0x03, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x74, 0x1C, 0x07, 0xCD, 0x00, 0x33, 0xD0, 0x1C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x1D, 0x43, 0x73, 0x34, 0xFF, 0x31, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x34, 0x1D, 0x07, 0xCD, 0x00, 0x33, 0xDC, 0x1C, 0x1D, 0xFD, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFF, 0x31, 0x34, 0x03, 0xF3, 0x0F, 0xD7, 0x30, 0x34, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFC, 0xB1, 0x31, 0x07, 0xD0, 0x0F, 0x90, 0x23, 0x34, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0xFF, 0x13, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x0C, 0x30, 0x03, 0xCC, 0x00, 0x33, 0xD0, 0x2C, 0x1D, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x03, 0x33, 0x30, 0x03, 0xB3, 0x38, 0xCD, 0xC1, 0x0D, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x43, 0x30, 0xC7, 0x34, 0xCD, 0x1C, 0xED, 0x1E, 0x2C, 0x0E, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x34, 0x1C, 0xB8, 0x03, 0x3D, 0xC0, 0x2D, 0x34, 0x1C, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x03, 0xB3, 0x38, 0xDC, 0x40, 0x07, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x07, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x2D, 0xC0, 0x02, 0x2C, 0xD0, 0x02, 0x6C, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x2F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2F, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x30, 0x80, 0x02, 0x0C, 0xA0, 0x00, 0x03, 0x28, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3E, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x1D, 0x37, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x30, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x04, 0xC3, 0xCF, 0x30, 0xFD, 0x01, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x70, 0xC0, 0x00, 0x7F, 0x5C, 0x33, 0xCC, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x5C, 0x32, 0xC0, 0x24, 0x3D, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x0D, 0x30, 0xF8, 0x38, 0x33, 0xCC, 0x31, 0xFD, 0x01, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0xF3, 0xCB, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x3D, 0x07, 0x03, 0x2F, 0x03, 0x03, 0x07, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x2C, 0x33, 0x4C, 0x3F, 0xC0, 0x04, 0xE3, 0x07, 0x00,
|
||||
0x05, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x7F, 0x9C, 0x33, 0xCC, 0x30, 0xC7, 0x01, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x04, 0x1C, 0x00, 0x0D, 0x0C, 0x0C, 0x1D, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x00, 0x30, 0x00, 0x34, 0x30, 0x30, 0x30, 0x30, 0x1E, 0x00,
|
||||
0x05, 0x00, 0x00, 0x30, 0xC0, 0x10, 0xE3, 0xEC, 0xF0, 0xC1, 0x1C, 0xC3, 0x01, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x47, 0x3D, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x71, 0x37, 0x33, 0x33, 0x32, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x33, 0xCC, 0x30, 0xD3, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0x33, 0xCC, 0x34, 0x7D, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1C, 0x33, 0xCC, 0x34, 0x7F, 0x0C, 0x30, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1D, 0x33, 0xCC, 0x34, 0xFD, 0x00, 0x03, 0x0C, 0x50,
|
||||
0x04, 0x00, 0x00, 0x00, 0x00, 0x33, 0x1F, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x0C, 0xC1, 0x43, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x1C, 0x74, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x0D, 0x33, 0xCC, 0x34, 0xFD, 0x01, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x33, 0xCD, 0x2D, 0x2C, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x33, 0x32, 0x33, 0x73, 0x37, 0xCD, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0x2C, 0xD3, 0xC7, 0x38, 0xC7, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x0C, 0x73, 0x4C, 0x37, 0x74, 0xC0, 0xF0, 0x01, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC4, 0xC2, 0xC2, 0x12, 0xFF, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x38, 0x0C, 0x0C, 0x03, 0x0C, 0x0C, 0x38, 0x00, 0x00, 0x00,
|
||||
0x02, 0x00, 0x32, 0x33, 0x33, 0x13, 0x00,
|
||||
0x04, 0x00, 0x00, 0x0B, 0x0C, 0x0C, 0x30, 0x0C, 0x0C, 0x0B, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x72, 0x37, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7F, 0x00, 0xFF, 0x01, 0xFF, 0x07, 0xFF, 0x1F, 0xFF, 0x7F, 0xFF, 0x1B, 0xBF, 0x01, 0x1B, 0x00,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x00, 0x00, 0xF8, 0xF0, 0x3F, 0xEE, 0x2C, 0x30, 0xCB, 0x0B, 0x30, 0x42, 0xC3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xF3, 0x33, 0x00, 0x03, 0x30, 0x00, 0xFF, 0x3F, 0x00,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x00, 0x00, 0xCB, 0x00, 0x00, 0xEE, 0xC0, 0xFF, 0xF8, 0xB0, 0xC0, 0xFF, 0x2C, 0xC0, 0x00, 0x0C, 0xCF, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0xCF, 0x00, 0x0C, 0xC0, 0x00, 0xFC, 0xFF,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x70, 0x00, 0x00, 0xF3, 0xFF, 0xD3, 0x03, 0xE0, 0x3C, 0x3F, 0x38, 0x03, 0xD0, 0x33, 0xFF, 0x38, 0x03, 0xE0, 0xF0, 0xFF, 0x03,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x8B, 0xF7, 0x0C, 0x13, 0x9F, 0x3B, 0x37, 0x00, 0xC0, 0x23, 0xFF, 0xFF, 0x8B, 0x03, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x80, 0x03, 0x2C, 0x0D, 0x00, 0x37, 0x00, 0xC0, 0xF3, 0xFF, 0x3C, 0xFF, 0xCF, 0x03, 0x00, 0xDC, 0x00, 0x70, 0x38, 0xC0, 0x02, 0xFD, 0x07,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0xF0, 0xFF, 0xC0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0x03, 0xFF, 0x0F, 0xC0, 0x3F, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0x03, 0x00, 0x3C, 0xF0, 0xC0, 0xC3, 0x3A, 0x3C, 0x0B, 0xCE, 0x2B, 0x80, 0x7E, 0x00, 0xD0, 0x03, 0x00, 0xFC, 0xFF, 0xFF,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0xFC, 0xFF, 0x03, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x80, 0x03, 0x2C, 0x0D, 0x0F, 0x37, 0xF0, 0xC0, 0xF3, 0xFF, 0x3C, 0xFF, 0xCF, 0x03, 0x0F, 0xDC, 0xF0, 0x70, 0x38, 0xC0, 0x02, 0xFD, 0x07,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1F, 0x00, 0xAD, 0x07, 0xB0, 0xC5, 0x00, 0x17, 0x0C, 0x70, 0xD0, 0x00, 0x0C, 0x03, 0xBC, 0xEF, 0xB3, 0x11, 0xE0, 0x07, 0x05, 0x3C, 0x52, 0xC8,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xC0, 0x3F, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0xFF, 0x0F, 0xFC, 0xFF, 0x3F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xE0, 0x2F, 0xFF, 0xE3, 0x2F, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x80, 0xFF, 0x2F, 0xFD, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0x7F, 0xF8, 0xFF, 0x02, 0xFD, 0x07,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x02, 0x00, 0xC8, 0x07, 0x10, 0xC3, 0x00, 0x31, 0x0D, 0x00, 0xFD, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, 0xF0, 0xF0, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x80, 0xFF, 0x8B, 0x1E, 0xD0, 0x2E, 0x00, 0xF0, 0x00, 0xE0, 0xFF, 0x0B, 0x00, 0x0F, 0x00, 0xB8, 0x03, 0xB0, 0xE2, 0xFF, 0x02, 0x50, 0x01,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x03, 0x1E, 0x03, 0x73, 0x03, 0xEF, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF,
|
||||
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFE, 0x02, 0xBE, 0xC1, 0xD0, 0x01, 0xF0, 0x3F, 0xE0, 0x0B, 0x1F, 0x1C, 0xD0, 0x4A, 0x03, 0x6C, 0xB3, 0x00, 0xC3, 0x4D, 0x7E, 0xD0, 0xBF, 0x01,
|
||||
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2A, 0x00, 0xAA, 0x0A, 0x80, 0x2A, 0xFC, 0xA0, 0xF2, 0x3F, 0xA0, 0xFC, 0x03, 0xC8, 0xFF, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0xC0, 0x07, 0xAA, 0xEA, 0x1F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xAA, 0xEA, 0x1F, 0x00, 0xC0, 0x07, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0xD0, 0x03, 0x00, 0xF4, 0xAB, 0xAA, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF4, 0xAB, 0xAA, 0xD0, 0x03, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0xFE, 0xFF, 0xA0, 0xEA, 0xA3, 0x80, 0xEF, 0x02, 0xFE, 0x0B, 0xF8, 0xAF, 0xEA, 0xFF, 0x2F, 0xFE, 0x2F, 0x20, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x2D, 0xFE, 0x2F, 0x00, 0x00, 0xF0, 0xFF, 0x06, 0x00, 0x64, 0xFE, 0x0A, 0x05, 0x90, 0x00, 0x00, 0x02, 0x40, 0x06,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x07, 0x36, 0x06, 0x4C, 0x0E, 0x28, 0x3C, 0x70, 0xF0, 0xE0, 0xC1, 0xF6, 0x7F, 0xF2, 0xFF, 0x03, 0xFE, 0x02, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x04, 0x20, 0x11, 0x84, 0x48, 0x10, 0x12, 0x42, 0x88, 0x04, 0x32, 0x22, 0xCC, 0x8C, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0xD0, 0x01, 0x80, 0x07, 0x40, 0x7B, 0x00, 0xFF, 0x02, 0xBC, 0x0F, 0xE0, 0x2B, 0x40, 0x7F, 0xD0, 0xFF, 0x1F, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, 0x00, 0x90, 0x01, 0x80, 0x0A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x74, 0x00, 0x40, 0x07, 0x00, 0x34, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0xCF, 0xBD, 0x3C, 0x00, 0xF0, 0xFF, 0xFF, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xF0, 0xFF, 0xC3, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0x07, 0x00, 0xBD, 0x02, 0xE8, 0xB3, 0xE0, 0x3C, 0xAC, 0xC3, 0x03, 0x0F, 0x3C, 0x00, 0xC0, 0x03, 0x00, 0xFC, 0xFF, 0xFF,
|
||||
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x0C, 0x1C, 0xB9, 0xD1, 0x6C, 0x73, 0x0E, 0x70, 0x34, 0x70, 0x0A, 0x68, 0xD3, 0xFF, 0x1F, 0xBC, 0x99, 0x8F, 0x8B, 0x8B, 0x7B, 0x9B, 0x79, 0xFF, 0xFF, 0xFF,
|
||||
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0x00, 0xC0, 0x0F, 0x00, 0xFC, 0x0F, 0x00, 0xFF, 0x03, 0xF0, 0xFF, 0x03, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, 0xCB, 0x30, 0xC3, 0x3F, 0xC7, 0x00, 0x7E, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xC3, 0xFF, 0x3F, 0x0C, 0x00, 0xC3, 0xFC, 0x33, 0x0C, 0x24, 0xC3, 0xC0, 0x31, 0x0C, 0x06, 0xC3, 0x30, 0x30, 0x0C, 0x00, 0xC3, 0xFF, 0x3F,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x30, 0x00, 0x03, 0xC3, 0x30, 0x30, 0x3F, 0xFF, 0xFF, 0x3F, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0x0C, 0x0C, 0xC3, 0xC0, 0x00, 0x0C, 0xFC, 0xFF,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xFC, 0x0F, 0xC0, 0xFF, 0x00, 0xFC, 0x0F, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x3C, 0x00, 0xC0, 0x03, 0xF0, 0x3F, 0x00, 0xFF, 0x03, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0xFF, 0x3F, 0x8E, 0xCB, 0xBE, 0x99, 0xFF, 0x8B, 0xFF, 0x9B, 0xF9, 0x8E, 0xCB, 0xF2, 0xFF, 0x03, 0xFE, 0x02, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
|
||||
0x03, 0x00, 0x70, 0x78, 0x38, 0x0C, 0xC3, 0x30, 0xEE, 0x1D,
|
||||
0x03, 0x00, 0x40, 0xB7, 0xCB, 0x30, 0x0C, 0xC3, 0xD2, 0xD2,
|
||||
0x05, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x4C, 0x33, 0xCC, 0x30, 0xC7, 0xF4, 0x01, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xF0, 0x90, 0x03, 0x0C, 0x30, 0xF4, 0x02, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x08, 0x03, 0x06, 0x06, 0x06, 0xFC, 0x03, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x08, 0x83, 0x0B, 0x30, 0xC2, 0xF4, 0x01, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x63, 0xCC, 0x3F, 0xC0, 0x00, 0x03, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x0C, 0xF0, 0x07, 0x34, 0xC1, 0xF8, 0x01, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x0C, 0xF1, 0xC2, 0x34, 0xC3, 0xF4, 0x01, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x03, 0x06, 0x06, 0x0C, 0x30, 0x00, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0xD3, 0xC7, 0x34, 0xC3, 0xF4, 0x01, 0x00, 0x00,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x0C, 0x63, 0x0C, 0x3E, 0xC0, 0xF8, 0x01, 0x00, 0x00,
|
||||
0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x03, 0x00, 0x00, 0x0C, 0xCF, 0xF3, 0x3C, 0xCF, 0x33, 0x00,
|
||||
0x03, 0x00, 0x00, 0xC0, 0x3C, 0xCF, 0xF3, 0x3C, 0x0F, 0x03,
|
||||
0x05, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x30, 0xC0, 0x0F, 0x30, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xD0, 0x7F, 0x40, 0xFF, 0x1F, 0xFC, 0xFF, 0x43, 0xFF, 0x1F, 0x40, 0x15, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x06, 0x90, 0x91, 0x01, 0x06, 0x24, 0x30, 0x90, 0x1B, 0x46, 0x6E, 0x96, 0xB9, 0x91, 0xE4, 0x06, 0x0C, 0x18, 0x90, 0x40, 0x46, 0x06, 0x90, 0x1B,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x02, 0xC2, 0xAB, 0xAA, 0x3E, 0x20, 0xE0, 0xAB, 0xAA, 0x3E, 0x02, 0xC2, 0xFF, 0xFF, 0x0F, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0xF0, 0xFF, 0x00, 0xFE, 0x0B, 0xD0, 0x7F, 0x00, 0xA4, 0x01, 0x00, 0x0A, 0x00, 0xA0, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x81, 0x24, 0x10, 0x85, 0x00, 0x20, 0x66, 0x40, 0x15, 0x45, 0x62, 0x90, 0x4D, 0xD0, 0xF1, 0x23, 0x01, 0xFD, 0x41, 0x41, 0x07, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xA0, 0x00, 0x40, 0x1F, 0x00, 0xF8, 0x02, 0xD0, 0x7F, 0x00, 0xFE, 0x0B, 0xF0, 0xEF, 0x00, 0xFF, 0x0D, 0xD0, 0x77, 0x00, 0xF4, 0x01,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3C, 0x00, 0xD4, 0x01, 0xD0, 0x06, 0x40, 0x7F, 0x00, 0xFD, 0x01, 0xF4, 0x07, 0xD0, 0x1F, 0x00, 0x7F, 0x00, 0xD0, 0x01, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0xFE, 0x0B, 0x88, 0x2F, 0x52, 0xF0, 0x50, 0x01, 0x0A, 0xD4, 0xAF, 0x7F, 0xFD, 0xF5, 0xC7, 0x0B, 0x3E, 0x70, 0xD0, 0x00, 0xA8, 0x02,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2F, 0x80, 0x5F, 0x2F, 0x0C, 0x00, 0xC3, 0x00, 0x30, 0x0C, 0x00, 0xC3, 0x01, 0x34, 0x34, 0xC0, 0x01, 0x07, 0x0D, 0xD0, 0x75, 0x00, 0xF4, 0x01,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xF4, 0x01, 0xC0, 0x3F, 0x00, 0xF0, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xE0, 0xEF, 0x00, 0xBB, 0x0B, 0xA0, 0xAA, 0x00, 0xAA, 0x0A, 0x80, 0x19, 0x00, 0x64, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x2D, 0x80, 0xE7, 0x0B, 0xBE, 0xF8, 0xFA, 0x02, 0xFE, 0x0B, 0x80, 0x2F, 0x00, 0x50, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xF8, 0x02, 0xE0, 0xBF, 0x80, 0xAF, 0x2F, 0xBE, 0xE0, 0xDB, 0x02, 0x78, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xA0, 0x00, 0x40, 0x1F, 0x50, 0xFE, 0x5B, 0xFD, 0xFF, 0x47, 0xFF, 0x1F, 0xE0, 0xBF, 0x00, 0xFE, 0x0B, 0xF0, 0xF5, 0x40, 0x01, 0x14,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1A, 0x00, 0x09, 0x06, 0x20, 0x80, 0x00, 0x02, 0x08, 0xFC, 0xFF, 0xC3, 0x00, 0x30, 0x0C, 0x00, 0xC3, 0x00, 0x30, 0x0C, 0x00, 0xC3, 0xFF, 0x3F,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0A, 0xF0, 0xFF, 0x00, 0xAA, 0x0A, 0xF0, 0xFF, 0x00, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0xFF, 0x3F, 0xFE, 0xDF, 0xFE, 0x1F, 0xFE, 0x1D, 0xFE, 0x12, 0xFE, 0x2E, 0xFE, 0xF2, 0xFE, 0x03, 0xFE, 0x02, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x31, 0x00, 0x30, 0x01, 0x40, 0x34, 0x00, 0xCC, 0x00, 0x00, 0x0A, 0x00, 0xF8, 0x02, 0xE0, 0xBF, 0x80, 0xFF, 0x2F, 0xFE, 0xFF, 0xFB, 0xFF, 0xFF,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x2F, 0xFC, 0xFF, 0xC3, 0x07, 0x3D, 0x3C, 0xC0, 0xC3, 0x03, 0x3C, 0x7C, 0xD0, 0xC3, 0xFF, 0x3F, 0xF8, 0xFF, 0x02, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xF3, 0x3C, 0x3C, 0xCF, 0x03, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB9, 0x91, 0xE3, 0x46, 0x2E, 0x1B, 0xB9, 0x61, 0xE4, 0x06, 0x91, 0x1B, 0x41, 0x6E, 0x24, 0xB9, 0x91, 0xE3, 0x46, 0x2E, 0x1B, 0xB9, 0x01, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0C, 0xC0, 0x23, 0x00, 0x80, 0x08, 0x00, 0x20, 0x0F, 0xC0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x2F, 0xC0, 0x01, 0x0D, 0x06, 0x40, 0x32, 0x00, 0x30, 0x03, 0x00, 0x33, 0x00, 0x30, 0x06, 0x40, 0xC2, 0x01, 0x0D, 0xE0, 0x2F, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x23, 0x80, 0x32, 0x0A, 0x0D, 0xC3, 0xD1, 0x10, 0x1C, 0x0D, 0xC0, 0x81, 0x02, 0x0A, 0xE0, 0x2F, 0x00, 0x54, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0xB0, 0xE0, 0x00, 0x03, 0x0C, 0x30, 0xC0, 0x00, 0x0B, 0x0E, 0xC0, 0x3F, 0x00, 0xAC, 0x03, 0xC0, 0x3A, 0x00, 0xAC, 0x03,
|
||||
0x05, 0x00, 0x00, 0xF0, 0xC6, 0x1B, 0x6F, 0xBC, 0xF1, 0xC6, 0x1B, 0x6F, 0xBC, 0xF1, 0x06, 0x00,
|
||||
0x08, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0xE4, 0x6F, 0x00, 0x00,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x3E, 0x00, 0xF9, 0x00, 0xE4, 0x03, 0x90, 0x0F, 0x40, 0x3E, 0x00, 0xF9, 0x00, 0xE4, 0x03, 0x90, 0x0F, 0x40, 0x3E, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0xFF, 0x03, 0xF0, 0x3F, 0x00, 0xFF, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x82, 0xE0, 0xBA, 0x2E, 0x08, 0x82, 0x80, 0x20, 0x08, 0xAE, 0xEB, 0x82, 0x20, 0x08, 0x08, 0x82, 0xE0, 0xBA, 0x2E, 0x08, 0x82, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x30, 0xFC, 0x00, 0x43, 0x07, 0xFC, 0x20, 0x40, 0x07, 0x30, 0x20, 0x00, 0x03, 0x00, 0xFC, 0x00, 0x40, 0x07, 0x00, 0x20,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xC0, 0x20, 0x1D, 0x20, 0x61, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x84, 0x01, 0x24, 0xB4, 0xF1, 0x01, 0xFE, 0x0F, 0xD0, 0x0F, 0x00, 0xFC,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x90, 0x1A, 0x40, 0xFE, 0x06, 0xE4, 0x6F, 0x40, 0xFE, 0x06, 0x90, 0x1A, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x81, 0x88, 0x88, 0x58, 0x55, 0x55, 0xF5, 0x0F, 0x40, 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0xA5, 0x6B, 0x01, 0x64, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x86, 0xC0, 0x00, 0x2C, 0x40, 0xFE, 0x0B, 0xE4, 0xBF, 0x0C, 0xC0, 0xF2, 0x6F, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xF4, 0x01, 0xC0, 0x30, 0x00, 0x0D, 0x07, 0xF0, 0xF0, 0x40, 0x5F, 0x1F, 0xFC, 0xFA, 0xD3, 0xFF, 0x7F, 0xFF, 0xF0, 0xDF, 0xFF, 0x7F,
|
||||
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1E, 0x00, 0x80, 0x07, 0x00, 0xE0, 0x01, 0x00, 0x78, 0x60, 0x00, 0x24, 0x98, 0x01, 0x80, 0x42, 0x06, 0x00, 0x00, 0x19, 0x00, 0x00, 0x04,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7F, 0x00, 0x5C, 0x0D, 0xC0, 0xC1, 0x00, 0x1C, 0x0C, 0x40, 0xFF, 0x01, 0x00, 0x74, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0xA2, 0x02, 0x80, 0x0A, 0x00, 0x25, 0x00, 0x44, 0x08, 0x10, 0x01, 0x40, 0x04, 0x00, 0x14, 0x00, 0x10, 0x00, 0x00,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0xFA, 0x00, 0x5B, 0x0E, 0x60, 0x90, 0x00, 0x01, 0x04,
|
||||
0x06, 0x00, 0x00, 0x00, 0xCD, 0xF1, 0x3F, 0xFD, 0x41, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x06, 0x00, 0x00, 0x00, 0x74, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0xDC, 0xC0, 0x0C, 0x99, 0x31, 0x30, 0x89, 0x41, 0x07,
|
||||
0x0A, 0x00, 0x00, 0x00, 0x74, 0x00, 0xD0, 0x1F, 0x40, 0x8B, 0x07, 0x3D, 0xF3, 0xF1, 0x3F, 0x3F, 0xFD, 0xF8, 0x41, 0xFF, 0x07, 0xD0, 0x1C, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
extern const unsigned short font_ptrs[] = {
|
||||
0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0060, 0x0070,
|
||||
0x0080, 0x0090, 0x00A0, 0x00B0, 0x00C0, 0x00D0, 0x00E0, 0x00F0,
|
||||
0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x0170,
|
||||
0x0180, 0x0190, 0x01A0, 0x01B0, 0x01C0, 0x01D0, 0x01E0, 0x01F0,
|
||||
0x0200, 0x0210, 0x021A, 0x022A, 0x023D, 0x0250, 0x0266, 0x0279,
|
||||
0x0283, 0x0290, 0x029D, 0x02B0, 0x02C3, 0x02D0, 0x02E0, 0x02EA,
|
||||
0x02FD, 0x0310, 0x0320, 0x0333, 0x0346, 0x0359, 0x036C, 0x037F,
|
||||
0x0392, 0x03A5, 0x03B8, 0x03C2, 0x03CF, 0x03E2, 0x03F5, 0x0408,
|
||||
0x041B, 0x0434, 0x0447, 0x045A, 0x046D, 0x0480, 0x0493, 0x04A6,
|
||||
0x04B9, 0x04CC, 0x04D9, 0x04EC, 0x0502, 0x0515, 0x052E, 0x0544,
|
||||
0x055A, 0x056D, 0x0583, 0x0596, 0x05A9, 0x05BC, 0x05D2, 0x05E5,
|
||||
0x05FE, 0x0614, 0x0627, 0x063D, 0x064A, 0x065A, 0x0667, 0x0674,
|
||||
0x0687, 0x0691, 0x06A1, 0x06B1, 0x06C1, 0x06D1, 0x06E1, 0x06EE,
|
||||
0x06FE, 0x070E, 0x071B, 0x0728, 0x0738, 0x0745, 0x0758, 0x0768,
|
||||
0x0778, 0x0788, 0x0798, 0x07A5, 0x07B5, 0x07C2, 0x07D2, 0x07E2,
|
||||
0x07F5, 0x0805, 0x0815, 0x0825, 0x0832, 0x0839, 0x0846, 0x0859,
|
||||
|
||||
0x0866, 0x087F, 0x08A4, 0x08C9, 0x08E8, 0x090D, 0x092C, 0x094B,
|
||||
0x096A, 0x0989, 0x09A8, 0x09C7, 0x09E6, 0x0A0B, 0x0A1E, 0x0A3D,
|
||||
0x0A5C, 0x0A7B, 0x0A9A, 0x0AB3, 0x0AD5, 0x0AF7, 0x0B1C, 0x0B41,
|
||||
0x0B5D, 0x0B79, 0x0B95, 0x0BB1, 0x0BCD, 0x0BE9, 0x0C05, 0x0C21,
|
||||
0x0C3D, 0x0C59, 0x0C75, 0x0C94, 0x0CB6, 0x0CD8, 0x0CF1, 0x0D10,
|
||||
0x0D2F, 0x0D4E, 0x0D6D, 0x0D89, 0x0D96, 0x0DA0, 0x0DAA, 0x0DBA,
|
||||
0x0DCA, 0x0DDA, 0x0DEA, 0x0DFA, 0x0E0A, 0x0E1A, 0x0E2A, 0x0E3A,
|
||||
0x0E4A, 0x0E5A, 0x0E67, 0x0E71, 0x0E7B, 0x0E8B, 0x0E9E, 0x0EB1,
|
||||
0x0ED0, 0x0EEF, 0x0F0E, 0x0F2D, 0x0F4C, 0x0F6B, 0x0F8A, 0x0FA9,
|
||||
0x0FC8, 0x0FE7, 0x1006, 0x1025, 0x1044, 0x1063, 0x1082, 0x10A1,
|
||||
0x10BD, 0x10DC, 0x10FB, 0x111A, 0x1139, 0x1158, 0x1177, 0x1196,
|
||||
0x11B5, 0x11C5, 0x11DE, 0x11FA, 0x1219, 0x1238, 0x1257, 0x1276,
|
||||
0x1295, 0x12B7, 0x12D6, 0x12F5, 0x1314, 0x1339, 0x1358, 0x1377,
|
||||
0x1396, 0x13A9, 0x13BC, 0x13CF, 0x13E2, 0x13F5, 0x1408, 0x141B,
|
||||
0x142E, 0x1441, 0x1454, 0x1467, 0x147A, 0x148D, 0x14A0, 0x14B3,
|
||||
0x14C6, 0x14D9, 0x14EC, 0x14FF, 0x1512, 0x1525, 0x1538, 0x154B,
|
||||
|
||||
0x155E,
|
||||
};
|
||||
extern const unsigned int font_ranges[][2] = {
|
||||
{ 0x000000, 0x00007F },
|
||||
{ 0x00E000, 0x00E07F },
|
||||
{ 0x00FFFD, 0x00FFFD },
|
||||
{ 0, 0 },
|
||||
};
|
||||
#endif
|
11
data/font.h
Normal file
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
#define FONT_H 12
|
||||
#ifndef FONTEDITOR
|
||||
extern const unsigned char font_data[];
|
||||
extern const unsigned short font_ptrs[];
|
||||
extern const unsigned int font_ranges[][2];
|
||||
#else
|
||||
extern unsigned char *font_data;
|
||||
extern unsigned short *font_ptrs;
|
||||
extern unsigned int (*font_ranges)[2];
|
||||
#endif
|
23
data/hmap.cpp
Normal file
24
data/hmap.h
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Powder Toy - Heatmap Data
|
||||
*
|
||||
* Copyright (c) 2010 Simon Robertshaw
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
||||
*/
|
||||
#pragma once
|
||||
extern const unsigned char color_data[];
|
||||
//extern const char plasma_data[];
|
||||
extern const unsigned char hflm_data[];
|
||||
extern const unsigned char firw_data[];
|
4118
data/icon.cpp
Normal file
22
data/icon.h
Normal file
@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Powder Toy - Main source
|
||||
*
|
||||
* Copyright (c) 2008 - 2010 Stanislaw Skowronek.
|
||||
* Copyright (c) 2010 Simon Robertshaw
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
||||
*/
|
||||
#pragma once
|
||||
extern const unsigned char app_icon[];
|
310
data/icondoc.h
Normal file
@ -0,0 +1,310 @@
|
||||
/**
|
||||
* Powder Toy - Main source
|
||||
*
|
||||
* Copyright (c) 2008 - 2010 Stanislaw Skowronek.
|
||||
* Copyright (c) 2010 Simon Robertshaw
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
||||
*/
|
||||
#pragma once
|
||||
const unsigned char icon_doc_32_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a,
|
||||
0xf4, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
|
||||
0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93,
|
||||
0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
|
||||
0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdb, 0x04,
|
||||
0x06, 0x11, 0x21, 0x0c, 0xfc, 0x0b, 0x2f, 0xdf, 0x00, 0x00, 0x04, 0x65, 0x49, 0x44, 0x41, 0x54,
|
||||
0x58, 0xc3, 0xb5, 0x96, 0x7f, 0x4c, 0xd4, 0x65, 0x1c, 0xc7, 0x5f, 0xcf, 0x73, 0xdf, 0xe3, 0x7e,
|
||||
0x90, 0x8b, 0x98, 0xb8, 0x36, 0x12, 0xb8, 0x38, 0x69, 0x03, 0x4c, 0x64, 0xec, 0x6a, 0xa2, 0xd3,
|
||||
0xb5, 0x74, 0x78, 0x4c, 0x42, 0x33, 0x51, 0xda, 0x5c, 0xe3, 0x97, 0x72, 0x79, 0xcc, 0x5c, 0xfd,
|
||||
0x53, 0xcb, 0x50, 0x69, 0x93, 0xda, 0x9a, 0x3a, 0x0d, 0x0d, 0x99, 0xf3, 0x9f, 0x3b, 0x98, 0x89,
|
||||
0x72, 0x14, 0x64, 0xb2, 0x62, 0x2b, 0x56, 0xad, 0x56, 0x20, 0xbf, 0x06, 0x3a, 0xe1, 0x1c, 0x8b,
|
||||
0xed, 0x86, 0x89, 0x77, 0x96, 0x7f, 0x30, 0xf6, 0xed, 0x0f, 0xb9, 0x1b, 0xe6, 0x1d, 0x7c, 0x39,
|
||||
0xe8, 0xb3, 0x3d, 0x7b, 0xbe, 0xcf, 0xb3, 0xef, 0xf3, 0x7c, 0x5f, 0xcf, 0xfb, 0xf3, 0xe3, 0xf9,
|
||||
0x0a, 0x9e, 0xb4, 0xd5, 0x40, 0x0a, 0x0b, 0x37, 0x3f, 0x30, 0x0a, 0x78, 0x17, 0xb2, 0x48, 0x09,
|
||||
0x33, 0x97, 0x52, 0x52, 0x52, 0xe2, 0x11, 0x42, 0xa0, 0xaa, 0x2a, 0x42, 0x08, 0x80, 0xd0, 0xb3,
|
||||
0xaa, 0xaa, 0xa1, 0x17, 0x55, 0x55, 0x45, 0x55, 0x55, 0xcc, 0x66, 0x33, 0x05, 0x05, 0x05, 0x3e,
|
||||
0xa7, 0xd3, 0x59, 0x73, 0xf3, 0xe6, 0xcd, 0xd6, 0x19, 0x90, 0xa8, 0x01, 0xa4, 0x10, 0x82, 0xce,
|
||||
0xce, 0x4e, 0x4d, 0x1b, 0x5c, 0xe8, 0xed, 0x61, 0x6f, 0x7a, 0x26, 0x89, 0x89, 0x89, 0x2b, 0xda,
|
||||
0xdb, 0xdb, 0x3f, 0xcd, 0xcb, 0xcb, 0xd3, 0xdf, 0xba, 0x75, 0xab, 0x59, 0x2b, 0x84, 0x0c, 0x33,
|
||||
0xa7, 0x9f, 0x7d, 0xca, 0xf9, 0xec, 0xfc, 0xa9, 0xd3, 0x08, 0x21, 0x68, 0x68, 0x68, 0xc0, 0xe7,
|
||||
0xf3, 0x19, 0x3a, 0x3a, 0x3a, 0x6a, 0xad, 0x56, 0xeb, 0x0e, 0xad, 0x6e, 0x94, 0x91, 0x14, 0xd0,
|
||||
0xd2, 0x00, 0xba, 0xea, 0xeb, 0x11, 0x42, 0x30, 0x35, 0x35, 0x45, 0x57, 0x57, 0x17, 0x89, 0x89,
|
||||
0x89, 0x4a, 0x5b, 0x5b, 0x5b, 0xad, 0xc5, 0x62, 0x79, 0x5d, 0x0b, 0x84, 0x24, 0x4a, 0xeb, 0x77,
|
||||
0x55, 0x86, 0x20, 0x84, 0x10, 0x48, 0x29, 0x19, 0x1e, 0x1e, 0x46, 0x4a, 0x49, 0x52, 0x52, 0x92,
|
||||
0xd2, 0xda, 0xda, 0x7a, 0x5c, 0x0b, 0x44, 0xd4, 0x00, 0x19, 0xc5, 0x75, 0xa1, 0x8f, 0x03, 0x48,
|
||||
0x29, 0x19, 0x1f, 0x1f, 0x0f, 0xc1, 0x58, 0x2c, 0x16, 0xa5, 0xb9, 0xb9, 0x79, 0x5e, 0x25, 0xa2,
|
||||
0x06, 0x98, 0x6d, 0x41, 0x97, 0x04, 0x01, 0x14, 0x45, 0x41, 0x51, 0x14, 0x52, 0x53, 0x53, 0x75,
|
||||
0x4d, 0x4d, 0x4d, 0xb5, 0xc9, 0xc9, 0xc9, 0x11, 0x21, 0x16, 0x05, 0x30, 0xe0, 0x7e, 0xfb, 0x31,
|
||||
0x08, 0x9f, 0xcf, 0x47, 0x42, 0x42, 0x02, 0xf1, 0xf1, 0xf1, 0x58, 0xad, 0x56, 0xb2, 0xb3, 0xb3,
|
||||
0x71, 0x3a, 0x9d, 0x3a, 0x87, 0xc3, 0x71, 0x24, 0x21, 0x21, 0xe1, 0x9d, 0x70, 0x10, 0x32, 0xd2,
|
||||
0x89, 0xe6, 0x8d, 0x01, 0xb7, 0x83, 0xf4, 0x3d, 0x67, 0x1e, 0x5b, 0xa3, 0xd7, 0xeb, 0x31, 0x9b,
|
||||
0xcd, 0xc4, 0xc6, 0xc6, 0x32, 0x3d, 0x3d, 0x4d, 0x20, 0x10, 0x60, 0x64, 0x64, 0x84, 0x93, 0x27,
|
||||
0x4f, 0xc6, 0x66, 0x66, 0x66, 0x96, 0x6a, 0x06, 0x98, 0x2d, 0x6b, 0xb8, 0x76, 0x65, 0x70, 0x90,
|
||||
0xcc, 0xe2, 0xba, 0xd0, 0x78, 0xc0, 0xed, 0x08, 0xf9, 0x3e, 0x26, 0x26, 0x06, 0xa3, 0xd1, 0x88,
|
||||
0xc1, 0x60, 0xc0, 0x64, 0x32, 0x61, 0x30, 0x18, 0x1e, 0x15, 0x1c, 0x45, 0x89, 0x05, 0xe2, 0x16,
|
||||
0xed, 0x82, 0x6a, 0xcf, 0x55, 0x76, 0xa4, 0xa7, 0x87, 0xc6, 0x6f, 0x1c, 0x3b, 0xfa, 0x44, 0x40,
|
||||
0x06, 0x61, 0xa4, 0x94, 0xe8, 0x74, 0x3a, 0xf4, 0x7a, 0x3d, 0x26, 0x93, 0x09, 0x40, 0xa7, 0xa5,
|
||||
0x12, 0x22, 0x65, 0x64, 0xae, 0xea, 0x82, 0xc2, 0xc7, 0xc6, 0x97, 0x3e, 0x3c, 0xfc, 0x84, 0x72,
|
||||
0xb3, 0x4b, 0xb8, 0x94, 0x12, 0x55, 0x55, 0x31, 0x1a, 0x8d, 0x61, 0x0f, 0xac, 0xf0, 0x3f, 0xd8,
|
||||
0x7f, 0x21, 0x66, 0x5c, 0x00, 0x20, 0x16, 0x1d, 0x03, 0x59, 0x7b, 0x76, 0xa3, 0xb5, 0x52, 0x06,
|
||||
0x9b, 0x94, 0x32, 0x08, 0xc0, 0xa2, 0xb3, 0xa0, 0xa7, 0xb1, 0x29, 0xf4, 0x5c, 0x7a, 0xea, 0x04,
|
||||
0xfd, 0x2e, 0x07, 0x73, 0xed, 0x11, 0xec, 0x75, 0x3a, 0x9d, 0xe6, 0xdb, 0x10, 0xad, 0x97, 0x51,
|
||||
0x43, 0xd5, 0x41, 0x1a, 0xe6, 0x71, 0x45, 0xd0, 0x22, 0x01, 0x44, 0x5d, 0x07, 0xa2, 0xa9, 0x94,
|
||||
0x0b, 0xaa, 0x84, 0x5a, 0xfd, 0xbb, 0xab, 0xe6, 0x98, 0xa6, 0x5b, 0x33, 0x52, 0x66, 0x45, 0xad,
|
||||
0x40, 0xb5, 0xe7, 0x2a, 0xa5, 0xa7, 0x4e, 0x60, 0x2f, 0x2c, 0x5c, 0x7a, 0x05, 0xe6, 0x02, 0x08,
|
||||
0x06, 0xdd, 0xd8, 0xa8, 0x97, 0x86, 0xaa, 0x83, 0xd8, 0x7a, 0xcf, 0x92, 0xb5, 0xbb, 0x48, 0x13,
|
||||
0x84, 0x66, 0x80, 0xb9, 0x82, 0x70, 0x5f, 0xe7, 0x14, 0x17, 0x7a, 0x7b, 0xe8, 0xfc, 0xe6, 0x1a,
|
||||
0xab, 0xf2, 0xed, 0x68, 0x0d, 0x97, 0x48, 0x7b, 0x2a, 0x0b, 0x91, 0xcc, 0xba, 0x75, 0x2b, 0x5d,
|
||||
0xf5, 0xe7, 0xe9, 0xaa, 0x3f, 0xcf, 0x85, 0x1b, 0x3d, 0x20, 0xa0, 0xb8, 0xe6, 0x63, 0xfe, 0x0e,
|
||||
0x04, 0xd8, 0x75, 0xec, 0x28, 0x97, 0x0e, 0x7f, 0xb4, 0x34, 0x0a, 0x44, 0x32, 0xcf, 0x5e, 0x0b,
|
||||
0xd5, 0x9e, 0x16, 0x06, 0xdc, 0x0e, 0x6c, 0x7d, 0xe7, 0x98, 0xbc, 0x37, 0x49, 0x4e, 0x6e, 0x2e,
|
||||
0x4f, 0x2d, 0x5b, 0x86, 0x7d, 0xfb, 0x76, 0xaa, 0x3d, 0x57, 0xb1, 0xda, 0xed, 0x54, 0x7b, 0x5a,
|
||||
0x34, 0xef, 0xa9, 0x09, 0x20, 0xe8, 0xe3, 0x8a, 0xef, 0xa7, 0x00, 0x95, 0xa1, 0x35, 0x07, 0xb8,
|
||||
0xfe, 0x5c, 0x11, 0x5b, 0xc6, 0x9a, 0x58, 0x99, 0x92, 0xc2, 0x2b, 0xf9, 0xf9, 0xd8, 0x7a, 0xcf,
|
||||
0xd2, 0xe2, 0x72, 0x03, 0x2a, 0x63, 0xa3, 0xa3, 0xac, 0xaf, 0x28, 0xd7, 0xa4, 0x80, 0xa2, 0x45,
|
||||
0xae, 0xee, 0xc6, 0x26, 0xd6, 0xee, 0x2e, 0xa2, 0xcc, 0xe9, 0xc4, 0x7b, 0xfb, 0x36, 0x69, 0xdd,
|
||||
0xa7, 0x39, 0xf7, 0xbb, 0x09, 0xef, 0x6a, 0x1b, 0x65, 0x0f, 0xae, 0x71, 0xc4, 0xfb, 0x2c, 0x5f,
|
||||
0xae, 0xd9, 0x42, 0x61, 0x31, 0xec, 0x7c, 0xf0, 0x2d, 0x30, 0xc4, 0x91, 0x95, 0x2b, 0x97, 0x46,
|
||||
0x81, 0x0d, 0xfb, 0x2a, 0x38, 0x74, 0xf1, 0x22, 0x55, 0x1f, 0xbc, 0x8f, 0xad, 0xef, 0x2c, 0x77,
|
||||
0xbc, 0x5e, 0xf6, 0x77, 0x4e, 0xb1, 0xaf, 0xa4, 0x14, 0x21, 0x04, 0xc3, 0x59, 0x07, 0x58, 0xb7,
|
||||
0x69, 0x23, 0x57, 0x5c, 0x6e, 0x9e, 0x8e, 0x7b, 0x06, 0x21, 0x1e, 0x05, 0xea, 0x56, 0x0d, 0xe9,
|
||||
0x39, 0x67, 0x1a, 0x0a, 0x21, 0xd8, 0x50, 0x51, 0x4e, 0xc0, 0xef, 0xa7, 0x2c, 0xe6, 0x17, 0x4a,
|
||||
0x5e, 0xcc, 0x22, 0xa3, 0xb8, 0x8e, 0xa1, 0xbe, 0x3e, 0x02, 0x81, 0x00, 0x3f, 0xfc, 0xf6, 0x2b,
|
||||
0xdf, 0xb5, 0xb5, 0xe1, 0xbd, 0x3b, 0x41, 0x5f, 0x77, 0x0f, 0x39, 0xb9, 0xeb, 0x38, 0x73, 0xbc,
|
||||
0x96, 0x8c, 0xe2, 0x3a, 0x6c, 0xeb, 0xd7, 0x73, 0x67, 0x64, 0x84, 0x55, 0xf9, 0x76, 0xec, 0xef,
|
||||
0xbd, 0x3b, 0x67, 0x5a, 0x47, 0x54, 0x20, 0xb7, 0xbc, 0x8c, 0x07, 0x7e, 0x3f, 0x69, 0x19, 0x19,
|
||||
0xbc, 0xe9, 0xf9, 0x8b, 0x7e, 0x57, 0x25, 0xcd, 0x03, 0x03, 0x6c, 0xde, 0xb6, 0x0d, 0x57, 0x41,
|
||||
0x3c, 0x83, 0x37, 0x7a, 0x71, 0xbf, 0xb6, 0x9c, 0x2d, 0x63, 0x8d, 0xe4, 0xbf, 0xba, 0x99, 0x43,
|
||||
0xcb, 0x87, 0x10, 0x42, 0xd0, 0xef, 0xaa, 0xc4, 0x7f, 0x7f, 0x92, 0xfb, 0x93, 0x93, 0x6c, 0xcc,
|
||||
0xcb, 0x23, 0xe0, 0xf7, 0xcf, 0x59, 0x09, 0x23, 0xfe, 0x0f, 0x7c, 0x51, 0xf8, 0x02, 0x8d, 0xe3,
|
||||
0x71, 0xdc, 0x9b, 0xb8, 0xcb, 0x8a, 0xac, 0x2c, 0xba, 0x9f, 0xdf, 0xc4, 0x1f, 0x1d, 0xd7, 0x11,
|
||||
0x42, 0xf0, 0xd9, 0xc4, 0x0a, 0xf6, 0xbf, 0xb5, 0x93, 0x31, 0x9d, 0x0e, 0xef, 0xf8, 0x9f, 0x74,
|
||||
0x7b, 0x5a, 0x90, 0xf9, 0x0e, 0x3e, 0xa9, 0x85, 0xcf, 0xbf, 0xfe, 0x0a, 0x23, 0x0f, 0xc9, 0xb1,
|
||||
0xbd, 0xc4, 0xda, 0xbb, 0x3f, 0xa2, 0xa6, 0xa6, 0xd1, 0x5d, 0xf2, 0x13, 0x6d, 0x97, 0x2f, 0x87,
|
||||
0x4f, 0xcf, 0x30, 0x73, 0x2f, 0x03, 0x99, 0x80, 0x69, 0x89, 0xff, 0x53, 0x1e, 0x02, 0x7d, 0xc0,
|
||||
0xcf, 0xf3, 0x01, 0x98, 0x81, 0x65, 0x33, 0xfd, 0x52, 0xda, 0x3f, 0x40, 0x60, 0xa6, 0x0f, 0xd9,
|
||||
0xbf, 0x2f, 0x89, 0x69, 0x46, 0x25, 0x68, 0x1c, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
|
||||
0x44, 0xae, 0x42, 0x60, 0x82
|
||||
};
|
||||
const unsigned char icon_doc_16_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff,
|
||||
0x61, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
|
||||
0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93,
|
||||
0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
|
||||
0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdb, 0x04,
|
||||
0x06, 0x11, 0x21, 0x22, 0x20, 0xdd, 0x22, 0x10, 0x00, 0x00, 0x01, 0x95, 0x49, 0x44, 0x41, 0x54,
|
||||
0x38, 0xcb, 0x95, 0x93, 0x3d, 0x4b, 0x82, 0x51, 0x14, 0xc7, 0x7f, 0xc7, 0x24, 0x4d, 0x7c, 0x96,
|
||||
0x96, 0x50, 0x48, 0x14, 0x8a, 0x86, 0x16, 0x23, 0x28, 0xea, 0x23, 0xd8, 0xd0, 0xcb, 0x20, 0x86,
|
||||
0x6b, 0x11, 0xb4, 0xd8, 0x10, 0x6d, 0x81, 0xbd, 0x7c, 0x02, 0x5b, 0xa2, 0x10, 0x47, 0x6b, 0x2a,
|
||||
0xa7, 0x1c, 0x0b, 0x24, 0xb3, 0xa9, 0xf7, 0xa1, 0x25, 0xb2, 0x20, 0xe4, 0x59, 0xad, 0xd0, 0xb2,
|
||||
0xdb, 0x50, 0x8f, 0x3c, 0xbe, 0x3c, 0x50, 0x07, 0x2e, 0xdc, 0x73, 0xef, 0x39, 0xff, 0xf3, 0x3b,
|
||||
0x87, 0x7b, 0x45, 0x29, 0x05, 0x80, 0x88, 0x0c, 0x02, 0x1a, 0x16, 0xa6, 0x94, 0x3a, 0x6b, 0x77,
|
||||
0x6e, 0x37, 0xed, 0xb5, 0x68, 0x34, 0x9a, 0x37, 0x1c, 0x8f, 0xcf, 0xc7, 0x4b, 0xb1, 0x08, 0x40,
|
||||
0xa9, 0x54, 0x42, 0x44, 0xc6, 0xda, 0x89, 0x98, 0x05, 0x04, 0xa0, 0x50, 0x28, 0x10, 0xcf, 0x1c,
|
||||
0x12, 0x9f, 0x9c, 0xaa, 0x5f, 0xf4, 0x0e, 0x05, 0xd1, 0x75, 0x3d, 0x2f, 0x22, 0xe3, 0x4a, 0xa9,
|
||||
0xbc, 0x59, 0xc0, 0x66, 0x76, 0x44, 0x04, 0xa0, 0x21, 0x19, 0xe0, 0xfe, 0x34, 0x8f, 0xcb, 0xe5,
|
||||
0x42, 0xd7, 0xf5, 0x53, 0x11, 0x19, 0xb3, 0x12, 0x10, 0x43, 0xa4, 0x79, 0x01, 0x38, 0x1c, 0x0e,
|
||||
0xb3, 0xc8, 0x78, 0xdb, 0x16, 0x8c, 0xe0, 0xe0, 0x6c, 0x84, 0x8b, 0xf4, 0x5e, 0x03, 0x99, 0xd7,
|
||||
0xeb, 0x05, 0x20, 0x10, 0x08, 0xd4, 0x8b, 0x35, 0x13, 0xd8, 0x8c, 0x8a, 0x97, 0x7b, 0xfb, 0xf5,
|
||||
0xea, 0xf3, 0x5b, 0x09, 0x1e, 0x0e, 0x96, 0xd1, 0x34, 0x0d, 0x4d, 0xd3, 0xf0, 0xfb, 0xfd, 0x0d,
|
||||
0x79, 0x2d, 0x04, 0x06, 0x85, 0x61, 0xc9, 0xd8, 0x12, 0x49, 0xc0, 0x6e, 0xff, 0x09, 0x75, 0x3a,
|
||||
0x9d, 0x96, 0x04, 0xd2, 0x9c, 0xdc, 0xce, 0x7e, 0x63, 0xe4, 0x5f, 0x43, 0x0c, 0x6f, 0xac, 0xd3,
|
||||
0x44, 0xf7, 0x37, 0x82, 0x78, 0x26, 0xc3, 0x5c, 0x22, 0x41, 0x68, 0x7a, 0xfa, 0x4f, 0x04, 0xf5,
|
||||
0x21, 0xde, 0xa5, 0x17, 0x11, 0x11, 0x9e, 0x8b, 0x8f, 0x24, 0x63, 0x31, 0x46, 0x6f, 0xb6, 0x19,
|
||||
0x9a, 0x8d, 0x98, 0x29, 0x6c, 0x96, 0x2d, 0x00, 0x2c, 0x1c, 0x7f, 0x92, 0xba, 0xbe, 0xe2, 0x24,
|
||||
0x9b, 0xa5, 0x7f, 0x22, 0x64, 0xbe, 0x6a, 0x89, 0x6d, 0x79, 0xca, 0x7d, 0xa1, 0x10, 0xb9, 0x9d,
|
||||
0x5d, 0x72, 0x3b, 0xbb, 0xa4, 0xae, 0xaf, 0x00, 0x88, 0x6e, 0x6e, 0xf2, 0x5a, 0x2e, 0x13, 0x5e,
|
||||
0x5f, 0xe3, 0xe9, 0x28, 0x6b, 0x29, 0x40, 0xad, 0x56, 0x63, 0xb8, 0xf3, 0x8b, 0x81, 0x99, 0x19,
|
||||
0xdc, 0x5f, 0x6f, 0x64, 0x57, 0x57, 0x78, 0xb3, 0xbb, 0xe9, 0xa9, 0x54, 0xa8, 0x54, 0x3f, 0xa8,
|
||||
0xde, 0xde, 0xd1, 0xed, 0xf1, 0x34, 0xa2, 0x98, 0xbe, 0xf3, 0x08, 0xe0, 0x01, 0xba, 0x00, 0x37,
|
||||
0xe0, 0x00, 0x3a, 0x0c, 0x6d, 0xa0, 0x02, 0x94, 0x81, 0x77, 0xe0, 0x45, 0x29, 0x75, 0x0e, 0xf0,
|
||||
0x0d, 0xff, 0x1c, 0x7a, 0x37, 0x5c, 0xfd, 0x46, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
|
||||
0x44, 0xae, 0x42, 0x60, 0x82
|
||||
};
|
||||
|
||||
const unsigned char icon_desktop_48_png[] = {
|
||||
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xF9,
|
||||
0x87, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00,
|
||||
0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00,
|
||||
0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC3, 0x00, 0x00, 0x0E, 0xC3, 0x01, 0xC7,
|
||||
0x6F, 0xA8, 0x64, 0x00, 0x00, 0x0A, 0x20, 0x49, 0x44, 0x41, 0x54, 0x68, 0x43, 0xED, 0x99, 0x7B,
|
||||
0x8C, 0x54, 0xE5, 0x19, 0x87, 0xF7, 0x32, 0xB7, 0x9D, 0x85, 0x55, 0xA0, 0x08, 0x08, 0x08, 0x42,
|
||||
0x65, 0x97, 0x4B, 0x54, 0x84, 0x5D, 0x6A, 0xB9, 0x2C, 0x48, 0xD1, 0x22, 0x82, 0x84, 0x22, 0x85,
|
||||
0xCA, 0xC5, 0xD4, 0x96, 0x58, 0xA3, 0x98, 0x52, 0xB0, 0x50, 0xA4, 0x88, 0x97, 0x16, 0x42, 0xAC,
|
||||
0xD2, 0x48, 0x6B, 0x49, 0x1A, 0xA9, 0xED, 0xC2, 0x2E, 0x36, 0xB5, 0xB1, 0x7F, 0x58, 0x42, 0x45,
|
||||
0x88, 0x88, 0xB4, 0xB5, 0x2D, 0x88, 0xA1, 0x05, 0xE4, 0xD2, 0x05, 0x16, 0x90, 0xCB, 0xEE, 0xCC,
|
||||
0x99, 0x99, 0x33, 0x73, 0xE6, 0xF2, 0xF6, 0x79, 0xCF, 0x39, 0x33, 0x3B, 0x80, 0x95, 0x59, 0x62,
|
||||
0x22, 0x24, 0x98, 0x3C, 0xF9, 0x0E, 0x24, 0xB2, 0xCF, 0xEF, 0x3D, 0xBF, 0xEF, 0x3B, 0x67, 0x76,
|
||||
0x8A, 0x8A, 0xAE, 0xFD, 0x77, 0x6D, 0x02, 0xD7, 0x26, 0x70, 0x75, 0x4F, 0xE0, 0xE9, 0x67, 0x7F,
|
||||
0xFA, 0xD8, 0xF2, 0xE7, 0x56, 0xC8, 0xD5, 0xC0, 0xE2, 0xA7, 0x96, 0xCD, 0x67, 0xDA, 0x3E, 0x28,
|
||||
0xCE, 0x4D, 0x5D, 0xC5, 0xF7, 0xEC, 0x3B, 0xF2, 0x85, 0xF1, 0xC8, 0xE2, 0xD5, 0xA2, 0x64, 0x1D,
|
||||
0x3E, 0xEB, 0xCF, 0xEA, 0x8A, 0x78, 0x17, 0x37, 0x84, 0x93, 0xE1, 0x8B, 0x0E, 0xD0, 0x96, 0xE1,
|
||||
0xB9, 0x01, 0xFA, 0xA1, 0xDD, 0xEE, 0xA2, 0x3B, 0x30, 0x74, 0xC8, 0x10, 0x19, 0x0D, 0x73, 0x61,
|
||||
0x55, 0x4D, 0xB5, 0xAC, 0x1B, 0x5B, 0x2D, 0x75, 0xC3, 0x6B, 0xE4, 0xB5, 0x11, 0xAC, 0x77, 0x55,
|
||||
0xCB, 0x86, 0x19, 0xC3, 0xA4, 0xFE, 0x51, 0x98, 0x3F, 0x4C, 0x1A, 0x96, 0xDE, 0x29, 0x0D, 0x2B,
|
||||
0x46, 0x4A, 0xC3, 0xCF, 0xC6, 0x48, 0xC3, 0x8B, 0x63, 0x59, 0xBF, 0x26, 0x0D, 0x2F, 0x29, 0xFC,
|
||||
0x79, 0x75, 0x2D, 0xEB, 0x28, 0x18, 0x01, 0x5F, 0x91, 0x86, 0x17, 0xF8, 0x7F, 0x16, 0xD4, 0x48,
|
||||
0xFD, 0xDC, 0x6A, 0xA9, 0x9F, 0x09, 0x53, 0xF8, 0xB7, 0xEE, 0x63, 0x1D, 0xCF, 0x7A, 0x0F, 0xEB,
|
||||
0xDD, 0x35, 0xB2, 0x7E, 0x34, 0xF0, 0x73, 0x36, 0xC0, 0xFA, 0x51, 0x35, 0x52, 0x37, 0xB2, 0x46,
|
||||
0x1E, 0x9A, 0x33, 0xE7, 0x3C, 0x34, 0xA8, 0x1B, 0x60, 0x00, 0xF2, 0x15, 0x17, 0x05, 0xE8, 0x5F,
|
||||
0x5C, 0x24, 0x3F, 0x2C, 0x2A, 0x91, 0x4D, 0xC5, 0xA5, 0x72, 0xCC, 0xEF, 0x93, 0x64, 0x77, 0xBF,
|
||||
0x64, 0x6A, 0xCB, 0x24, 0xF3, 0x44, 0x50, 0x32, 0x7F, 0x08, 0x4A, 0xFA, 0x74, 0x7B, 0xC9, 0x64,
|
||||
0x3A, 0x4B, 0x3A, 0x5D, 0x09, 0x23, 0xE0, 0x5E, 0x49, 0xA5, 0xEE, 0x96, 0x74, 0x6A, 0x92, 0xA4,
|
||||
0xD2, 0xB3, 0xB8, 0xFE, 0x96, 0x24, 0x53, 0x13, 0x25, 0x95, 0x1C, 0x02, 0x83, 0x25, 0x99, 0xEC,
|
||||
0x23, 0x49, 0xAB, 0x1C, 0xFC, 0x62, 0x1D, 0x0C, 0x88, 0xF5, 0x06, 0xAC, 0x0D, 0x48, 0x62, 0xBE,
|
||||
0x5F, 0xE2, 0x8F, 0xF8, 0x25, 0xF1, 0x70, 0x40, 0xE2, 0xB3, 0xB9, 0x1E, 0xEF, 0x17, 0xB3, 0x06,
|
||||
0x6E, 0xF5, 0x89, 0x59, 0xCD, 0x3A, 0x8C, 0x75, 0xA8, 0x5F, 0x06, 0x0C, 0x18, 0x60, 0x53, 0x59,
|
||||
0x59, 0xA5, 0xB5, 0xB1, 0x2B, 0xF6, 0x99, 0x01, 0x5E, 0xF6, 0x7A, 0xE4, 0xB0, 0xD7, 0x2B, 0xE9,
|
||||
0x00, 0xE2, 0x45, 0x3E, 0xC9, 0x54, 0xC0, 0x0A, 0x02, 0xB4, 0x54, 0xD8, 0xE2, 0x99, 0x4C, 0x57,
|
||||
0xA4, 0x3B, 0x41, 0x0F, 0x18, 0x80, 0xF8, 0x40, 0xD6, 0xEE, 0xC8, 0xF7, 0x40, 0xBE, 0x1F, 0xD2,
|
||||
0x7D, 0xA1, 0x07, 0xE2, 0xED, 0x20, 0xE8, 0x88, 0x27, 0x7D, 0x62, 0x35, 0xFA, 0x24, 0xB1, 0x11,
|
||||
0x7E, 0x0C, 0x8F, 0xF9, 0x24, 0xFE, 0x03, 0xE4, 0x7F, 0x04, 0x4B, 0x91, 0xE7, 0x3A, 0x3E, 0x1D,
|
||||
0xE9, 0x51, 0x48, 0xDF, 0xEE, 0x93, 0xD8, 0x70, 0x18, 0x0D, 0xB5, 0x3E, 0x19, 0x34, 0x68, 0x90,
|
||||
0x44, 0xA3, 0x51, 0x88, 0x15, 0x16, 0x20, 0xD9, 0x35, 0x20, 0xE2, 0xF3, 0x8B, 0xA8, 0x3C, 0x48,
|
||||
0x80, 0xB5, 0x21, 0x80, 0x78, 0x6F, 0xB8, 0x13, 0xD9, 0x5B, 0x20, 0x00, 0x1E, 0xE4, 0x09, 0x9A,
|
||||
0xF6, 0xD9, 0xA4, 0xB8, 0x4E, 0xA5, 0x3C, 0x4C, 0x1F, 0x92, 0x5E, 0x1B, 0x4B, 0xD7, 0x04, 0xF2,
|
||||
0x7B, 0xE0, 0xE7, 0x88, 0xCF, 0x04, 0xC4, 0x6C, 0xA6, 0x22, 0x3D, 0x93, 0xE9, 0x7F, 0xAF, 0x4C,
|
||||
0xE2, 0x0F, 0x22, 0x3F, 0x16, 0x7A, 0x13, 0xA0, 0x1B, 0xF4, 0x41, 0xBE, 0x07, 0x74, 0xF4, 0x49,
|
||||
0xFF, 0xFE, 0xFD, 0xDD, 0x00, 0xD1, 0xC2, 0x02, 0x48, 0x89, 0x17, 0x79, 0xAF, 0x33, 0x7D, 0xE5,
|
||||
0x66, 0xD8, 0xC5, 0x1D, 0xC8, 0x0C, 0x96, 0x4C, 0xFA, 0x1E, 0xB8, 0xC9, 0x95, 0x0E, 0x30, 0x75,
|
||||
0x0D, 0x02, 0x29, 0xAE, 0x53, 0x65, 0xC8, 0x07, 0x10, 0x57, 0xFC, 0x88, 0x33, 0xF9, 0x33, 0x88,
|
||||
0xEF, 0x66, 0x7D, 0x91, 0x75, 0x0A, 0x54, 0x7A, 0x25, 0xD1, 0x1D, 0x98, 0x72, 0x7C, 0x2C, 0xCC,
|
||||
0x20, 0xC0, 0x82, 0x32, 0x31, 0x1F, 0x08, 0x50, 0x17, 0x84, 0xBF, 0xEC, 0x97, 0x18, 0x77, 0x3C,
|
||||
0x56, 0x0E, 0x5E, 0x9F, 0x44, 0xF9, 0xF9, 0x55, 0x95, 0x95, 0x52, 0x55, 0x55, 0x25, 0xFD, 0xFA,
|
||||
0xF5, 0x2B, 0x2C, 0x80, 0x3D, 0x75, 0xA5, 0x98, 0x0A, 0x95, 0xC1, 0xE3, 0x4C, 0x39, 0xF1, 0x25,
|
||||
0x49, 0x67, 0xEE, 0x42, 0x76, 0x32, 0x6B, 0x5F, 0x56, 0xA6, 0x9D, 0xF6, 0x23, 0xAD, 0x21, 0xCA,
|
||||
0xA8, 0x0C, 0xA4, 0xA8, 0x0B, 0xB5, 0x49, 0xA9, 0xBC, 0x85, 0xEC, 0x49, 0xF8, 0x2B, 0x93, 0x7E,
|
||||
0x1D, 0x9E, 0x80, 0x6A, 0xE8, 0x84, 0x74, 0x77, 0x56, 0xBA, 0x9D, 0xA0, 0x1E, 0xF1, 0xB9, 0x4C,
|
||||
0x7D, 0x15, 0xF2, 0xCF, 0x05, 0xC5, 0x9C, 0xC5, 0xF5, 0x38, 0xA6, 0xCF, 0xC0, 0xA2, 0x1D, 0x40,
|
||||
0x03, 0x94, 0xF8, 0xA4, 0x63, 0xC7, 0x8E, 0x52, 0x51, 0x51, 0x21, 0xC1, 0x60, 0xB0, 0xC0, 0x00,
|
||||
0x74, 0x5F, 0x7A, 0x51, 0x99, 0xAF, 0x22, 0xFF, 0x14, 0x34, 0xFA, 0x11, 0xD6, 0xEA, 0x2C, 0x82,
|
||||
0x65, 0x30, 0x1E, 0xE9, 0x8E, 0xAC, 0x04, 0x48, 0x97, 0x23, 0x8E, 0x74, 0x4A, 0xD7, 0x0A, 0xBB,
|
||||
0xF3, 0x16, 0x01, 0xAC, 0xB3, 0xC8, 0xFF, 0x07, 0xDE, 0x85, 0x7A, 0x58, 0x88, 0xF4, 0x18, 0xA8,
|
||||
0x82, 0x1A, 0xC4, 0x11, 0x8D, 0x4F, 0x47, 0xF6, 0x65, 0xE4, 0x0F, 0x96, 0x8B, 0x79, 0x84, 0x00,
|
||||
0xEF, 0x04, 0x24, 0xF6, 0x3B, 0x58, 0x02, 0x33, 0xB8, 0x13, 0x83, 0x09, 0x40, 0x95, 0x74, 0xE3,
|
||||
0xE6, 0x73, 0xC9, 0x4D, 0x9C, 0x99, 0x8B, 0x7C, 0x03, 0x95, 0xD9, 0xCD, 0x9A, 0xA0, 0x1E, 0x19,
|
||||
0x36, 0x6A, 0x7A, 0x0D, 0xEB, 0x47, 0xD4, 0x67, 0x0F, 0x75, 0x79, 0x0D, 0x66, 0x20, 0x5C, 0x09,
|
||||
0x9D, 0x99, 0x78, 0x7B, 0x47, 0x3E, 0xD5, 0x81, 0x00, 0x65, 0x62, 0xC5, 0x38, 0x65, 0xF6, 0x10,
|
||||
0xE2, 0x5F, 0x4C, 0xF9, 0x6F, 0x08, 0x6F, 0x65, 0x7D, 0x85, 0x75, 0x1E, 0xD2, 0x73, 0x74, 0xEA,
|
||||
0xF0, 0x7D, 0xF8, 0x05, 0x1C, 0x20, 0x80, 0x59, 0x26, 0x31, 0xB3, 0x02, 0xAE, 0x93, 0x58, 0x2C,
|
||||
0x28, 0xD1, 0x73, 0x04, 0xD8, 0x5F, 0x26, 0xD1, 0x3A, 0xBF, 0x44, 0x1F, 0x77, 0x02, 0x44, 0xA2,
|
||||
0x11, 0x89, 0x44, 0x22, 0x05, 0xDE, 0x81, 0x26, 0xA6, 0x2E, 0x7A, 0xE2, 0xF4, 0x42, 0x78, 0x34,
|
||||
0xE2, 0x6B, 0x09, 0xD0, 0x02, 0x69, 0x17, 0x13, 0xE1, 0xFD, 0xF0, 0x12, 0xD2, 0x13, 0x08, 0x50,
|
||||
0x89, 0x78, 0x67, 0x5B, 0x5E, 0xFB, 0x6F, 0x9D, 0x41, 0x7E, 0xAB, 0xD6, 0x87, 0xF5, 0x10, 0xF2,
|
||||
0xC7, 0x60, 0x1B, 0xAC, 0x47, 0xB8, 0x0E, 0x7E, 0x0F, 0xEF, 0x52, 0x97, 0x26, 0xFA, 0x8F, 0xBC,
|
||||
0x69, 0xD2, 0x77, 0xF3, 0x46, 0xB8, 0x9D, 0x00, 0x37, 0x49, 0x34, 0xD6, 0x9E, 0x95, 0xE9, 0x47,
|
||||
0x7D, 0x12, 0xD9, 0x17, 0x70, 0x02, 0x20, 0x5F, 0x78, 0x80, 0xCC, 0x75, 0xC8, 0x8F, 0x84, 0x65,
|
||||
0xB0, 0x05, 0x69, 0x33, 0x4F, 0x3E, 0x45, 0x6D, 0xD2, 0xC8, 0xB3, 0xA6, 0x4C, 0x02, 0xBC, 0x8D,
|
||||
0xF4, 0x5C, 0xB8, 0x0D, 0xAE, 0x77, 0x8E, 0xCB, 0x83, 0x80, 0xA4, 0xF5, 0x3E, 0xD2, 0x84, 0x49,
|
||||
0x98, 0x88, 0x32, 0x94, 0xF8, 0x61, 0x5D, 0xE1, 0x2C, 0xD7, 0x26, 0x01, 0x6C, 0xBC, 0xF6, 0xF4,
|
||||
0xCD, 0xD8, 0x18, 0xA4, 0x9F, 0x46, 0x7E, 0x25, 0xE2, 0xDF, 0x86, 0x4A, 0x27, 0x40, 0xD4, 0xDB,
|
||||
0xB6, 0x0A, 0xBD, 0xBD, 0x63, 0x37, 0xD3, 0x7F, 0x00, 0xF1, 0x37, 0x98, 0x7C, 0x18, 0xD2, 0xDC,
|
||||
0x85, 0xEC, 0xE4, 0x75, 0x55, 0xF1, 0x6C, 0x00, 0xBD, 0x4E, 0x21, 0xBE, 0x03, 0x9E, 0x44, 0x7E,
|
||||
0x0C, 0x9B, 0xB7, 0xB3, 0x58, 0x1F, 0x78, 0xEC, 0x69, 0x27, 0xF6, 0xBA, 0xF2, 0xD4, 0x30, 0x1E,
|
||||
0x07, 0x4E, 0x25, 0x93, 0xD5, 0x86, 0x50, 0x4E, 0x75, 0x7A, 0xC2, 0x37, 0x90, 0xFF, 0x2D, 0xC2,
|
||||
0x27, 0xC0, 0x80, 0x46, 0xF8, 0x25, 0xF2, 0xB5, 0x4C, 0xFD, 0xFA, 0x8B, 0x02, 0xA8, 0xE3, 0xFF,
|
||||
0x7D, 0x90, 0xD9, 0x01, 0x32, 0x3B, 0x01, 0xF1, 0x4C, 0xA6, 0x55, 0xDE, 0x96, 0x26, 0x80, 0x3D,
|
||||
0x79, 0xA4, 0x75, 0x4D, 0x2A, 0x49, 0xE4, 0x95, 0xF7, 0xC4, 0xB2, 0x96, 0xB1, 0xD6, 0x8A, 0xF5,
|
||||
0x61, 0xB9, 0x58, 0x7F, 0x21, 0x40, 0x73, 0x50, 0x12, 0x89, 0x72, 0xC4, 0x83, 0x04, 0xE0, 0xAC,
|
||||
0x8F, 0xB3, 0xEA, 0xB4, 0xE3, 0xDD, 0x90, 0x1F, 0xCC, 0xD4, 0xBF, 0x89, 0xFC, 0x6A, 0xE4, 0x3F,
|
||||
0x00, 0x43, 0x62, 0xF6, 0xC3, 0x2A, 0xCB, 0x39, 0x02, 0xD4, 0x13, 0xE0, 0xDE, 0xB6, 0x07, 0x48,
|
||||
0x23, 0xAE, 0x64, 0x27, 0x6F, 0x57, 0xC6, 0xAE, 0xCD, 0x85, 0x93, 0xD7, 0xE9, 0x23, 0x6F, 0x59,
|
||||
0x70, 0x9C, 0x00, 0x1B, 0x24, 0x61, 0xCD, 0x96, 0x44, 0xB8, 0xAB, 0x24, 0x5A, 0x54, 0xBE, 0x8B,
|
||||
0x24, 0xE2, 0x37, 0x13, 0xA0, 0x2F, 0xF2, 0x95, 0x88, 0x23, 0x6D, 0x8E, 0x23, 0xC4, 0x3C, 0xE4,
|
||||
0x5F, 0xE7, 0xFA, 0x30, 0xE2, 0x31, 0x6A, 0x13, 0x43, 0xDE, 0xC1, 0x09, 0x40, 0xDF, 0xED, 0x4D,
|
||||
0x7B, 0x40, 0x8C, 0xC8, 0x52, 0x77, 0x0F, 0x18, 0x62, 0x18, 0x86, 0x7D, 0x5D, 0xC0, 0x1D, 0x20,
|
||||
0x40, 0x5A, 0xC9, 0x56, 0xC7, 0xE9, 0x7D, 0x76, 0xFA, 0xA9, 0x14, 0xD2, 0x8A, 0x3B, 0x7D, 0x8B,
|
||||
0x00, 0x96, 0x75, 0x12, 0xFE, 0x84, 0xF4, 0xA3, 0x30, 0x10, 0x7A, 0x23, 0x3E, 0x0A, 0xA6, 0x20,
|
||||
0xAF, 0xCC, 0x46, 0x7C, 0x21, 0xD2, 0xAF, 0xC2, 0x11, 0x26, 0x1F, 0x23, 0x04, 0xD2, 0x2E, 0xAD,
|
||||
0x93, 0x8F, 0x48, 0xD4, 0xDD, 0xB0, 0x91, 0xC8, 0xC7, 0x84, 0x78, 0xC1, 0x96, 0x56, 0xF9, 0x70,
|
||||
0xC1, 0x01, 0x54, 0x96, 0x0A, 0xD9, 0x01, 0x74, 0xEA, 0xB9, 0x3B, 0xD0, 0x5A, 0x1F, 0x47, 0x5E,
|
||||
0x27, 0x9F, 0xA4, 0xFB, 0x1A, 0xA0, 0x59, 0xAC, 0xC4, 0x76, 0xC4, 0x57, 0xC2, 0x4C, 0x78, 0x18,
|
||||
0xF9, 0x67, 0x11, 0x5F, 0x03, 0x6B, 0xA1, 0x8E, 0x3B, 0xB0, 0x0D, 0xF9, 0x13, 0x60, 0xB6, 0xCA,
|
||||
0xBB, 0xEF, 0x38, 0x1A, 0x40, 0xA7, 0x9E, 0x5D, 0x23, 0x11, 0x03, 0xF9, 0x7F, 0x22, 0xFE, 0x4A,
|
||||
0xDB, 0x2B, 0xD4, 0xBA, 0x69, 0xB3, 0x93, 0x77, 0xA6, 0xAF, 0xBD, 0x77, 0xBA, 0x7F, 0xE1, 0xF4,
|
||||
0x2D, 0xAA, 0x03, 0x89, 0x66, 0xF8, 0x07, 0x6C, 0x44, 0x78, 0x33, 0x1C, 0x82, 0xE3, 0x70, 0x1A,
|
||||
0xF9, 0xB0, 0x23, 0x9E, 0x93, 0x37, 0x73, 0xF5, 0xC9, 0x4E, 0x3F, 0xA2, 0x21, 0xDC, 0xE9, 0x1B,
|
||||
0x91, 0x16, 0x89, 0x18, 0x1F, 0x12, 0xE0, 0x8F, 0x6D, 0x0F, 0x90, 0xAB, 0x8E, 0xBB, 0x69, 0xED,
|
||||
0xBB, 0x60, 0x9F, 0x36, 0x6E, 0xE7, 0xDD, 0xDE, 0xEB, 0xE4, 0xED, 0x3B, 0xA0, 0x15, 0x4A, 0x24,
|
||||
0x10, 0x77, 0x88, 0x27, 0x42, 0x48, 0x9B, 0x10, 0xA7, 0x36, 0x0A, 0xD7, 0xAC, 0x66, 0x4C, 0x27,
|
||||
0x8F, 0x38, 0xF5, 0x71, 0xBA, 0xEF, 0xBC, 0x61, 0xE6, 0xD7, 0x47, 0x03, 0x18, 0x2E, 0x11, 0xE3,
|
||||
0x28, 0x01, 0xB6, 0x5E, 0x4E, 0x80, 0xB8, 0xD3, 0x79, 0xFB, 0xC8, 0x74, 0x41, 0x5A, 0x4F, 0x1D,
|
||||
0x27, 0x84, 0x8A, 0x6B, 0x6D, 0x5C, 0xF9, 0xBC, 0x00, 0xF1, 0x38, 0x01, 0x20, 0xA1, 0xF2, 0x1A,
|
||||
0x42, 0xC5, 0xB3, 0x93, 0x67, 0xCD, 0x76, 0x5E, 0x4F, 0x9C, 0xEC, 0xA6, 0x8D, 0x44, 0x9C, 0xFA,
|
||||
0xE4, 0xA6, 0x6F, 0xE8, 0xB5, 0x6E, 0xDA, 0x66, 0xD8, 0x91, 0xB7, 0x07, 0xC2, 0x85, 0x6D, 0xE2,
|
||||
0x54, 0xFA, 0xF0, 0x79, 0x27, 0x4E, 0xB6, 0x3A, 0xCE, 0x89, 0xE3, 0x76, 0xDE, 0xEE, 0xBD, 0xD6,
|
||||
0x46, 0xA7, 0x9F, 0xBD, 0xD6, 0xE9, 0x6B, 0x00, 0x95, 0x77, 0xA6, 0x6F, 0xE6, 0x02, 0xE4, 0x6D,
|
||||
0x5A, 0x9D, 0xBA, 0x4E, 0x1F, 0xB4, 0x36, 0x76, 0xEF, 0x73, 0x1B, 0x17, 0x79, 0x36, 0xAB, 0x6E,
|
||||
0x5A, 0xC3, 0x38, 0x0B, 0xDB, 0x6D, 0xE9, 0x70, 0x38, 0x6C, 0x53, 0xD0, 0x29, 0x94, 0x4A, 0xBF,
|
||||
0x45, 0xE7, 0xCF, 0xE5, 0xA6, 0x9F, 0x5F, 0x1D, 0x67, 0xEA, 0x79, 0x93, 0xD7, 0x10, 0x56, 0x5E,
|
||||
0x7D, 0xEC, 0x3B, 0x80, 0x78, 0x16, 0x7B, 0xFA, 0x5A, 0x19, 0x77, 0xFA, 0x7A, 0x5C, 0x22, 0xEE,
|
||||
0x4C, 0x5F, 0x8F, 0x4B, 0x95, 0xCF, 0x06, 0x50, 0x69, 0x2A, 0x64, 0xA3, 0xA7, 0xCE, 0x61, 0xA4,
|
||||
0xDF, 0xBC, 0x8C, 0x0A, 0x9D, 0x7E, 0x06, 0xF9, 0x6D, 0x60, 0x00, 0xD5, 0xB1, 0x8F, 0x4C, 0xA7,
|
||||
0xFF, 0x96, 0x62, 0xD7, 0xC7, 0x9D, 0xFA, 0x85, 0xF2, 0x09, 0x67, 0xFA, 0x26, 0xF5, 0xC9, 0xDF,
|
||||
0xB4, 0x7A, 0x64, 0xEA, 0x79, 0xAF, 0x53, 0x6F, 0x3D, 0xEF, 0xF3, 0xE5, 0x5D, 0x71, 0xED, 0xBF,
|
||||
0x4E, 0x3F, 0x7C, 0x8C, 0x00, 0x5B, 0x08, 0xE0, 0x1C, 0xA3, 0xF9, 0x5C, 0xF2, 0x39, 0x90, 0xDA,
|
||||
0xC5, 0x0B, 0x9A, 0xB5, 0x1C, 0xF1, 0x4D, 0x48, 0x7F, 0x92, 0x3B, 0xEF, 0xB5, 0xFB, 0xD9, 0xE9,
|
||||
0xEB, 0xA9, 0x93, 0xDB, 0xB8, 0x76, 0xE7, 0xB3, 0xBD, 0x77, 0x6A, 0xA3, 0x1B, 0xD7, 0x09, 0xC0,
|
||||
0xC4, 0xDD, 0x4D, 0x6B, 0xF7, 0x3F, 0x7F, 0xD3, 0xE6, 0xD5, 0x46, 0xA7, 0x6E, 0xF7, 0x5E, 0x09,
|
||||
0xEB, 0xE6, 0x7D, 0x0B, 0xF9, 0x15, 0x62, 0x9C, 0x99, 0x76, 0x19, 0x01, 0x36, 0xF5, 0x94, 0xD4,
|
||||
0xE9, 0xAF, 0xB3, 0x69, 0x17, 0x23, 0x5F, 0x07, 0xEF, 0xD3, 0xFD, 0x46, 0xE4, 0xE3, 0xEE, 0x89,
|
||||
0xA3, 0xDD, 0x77, 0x6B, 0xE3, 0x6E, 0xDA, 0xFC, 0xDE, 0xE7, 0xE4, 0xDD, 0x87, 0x54, 0xF6, 0x81,
|
||||
0xE5, 0x9C, 0x3A, 0x6E, 0xE7, 0xF5, 0xCC, 0xCF, 0x1D, 0x99, 0xF9, 0xBD, 0x6F, 0x66, 0xF2, 0xDB,
|
||||
0x08, 0xF0, 0x3C, 0x01, 0xEE, 0x93, 0xF0, 0xDE, 0x9E, 0xAD, 0x7B, 0x20, 0x54, 0xE8, 0x1E, 0xD8,
|
||||
0xC4, 0xE7, 0xDB, 0x46, 0x42, 0x58, 0xA3, 0x91, 0x9F, 0x09, 0x0B, 0x11, 0x5F, 0x01, 0x1B, 0x61,
|
||||
0x27, 0x9D, 0x3F, 0x40, 0x80, 0xA3, 0xF6, 0xB9, 0x1F, 0x77, 0x2B, 0xD3, 0x1A, 0x40, 0xA7, 0x1E,
|
||||
0x81, 0x53, 0x1C, 0x99, 0x27, 0xE8, 0xFB, 0x71, 0xA6, 0x7E, 0x14, 0x9A, 0xB8, 0xD6, 0x97, 0xB5,
|
||||
0xE3, 0x4C, 0xFA, 0xBF, 0xB0, 0x0F, 0xF6, 0x82, 0x3E, 0x6D, 0x4F, 0xC2, 0x29, 0xA4, 0x9B, 0x98,
|
||||
0xFE, 0x1E, 0xD6, 0x35, 0x84, 0x98, 0x24, 0xE1, 0xE6, 0x1B, 0x24, 0xFC, 0x8E, 0xC7, 0x0E, 0x10,
|
||||
0x0A, 0x85, 0x6C, 0x0A, 0xDB, 0xC4, 0x6B, 0xF8, 0x20, 0xCE, 0xCB, 0x58, 0xF2, 0xA3, 0x76, 0x62,
|
||||
0xED, 0xBF, 0x41, 0xAC, 0x8F, 0xFB, 0xF0, 0xF1, 0x70, 0xA0, 0x58, 0xC6, 0x08, 0x02, 0x4C, 0xA4,
|
||||
0x3A, 0xD3, 0x91, 0x7F, 0x08, 0x16, 0x11, 0x60, 0x1D, 0xF5, 0xD9, 0x42, 0xEF, 0xFF, 0x4E, 0x6D,
|
||||
0xDE, 0x83, 0x0D, 0x88, 0x2F, 0x21, 0xC0, 0x6C, 0xAA, 0x33, 0x4D, 0x62, 0xCD, 0xF7, 0xC3, 0x24,
|
||||
0x89, 0x9E, 0x9D, 0x22, 0xD1, 0xA6, 0xA9, 0x30, 0x59, 0xA2, 0x9F, 0xDC, 0x2F, 0x91, 0xF0, 0x44,
|
||||
0xA4, 0xA7, 0xC2, 0x3C, 0x58, 0x89, 0xF4, 0xAF, 0x61, 0x1D, 0x3C, 0xC7, 0xE4, 0x27, 0x10, 0xA4,
|
||||
0x9B, 0x84, 0xF9, 0x54, 0x17, 0x7E, 0xF3, 0xE2, 0x4F, 0x64, 0x97, 0xDC, 0x03, 0xC9, 0x3B, 0x08,
|
||||
0x30, 0x0B, 0x9E, 0xE4, 0xB7, 0x0A, 0xCF, 0x94, 0x4A, 0x72, 0x55, 0xA9, 0x58, 0xBF, 0x82, 0x7A,
|
||||
0x8F, 0x58, 0x9B, 0x79, 0xCB, 0xDC, 0x02, 0xDB, 0x79, 0xA7, 0x3F, 0x50, 0x21, 0xF1, 0xD0, 0x8D,
|
||||
0xC8, 0xDF, 0x0A, 0xC3, 0x90, 0xBE, 0x03, 0x79, 0x5E, 0x8F, 0xFF, 0xCD, 0x47, 0x44, 0x3E, 0x07,
|
||||
0xC7, 0x7E, 0x52, 0x2A, 0xB1, 0xEF, 0x14, 0x4B, 0xF4, 0xBB, 0x25, 0x12, 0x7D, 0x10, 0x26, 0x70,
|
||||
0x3D, 0x81, 0x75, 0x7A, 0xB1, 0x44, 0x16, 0x94, 0x48, 0xE4, 0x37, 0x5E, 0x31, 0x0E, 0x55, 0x20,
|
||||
0xDD, 0x0B, 0x6E, 0x43, 0x7C, 0x08, 0xF4, 0x82, 0xA0, 0x84, 0x4F, 0x79, 0x24, 0xB4, 0xC3, 0x2F,
|
||||
0xE1, 0x75, 0xFE, 0xB6, 0xEF, 0x81, 0x24, 0xBF, 0x91, 0x48, 0x7A, 0xA0, 0x82, 0x00, 0x5D, 0xF8,
|
||||
0x60, 0xC2, 0xAF, 0x37, 0xAC, 0xBE, 0x5C, 0x0F, 0xE6, 0xB7, 0x09, 0xD5, 0x30, 0xCC, 0x23, 0xF1,
|
||||
0xE1, 0x30, 0x0D, 0x96, 0x94, 0x8A, 0xF9, 0x6A, 0x89, 0x98, 0x7F, 0xF6, 0x88, 0xB9, 0x99, 0xEB,
|
||||
0xD5, 0x48, 0x4F, 0xF4, 0x48, 0xAC, 0x0B, 0x1F, 0x54, 0xDA, 0xEB, 0x6F, 0x15, 0xBC, 0x36, 0xCD,
|
||||
0xD0, 0x54, 0xE4, 0x91, 0x46, 0x88, 0x70, 0x6D, 0x14, 0x43, 0x27, 0x98, 0xEC, 0x11, 0x63, 0x7D,
|
||||
0xA9, 0x18, 0x7C, 0x86, 0x30, 0x76, 0xB1, 0xEE, 0xF4, 0x48, 0xB8, 0xC1, 0x2B, 0xA1, 0xE5, 0x4C,
|
||||
0x7F, 0x86, 0x4F, 0x42, 0xB5, 0x97, 0x11, 0xE0, 0xC2, 0x63, 0xEB, 0x4A, 0xFB, 0xF3, 0x25, 0x2B,
|
||||
0xA4, 0xC2, 0xD9, 0xF3, 0xDE, 0xBE, 0xE6, 0x49, 0xAB, 0xA7, 0x8E, 0x5E, 0x3B, 0x9B, 0xB5, 0xF5,
|
||||
0x69, 0xAB, 0x47, 0xA5, 0xFE, 0x7D, 0x4C, 0x5F, 0x13, 0xF2, 0xDF, 0x32, 0xF3, 0x4E, 0x9C, 0xDC,
|
||||
0xC9, 0x93, 0x77, 0x6C, 0xB6, 0xBE, 0x22, 0x3B, 0x27, 0x4B, 0xD8, 0x70, 0x9E, 0xB4, 0x21, 0x7D,
|
||||
0xE2, 0xBA, 0xA7, 0x4D, 0xFE, 0xC6, 0x6D, 0x61, 0x03, 0xB7, 0x84, 0x5A, 0x0A, 0xDB, 0xC4, 0xFA,
|
||||
0x0F, 0x66, 0x5F, 0xD2, 0xF4, 0x5A, 0x5F, 0x17, 0x72, 0x01, 0xF2, 0x4E, 0x9D, 0xEC, 0xC3, 0x2A,
|
||||
0x17, 0xE0, 0x53, 0xDF, 0xEF, 0x39, 0x36, 0x79, 0xD2, 0xB6, 0xBE, 0xE3, 0xEB, 0x6B, 0xB2, 0xF3,
|
||||
0xC1, 0xC4, 0x79, 0x5D, 0x70, 0x03, 0x84, 0x79, 0xF2, 0xDA, 0x01, 0x42, 0x17, 0x04, 0x70, 0xA4,
|
||||
0x35, 0x40, 0xA8, 0xA5, 0x0D, 0x01, 0xAE, 0xB4, 0xDA, 0xB4, 0xE9, 0x49, 0xAC, 0x1D, 0xBB, 0xD2,
|
||||
0xF9, 0xD4, 0x0F, 0xF5, 0xF3, 0x17, 0x2C, 0x1A, 0x77, 0xB9, 0x5F, 0x2F, 0xF1, 0xF5, 0x94, 0x7C,
|
||||
0x9E, 0x5C, 0xCA, 0x83, 0x3B, 0x32, 0x14, 0xFA, 0x42, 0x30, 0xF7, 0xFD, 0x00, 0x17, 0x5E, 0xE8,
|
||||
0x0C, 0xB7, 0x80, 0x7E, 0x79, 0x50, 0x10, 0xC5, 0x45, 0x25, 0x03, 0x4B, 0x8A, 0x3D, 0x83, 0x3E,
|
||||
0x4F, 0x0A, 0xF8, 0xD9, 0x2A, 0xDF, 0x01, 0x4A, 0xF3, 0x03, 0xE8, 0x17, 0x66, 0x1A, 0xA2, 0x1C,
|
||||
0xF4, 0x9B, 0x8F, 0x2B, 0x19, 0x9D, 0xFC, 0x79, 0xF2, 0xF9, 0x41, 0xAE, 0x5D, 0x5F, 0x9B, 0xC0,
|
||||
0xB5, 0x09, 0x5C, 0x85, 0x13, 0xF8, 0x1F, 0x36, 0x17, 0x75, 0x31, 0x45, 0xB2, 0x22, 0x02, 0x00,
|
||||
0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
|
||||
};
|
26
data/images.cpp
Normal file
23
data/images.h
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Powder Toy - Images
|
||||
*
|
||||
* Copyright (c) 2008 - 2010 Stanislaw Skowronek.
|
||||
* Copyright (c) 2010 Simon Robertshaw.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
||||
*/
|
||||
#pragma once
|
||||
extern const unsigned char save_to_server_image[];
|
||||
extern const unsigned char save_to_disk_image[];
|
21
font/Makefile
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
editor: editor.c
|
||||
gcc -oeditor -DSCALE=1 -DFONTEDITOR editor.c -lSDL -lm -O3 -ffast-math -march=k8 -Wno-unused-result
|
||||
|
||||
editor.exe: editor.c
|
||||
i686-w64-mingw32-gcc -oeditor.exe -DSCALE=1 -DFONTEDITOR editor.c -lmingw32 -lm -lSDLmain -lSDL -O3 -ffast-math -march=k8 -mwindows -Wno-unused-result
|
||||
|
||||
packer: packer.c
|
||||
gcc -opacker -DFONTEDITOR packer.c -lm -O3 -ffast-math -march=k8 -Wno-unused-result
|
||||
|
||||
packer.exe: packer.c
|
||||
i686-w64-mingw32-gcc -opacker.exe -DFONTEDITOR packer.c -lm -O3 -ffast-math -march=k8 -Wno-unused-result
|
||||
|
||||
unpacker: unpacker.c
|
||||
gcc -ounpacker -DFONTEDITOR unpacker.c -lm -O3 -ffast-math -march=k8 -Wno-unused-result
|
||||
|
||||
unpacker.exe: unpacker.c
|
||||
i686-w64-mingw32-gcc -ounpacker.exe -DFONTEDITOR unpacker.c -lm -O3 -ffast-math -march=k8 -Wno-unused-result
|
||||
|
||||
clean:
|
||||
rm -f editor packer unpacker editor.exe packer.exe unpacker.exe
|
405
font/editor.c
Normal file
@ -0,0 +1,405 @@
|
||||
#ifdef FONTEDITOR
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <SDL/SDL.h>
|
||||
|
||||
#define CELLW 12
|
||||
#define CELLH 12
|
||||
|
||||
#define XRES 800
|
||||
#define YRES 600
|
||||
//#define SCALE 1
|
||||
//#define EXTENDED_FONT 1
|
||||
|
||||
char font[256][CELLH][CELLW];
|
||||
char width[256];
|
||||
unsigned char flags[256];
|
||||
unsigned int color[256];
|
||||
signed char top[256];
|
||||
signed char left[256];
|
||||
|
||||
void blendpixel(unsigned *vid, int x, int y, int r, int g, int b, int a)
|
||||
{
|
||||
if (x<0 || y<0 || x>=XRES || y>=YRES)
|
||||
return;
|
||||
if (a != 255)
|
||||
{
|
||||
int t = vid[y*XRES+x];
|
||||
r = (a*r + (255-a)*((t>>16)&255)) >> 8;
|
||||
g = (a*g + (255-a)*((t>>8)&255)) >> 8;
|
||||
b = (a*b + (255-a)*(t&255)) >> 8;
|
||||
}
|
||||
vid[y*XRES+x] = (r<<16)|(g<<8)|b;
|
||||
}
|
||||
|
||||
int drawchar(unsigned *vid, int x, int y, unsigned char c, int r, int g, int b)
|
||||
{
|
||||
int i, j;
|
||||
if (color[c])
|
||||
{
|
||||
r = (color[c] >> 16) & 0xFF;
|
||||
g = (color[c] >> 8) & 0xFF;
|
||||
b = color[c] & 0xFF;
|
||||
}
|
||||
for (j = 0; j < CELLH; j++)
|
||||
for (i = 0; i < width[c] && i < CELLW; i++)
|
||||
blendpixel(vid, x+i+left[c], y+j+top[c], r, g, b, (font[c][j][i]*255)/3);
|
||||
return x + width[c];
|
||||
}
|
||||
|
||||
int drawtext(unsigned *vid, int x, int y, const char *s, int r, int g, int b)
|
||||
{
|
||||
for (; *s; s++)
|
||||
x = drawchar(vid, x, y, *s, r, g, b);
|
||||
return x;
|
||||
}
|
||||
|
||||
void drawline(unsigned *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a)
|
||||
{
|
||||
int cp = abs(y2-y1) > abs(x2-x1), x, y, dx, dy, sy;
|
||||
float e, de;
|
||||
if (cp)
|
||||
{
|
||||
y = x1;
|
||||
x1 = y1;
|
||||
y1 = y;
|
||||
y = x2;
|
||||
x2 = y2;
|
||||
y2 = y;
|
||||
}
|
||||
if (x1 > x2)
|
||||
{
|
||||
y = x1;
|
||||
x1 = x2;
|
||||
x2 = y;
|
||||
y = y1;
|
||||
y1 = y2;
|
||||
y2 = y;
|
||||
}
|
||||
dx = x2 - x1;
|
||||
dy = abs(y2 - y1);
|
||||
e = 0.0f;
|
||||
de = dy/(float)dx;
|
||||
y = y1;
|
||||
sy = (y1<y2) ? 1 : -1;
|
||||
for (x=x1; x<=x2; x++)
|
||||
{
|
||||
if (cp)
|
||||
blendpixel(vid, y, x, r, g, b, a);
|
||||
else
|
||||
blendpixel(vid, x, y, r, g, b, a);
|
||||
e += de;
|
||||
if (e >= 0.5f)
|
||||
{
|
||||
y += sy;
|
||||
e -= 1.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void drawcell(unsigned *vid, int i, int j, int c, int m)
|
||||
{
|
||||
int x, y, x0=i*32+64, y0=j*32+64;
|
||||
for (y = 1;y < 32;y++)
|
||||
for (x = 1; x < 32; x++)
|
||||
blendpixel(vid, x0+x, y0+y, 127*m, 127*m, 127*m, c);
|
||||
for (x = 0; x <32; x+=2)
|
||||
{
|
||||
if (!j)
|
||||
blendpixel(vid, x0+x, y0, 64*m, 64*m, 64*m, 255);
|
||||
if (!i)
|
||||
blendpixel(vid, x0, y0+x, 64*m, 64*m, 64*m, 255);
|
||||
blendpixel(vid, x0+x, y0+32, 64*m, 64*m, 64*m, 255);
|
||||
blendpixel(vid, x0+32, y0+x, 64*m, 64*m, 64*m, 255);
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
* SDL OUTPUT *
|
||||
***********************************************************/
|
||||
|
||||
SDL_Surface *sdl_scrn;
|
||||
int sdl_key;
|
||||
void sdl_open(void)
|
||||
{
|
||||
if (SDL_Init(SDL_INIT_VIDEO)<0)
|
||||
{
|
||||
fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
atexit(SDL_Quit);
|
||||
sdl_scrn = SDL_SetVideoMode(XRES*SCALE, YRES*SCALE + 40*SCALE, 32, SDL_SWSURFACE);
|
||||
if (!sdl_scrn)
|
||||
{
|
||||
fprintf(stderr, "Creating window: %s\n", SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void sdl_blit(int x, int y, int w, int h, unsigned int *src, int pitch)
|
||||
{
|
||||
unsigned *dst,i,j,k;
|
||||
if (SDL_MUSTLOCK(sdl_scrn))
|
||||
if (SDL_LockSurface(sdl_scrn)<0)
|
||||
return;
|
||||
dst = (unsigned *)sdl_scrn->pixels+y*sdl_scrn->pitch/4+x;
|
||||
for (j = 0;j < h; j++)
|
||||
{
|
||||
for (k = 0; k < SCALE; k++)
|
||||
{
|
||||
for (i = 0; i < w*SCALE; i++)
|
||||
dst[i] = src[i/SCALE];
|
||||
dst += sdl_scrn->pitch/4;
|
||||
}
|
||||
src += pitch/4;
|
||||
}
|
||||
if (SDL_MUSTLOCK(sdl_scrn))
|
||||
SDL_UnlockSurface(sdl_scrn);
|
||||
SDL_UpdateRect(sdl_scrn,0,0,0,0);
|
||||
}
|
||||
|
||||
int frame_idx = 0;
|
||||
void dump_frame(unsigned int *src, int w, int h, int pitch)
|
||||
{
|
||||
char frame_name[32];
|
||||
unsigned j,i,c;
|
||||
FILE *f;
|
||||
sprintf(frame_name,"frame%04d.ppm",frame_idx);
|
||||
f=fopen(frame_name,"w");
|
||||
fprintf(f,"P6\n%d %d\n255\n",w,h);
|
||||
for (j = 0; j < h; j++)
|
||||
{
|
||||
for (i = 0; i < w; i++)
|
||||
{
|
||||
c = ((src[i]&0xFF0000)>>16) | (src[i]&0x00FF00) | ((src[i]&0x0000FF)<<16);
|
||||
fwrite(&c,3,1,f);
|
||||
}
|
||||
src += pitch/4;
|
||||
}
|
||||
fclose(f);
|
||||
frame_idx++;
|
||||
}
|
||||
|
||||
int sdl_poll()
|
||||
{
|
||||
SDL_Event event;
|
||||
sdl_key=0;
|
||||
while (SDL_PollEvent(&event))
|
||||
{
|
||||
switch (event.type)
|
||||
{
|
||||
case SDL_KEYDOWN:
|
||||
sdl_key = event.key.keysym.sym;
|
||||
break;
|
||||
case SDL_QUIT:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
* MAIN PROGRAM *
|
||||
***********************************************************/
|
||||
|
||||
const char *tag = "(c) 2008 Stanislaw Skowronek";
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
unsigned *vid_buf = (unsigned*)calloc(XRES*YRES, sizeof(unsigned));
|
||||
int x, y, b = 0, lb, c = 0xA0, i, j, dc = 0;
|
||||
int mode = 0;
|
||||
char hex[18] = "";
|
||||
char inputColor = 0;
|
||||
FILE *f;
|
||||
|
||||
f = fopen("font.bin", "rb");
|
||||
if(f)
|
||||
{
|
||||
fread(width, 1, 256, f);
|
||||
#ifdef EXTENDED_FONT
|
||||
fread(flags, 1, 256, f);
|
||||
fread(color, 4, 256, f);
|
||||
fread(top, 1, 256, f);
|
||||
fread(left, 1, 256, f);
|
||||
#endif
|
||||
fread(font, CELLW*CELLH, 256, f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
sdl_open();
|
||||
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||
while (!sdl_poll())
|
||||
{
|
||||
if (sdl_key=='q' || sdl_key==SDLK_ESCAPE)
|
||||
break;
|
||||
else if ((sdl_key==' ' || sdl_key=='=') && c < 255)
|
||||
{
|
||||
if (inputColor)
|
||||
{
|
||||
inputColor = 0;
|
||||
color[c] = 0;
|
||||
flags[c] &= ~0x2;
|
||||
}
|
||||
c++;
|
||||
}
|
||||
else if ((sdl_key=='\b' || sdl_key=='-') && c > 0)
|
||||
{
|
||||
if (inputColor)
|
||||
{
|
||||
inputColor = 0;
|
||||
color[c] = 0;
|
||||
flags[c] &= ~0x2;
|
||||
}
|
||||
c--;
|
||||
}
|
||||
#ifdef EXTENDED_FONT
|
||||
else if (sdl_key == 'w')
|
||||
flags[c] ^= 0x1;
|
||||
else if (sdl_key == 'c')
|
||||
{
|
||||
if (!(flags[c] & 0x2))
|
||||
{
|
||||
flags[c] |= 0x2;
|
||||
color[c] = 255<<24;
|
||||
inputColor = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
flags[c] &= ~0x2;
|
||||
color[c] = 0;
|
||||
inputColor = 0;
|
||||
}
|
||||
}
|
||||
else if (sdl_key == SDLK_RETURN)
|
||||
{
|
||||
int val = (x > 255) ? 255 : x;
|
||||
switch (inputColor)
|
||||
{
|
||||
case 1:
|
||||
color[c] |= (val<<16);
|
||||
inputColor = 2;
|
||||
break;
|
||||
case 2:
|
||||
color[c] |= (val<<8);
|
||||
inputColor = 3;
|
||||
break;
|
||||
case 3:
|
||||
color[c] |= (val<<0);
|
||||
inputColor = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
lb = b;
|
||||
b = SDL_GetMouseState(&x, &y);
|
||||
if (b)
|
||||
{
|
||||
x /= SCALE;
|
||||
y /= SCALE;
|
||||
}
|
||||
|
||||
i = x/32-2;
|
||||
j = y/32-2;
|
||||
if (!lb && b && (j<0 || j>=CELLH || i<0 || i>=CELLW))
|
||||
{
|
||||
int leftDistance = abs(i-left[c]);
|
||||
int widthDistance = abs(i-width[c]);
|
||||
int topDistance = abs(j-top[c]);
|
||||
if (widthDistance <= leftDistance && widthDistance <= topDistance)
|
||||
mode = 3; // WIDTH
|
||||
else if (leftDistance <= topDistance)
|
||||
mode = 4; // LEFT
|
||||
else
|
||||
mode = 2; // TOP
|
||||
}
|
||||
else if (!lb && b)
|
||||
{
|
||||
mode = 1; // DRAW
|
||||
if (b == 1)
|
||||
dc = (font[c][j][i]+3)%4;
|
||||
else
|
||||
dc = (font[c][j][i]+1)%4;
|
||||
}
|
||||
|
||||
if (b)
|
||||
switch(mode)
|
||||
{
|
||||
case 1:
|
||||
if (i>=0 && j>=0 && i<CELLW && j<CELLH)
|
||||
font[c][j][i] = dc;
|
||||
break;
|
||||
#ifdef EXTENDED_FONT
|
||||
case 2:
|
||||
top[c] = j;
|
||||
break;
|
||||
#endif
|
||||
case 3:
|
||||
width[c] = i;
|
||||
break;
|
||||
#ifdef EXTENDED_FONT
|
||||
case 4:
|
||||
left[c] = i;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
memset(vid_buf, 0, XRES*YRES*4);
|
||||
for (j = 0; j < CELLH; j++)
|
||||
for (i = 0; i < CELLW; i++)
|
||||
drawcell(vid_buf, i, j, (font[c][j][i]*255)/3, i>=width[c]?1:2);
|
||||
drawline(vid_buf, 32, 64+top[c]*32, 128+32*CELLW, 64+top[c]*32, 128, 128, 255, 255);
|
||||
drawline(vid_buf, 64+width[c]*32, 32, 64+width[c]*32, 128+32*CELLH, 255, 128, 128, 255);
|
||||
drawline(vid_buf, 64+left[c]*32, 32, 64+left[c]*32, 128+32*CELLH, 128, 255, 128, 255);
|
||||
|
||||
drawtext(vid_buf, 64, 192+32*CELLH, "A quick brown fox jumps over the lazy dog.", 255, 255, 255);
|
||||
drawtext(vid_buf, 64, 192+33*CELLH, "A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.", 255, 255, 255);
|
||||
drawtext(vid_buf, 64, 192+34*CELLH, "0123456789 ~`!@#$%^&*()-=_+[]{}\\|;:'\",./<>?", 255, 255, 255);
|
||||
|
||||
drawtext(vid_buf, 64, 192+37*CELLH, "Use '+' (= key) and '-' to switch between characters", 255, 255, 255);
|
||||
#ifdef EXTENDED_FONT
|
||||
drawtext(vid_buf, 64, 192+38*CELLH, "Click near a line to modify top/left offset, or character width", 255, 255, 255);
|
||||
drawtext(vid_buf, 64, 192+39*CELLH, "Use 'w' to toggle ignore width & auto draw next character flag, and 'c' to add / turn off font color", 255, 255, 255);
|
||||
if (inputColor)
|
||||
{
|
||||
char temptext[64];
|
||||
//drawtext(vid_buf, 64, 192+40*CELLH, "Due to extreme laziness, you must move the mouse and press enter to set the color of this icon", 255, 255, 255);
|
||||
sprintf(temptext, "Press enter to set %s color to: %i", inputColor == 1 ? "red" : (inputColor == 2 ? "green" : "blue"), (x > 255) ? 255 : x);
|
||||
drawtext(vid_buf, 64, 192+40*CELLH, temptext, 255, 255, 255);
|
||||
}
|
||||
#endif
|
||||
|
||||
drawchar(vid_buf, 32, 192+32*CELLH, c, 255, 255, 255);
|
||||
|
||||
sprintf(hex, "%02X", c);
|
||||
drawtext(vid_buf, 32, 192+34*CELLH, hex, 255, 255, 255);
|
||||
#ifdef EXTENDED_FONT
|
||||
sprintf(hex, "flags: 0x%02X", flags[c]);
|
||||
drawtext(vid_buf, 32, 192+35*CELLH, hex, 255, 255, 255);
|
||||
sprintf(hex, "color: 0x%08X", color[c]);
|
||||
drawtext(vid_buf, 32, 192+36*CELLH, hex, 255, 255, 255);
|
||||
#endif
|
||||
|
||||
sdl_blit(0, 0, XRES, YRES, vid_buf, XRES*4);
|
||||
}
|
||||
|
||||
f = fopen("font.bin", "wb");
|
||||
fwrite(width, 1, 256, f);
|
||||
#ifdef EXTENDED_FONT
|
||||
fwrite(flags, 1, 256, f);
|
||||
fwrite(color, 4, 256, f);
|
||||
fwrite(top, 1, 256, f);
|
||||
fwrite(left, 1, 256, f);
|
||||
#endif
|
||||
fwrite(font, CELLW*CELLH, 256, f);
|
||||
fclose(f);
|
||||
free(vid_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
127
font/packer.c
Normal file
@ -0,0 +1,127 @@
|
||||
#ifdef FONTEDITOR
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#define CELLW 12
|
||||
#define CELLH 12
|
||||
//#define EXTENDED_FONT 1
|
||||
|
||||
char font[256][CELLH][CELLW];
|
||||
char width[256];
|
||||
unsigned char flags[256];
|
||||
unsigned int color[256];
|
||||
signed char top[256];
|
||||
signed char left[256];
|
||||
|
||||
int bits_n = 0, bits_a = 0;
|
||||
int flush_bits(void)
|
||||
{
|
||||
if (bits_n)
|
||||
{
|
||||
bits_a >>= 8-bits_n;
|
||||
printf("0x%02X, ", bits_a);
|
||||
bits_a = 0;
|
||||
bits_n = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int stock_bits(int b, int nb)
|
||||
{
|
||||
bits_a >>= nb;
|
||||
bits_a |= b << (8-nb);
|
||||
bits_n += nb;
|
||||
if (bits_n >= 8)
|
||||
{
|
||||
printf("0x%02X, ", bits_a);
|
||||
bits_a = 0;
|
||||
bits_n = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int save_char(int c)
|
||||
{
|
||||
int nb = 1;
|
||||
int x, y;
|
||||
|
||||
if (!width[c])
|
||||
return 0;
|
||||
|
||||
printf(" 0x%02hhX, ", width[c]);
|
||||
#ifdef EXTENDED_FONT
|
||||
nb += stock_bits(abs(top[c])&3, 2);
|
||||
nb += stock_bits(top[c] < 0 ? 1 : 0, 1);
|
||||
nb += stock_bits(abs(left[c])&3, 2);
|
||||
nb += stock_bits(left[c] < 0 ? 1 : 0, 1);
|
||||
nb += stock_bits(flags[c]&3, 2);
|
||||
if (flags[c]&0x2)
|
||||
{
|
||||
nb += 4;
|
||||
printf("0x%02X, ", color[c]>>24);
|
||||
printf("0x%02X, ", (color[c]>>16)&0xFF);
|
||||
printf("0x%02X, ", (color[c]>>8)&0xFF);
|
||||
printf("0x%02X, ", color[c]&0xFF);
|
||||
}
|
||||
#endif
|
||||
printf(" ");
|
||||
|
||||
for (y = 0; y < CELLH; y++)
|
||||
for (x = 0; x < width[c] && x < CELLW; x++)
|
||||
nb += stock_bits(font[c][y][x]&3, 2);
|
||||
nb += flush_bits();
|
||||
|
||||
printf("\n");
|
||||
|
||||
return nb;
|
||||
}
|
||||
|
||||
char *tag = "(c) 2008 Stanislaw Skowronek";
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
FILE *f;
|
||||
int c, p[256], n = 0;
|
||||
|
||||
memset(p, 0, 256*4);
|
||||
|
||||
f = fopen("font.bin", "rb");
|
||||
fread(width, 1, 256, f);
|
||||
#ifdef EXTENDED_FONT
|
||||
fread(flags, 1, 256, f);
|
||||
fread(color, 4, 256, f);
|
||||
fread(top, 1, 256, f);
|
||||
fread(left, 1, 256, f);
|
||||
#endif
|
||||
fread(font, CELLW*CELLH, 256, f);
|
||||
fclose(f);
|
||||
|
||||
printf("unsigned char font_data[] = {\n");
|
||||
for (c = 0; c < 256; c++)
|
||||
{
|
||||
p[c] = n;
|
||||
n += save_char(c);
|
||||
}
|
||||
printf("};\n");
|
||||
|
||||
printf("\nshort font_ptrs[] = {\n");
|
||||
for (c = 0; c < 256; c++)
|
||||
{
|
||||
if( !(c%8))
|
||||
printf(" ");
|
||||
printf("0x%04X,", p[c]);
|
||||
if ((c%8)==7)
|
||||
printf("\n");
|
||||
else
|
||||
printf(" ");
|
||||
}
|
||||
printf("};\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
97
font/unpacker.c
Normal file
@ -0,0 +1,97 @@
|
||||
#ifdef FONTEDITOR
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#define INCLUDE_FONTDATA
|
||||
//#define EXTENDED_FONT 1
|
||||
|
||||
#include "font.h"
|
||||
|
||||
#define CELLW 12
|
||||
#define CELLH 12
|
||||
|
||||
char font[256][CELLH][CELLW];
|
||||
char width[256];
|
||||
unsigned char flags[256];
|
||||
unsigned int color[256];
|
||||
signed char top[256];
|
||||
signed char left[256];
|
||||
|
||||
void load_char(int c)
|
||||
{
|
||||
unsigned char *start = font_data + font_ptrs[c];
|
||||
unsigned char alpha, red, green, blue;
|
||||
int x, y, b;
|
||||
|
||||
int w = *(start++);
|
||||
#ifdef EXTENDED_FONT
|
||||
unsigned char flag = *(start++);
|
||||
signed char t = (flag&0x4) ? -(flag&0x3) : flag&0x3;
|
||||
signed char l = (flag&0x20) ? -((flag>>3)&0x3) : (flag>>3)&0x3;
|
||||
flag >>= 6;
|
||||
if (flag&0x2)
|
||||
{
|
||||
alpha = *(start++);
|
||||
red = *(start++);
|
||||
green = *(start++);
|
||||
blue = *(start++);
|
||||
color[c] = (alpha << 24) | (red << 16) | (green << 8) | blue;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!w)
|
||||
return;
|
||||
|
||||
b = 0;
|
||||
for (y = 0; y < CELLH; y++)
|
||||
for (x = 0; x < w && x < CELLW; x++)
|
||||
{
|
||||
font[c][y][x] = ((*start) >> b) & 3;
|
||||
b += 2;
|
||||
if (b >= 8)
|
||||
{
|
||||
start++;
|
||||
b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
width[c] = w;
|
||||
#ifdef EXTENDED_FONT
|
||||
flags[c] = flag;
|
||||
top[c] = t;
|
||||
left[c] = l;
|
||||
printf("%02X: %d %d %d %d\t0x%08X\n", c, w, t, l, flag, color[c]);
|
||||
#else
|
||||
printf("%02X: %d\n", c, w);
|
||||
#endif
|
||||
}
|
||||
|
||||
char *tag = "(c) 2011 Stanislaw Skowronek";
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
|
||||
memset(color, 0, sizeof(color));
|
||||
for (i = 0; i < 256; i++)
|
||||
load_char(i);
|
||||
|
||||
f = fopen("font.bin", "wb");
|
||||
fwrite(width, 1, 256, f);
|
||||
#ifdef EXTENDED_FONT
|
||||
fwrite(flags, 1, 256, f);
|
||||
fwrite(color, 4, 256, f);
|
||||
fwrite(top, 1, 256, f);
|
||||
fwrite(left, 1, 256, f);
|
||||
#endif
|
||||
fwrite(font, CELLW*CELLH, 256, f);
|
||||
fclose(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
290
fonttool.py
@ -1,290 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import bz2
|
||||
import math
|
||||
import re
|
||||
import argparse
|
||||
|
||||
CP_MAX = 0x10FFFF
|
||||
FONT_CPP = "resources/font.bz2"
|
||||
FONT_HEIGHT = 12
|
||||
|
||||
|
||||
class ReadBDFError(RuntimeError):
|
||||
def __init__(self, line_number, message):
|
||||
super().__init__(self, 'line %i: %s' % (line_number, message))
|
||||
|
||||
|
||||
class FontTool:
|
||||
def __init__(self, file):
|
||||
self.file = file
|
||||
with open(self.file, 'rb') as font_cpp:
|
||||
font_cpp_data = bz2.decompress(font_cpp.read())
|
||||
i = 0
|
||||
self.code_points = [False for _ in range(CP_MAX + 2)]
|
||||
while i < len(font_cpp_data):
|
||||
cp = font_cpp_data[i] | (font_cpp_data[i + 1] << 8) | (font_cpp_data[i + 2] << 16)
|
||||
width = font_cpp_data[i + 3]
|
||||
n = i + 4 + 3 * width
|
||||
self.code_points[cp] = font_cpp_data[(i + 3): n]
|
||||
i = n
|
||||
|
||||
def commit(self):
|
||||
l = []
|
||||
for i, data in enumerate(self.code_points):
|
||||
if data:
|
||||
l.append(i & 0xFF)
|
||||
l.append((i >> 8) & 0xFF)
|
||||
l.append((i >> 16) & 0xFF)
|
||||
l += data
|
||||
with open(self.file, 'wb') as font_cpp:
|
||||
font_cpp.write(bz2.compress(bytes(l)))
|
||||
|
||||
def pack(cp_matrix):
|
||||
width = 0
|
||||
for row in cp_matrix:
|
||||
if width < len(row):
|
||||
width = len(row)
|
||||
cp_data = [width]
|
||||
bits = 8
|
||||
for row in cp_matrix:
|
||||
padded = row + [0] * (width - len(row))
|
||||
for cv in padded:
|
||||
if bits == 8:
|
||||
cp_data.append(0)
|
||||
bits = 0
|
||||
cp_data[-1] |= (cv & 3) << bits
|
||||
bits += 2
|
||||
return cp_data
|
||||
|
||||
def unpack(cp_data):
|
||||
ptr = 1
|
||||
bits = 0
|
||||
buf = 0
|
||||
cp_matrix = []
|
||||
for y in range(FONT_HEIGHT):
|
||||
cp_matrix.append([])
|
||||
for x in range(cp_data[0]):
|
||||
if bits == 0:
|
||||
buf = cp_data[ptr]
|
||||
ptr += 1
|
||||
bits = 8
|
||||
cp_matrix[-1].append(buf & 3)
|
||||
buf >>= 2
|
||||
bits -= 2
|
||||
return cp_matrix
|
||||
|
||||
def dump(self, i, print):
|
||||
lut = [' ', '░░', '▒▒', '▓▓']
|
||||
if self.code_points[i]:
|
||||
print('code point %i (%c)' % (i, i))
|
||||
print('')
|
||||
for l in [''.join([lut[ch] for ch in row]) for row in FontTool.unpack(self.code_points[i])]:
|
||||
print(l)
|
||||
print('')
|
||||
else:
|
||||
print('code point %i (%c) is not available' % (i, i))
|
||||
|
||||
|
||||
class RawReader:
|
||||
def __init__(self, path):
|
||||
self.code_points = [False for _ in range(CP_MAX + 2)]
|
||||
with open(path) as raw:
|
||||
items = [int(v) for v in re.findall(r'[0-9]+', raw.read())]
|
||||
ptr = 0
|
||||
while ptr <= len(items) - 2:
|
||||
cp = items[ptr]
|
||||
width = items[ptr + 1]
|
||||
ptr += 2
|
||||
matrix = []
|
||||
for i in range(ptr, ptr + width * FONT_HEIGHT, width):
|
||||
matrix.append(items[i: (i + width)])
|
||||
ptr += width * FONT_HEIGHT
|
||||
self.code_points[cp] = FontTool.pack(matrix)
|
||||
|
||||
|
||||
class BDFReader:
|
||||
|
||||
def __init__(self, path, xoffs, yoffs):
|
||||
self.code_points = [False for _ in range(CP_MAX + 2)]
|
||||
item_re = re.compile(r'[^ \n\r]+')
|
||||
with open(path) as bdf:
|
||||
global_dw = False
|
||||
startchar = False
|
||||
bitmap = False
|
||||
char_dw = False
|
||||
char_cp = False
|
||||
char_bbx = False
|
||||
skip = 0
|
||||
for line_number, line in enumerate(bdf):
|
||||
if skip:
|
||||
skip -= 1
|
||||
continue
|
||||
items = re.findall(item_re, line)
|
||||
if startchar and items[0] == 'ENDCHAR':
|
||||
if len(bitmap) != char_bbx[1]:
|
||||
raise ReadBDFError(line_number, "invalid bitmap data")
|
||||
cp_matrix = []
|
||||
for y in range(FONT_HEIGHT):
|
||||
cp_matrix.append([])
|
||||
for x in range(char_dw):
|
||||
cv = 0
|
||||
xx = x + xoffs
|
||||
yy = FONT_HEIGHT - 1 - y + yoffs
|
||||
if char_bbx[2] <= xx < char_bbx[0] + char_bbx[2] and char_bbx[3] <= yy < char_bbx[1] + \
|
||||
char_bbx[3]:
|
||||
cv = bitmap[char_bbx[1] - 1 - (yy - char_bbx[3])][xx - char_bbx[2]] * 3
|
||||
cp_matrix[-1].append(cv)
|
||||
self.code_points[char_cp] = FontTool.pack(cp_matrix)
|
||||
startchar = False
|
||||
bitmap = False
|
||||
char_dw = False
|
||||
char_cp = False
|
||||
char_bbx = False
|
||||
elif bitmap != False:
|
||||
if len(items) != 1:
|
||||
raise ReadBDFError(line_number, "missing bitmap data")
|
||||
bits = []
|
||||
for ch in items[0]:
|
||||
cv = int(ch, 16)
|
||||
bits += [cv & 8 and 1 or 0, cv & 4 and 1 or 0, cv & 2 and 1 or 0, cv & 1 and 1 or 0]
|
||||
bitmap.append(bits[: char_bbx[0]])
|
||||
elif items[0] == 'SIZE':
|
||||
if len(items) != 4:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
elif items[0] == 'FONTBOUNDINGBOX':
|
||||
if len(items) != 5:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
elif not startchar and items[0] == 'STARTCHAR':
|
||||
startchar = True
|
||||
char_dw = global_dw
|
||||
elif items[0] == 'STARTPROPERTIES':
|
||||
if len(items) != 2:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
skip = int(items[1]) + 1
|
||||
elif startchar and items[0] == 'BITMAP':
|
||||
bitmap = []
|
||||
elif startchar and items[0] == 'BBX':
|
||||
if len(items) != 5:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
char_bbx = [int(items[1]), int(items[2]), int(items[3]), int(items[4])]
|
||||
elif startchar and items[0] == 'ENCODING':
|
||||
if len(items) != 2:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
char_cp = int(items[1])
|
||||
elif items[0] == 'METRICSSET':
|
||||
if len(items) != 2:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
if int(items[1]) == 1:
|
||||
raise ReadBDFError(line_number, "font does not support writing direction 0")
|
||||
elif items[0] == 'DWIDTH':
|
||||
if len(items) != 3:
|
||||
raise ReadBDFError(line_number, "invalid directive")
|
||||
if int(items[2]) != 0:
|
||||
raise ReadBDFError(line_number, "vertical component of dwidth vector is non-zero")
|
||||
char_dw = int(items[1])
|
||||
if not startchar:
|
||||
global_dw = char_dw
|
||||
|
||||
def pad_str(s, pad, n):
|
||||
return s + pad * (n - len(s))
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
parser = argparse.ArgumentParser("fonttool.py", description="font tools for managing fonts, this script can be"
|
||||
" imported as a module",
|
||||
fromfile_prefix_chars="@")
|
||||
command = parser.add_subparsers(dest="command", required=True)
|
||||
|
||||
addbdf = command.add_parser("addbdf", help="Adds BDF Formated Font")
|
||||
addbdf.add_argument("first", metavar="FIRST", type=int)
|
||||
addbdf.add_argument("last", metavar="LAST", type=int)
|
||||
addbdf.add_argument("bdffile", metavar="BDFFILE", help="BDF is an archaic bitmap font format")
|
||||
addbdf.add_argument("xoffs", metavar="XOFFS", nargs="?", default=0, type=int, help="Defaults to 0")
|
||||
addbdf.add_argument("yoffs", metavar="YOFFS", nargs="?", default=0, type=int, help="Defaults to 0")
|
||||
|
||||
addraw = command.add_parser("addraw", help="Adds a Raw Formated Font")
|
||||
addraw.add_argument("first", metavar="FIRST", type=int)
|
||||
addraw.add_argument("last", metavar="LAST", type=int)
|
||||
addraw.add_argument("rawfile", metavar="RAWFILE", help=""""Raw" files are simply ASCII-encoded white-space delimited \
|
||||
lists
|
||||
of decimal integer constants. These lists of integers encode
|
||||
characters as any number of consecutive character description
|
||||
structures laid out as follows:
|
||||
* the code point corresponding to the character being described;
|
||||
* the width in pixels of the character being described;
|
||||
* width times %i brightness levels between 0 and 3, a row-major matrix.""")
|
||||
|
||||
remove = command.add_parser("remove", help="Remove a range of characters")
|
||||
remove.add_argument("first", metavar="FIRST", type=int)
|
||||
remove.add_argument("last", metavar="LAST", type=int, default=None, nargs="?", help="Defaults to FIRST")
|
||||
|
||||
copy = command.add_parser("copy", help="Copy a range of characters to another range")
|
||||
copy.add_argument("dest", metavar="DSTFIRST", type=int)
|
||||
copy.add_argument("first", metavar="SRCFIRST", type=int)
|
||||
copy.add_argument("last", metavar="SRCLAST", type=int, default=None, nargs="?", help="Defaults to SRCFIRST")
|
||||
|
||||
inspect = command.add_parser("inspect", help="Inspect a range of characters")
|
||||
inspect.add_argument("first", metavar="FIRST", type=int)
|
||||
inspect.add_argument("last", metavar="LAST", type=int, default=None, nargs="?", help="Defaults to FIRST")
|
||||
|
||||
diff = command.add_parser("diff", help="Prints subranges that changed between the current and an external font file")
|
||||
diff.add_argument("external", metavar="EXTERNAL", help="External font.bz2")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if 'first' in args:
|
||||
cp_first = args.first
|
||||
if args.last is None:
|
||||
cp_last = cp_first
|
||||
else:
|
||||
cp_last = args.last
|
||||
if cp_first < 0 or cp_last > CP_MAX or cp_first > cp_last:
|
||||
print('invalid range')
|
||||
exit(1)
|
||||
|
||||
ft = FontTool(FONT_CPP)
|
||||
|
||||
if args.command == "addbdf":
|
||||
xoffs = args.xoffs
|
||||
yoffs = args.yoffs
|
||||
bdfr = BDFReader(args.bdffile, xoffs, yoffs)
|
||||
for i in range(cp_first, cp_last + 1):
|
||||
if bdfr.code_points[i] and not ft.code_points[i]:
|
||||
ft.code_points[i] = bdfr.code_points[i]
|
||||
ft.commit()
|
||||
elif args.command == 'addraw':
|
||||
rr = RawReader(args.rawfile)
|
||||
for i in range(cp_first, cp_last + 1):
|
||||
if rr.code_points[i] and not ft.code_points[i]:
|
||||
ft.code_points[i] = rr.code_points[i]
|
||||
ft.commit()
|
||||
elif args.command == 'remove':
|
||||
for i in range(cp_first, cp_last + 1):
|
||||
ft.code_points[i] = False
|
||||
ft.commit()
|
||||
elif args.command == 'copy':
|
||||
for i in range(cp_first, cp_last + 1):
|
||||
ft.code_points[i + (args.dest - cp_first)] = ft.code_points[i]
|
||||
ft.commit()
|
||||
elif args.command == 'inspect':
|
||||
for i in range(cp_first, cp_last + 1):
|
||||
ft.dump(i, print)
|
||||
elif args.command == 'diff':
|
||||
pad_to = 50
|
||||
eft = FontTool(args.external)
|
||||
for i in range(0, CP_MAX + 1):
|
||||
if eft.code_points[i] != ft.code_points[i]:
|
||||
cur = []
|
||||
def add_cur(line):
|
||||
global cur
|
||||
cur.append(line)
|
||||
ft.dump(i, add_cur)
|
||||
ext = []
|
||||
def add_ext(line):
|
||||
global ext
|
||||
ext.append(line)
|
||||
eft.dump(i, add_ext)
|
||||
print('#' * (2 * pad_to + 7))
|
||||
for j in range(max(len(cur), len(ext))):
|
||||
print('# ' + pad_str(j < len(cur) and cur[j] or '', ' ', pad_to) + ' # ' + pad_str(j < len(ext) and ext[j] or '', ' ', pad_to) + ' #')
|
237
generator.py
Normal file
@ -0,0 +1,237 @@
|
||||
#!/usr/bin/env python3
|
||||
import re, os, shutil, string, sys
|
||||
|
||||
def generateElements(elementFiles, outputCpp, outputH):
|
||||
|
||||
elementClasses = {}
|
||||
baseClasses = {}
|
||||
|
||||
elementHeader = """// This file is automatically generated by generator.py
|
||||
|
||||
#ifndef ELEMENTCLASSES_H
|
||||
#define ELEMENTCLASSES_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "simulation/SimulationData.h"
|
||||
#include "simulation/elements/Element.h"
|
||||
|
||||
"""
|
||||
|
||||
directives = []
|
||||
|
||||
for elementFile in elementFiles:
|
||||
try:
|
||||
f = open(elementFile, "r")
|
||||
except:
|
||||
f = open("src/simulation/elements/"+elementFile, "r")
|
||||
|
||||
fileData = f.read()
|
||||
f.close()
|
||||
|
||||
directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
|
||||
matcher = re.compile(directiveMatcher)
|
||||
directiveMatches = matcher.findall(fileData)
|
||||
|
||||
for match in directiveMatches:
|
||||
directives.append(match.split(" "))
|
||||
|
||||
classDirectives = []
|
||||
usedIDs = []
|
||||
for d in directives:
|
||||
if d[0] == "ElementClass":
|
||||
d[3] = int(d[3])
|
||||
classDirectives.append(d)
|
||||
if d[3] in usedIDs:
|
||||
print("WARNING: duplicate element ID {} ({})".format(d[3],d[2]))
|
||||
usedIDs.append(d[3])
|
||||
|
||||
elementIDs = sorted(classDirectives, key=lambda directive: directive[3])
|
||||
|
||||
for d in elementIDs:
|
||||
tmpClass = d[1]
|
||||
newClass = ""
|
||||
baseClass = "Element"
|
||||
if ':' in tmpClass:
|
||||
classBits = tmpClass.split(':')
|
||||
newClass = classBits[0]
|
||||
baseClass = classBits[1]
|
||||
else:
|
||||
newClass = tmpClass
|
||||
|
||||
elementClasses[newClass] = []
|
||||
baseClasses[newClass] = baseClass
|
||||
elementHeader += "#define %s %s\n" % (d[2], d[3])
|
||||
|
||||
for d in directives:
|
||||
if d[0] == "ElementHeader":
|
||||
tmpClass = d[1]
|
||||
newClass = ""
|
||||
baseClass = "Element"
|
||||
if ':' in tmpClass:
|
||||
classBits = tmpClass.split(':')
|
||||
newClass = classBits[0]
|
||||
baseClass = classBits[1]
|
||||
else:
|
||||
newClass = tmpClass
|
||||
elementClasses[newClass].append(" ".join(d[2:])+";")
|
||||
|
||||
#for className, classMembers in elementClasses.items():
|
||||
for d in elementIDs:
|
||||
tmpClass = d[1]
|
||||
newClass = ""
|
||||
baseClass = "Element"
|
||||
if ':' in tmpClass:
|
||||
classBits = tmpClass.split(':')
|
||||
newClass = classBits[0]
|
||||
baseClass = classBits[1]
|
||||
else:
|
||||
newClass = tmpClass
|
||||
|
||||
className = newClass
|
||||
classMembers = elementClasses[newClass]
|
||||
elementBase = baseClass
|
||||
elementHeader += """
|
||||
class {0}: public {1}
|
||||
{{
|
||||
public:
|
||||
{0}();
|
||||
virtual ~{0}();
|
||||
{2}
|
||||
}};
|
||||
""".format(className, elementBase, str.join("\n\t", classMembers))
|
||||
|
||||
elementHeader += """
|
||||
std::vector<Element> GetElements();
|
||||
|
||||
#endif
|
||||
"""
|
||||
|
||||
elementContent = """#include "simulation/ElementDefs.h"
|
||||
#include "ElementClasses.h"
|
||||
|
||||
std::vector<Element> GetElements()
|
||||
{
|
||||
std::vector<Element> elements;
|
||||
""";
|
||||
|
||||
for d in elementIDs:
|
||||
tmpClass = d[1]
|
||||
newClass = ""
|
||||
baseClass = "Element"
|
||||
if ':' in tmpClass:
|
||||
classBits = tmpClass.split(':')
|
||||
newClass = classBits[0]
|
||||
baseClass = classBits[1]
|
||||
else:
|
||||
newClass = tmpClass
|
||||
elementContent += """elements.push_back(%s());
|
||||
""" % (newClass)
|
||||
|
||||
elementContent += """return elements;
|
||||
}
|
||||
""";
|
||||
|
||||
outputPath, outputFile = os.path.split(outputH)
|
||||
if not os.path.exists(outputPath):
|
||||
os.makedirs(outputPath)
|
||||
|
||||
f = open(outputH, "w")
|
||||
f.write(elementHeader)
|
||||
f.close()
|
||||
|
||||
f = open(outputCpp, "w")
|
||||
f.write(elementContent)
|
||||
f.close()
|
||||
|
||||
def generateTools(toolFiles, outputCpp, outputH):
|
||||
toolClasses = {}
|
||||
|
||||
toolHeader = """#ifndef TOOLCLASSES_H
|
||||
#define TOOLCLASSES_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "simulation/simtools/SimTool.h"
|
||||
|
||||
"""
|
||||
|
||||
directives = []
|
||||
|
||||
for toolFile in toolFiles:
|
||||
try:
|
||||
f = open(toolFile, "r")
|
||||
except:
|
||||
f = open("src/simulation/simtools/"+toolFile, "r")
|
||||
fileData = f.read()
|
||||
f.close()
|
||||
|
||||
directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
|
||||
matcher = re.compile(directiveMatcher)
|
||||
directiveMatches = matcher.findall(fileData)
|
||||
|
||||
for match in directiveMatches:
|
||||
directives.append(match.split(" "))
|
||||
|
||||
classDirectives = []
|
||||
usedIDs = []
|
||||
for d in directives:
|
||||
if d[0] == "ToolClass":
|
||||
toolClasses[d[1]] = []
|
||||
toolHeader += "#define %s %s\n" % (d[2], d[3])
|
||||
d[3] = int(d[3])
|
||||
classDirectives.append(d)
|
||||
if d[3] in usedIDs:
|
||||
print("WARNING: duplicate tool ID {} ({})".format(d[3],d[2]))
|
||||
usedIDs.append(d[3])
|
||||
|
||||
for d in directives:
|
||||
if d[0] == "ToolHeader":
|
||||
toolClasses[d[1]].append(" ".join(d[2:])+";")
|
||||
|
||||
for className, classMembers in list(toolClasses.items()):
|
||||
toolHeader += """
|
||||
class {0}: public SimTool
|
||||
{{
|
||||
public:
|
||||
{0}();
|
||||
virtual ~{0}();
|
||||
int Perform(Simulation * sim, Particle * cpart, int x, int y, int brushX, int brushY, float strength) override;
|
||||
}};
|
||||
""".format(className, str.join("\n", classMembers))
|
||||
|
||||
toolHeader += """
|
||||
std::vector<SimTool*> GetTools();
|
||||
|
||||
#endif
|
||||
"""
|
||||
|
||||
toolContent = """#include "ToolClasses.h"
|
||||
std::vector<SimTool*> GetTools()
|
||||
{
|
||||
std::vector<SimTool*> tools;
|
||||
""";
|
||||
|
||||
toolIDs = sorted(classDirectives, key=lambda directive: directive[3])
|
||||
for d in toolIDs:
|
||||
toolContent += """ tools.push_back(new %s());
|
||||
""" % (d[1])
|
||||
|
||||
toolContent += """ return tools;
|
||||
}
|
||||
""";
|
||||
|
||||
outputPath, outputFile = os.path.split(outputH)
|
||||
if not os.path.exists(outputPath):
|
||||
os.makedirs(outputPath)
|
||||
|
||||
f = open(outputH, "w")
|
||||
f.write(toolHeader)
|
||||
f.close()
|
||||
|
||||
f = open(outputCpp, "w")
|
||||
f.write(toolContent)
|
||||
f.close()
|
||||
|
||||
generateElements(os.listdir("src/simulation/elements"), "generated/ElementClasses.cpp", "generated/ElementClasses.h")
|
||||
generateTools(os.listdir("src/simulation/simtools"), "generated/ToolClasses.cpp", "generated/ToolClasses.h")
|
484
meson.build
@ -1,484 +0,0 @@
|
||||
project(
|
||||
'the-powder-toy',
|
||||
[ 'c', 'cpp' ],
|
||||
version: 'the.cake.is.a.lie',
|
||||
default_options: [
|
||||
'c_std=c99',
|
||||
'cpp_std=c++17',
|
||||
'cpp_rtti=false',
|
||||
'build.c_std=c99', # used by to_array
|
||||
'build.cpp_std=c++17', # used by to_array
|
||||
'build.cpp_rtti=false', # used by to_array
|
||||
],
|
||||
meson_version: '>=0.64.0',
|
||||
)
|
||||
|
||||
if get_option('prepare')
|
||||
# we're being run by prepare.py in a ghactions workflow only to determine the values of options; exit early
|
||||
subdir_done()
|
||||
endif
|
||||
|
||||
fs = import('fs')
|
||||
to_array = generator(
|
||||
executable('toarray', sources: 'resources/ToArray.cpp', native: true),
|
||||
output: [ '@PLAINNAME@.cpp', '@PLAINNAME@.h' ],
|
||||
arguments: [ '@OUTPUT0@', '@OUTPUT1@', '@INPUT@', '@EXTRA_ARGS@' ]
|
||||
)
|
||||
|
||||
render_icons_with_inkscape = get_option('render_icons_with_inkscape')
|
||||
inkscape = find_program('inkscape', required: render_icons_with_inkscape)
|
||||
|
||||
c_compiler = meson.get_compiler('c')
|
||||
|
||||
is_x86 = host_machine.cpu_family() in [ 'x86', 'x86_64' ]
|
||||
is_64bit = host_machine.cpu_family() in [ 'aarch64', 'x86_64' ]
|
||||
is_msvc = c_compiler.get_id() in [ 'msvc' ]
|
||||
|
||||
host_arch = host_machine.cpu_family()
|
||||
host_platform = host_machine.system()
|
||||
# educated guesses follow, PRs welcome
|
||||
if c_compiler.get_id() in [ 'msvc' ]
|
||||
if host_platform != 'windows'
|
||||
error('this seems fishy')
|
||||
endif
|
||||
host_libc = 'msvc'
|
||||
elif c_compiler.get_id() in [ 'gcc' ] and host_platform == 'windows'
|
||||
host_libc = 'mingw'
|
||||
elif host_platform in [ 'darwin' ]
|
||||
host_libc = 'macos'
|
||||
elif host_platform in [ 'emscripten' ]
|
||||
host_platform = 'emscripten'
|
||||
host_libc = 'emscripten'
|
||||
elif host_platform in [ 'android' ]
|
||||
host_platform = 'android'
|
||||
host_libc = 'bionic'
|
||||
else
|
||||
if host_platform != 'linux'
|
||||
# TODO: maybe use 'default' in place of 'linux', or use something other than host_platform where details such as desktop integration are concerned
|
||||
warning('host platform is not linux but we will pretend that it is')
|
||||
host_platform = 'linux'
|
||||
endif
|
||||
host_libc = 'gnu'
|
||||
endif
|
||||
|
||||
static_variant = get_option('static')
|
||||
if static_variant != 'prebuilt' and host_platform == 'android'
|
||||
warning('only prebuilt libs are supported for android')
|
||||
static_variant = 'prebuilt'
|
||||
endif
|
||||
if static_variant == 'system' and host_platform == 'windows' and host_libc == 'msvc'
|
||||
warning('no way to find system libs for msvc on windows')
|
||||
static_variant = 'prebuilt'
|
||||
endif
|
||||
|
||||
is_static = static_variant != 'none'
|
||||
is_debug = get_option('optimization') in [ '0', 'g' ]
|
||||
app_exe = get_option('app_exe')
|
||||
|
||||
tpt_libs_static = 'none'
|
||||
if static_variant == 'prebuilt'
|
||||
tpt_libs_static = 'static'
|
||||
endif
|
||||
if static_variant == 'none' and host_platform == 'windows' and host_libc == 'msvc'
|
||||
tpt_libs_static = 'dynamic'
|
||||
endif
|
||||
tpt_libs_debug = is_debug ? 'debug' : 'release'
|
||||
tpt_libs_variant = '@0@-@1@-@2@-@3@'.format(host_arch, host_platform, host_libc, tpt_libs_static)
|
||||
tpt_libs_vtag = get_option('tpt_libs_vtag')
|
||||
if tpt_libs_vtag == ''
|
||||
tpt_libs_vtag = 'v20240112165024'
|
||||
endif
|
||||
if tpt_libs_static != 'none'
|
||||
if tpt_libs_variant not in [
|
||||
'x86_64-linux-gnu-static',
|
||||
'x86_64-windows-mingw-static',
|
||||
'x86_64-windows-msvc-static',
|
||||
'x86_64-windows-msvc-dynamic',
|
||||
'x86-windows-msvc-static',
|
||||
'x86-windows-msvc-dynamic',
|
||||
'x86_64-darwin-macos-static',
|
||||
'aarch64-darwin-macos-static',
|
||||
'x86-android-bionic-static',
|
||||
'x86_64-android-bionic-static',
|
||||
'arm-android-bionic-static',
|
||||
'aarch64-android-bionic-static',
|
||||
'wasm32-emscripten-emscripten-static',
|
||||
]
|
||||
error('no prebuilt @0@ libraries are currently provided'.format(tpt_libs_variant))
|
||||
endif
|
||||
tpt_libs = subproject('tpt-libs-prebuilt-@0@-@1@-@2@'.format(tpt_libs_variant, tpt_libs_debug, tpt_libs_vtag))
|
||||
else
|
||||
if get_option('workaround_elusive_bzip2')
|
||||
bzip2_lib_name = get_option('workaround_elusive_bzip2_lib_name')
|
||||
bzip2_include_name = get_option('workaround_elusive_bzip2_include_name')
|
||||
bzip2_lib_dir = get_option('workaround_elusive_bzip2_lib_dir')
|
||||
bzip2_include_dir = include_directories(get_option('workaround_elusive_bzip2_include_dir'))
|
||||
bzip2_static = get_option('workaround_elusive_bzip2_static')
|
||||
meson.override_dependency('bzip2', declare_dependency(
|
||||
dependencies: c_compiler.find_library(
|
||||
bzip2_lib_name,
|
||||
has_headers: bzip2_include_name,
|
||||
dirs: bzip2_lib_dir,
|
||||
header_include_directories: bzip2_include_dir,
|
||||
static: bzip2_static,
|
||||
),
|
||||
include_directories: bzip2_include_dir,
|
||||
))
|
||||
endif
|
||||
endif
|
||||
|
||||
x86_sse_level_str = get_option('x86_sse')
|
||||
if x86_sse_level_str == 'auto'
|
||||
x86_sse_level = 20
|
||||
if not is_x86 or not is_64bit or host_platform == 'darwin' or (is_64bit and is_msvc)
|
||||
x86_sse_level = 0
|
||||
endif
|
||||
elif x86_sse_level_str == 'sse3'
|
||||
x86_sse_level = 30
|
||||
elif x86_sse_level_str == 'sse2'
|
||||
x86_sse_level = 20
|
||||
elif x86_sse_level_str == 'sse'
|
||||
x86_sse_level = 10
|
||||
elif x86_sse_level_str == 'none'
|
||||
x86_sse_level = 0
|
||||
endif
|
||||
|
||||
lua_variant = get_option('lua')
|
||||
if lua_variant == 'auto'
|
||||
if host_platform == 'emscripten'
|
||||
lua_variant = 'lua5.2'
|
||||
else
|
||||
lua_variant = 'luajit'
|
||||
endif
|
||||
endif
|
||||
if lua_variant == 'luajit' and host_platform == 'emscripten'
|
||||
error('luajit does not work with emscripten')
|
||||
endif
|
||||
if lua_variant == 'none'
|
||||
lua_dep = []
|
||||
elif lua_variant == 'lua5.1' or lua_variant == 'lua5.2'
|
||||
lua_dep = dependency(lua_variant + '-c++', static: is_static, required: false)
|
||||
if not lua_dep.found()
|
||||
if not get_option('workaround_noncpp_lua')
|
||||
error('your system @0@ is not compatible with C++, configure with -Dworkaround_noncpp_lua=true to disable this error'.format(lua_variant))
|
||||
endif
|
||||
lua_dep = dependency(lua_variant, static: is_static)
|
||||
endif
|
||||
elif lua_variant == 'luajit'
|
||||
lua_dep = dependency('luajit', static: is_static)
|
||||
endif
|
||||
|
||||
enable_http = get_option('http')
|
||||
if host_platform == 'android'
|
||||
android_ndk_toolchain_prefix = meson.get_external_property('android_ndk_toolchain_prefix')
|
||||
android_platform = meson.get_external_property('android_platform')
|
||||
tpt_libs_android_toolchain_prefix = tpt_libs.get_variable('android_toolchain_prefix')
|
||||
tpt_libs_android_system_version = tpt_libs.get_variable('android_system_version')
|
||||
tpt_libs_android_platform = tpt_libs.get_variable('android_platform')
|
||||
if '@0@@1@-'.format(tpt_libs_android_toolchain_prefix, tpt_libs_android_system_version) != android_ndk_toolchain_prefix
|
||||
error('tpt-libs android toolchain mismatch')
|
||||
endif
|
||||
if tpt_libs_android_platform != android_platform
|
||||
error('tpt-libs android platform mismatch')
|
||||
endif
|
||||
endif
|
||||
curl_dep = []
|
||||
if enable_http and host_platform != 'emscripten'
|
||||
curl_dep = dependency('libcurl', static: is_static)
|
||||
endif
|
||||
|
||||
project_link_args = []
|
||||
project_c_args = []
|
||||
project_cpp_args = []
|
||||
|
||||
fftw_dep = dependency('fftw3f', static: is_static)
|
||||
threads_dep = dependency('threads')
|
||||
if host_platform == 'emscripten'
|
||||
zlib_dep = []
|
||||
png_dep = []
|
||||
sdl2_dep = []
|
||||
bzip2_dep = []
|
||||
project_link_args += [
|
||||
'--no-heap-copy',
|
||||
'-s', 'WASM=1',
|
||||
'-s', 'ALLOW_MEMORY_GROWTH=1',
|
||||
'-s', 'FORCE_FILESYSTEM=1',
|
||||
'-s', 'EXIT_RUNTIME=0',
|
||||
'-s', 'EXPORTED_RUNTIME_METHODS=ccall,cwrap',
|
||||
'-s', 'FS_DEBUG',
|
||||
'-s', 'MODULARIZE',
|
||||
'-s', 'EXPORT_NAME=create_' + app_exe,
|
||||
'-Wl,-u,_emscripten_run_callback_on_thread',
|
||||
'-lidbfs.js',
|
||||
]
|
||||
emcc_args = [
|
||||
'-s', 'USE_SDL=2',
|
||||
'-s', 'USE_BZIP2=1',
|
||||
'-s', 'USE_LIBPNG',
|
||||
'-s', 'USE_ZLIB=1',
|
||||
'-s', 'DISABLE_EXCEPTION_CATCHING=0',
|
||||
]
|
||||
if is_debug
|
||||
project_link_args += [ '--source-map-base=./' ]
|
||||
emcc_args += [ '-gsource-map' ]
|
||||
endif
|
||||
project_link_args += emcc_args
|
||||
project_c_args += emcc_args
|
||||
project_cpp_args += emcc_args
|
||||
else
|
||||
zlib_dep = dependency('zlib', static: is_static)
|
||||
png_dep = dependency('libpng16', static: is_static)
|
||||
sdl2_dep = dependency('sdl2', static: is_static)
|
||||
bzip2_dep = dependency('bzip2', static: is_static)
|
||||
endif
|
||||
json_dep = dependency('jsoncpp', static: is_static)
|
||||
|
||||
if is_msvc
|
||||
if x86_sse_level >= 30
|
||||
warning('SSE3 configured to be enabled but unavailable in msvc')
|
||||
x86_sse_level = 20
|
||||
endif
|
||||
if is_64bit and x86_sse_level > 0
|
||||
warning('SSE explicitly configured but unavailable in msvc targeting 64-bit machines')
|
||||
x86_sse_level = 0
|
||||
endif
|
||||
args_msvc = [
|
||||
'/GS',
|
||||
'/D_SCL_SECURE_NO_WARNINGS',
|
||||
'/DUNICODE',
|
||||
'/D_UNICODE',
|
||||
]
|
||||
if x86_sse_level >= 20
|
||||
args_msvc += [ '/arch:SSE2' ]
|
||||
elif x86_sse_level >= 10
|
||||
args_msvc += [ '/arch:SSE' ]
|
||||
endif
|
||||
if not is_debug
|
||||
args_msvc += [
|
||||
'/Oy-',
|
||||
'/fp:fast',
|
||||
'/GL',
|
||||
]
|
||||
project_link_args += [
|
||||
'/OPT:REF',
|
||||
'/OPT:ICF',
|
||||
'/LTCG',
|
||||
]
|
||||
endif
|
||||
project_c_args += args_msvc
|
||||
project_cpp_args += args_msvc
|
||||
else
|
||||
args_ccomp = []
|
||||
if host_platform == 'darwin' and x86_sse_level > 0
|
||||
message('SSE level explicitly configured but unavailable on macosx')
|
||||
x86_sse_level = 0
|
||||
endif
|
||||
if x86_sse_level >= 30
|
||||
args_ccomp += [ '-msse3' ]
|
||||
elif x86_sse_level >= 20
|
||||
args_ccomp += [ '-msse2' ]
|
||||
elif x86_sse_level >= 10
|
||||
args_ccomp += [ '-msse' ]
|
||||
endif
|
||||
if host_platform == 'windows'
|
||||
args_ccomp += [
|
||||
'-DUNICODE',
|
||||
'-D_UNICODE',
|
||||
]
|
||||
endif
|
||||
if not is_debug
|
||||
args_ccomp += [
|
||||
'-ftree-vectorize',
|
||||
'-funsafe-math-optimizations',
|
||||
'-ffast-math',
|
||||
'-fomit-frame-pointer',
|
||||
]
|
||||
endif
|
||||
if host_platform == 'android'
|
||||
if not is_64bit
|
||||
args_ccomp += [ '-U_FILE_OFFSET_BITS' ]
|
||||
endif
|
||||
# android doesn't ship libc++_shared.so, so we might as well link it statically;
|
||||
# the alternative would be to grab libc++_shared.so from the NDK and ship it with
|
||||
# the app alongside libpowder.so, and possibly add it to SDL's list of libraries to load
|
||||
project_link_args += [ '-static-libstdc++' ]
|
||||
endif
|
||||
project_c_args += args_ccomp + [
|
||||
'-Wno-implicit-fallthrough',
|
||||
'-Wno-missing-field-initializers',
|
||||
'-Wno-unused-result',
|
||||
'-Wno-unused-parameter',
|
||||
]
|
||||
project_cpp_args += args_ccomp + [
|
||||
'-Wno-invalid-offsetof',
|
||||
'-Wno-unused-result',
|
||||
'-Wno-missing-field-initializers',
|
||||
'-Wno-unused-parameter',
|
||||
]
|
||||
endif
|
||||
|
||||
if host_platform == 'windows'
|
||||
args_ccomp_win = [ '-D_WIN32_WINNT=0x0501', '-DNOMINMAX' ]
|
||||
windows_mod = import('windows')
|
||||
if is_static
|
||||
args_ccomp_win += [ '-DCURL_STATICLIB' ]
|
||||
if host_arch == 'x86_64'
|
||||
args_ccomp_win += [ '-DZLIB_WINAPI' ]
|
||||
endif
|
||||
endif
|
||||
if tpt_libs_static == 'dynamic'
|
||||
foreach input_output_condition : tpt_libs.get_variable('config_dlls')
|
||||
dll_input = input_output_condition[0]
|
||||
dll_output = input_output_condition[1]
|
||||
dll_condition = input_output_condition[2]
|
||||
do_copy = false
|
||||
if dll_condition == 'all'
|
||||
do_copy = true
|
||||
elif dll_condition == 'lua=' + lua_variant
|
||||
do_copy = true
|
||||
endif
|
||||
if do_copy
|
||||
fs.copyfile(dll_input, dll_output)
|
||||
endif
|
||||
endforeach
|
||||
endif
|
||||
project_c_args += args_ccomp_win
|
||||
project_cpp_args += args_ccomp_win
|
||||
endif
|
||||
|
||||
project_inc = include_directories([ 'src', 'resources' ])
|
||||
|
||||
if host_platform == 'windows'
|
||||
ident_platform = is_64bit ? 'WIN64' : 'WIN32'
|
||||
elif host_platform == 'linux'
|
||||
ident_platform = is_64bit ? 'LIN64' : 'LIN32'
|
||||
elif host_platform == 'darwin'
|
||||
ident_platform = host_arch == 'aarch64' ? 'MACOSARM' : 'MACOSX'
|
||||
else
|
||||
ident_platform = 'UNKNOWN'
|
||||
endif
|
||||
|
||||
project_deps = []
|
||||
data_files = []
|
||||
powder_deps = []
|
||||
|
||||
project_export_dynamic = false
|
||||
|
||||
subdir('src')
|
||||
subdir('resources')
|
||||
|
||||
powder_files += data_files
|
||||
render_files += data_files
|
||||
font_files += data_files
|
||||
|
||||
if host_platform == 'emscripten'
|
||||
project_link_args += [
|
||||
'-o', app_exe + '.js', # so we get a .wasm, and a .js
|
||||
]
|
||||
endif
|
||||
if get_option('export_lua_symbols')
|
||||
if is_static and lua_variant != 'none' and not project_export_dynamic
|
||||
if host_platform == 'windows'
|
||||
error('Lua symbols are currently impossible to export correctly on Windows')
|
||||
elif c_compiler.has_link_argument('-Wl,--export-dynamic-symbol')
|
||||
project_link_args += [
|
||||
'-Wl,--export-dynamic-symbol=lua_*',
|
||||
'-Wl,--export-dynamic-symbol=luaL_*',
|
||||
'-Wl,--export-dynamic-symbol=luaopen_*',
|
||||
]
|
||||
else
|
||||
warning('your linker does not support -Wl,--export-dynamic-symbol so Meson will be instructed to export all symbols in order to enable loading Lua shared modules, which may blow up the size of the resulting binary')
|
||||
project_export_dynamic = true
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
if get_option('build_powder')
|
||||
powder_deps += project_deps + [
|
||||
threads_dep,
|
||||
zlib_dep,
|
||||
png_dep,
|
||||
sdl2_dep,
|
||||
lua_dep,
|
||||
curl_dep,
|
||||
fftw_dep,
|
||||
bzip2_dep,
|
||||
json_dep,
|
||||
]
|
||||
if host_platform == 'android'
|
||||
powder_sha = shared_library(
|
||||
app_exe,
|
||||
sources: powder_files,
|
||||
include_directories: project_inc,
|
||||
c_args: project_c_args,
|
||||
cpp_args: project_cpp_args,
|
||||
link_args: project_link_args,
|
||||
dependencies: powder_deps,
|
||||
)
|
||||
subdir('android')
|
||||
else
|
||||
executable(
|
||||
app_exe,
|
||||
sources: powder_files,
|
||||
include_directories: project_inc,
|
||||
c_args: project_c_args,
|
||||
cpp_args: project_cpp_args,
|
||||
win_subsystem: is_debug ? 'console' : 'windows',
|
||||
link_args: project_link_args,
|
||||
dependencies: powder_deps,
|
||||
export_dynamic: project_export_dynamic,
|
||||
install: true,
|
||||
)
|
||||
endif
|
||||
endif
|
||||
|
||||
if get_option('build_render')
|
||||
if host_platform == 'emscripten'
|
||||
error('render does not target emscripten')
|
||||
endif
|
||||
render_deps = project_deps + [
|
||||
threads_dep,
|
||||
zlib_dep,
|
||||
bzip2_dep,
|
||||
json_dep,
|
||||
png_dep,
|
||||
]
|
||||
render_link_args = project_link_args
|
||||
if host_platform == 'linux' and is_static
|
||||
render_link_args += [ '-static' ]
|
||||
endif
|
||||
executable(
|
||||
'render',
|
||||
sources: render_files,
|
||||
include_directories: project_inc,
|
||||
c_args: project_c_args,
|
||||
cpp_args: project_cpp_args,
|
||||
link_args: render_link_args,
|
||||
dependencies: render_deps,
|
||||
export_dynamic: project_export_dynamic,
|
||||
)
|
||||
endif
|
||||
|
||||
if get_option('build_font')
|
||||
if host_platform == 'emscripten'
|
||||
error('font does not target emscripten')
|
||||
endif
|
||||
font_deps = project_deps + [
|
||||
threads_dep,
|
||||
zlib_dep,
|
||||
png_dep,
|
||||
sdl2_dep,
|
||||
bzip2_dep,
|
||||
json_dep,
|
||||
]
|
||||
executable(
|
||||
'font',
|
||||
sources: font_files,
|
||||
include_directories: project_inc,
|
||||
c_args: project_c_args,
|
||||
cpp_args: project_cpp_args,
|
||||
link_args: project_link_args,
|
||||
dependencies: font_deps,
|
||||
export_dynamic: project_export_dynamic,
|
||||
)
|
||||
endif
|
@ -1,313 +0,0 @@
|
||||
option(
|
||||
'static',
|
||||
type: 'combo',
|
||||
choices: [ 'none', 'system', 'prebuilt' ],
|
||||
value: 'none',
|
||||
description: 'Build statically using libraries present on the system (\'system\') or using prebuilt libraries official builds use (\'prebuilt\')'
|
||||
)
|
||||
option(
|
||||
'beta',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Beta build'
|
||||
)
|
||||
option(
|
||||
'ignore_updates',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Don\'t show notifications about available updates'
|
||||
)
|
||||
option(
|
||||
'can_install',
|
||||
type: 'combo',
|
||||
choices: [ 'no', 'yes', 'yes_check', 'auto' ],
|
||||
value: 'auto',
|
||||
description: 'Disable (\'no\') or enable (\'yes\') setting up file and URL associations, or even offer to do it at startup (\'yes_check\')'
|
||||
)
|
||||
option(
|
||||
'http',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Enable HTTP via libcurl'
|
||||
)
|
||||
option(
|
||||
'snapshot',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Snapshot build'
|
||||
)
|
||||
option(
|
||||
'display_version_major',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 98,
|
||||
description: 'Major component of the display version, should more or less map to the MINOR version in semantic versioning'
|
||||
)
|
||||
option(
|
||||
'display_version_minor',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 2,
|
||||
description: 'Minor component of the display version, should more or less map to the PATCH version in semantic versioning'
|
||||
)
|
||||
option(
|
||||
'build_num',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 365,
|
||||
description: 'Build number, should be strictly monotonously increasing across public releases'
|
||||
)
|
||||
option(
|
||||
'upstream_version_major',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 98,
|
||||
description: 'Major component of the upstream display version, mod owners should not change this but merge upstream changes to it'
|
||||
)
|
||||
option(
|
||||
'upstream_version_minor',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 2,
|
||||
description: 'Minor component of the upstream display version, mod owners should not change this but merge upstream changes to it'
|
||||
)
|
||||
option(
|
||||
'upstream_build_num',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 365,
|
||||
description: 'Upstream build number, mod owners should not change this but merge upstream changes to it'
|
||||
)
|
||||
option(
|
||||
'mod_id',
|
||||
type: 'integer',
|
||||
min: 0,
|
||||
value: 0,
|
||||
description: 'Mod ID, used on the https://starcatcher.us/TPT build server, the build server will compile for all platforms for you and send updates in-game, see jacob1 to get a mod ID'
|
||||
)
|
||||
option(
|
||||
'lua',
|
||||
type: 'combo',
|
||||
choices: [ 'none', 'lua5.1', 'lua5.2', 'luajit', 'auto' ],
|
||||
value: 'auto',
|
||||
description: 'Lua library to use'
|
||||
)
|
||||
option(
|
||||
'x86_sse',
|
||||
type: 'combo',
|
||||
choices: [ 'none', 'sse', 'sse2', 'sse3', 'auto' ],
|
||||
value: 'auto',
|
||||
description: 'Enable SSE (available only on x86)'
|
||||
)
|
||||
option(
|
||||
'build_powder',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Build the game'
|
||||
)
|
||||
option(
|
||||
'build_render',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Build the thumbnail renderer'
|
||||
)
|
||||
option(
|
||||
'build_font',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Build the font editor'
|
||||
)
|
||||
option(
|
||||
'server',
|
||||
type: 'string',
|
||||
value: 'powdertoy.co.uk',
|
||||
description: 'Simulation server'
|
||||
)
|
||||
option(
|
||||
'static_server',
|
||||
type: 'string',
|
||||
value: 'static.powdertoy.co.uk',
|
||||
description: 'Static simulation server'
|
||||
)
|
||||
option(
|
||||
'update_server',
|
||||
type: 'string',
|
||||
value: '',
|
||||
description: 'Update server, only used by snapshots and mods, see \'snapshot\' and \'mod_id\''
|
||||
)
|
||||
option(
|
||||
'workaround_noncpp_lua',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Allow linking against a non-C++ system Lua'
|
||||
)
|
||||
option(
|
||||
'workaround_elusive_bzip2',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'acquire bzip2 dependency with find_library'
|
||||
)
|
||||
option(
|
||||
'workaround_elusive_bzip2_lib_name',
|
||||
type: 'string',
|
||||
value: 'bz2',
|
||||
description: 'bzip2 library name, see \'workaround_elusive_bzip2\''
|
||||
)
|
||||
option(
|
||||
'workaround_elusive_bzip2_lib_dir',
|
||||
type: 'string',
|
||||
value: '/usr/lib/x86_64-linux-gnu',
|
||||
description: 'bzip2 library directory, see \'workaround_elusive_bzip2\''
|
||||
)
|
||||
option(
|
||||
'workaround_elusive_bzip2_include_name',
|
||||
type: 'string',
|
||||
value: 'bzlib.h',
|
||||
description: 'bzip2 header name, see \'workaround_elusive_bzip2\''
|
||||
)
|
||||
option(
|
||||
'workaround_elusive_bzip2_include_dir',
|
||||
type: 'string',
|
||||
value: '/usr/include',
|
||||
description: 'bzip2 header directory, see \'workaround_elusive_bzip2\''
|
||||
)
|
||||
option(
|
||||
'workaround_elusive_bzip2_static',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'bzip2 static setting, see \'workaround_elusive_bzip2\''
|
||||
)
|
||||
option(
|
||||
'tpt_libs_vtag',
|
||||
type: 'string',
|
||||
value: '',
|
||||
description: 'tpt-libs vtag override, only used for tpt-libs development'
|
||||
)
|
||||
option(
|
||||
'android_keystore',
|
||||
type: 'string',
|
||||
value: '',
|
||||
description: 'Path to Java keystore for signing an APK, only used for Android development'
|
||||
)
|
||||
option(
|
||||
'android_keyalias',
|
||||
type: 'string',
|
||||
value: 'androidkey',
|
||||
description: 'Signing key alias for signing an APK, only used for Android development'
|
||||
)
|
||||
option(
|
||||
'app_name',
|
||||
type: 'string',
|
||||
value: 'The Powder Toy',
|
||||
description: 'App name, used for desktop integration and the window title, change if you work on a mod'
|
||||
)
|
||||
option(
|
||||
'app_comment',
|
||||
type: 'string',
|
||||
value: 'Physics sandbox game',
|
||||
description: 'App comment, used for desktop integration, change if you work on a mod'
|
||||
)
|
||||
option(
|
||||
'app_exe',
|
||||
type: 'string',
|
||||
value: 'powder',
|
||||
description: 'App executable name, used for desktop integration, change if you work on a mod'
|
||||
)
|
||||
option(
|
||||
'app_id',
|
||||
type: 'string',
|
||||
value: 'uk.co.powdertoy.tpt',
|
||||
description: 'App ID, a D-Bus well-known name, used for desktop integration, change if you work on a mod'
|
||||
)
|
||||
option(
|
||||
'app_data',
|
||||
type: 'string',
|
||||
value: 'The Powder Toy',
|
||||
description: 'App data directory name, do not change even if you work on a mod, only if you know what you are doing'
|
||||
)
|
||||
option(
|
||||
'app_vendor',
|
||||
type: 'string',
|
||||
value: 'powdertoy',
|
||||
description: 'App vendor prefix, used for desktop integration, do not change even if you work on a mod, only if you know what you are doing'
|
||||
)
|
||||
option(
|
||||
'enforce_https',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Enforce encrypted HTTP traffic, may be disabled for debugging'
|
||||
)
|
||||
option(
|
||||
'secure_ciphers_only',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Use only secure ciphers for encrypted HTTP traffic, please review cipher list before enabling'
|
||||
)
|
||||
option(
|
||||
'prepare',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Used by ghactions workflows, not useful otherwise'
|
||||
)
|
||||
option(
|
||||
'render_icons_with_inkscape',
|
||||
type: 'feature',
|
||||
value: 'disabled',
|
||||
description: 'Render icons with Inkscape (inkscape binary needs to be in PATH)'
|
||||
)
|
||||
option(
|
||||
'resolve_vcs_tag',
|
||||
type: 'combo',
|
||||
choices: [ 'no', 'static_release_only', 'yes' ],
|
||||
value: 'static_release_only',
|
||||
description: 'Enable VCS tag resolution, introduces an always-stale custom target'
|
||||
)
|
||||
option(
|
||||
'manifest_copyright',
|
||||
type: 'string',
|
||||
value: 'Copyright © 2008-2011 Stanislaw K Skowrenek, Copyright © 2011-2023 Simon Robertshaw, Copyright © 2016-2023 jacob1',
|
||||
description: 'Copyright string, don\'t take too seriously, subject to change'
|
||||
)
|
||||
option(
|
||||
'manifest_macos_min_ver',
|
||||
type: 'string',
|
||||
value: '',
|
||||
description: 'MacOS minimum allowed platform version string, used by ghactions workflows, not useful otherwise'
|
||||
)
|
||||
option(
|
||||
'manifest_date',
|
||||
type: 'string',
|
||||
value: '',
|
||||
description: 'Build date string, used by ghactions workflows, not useful otherwise'
|
||||
)
|
||||
option(
|
||||
'platform_clipboard',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Enable platform clipboard, allows copying simulation data between different windows'
|
||||
)
|
||||
option(
|
||||
'use_bluescreen',
|
||||
type: 'combo',
|
||||
choices: [ 'no', 'yes', 'auto' ],
|
||||
value: 'auto',
|
||||
description: 'Show blue error screen upon unhandled signals and exceptions'
|
||||
)
|
||||
option(
|
||||
'windows_icons',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Add icon resources to the executable on Windows'
|
||||
)
|
||||
option(
|
||||
'windows_utf8cp',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Ask Windows nicely for UTF-8 as the codepage'
|
||||
)
|
||||
option(
|
||||
'export_lua_symbols',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Export Lua symbols to enable loading of Lua shared modules'
|
||||
)
|
70
newelement.py
Executable file
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
|
||||
if len(sys.argv) != 2:
|
||||
name = input('element name: ')
|
||||
else:
|
||||
name = sys.argv[1]
|
||||
|
||||
if re.search('[^A-Z0-9-]', name):
|
||||
sys.exit('element names should only contain uppercase letters, digits and hyphens (you can change the Name property of the element to whatever later though, which is what shows up in menus)')
|
||||
|
||||
path = 'src/simulation/elements/' + name + '.cpp'
|
||||
|
||||
if os.path.isfile(path):
|
||||
sys.exit('element already exists')
|
||||
|
||||
with open("generator.py") as f:
|
||||
exec(compile(f.read(), "generator.py", 'exec'))
|
||||
|
||||
max_id = 0
|
||||
with open('generated/ElementClasses.h', 'r') as classes:
|
||||
for pt in re.findall('#define PT_\\S+ (\\d+)', classes.read()):
|
||||
pt_id = int(pt)
|
||||
if max_id < pt_id:
|
||||
max_id = pt_id
|
||||
|
||||
with open(path, 'w') as elem:
|
||||
elem.write(r"""#include "simulation/ElementCommon.h"
|
||||
|
||||
//#TPT-Directive ElementClass Element_{0} PT_{0} {1}
|
||||
Element_{0}::Element_{0}()
|
||||
{{
|
||||
Identifier = "DEFAULT_PT_{0}";
|
||||
Name = "{0}";
|
||||
Colour = PIXPACK(0xFFFFFF);
|
||||
MenuVisible = 1;
|
||||
MenuSection = SC_SPECIAL;
|
||||
Enabled = 1;
|
||||
|
||||
// element properties here
|
||||
|
||||
Update = &Element_{0}::update;
|
||||
Graphics = &Element_{0}::graphics;
|
||||
}}
|
||||
|
||||
//#TPT-Directive ElementHeader Element_{0} static int update(UPDATE_FUNC_ARGS)
|
||||
int Element_{0}::update(UPDATE_FUNC_ARGS)
|
||||
{{
|
||||
// update code here
|
||||
|
||||
return 0;
|
||||
}}
|
||||
|
||||
//#TPT-Directive ElementHeader Element_{0} static int graphics(GRAPHICS_FUNC_ARGS)
|
||||
int Element_{0}::graphics(GRAPHICS_FUNC_ARGS)
|
||||
{{
|
||||
// graphics code here
|
||||
// return 1 if nothing dymanic happens here
|
||||
|
||||
return 0;
|
||||
}}
|
||||
|
||||
Element_{0}::~Element_{0}() {{}}
|
||||
""".format(name, str(max_id + 1)))
|
||||
elem.close()
|
||||
|
||||
with open("generator.py") as f:
|
||||
exec(compile(f.read(), "generator.py", 'exec'))
|
@ -1,70 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>ptsave</string>
|
||||
</array>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>Powder Toy Save URL</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleName</key>
|
||||
<string>@APPNAME@</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>icon_exe.icns</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>@MANIFEST_COPYRIGHT@</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>stm</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>icon_cps.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Powder Toy Save</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>cps</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>icon_cps.icns</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Powder Toy Stamp</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>@APPEXE@</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>@APPID@</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@ (build @BUILD_NUM@)</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>@MANIFEST_MACOS_MIN_VER@</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
</dict>
|
||||
</plist>
|
@ -1,137 +0,0 @@
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
static void writeU32LE(uint8_t *dest, uint32_t value)
|
||||
{
|
||||
dest[0] = uint8_t( value & 0xFF);
|
||||
dest[1] = uint8_t((value >> 8) & 0xFF);
|
||||
dest[2] = uint8_t((value >> 16) & 0xFF);
|
||||
dest[3] = uint8_t((value >> 24) & 0xFF);
|
||||
}
|
||||
|
||||
static uint32_t readU32BE(const uint8_t *src)
|
||||
{
|
||||
return uint32_t(src[3]) |
|
||||
(uint32_t(src[2]) << 8) |
|
||||
(uint32_t(src[1]) << 16) |
|
||||
(uint32_t(src[0]) << 24);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
std::cerr << "usage: " << argv[0] << " OUTPUT INPUT..." << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
auto images = argc - 2;
|
||||
if (images > 255)
|
||||
{
|
||||
std::cerr << "too many images specified" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
std::string outputPath = argv[1];
|
||||
std::ofstream output(outputPath, std::ios::binary);
|
||||
auto outputFailure = [&outputPath](std::string action) {
|
||||
std::cerr << "failed to " << action << " " << outputPath << ": " << strerror(errno) << std::endl;
|
||||
exit(1);
|
||||
};
|
||||
if (!output)
|
||||
{
|
||||
outputFailure("open");
|
||||
}
|
||||
std::vector<char> header(6 + images * 16, 0);
|
||||
auto writeHeader = [&header, &output, &outputFailure]() {
|
||||
output.seekp(0, std::ios_base::beg);
|
||||
output.write(&header[0], header.size());
|
||||
if (!output)
|
||||
{
|
||||
outputFailure("write");
|
||||
}
|
||||
};
|
||||
writeHeader(); // make space for header
|
||||
auto *headerU8 = reinterpret_cast<uint8_t *>(&header[0]);
|
||||
headerU8[2] = 1;
|
||||
headerU8[4] = images;
|
||||
for (auto image = 0; image < images; ++image)
|
||||
{
|
||||
std::string inputPath = argv[2 + image];
|
||||
std::ifstream input(inputPath, std::ios::binary);
|
||||
auto inputFailure = [&inputPath](std::string action) {
|
||||
std::cerr << "failed to " << action << " " << inputPath << ": " << strerror(errno) << std::endl;
|
||||
exit(1);
|
||||
};
|
||||
auto imageFailure = [&inputPath](std::string failure) {
|
||||
std::cerr << "failed to process " << inputPath << ": " << failure << std::endl;
|
||||
exit(1);
|
||||
};
|
||||
if (!input)
|
||||
{
|
||||
inputFailure("open");
|
||||
}
|
||||
std::vector<char> buf;
|
||||
input.seekg(0, std::ios_base::end);
|
||||
buf.resize(input.tellg());
|
||||
input.seekg(0, std::ios_base::beg);
|
||||
input.read(&buf[0], buf.size());
|
||||
if (!input)
|
||||
{
|
||||
inputFailure("read");
|
||||
}
|
||||
auto *bufU8 = reinterpret_cast<uint8_t *>(&buf[0]);
|
||||
if (buf.size() < 0x21 ||
|
||||
readU32BE(&bufU8[0]) != UINT32_C(0x89504E47) ||
|
||||
readU32BE(&bufU8[4]) != UINT32_C(0x0D0A1A0A) ||
|
||||
bufU8[0x18] != 8 ||
|
||||
bufU8[0x19] != 6)
|
||||
{
|
||||
imageFailure("not a 32bpp RGBA PNG");
|
||||
}
|
||||
auto writeOffset = output.tellp();
|
||||
output.write(&buf[0], buf.size());
|
||||
if (!output)
|
||||
{
|
||||
outputFailure("write");
|
||||
}
|
||||
auto width = readU32BE(&bufU8[0x10]);
|
||||
auto height = readU32BE(&bufU8[0x14]);
|
||||
if (width == 256)
|
||||
{
|
||||
width = 0;
|
||||
}
|
||||
if (width > 255)
|
||||
{
|
||||
imageFailure("width exceeds U8 limit");
|
||||
}
|
||||
if (height == 256)
|
||||
{
|
||||
height = 0;
|
||||
}
|
||||
if (height > 255)
|
||||
{
|
||||
imageFailure("height exceeds U8 limit");
|
||||
}
|
||||
auto *entryU8 = headerU8 + 6 + image * 16;
|
||||
entryU8[0] = width;
|
||||
entryU8[1] = height;
|
||||
entryU8[4] = 1;
|
||||
entryU8[6] = 32;
|
||||
if (buf.size() > UINT32_MAX)
|
||||
{
|
||||
imageFailure("data size exceeds U32 limit");
|
||||
}
|
||||
writeU32LE(&entryU8[8], uint32_t(buf.size()));
|
||||
if (writeOffset > UINT32_MAX)
|
||||
{
|
||||
std::cerr << "output data size exceeds U32 limit" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
writeU32LE(&entryU8[12], uint32_t(writeOffset));
|
||||
}
|
||||
writeHeader(); // actually write it out
|
||||
return 0;
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
#include <fstream>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc != 5)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
auto *outputCppPath = argv[1];
|
||||
auto *outputHPath = argv[2];
|
||||
auto *inputAnyPath = argv[3];
|
||||
auto *symbolName = argv[4];
|
||||
std::ifstream inputAny(inputAnyPath, std::ios::binary);
|
||||
std::ofstream outputCpp(outputCppPath);
|
||||
if (!outputCpp)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
outputCpp << "#include \"" << outputHPath << "\"\nconst unsigned char " << symbolName << "[] = { ";
|
||||
auto dataLen = 0U;
|
||||
while (true)
|
||||
{
|
||||
char ch;
|
||||
inputAny.read(&ch, 1);
|
||||
if (inputAny.eof())
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (!inputAny)
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
outputCpp << (unsigned int)(unsigned char)(ch) << ", ";
|
||||
dataLen += 1;
|
||||
}
|
||||
outputCpp << " }; const unsigned int " << symbolName << "_size = " << dataLen << ";\n";
|
||||
if (!outputCpp)
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
std::ofstream outputH(outputHPath);
|
||||
if (!outputH)
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
outputH << "#pragma once\nextern const unsigned char " << symbolName << "[]; extern const unsigned int " << symbolName << "_size;\n";
|
||||
if (!outputH)
|
||||
{
|
||||
return 6;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<component type="desktop">
|
||||
<id>@APPID@</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0</project_license>
|
||||
<name>@APPNAME@</name>
|
||||
<summary>@APPCOMMENT@</summary>
|
||||
<content_rating type="oars-1.1">
|
||||
<content_attribute id="social-chat">moderate</content_attribute>
|
||||
</content_rating>
|
||||
<launchable type="desktop-id">@APPID@.desktop</launchable>
|
||||
<description>
|
||||
<p>
|
||||
Have you ever wanted to blow something up? Or maybe you always dreamt of operating an atomic power plant? Do you have a will to develop your own CPU? The Powder Toy lets you to do all of these, and even more!
|
||||
</p>
|
||||
<p>
|
||||
The Powder Toy is a free physics sandbox game, which simulates air pressure and velocity, heat, gravity and a countless number of interactions between different substances! The game provides you with various building materials, liquids, gases and electronic components which can be used to construct complex machines, guns, bombs, realistic terrains and almost anything else. You can then mine them and watch cool explosions, add intricate wirings, play with little stickmen or operate your machine. You can browse and play thousands of different saves made by the community or upload your own – we welcome your creations!
|
||||
</p>
|
||||
<p>
|
||||
There is a Lua API – you can automate your work or even make plugins for the game. The Powder Toy is free and the source code is distributed under the GNU General Public License, so you can modify the game yourself or help with development.
|
||||
</p>
|
||||
</description>
|
||||
<screenshots>
|
||||
<screenshot>
|
||||
<image>https://powdertoy.co.uk/Themes/Next/Design/Images/Screen2.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<url type="homepage">https://powdertoy.co.uk/</url>
|
||||
<url type="bugtracker">https://github.com/The-Powder-Toy/The-Powder-Toy/issues</url>
|
||||
<url type="help">https://powdertoy.co.uk/Wiki/W/Main_Page.html</url>
|
||||
<releases>
|
||||
<release date="@MANIFEST_DATE@" version="@DISPLAY_VERSION_MAJOR@.@DISPLAY_VERSION_MINOR@.@BUILD_NUM@" />
|
||||
</releases>
|
||||
</component>
|
BIN
resources/document.icns
Normal file
BIN
resources/document.ico
Normal file
After Width: | Height: | Size: 25 KiB |
@ -1,9 +0,0 @@
|
||||
We keep these icons here to make it possible to build TPT without Inkscape. If
|
||||
you have Inkscape and want to change the game's icons, edit the SVGs in the
|
||||
parent directory and configure your build sites with
|
||||
`-Drender_icons_with_inkscape=true`.
|
||||
|
||||
The GitHub Actions workflows currently do not use Inkscape and use these icons
|
||||
instead, so once you are satisfied with the state of the SVGs, replace these
|
||||
icons with the ones in your build site in the same subdirectory and make a new
|
||||
commit.
|
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 563 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 644 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.8 KiB |
BIN
resources/icon.icns
Executable file
BIN
resources/icon.ico
Normal file
After Width: | Height: | Size: 76 KiB |
16
resources/icon/icontofile.py
Normal file
@ -0,0 +1,16 @@
|
||||
import sys
|
||||
from PIL import Image
|
||||
image = Image.open(sys.argv[1])
|
||||
|
||||
output = ""
|
||||
formatted = []
|
||||
for pixel in image.getdata():
|
||||
formatted.extend("0x{0:02X}".format(byte) for byte in pixel)
|
||||
for i in range(len(formatted)/16 + 1):
|
||||
print(", ".join(formatted[i*16:(i+1)*16]) + ",")
|
||||
|
||||
"""with open(sys.argv[1], "rb") as icon:
|
||||
icondata = icon.read()
|
||||
output = ["0x{0:02X}".format(ord(byte)) for byte in icondata]
|
||||
for line in range(len(output)/16+1):
|
||||
print(", ".join(output[line*16:(line+1)*16])+",")"""
|
BIN
resources/icon/new-unused/icon.icns
Normal file
117
resources/icon/new-unused/icon.svg
Normal file
@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1024"
|
||||
height="1024"
|
||||
viewBox="0 0 270.93334 270.93333"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="icon_pile_gradient.svg"
|
||||
inkscape:export-filename="/home/lbphacker/temp/tpt-logo/icon_circle.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<defs
|
||||
id="defs2">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5602">
|
||||
<stop
|
||||
style="stop-color:#ff7a4c;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5604" />
|
||||
<stop
|
||||
style="stop-color:#ffff4a;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop5606" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter5229"
|
||||
x="-0.099935167"
|
||||
width="1.1998703"
|
||||
y="-0.091193162"
|
||||
height="1.1823863">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="7.6262206"
|
||||
id="feGaussianBlur5231" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5602"
|
||||
id="linearGradient5608"
|
||||
x1="623.16376"
|
||||
y1="313.71109"
|
||||
x2="835.82587"
|
||||
y2="100.99124"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.3535534"
|
||||
inkscape:cx="218.91161"
|
||||
inkscape:cy="713.0457"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="705"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false"
|
||||
showguides="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-594.1217,-81.893738)">
|
||||
<g
|
||||
id="g5610">
|
||||
<path
|
||||
transform="matrix(1.1416809,0,0,1.1416809,-103.36921,-12.109215)"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path950"
|
||||
d="m 729.5891,100.64025 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8533,-6.85384 6.8536343,6.8536343 0 0 0 -6.8533,-6.85333 z m 0,27.34045 c -3.7851,0 -6.8534,3.06823 -6.8534,6.85333 l 0,14.43478 c 0,3.78508 3.0683,6.85384 6.8534,6.85384 3.7851,0 6.8538,-3.06876 6.8538,-6.85384 l 0,-14.43478 c 0,-3.7851 -3.0687,-6.85333 -6.8538,-6.85333 z m 26.5585,18.38389 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8539,-6.85333 6.8536343,6.8536343 0 0 0 -6.8539,-6.85384 z m -62.3124,22.72367 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8538,-6.85385 6.8536343,6.8536343 0 0 0 -6.8538,-6.85333 z m 35.7544,0.66715 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8533,-6.85385 6.8536343,6.8536343 0 0 0 -6.8533,-6.85384 z m -0.1886,27.342 c -3.3028,0.0484 -6.4566,1.38153 -8.7928,3.71656 l -78.8505,78.85152 c -7.9961,8.00073 -2.3327,21.6754 8.9788,21.67982 l 157.7032,0 c 11.312,-0.003 16.9767,-13.67855 8.9802,-21.67982 l -78.8515,-78.85152 c -2.4281,-2.42693 -5.7354,-3.76761 -9.168,-3.71656 z m 0.7482,8.51369 0,0 c 0.4485,0 0.8969,0.044 1.3385,0.13074 1.4334,0.202 2.8158,0.85351 3.9181,1.95595 l 74.9995,74.99956 c 2.6995,2.6994 2.6995,7.07622 0,9.77563 -2.699,2.69939 -7.0755,2.69939 -9.7751,0 l -70.3275,-70.32749 -11.8003,11.80031 c -2.6993,2.69937 -7.076,2.6993 -9.7756,0 -2.6992,-2.69951 -2.6988,-7.07626 0,-9.77563 l 16.5344,-16.53439 c 1.3498,-1.34968 3.1186,-2.02467 4.8875,-2.02468 z m 55.2437,1.29294 a 6.8536343,6.8536343 0 0 0 -6.8533,6.85385 6.8536343,6.8536343 0 0 0 6.8533,6.85333 6.8536343,6.8536343 0 0 0 6.8538,-6.85333 6.8536343,6.8536343 0 0 0 -6.8538,-6.85385 z m -115.8803,12.52999 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8534,-6.85333 6.8536343,6.8536343 0 0 0 -6.8534,-6.85384 z m 27.0614,18.73839 a 6.8536343,6.8536343 0 0 1 6.8534,6.85333 6.8536343,6.8536343 0 0 1 -6.8534,6.85384 6.8536343,6.8536343 0 0 1 -6.8538,-6.85384 6.8536343,6.8536343 0 0 1 6.8538,-6.85333 z m -27.4784,26.01701 a 6.8536343,6.8536343 0 0 1 6.8538,6.85333 6.8536343,6.8536343 0 0 1 -6.8538,6.85385 6.8536343,6.8536343 0 0 1 -6.8533,-6.85385 6.8536343,6.8536343 0 0 1 6.8533,-6.85333 z"
|
||||
style="opacity:0.90700001;fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.70695019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5229)" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#linearGradient5608);fill-opacity:1;stroke:#4d361f;stroke-width:3.96875027;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-rule:nonzero"
|
||||
d="m 729.58874,102.78984 a 7.8246635,7.8246635 0 0 0 -7.82496,7.82432 7.8246635,7.8246635 0 0 0 7.82496,7.82489 7.8246635,7.8246635 0 0 0 7.82429,-7.82489 7.8246635,7.8246635 0 0 0 -7.82429,-7.82432 z m 0,31.21407 c -4.32137,0 -7.82439,3.50293 -7.82439,7.82431 l 0,16.47992 c 0,4.32136 3.50302,7.8249 7.82439,7.8249 4.32138,0 7.82486,-3.50354 7.82486,-7.8249 l 0,-16.47992 c 0,-4.32138 -3.50348,-7.82431 -7.82486,-7.82431 z m 30.32135,20.98853 a 7.8246635,7.8246635 0 0 0 -7.82486,7.82491 7.8246635,7.8246635 0 0 0 7.82486,7.82431 7.8246635,7.8246635 0 0 0 7.82496,-7.82431 7.8246635,7.8246635 0 0 0 -7.82496,-7.82491 z m -71.14088,25.94318 a 7.8246635,7.8246635 0 0 0 -7.82497,7.82432 7.8246635,7.8246635 0 0 0 7.82497,7.82491 7.8246635,7.8246635 0 0 0 7.82485,-7.82491 7.8246635,7.8246635 0 0 0 -7.82485,-7.82432 z m 40.82011,0.76168 a 7.8246635,7.8246635 0 0 0 -7.82497,7.82489 7.8246635,7.8246635 0 0 0 7.82497,7.82492 7.8246635,7.8246635 0 0 0 7.82428,-7.82492 7.8246635,7.8246635 0 0 0 -7.82428,-7.82489 z m -0.21533,31.21584 c -3.77074,0.0553 -7.37137,1.57726 -10.03856,4.24312 l -90.02211,90.02327 c -9.129,9.1343 -2.6632,24.7464 10.25092,24.75145 l 180.04673,0 c 12.91469,-0.004 19.38198,-15.61654 10.25253,-24.75145 l -90.02326,-90.02327 c -2.77211,-2.77078 -6.54799,-4.30141 -10.46693,-4.24312 z m 0.85421,9.71992 0,0 c 0.51205,0 1.02398,0.0503 1.52815,0.14926 1.63648,0.23062 3.21474,0.97444 4.47322,2.23307 l 85.62549,85.62556 c 3.08197,3.08186 3.08197,8.07879 0,11.16066 -3.0814,3.08183 -8.07797,3.08183 -11.16005,0 l -80.29156,-80.29155 -13.47218,13.47219 c -3.08173,3.08181 -8.07853,3.08173 -11.16061,0 -3.08163,-3.08199 -3.08117,-8.07884 0,-11.16066 l 18.877,-18.87699 c 1.54104,-1.5409 3.56045,-2.31153 5.57997,-2.31154 z m 63.07068,1.47613 a 7.8246635,7.8246635 0 0 0 -7.82428,7.8249 7.8246635,7.8246635 0 0 0 7.82428,7.82432 7.8246635,7.8246635 0 0 0 7.82486,-7.82432 7.8246635,7.8246635 0 0 0 -7.82486,-7.8249 z m -132.29832,14.30524 a 7.8246635,7.8246635 0 0 0 -7.82486,7.8249 7.8246635,7.8246635 0 0 0 7.82486,7.82432 7.8246635,7.8246635 0 0 0 7.82439,-7.82432 7.8246635,7.8246635 0 0 0 -7.82439,-7.8249 z m 30.89547,21.39326 a 7.8246635,7.8246635 0 0 1 7.8244,7.82432 7.8246635,7.8246635 0 0 1 -7.8244,7.8249 7.8246635,7.8246635 0 0 1 -7.82484,-7.8249 7.8246635,7.8246635 0 0 1 7.82484,-7.82432 z m -31.37155,29.70312 a 7.8246635,7.8246635 0 0 1 7.82484,7.82432 7.8246635,7.8246635 0 0 1 -7.82484,7.82491 7.8246635,7.8246635 0 0 1 -7.82428,-7.82491 7.8246635,7.8246635 0 0 1 7.82428,-7.82432 z"
|
||||
id="path952"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.4 KiB |
BIN
resources/icon/new-unused/icon_128.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
resources/icon/new-unused/icon_256.ico
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
resources/icon/new-unused/icon_256.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
resources/icon/new-unused/icon_48.ico
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
resources/icon/new-unused/icon_64.ico
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
resources/icon/new-unused/icon_96.ico
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
resources/icon/new-unused/icon_circle.png
Normal file
After Width: | Height: | Size: 111 KiB |
101
resources/icon/new-unused/icon_circle.svg
Normal file
@ -0,0 +1,101 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1024"
|
||||
height="1024"
|
||||
viewBox="0 0 270.93334 270.93333"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="icon_circle.svg"
|
||||
inkscape:export-filename="/home/lbphacker/temp/tpt-logo/icon_circle.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<defs
|
||||
id="defs2">
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter5229"
|
||||
x="-0.099935167"
|
||||
width="1.1998703"
|
||||
y="-0.091193162"
|
||||
height="1.1823863">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="7.6262206"
|
||||
id="feGaussianBlur5231" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.66"
|
||||
inkscape:cx="328.01066"
|
||||
inkscape:cy="553.26531"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g986"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="982"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false"
|
||||
showguides="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-594.1217,-81.893738)">
|
||||
<g
|
||||
id="g986">
|
||||
<circle
|
||||
r="135.46667"
|
||||
cy="217.36041"
|
||||
cx="729.58838"
|
||||
id="circle948"
|
||||
style="opacity:1;fill:#ffd090;fill-opacity:1;stroke:none;stroke-width:1.74795687;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
transform="matrix(0.91722511,0,0,0.91722511,60.391628,16.637154)"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path950"
|
||||
d="m 729.5891,100.64025 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8533,-6.85384 6.8536343,6.8536343 0 0 0 -6.8533,-6.85333 z m 0,27.34045 c -3.7851,0 -6.8534,3.06823 -6.8534,6.85333 v 14.43478 c 0,3.78508 3.0683,6.85384 6.8534,6.85384 3.7851,0 6.8538,-3.06876 6.8538,-6.85384 v -14.43478 c 0,-3.7851 -3.0687,-6.85333 -6.8538,-6.85333 z m 26.5585,18.38389 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8539,-6.85333 6.8536343,6.8536343 0 0 0 -6.8539,-6.85384 z m -62.3124,22.72367 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85333 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8538,-6.85385 6.8536343,6.8536343 0 0 0 -6.8538,-6.85333 z m 35.7544,0.66715 a 6.8536343,6.8536343 0 0 0 -6.8539,6.85384 6.8536343,6.8536343 0 0 0 6.8539,6.85385 6.8536343,6.8536343 0 0 0 6.8533,-6.85385 6.8536343,6.8536343 0 0 0 -6.8533,-6.85384 z m -0.1886,27.342 c -3.3028,0.0484 -6.4566,1.38153 -8.7928,3.71656 l -78.8505,78.85152 c -7.9961,8.00073 -2.3327,21.6754 8.9788,21.67982 h 157.7032 c 11.312,-0.003 16.9767,-13.67855 8.9802,-21.67982 l -78.8515,-78.85152 c -2.4281,-2.42693 -5.7354,-3.76761 -9.168,-3.71656 z m 0.7482,8.51369 v 0 c 0.4485,0 0.8969,0.044 1.3385,0.13074 1.4334,0.202 2.8158,0.85351 3.9181,1.95595 l 74.9995,74.99956 c 2.6995,2.6994 2.6995,7.07622 0,9.77563 -2.699,2.69939 -7.0755,2.69939 -9.7751,0 l -70.3275,-70.32749 -11.8003,11.80031 c -2.6993,2.69937 -7.076,2.6993 -9.7756,0 -2.6992,-2.69951 -2.6988,-7.07626 0,-9.77563 l 16.5344,-16.53439 c 1.3498,-1.34968 3.1186,-2.02467 4.8875,-2.02468 z m 55.2437,1.29294 a 6.8536343,6.8536343 0 0 0 -6.8533,6.85385 6.8536343,6.8536343 0 0 0 6.8533,6.85333 6.8536343,6.8536343 0 0 0 6.8538,-6.85333 6.8536343,6.8536343 0 0 0 -6.8538,-6.85385 z m -115.8803,12.52999 a 6.8536343,6.8536343 0 0 0 -6.8538,6.85384 6.8536343,6.8536343 0 0 0 6.8538,6.85333 6.8536343,6.8536343 0 0 0 6.8534,-6.85333 6.8536343,6.8536343 0 0 0 -6.8534,-6.85384 z m 27.0614,18.73839 a 6.8536343,6.8536343 0 0 1 6.8534,6.85333 6.8536343,6.8536343 0 0 1 -6.8534,6.85384 6.8536343,6.8536343 0 0 1 -6.8538,-6.85384 6.8536343,6.8536343 0 0 1 6.8538,-6.85333 z m -27.4784,26.01701 a 6.8536343,6.8536343 0 0 1 6.8538,6.85333 6.8536343,6.8536343 0 0 1 -6.8538,6.85385 6.8536343,6.8536343 0 0 1 -6.8533,-6.85385 6.8536343,6.8536343 0 0 1 6.8533,-6.85333 z"
|
||||
style="opacity:0.90700001;fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.70695019;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5229)" />
|
||||
<path
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:12.57235909;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 729.58907,108.94692 a 6.2863255,6.2863255 0 0 0 -6.28657,6.28605 6.2863255,6.2863255 0 0 0 6.28657,6.28651 6.2863255,6.2863255 0 0 0 6.28602,-6.28651 6.2863255,6.2863255 0 0 0 -6.28602,-6.28605 z m 0,25.07735 c -3.47179,0 -6.28611,2.81425 -6.28611,6.28604 v 13.23995 c 0,3.47177 2.81432,6.28651 6.28611,6.28651 3.47179,0 6.28648,-2.81474 6.28648,-6.28651 v -13.23995 c 0,-3.47179 -2.81469,-6.28604 -6.28648,-6.28604 z m 24.36013,16.86216 a 6.2863255,6.2863255 0 0 0 -6.28648,6.28652 6.2863255,6.2863255 0 0 0 6.28648,6.28604 6.2863255,6.2863255 0 0 0 6.28657,-6.28604 6.2863255,6.2863255 0 0 0 -6.28657,-6.28652 z m -57.1545,20.84272 a 6.2863255,6.2863255 0 0 0 -6.28657,6.28605 6.2863255,6.2863255 0 0 0 6.28657,6.28652 6.2863255,6.2863255 0 0 0 6.28648,-6.28652 6.2863255,6.2863255 0 0 0 -6.28648,-6.28605 z m 32.79483,0.61193 a 6.2863255,6.2863255 0 0 0 -6.28657,6.28651 6.2863255,6.2863255 0 0 0 6.28657,6.28653 6.2863255,6.2863255 0 0 0 6.28602,-6.28653 6.2863255,6.2863255 0 0 0 -6.28602,-6.28651 z m -0.17299,25.07877 c -3.02941,0.0444 -5.92215,1.26717 -8.06497,3.40892 l -72.32366,72.32459 c -7.33423,7.33848 -2.13961,19.88123 8.23558,19.88528 h 144.64933 c 10.37565,-0.003 15.57146,-12.54631 8.23687,-19.88528 l -72.32458,-72.32459 c -2.22711,-2.22604 -5.26065,-3.45575 -8.40912,-3.40892 z m 0.68627,7.80897 v 0 c 0.41138,0 0.82266,0.0404 1.22771,0.11992 1.31475,0.18528 2.58272,0.78286 3.59378,1.79404 l 68.79142,68.79148 c 2.47605,2.47596 2.47605,6.49049 0,8.96646 -2.47559,2.47594 -6.48983,2.47594 -8.96597,0 l -64.50615,-64.50614 -10.82353,10.82354 c -2.47586,2.47593 -6.49028,2.47586 -8.96642,0 -2.47578,-2.47606 -2.47541,-6.49053 0,-8.96646 l 15.16576,-15.16575 c 1.23807,-1.23796 2.86046,-1.85708 4.48294,-1.85709 z m 50.67091,1.18592 a 6.2863255,6.2863255 0 0 0 -6.28602,6.28652 6.2863255,6.2863255 0 0 0 6.28602,6.28605 6.2863255,6.2863255 0 0 0 6.28648,-6.28605 6.2863255,6.2863255 0 0 0 -6.28648,-6.28652 z M 674.4854,217.90756 a 6.2863255,6.2863255 0 0 0 -6.28648,6.28651 6.2863255,6.2863255 0 0 0 6.28648,6.28605 6.2863255,6.2863255 0 0 0 6.28611,-6.28605 6.2863255,6.2863255 0 0 0 -6.28611,-6.28651 z m 24.82139,17.18732 a 6.2863255,6.2863255 0 0 1 6.28611,6.28605 6.2863255,6.2863255 0 0 1 -6.28611,6.28651 6.2863255,6.2863255 0 0 1 -6.28647,-6.28651 6.2863255,6.2863255 0 0 1 6.28647,-6.28605 z m -25.20387,23.86345 a 6.2863255,6.2863255 0 0 1 6.28647,6.28605 6.2863255,6.2863255 0 0 1 -6.28647,6.28652 6.2863255,6.2863255 0 0 1 -6.28602,-6.28652 6.2863255,6.2863255 0 0 1 6.28602,-6.28605 z"
|
||||
id="path952"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.1 KiB |
BIN
resources/icon/powder-128.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
resources/icon/powder-16.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/icon/powder-24.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
resources/icon/powder-256.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
resources/icon/powder-32.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
resources/icon/powder-48.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 255 KiB |
@ -1,533 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 16.933331 16.933331"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
sodipodi:docname="icon_exe.svg"
|
||||
inkscape:export-filename="icon.png"
|
||||
inkscape:export-xdpi="192"
|
||||
inkscape:export-ydpi="192"
|
||||
xml:space="preserve"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#ffffff"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
inkscape:zoom="16.970563"
|
||||
inkscape:cx="57.422963"
|
||||
inkscape:cy="24.188945"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="1054"
|
||||
inkscape:window-x="1297"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer7" /><defs
|
||||
id="defs2"><linearGradient
|
||||
id="linearGradient10317"><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop10311" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:1;"
|
||||
offset="0.58129495"
|
||||
id="stop10313" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop10315" /></linearGradient><linearGradient
|
||||
id="linearGradient7451"><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:0.98309183;"
|
||||
offset="0"
|
||||
id="stop7445" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:0.65823293;"
|
||||
offset="0.44851306"
|
||||
id="stop7447" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop7449" /></linearGradient><linearGradient
|
||||
id="linearGradient7331"><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop7325" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:1;"
|
||||
offset="0.37253886"
|
||||
id="stop7327" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop7329" /></linearGradient><linearGradient
|
||||
id="linearGradient6957"><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6951" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:1;"
|
||||
offset="0.61608356"
|
||||
id="stop6953" /><stop
|
||||
style="stop-color:#f5ffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6955" /></linearGradient><linearGradient
|
||||
id="linearGradient6573"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6567" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.823915;"
|
||||
offset="0.62599742"
|
||||
id="stop6569" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6571" /></linearGradient><linearGradient
|
||||
id="linearGradient6175"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.47854495;"
|
||||
offset="0"
|
||||
id="stop6169" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.29862821;"
|
||||
offset="0.67936534"
|
||||
id="stop6171" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6173" /></linearGradient><linearGradient
|
||||
id="linearGradient5893"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.71252441;"
|
||||
offset="0"
|
||||
id="stop5887" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.5904839;"
|
||||
offset="0.67936534"
|
||||
id="stop5889" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5891" /></linearGradient><linearGradient
|
||||
id="linearGradient5757"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5751" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0.75665909"
|
||||
id="stop5753" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5755" /></linearGradient><linearGradient
|
||||
id="linearGradient5685"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5679" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0.63781762"
|
||||
id="stop5681" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5683" /></linearGradient><linearGradient
|
||||
id="linearGradient5619"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5613" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:1;"
|
||||
offset="0.73820531"
|
||||
id="stop5615" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5617" /></linearGradient><linearGradient
|
||||
id="linearGradient5441"><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.89862061;"
|
||||
offset="0"
|
||||
id="stop5435" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0.72535044;"
|
||||
offset="0.62599742"
|
||||
id="stop5437" /><stop
|
||||
style="stop-color:#f5ff08;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5439" /></linearGradient><linearGradient
|
||||
id="linearGradient1452"><stop
|
||||
style="stop-color:#f50008;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop1446" /><stop
|
||||
style="stop-color:#f50008;stop-opacity:1;"
|
||||
offset="0.7918601"
|
||||
id="stop1448" /><stop
|
||||
style="stop-color:#f50008;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop1450" /></linearGradient><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1452"
|
||||
id="radialGradient522"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.78484331,0,0,0.78747227,696.44887,-323.11915)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1452"
|
||||
id="radialGradient524"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.8981104,0,0,0.76442481,749.97364,-321.90886)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6573"
|
||||
id="radialGradient526"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.63729372,0,0,0.41448086,723.17431,-328.11791)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5619"
|
||||
id="radialGradient528"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.44694866,0,0,0.65155251,787.10411,-304.51482)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5619"
|
||||
id="radialGradient530"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.44694866,0,0,0.40774632,806.63991,-285.18279)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5685"
|
||||
id="radialGradient532"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.31040892,0,0,0.40774632,771.18902,-267.79397)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5757"
|
||||
id="radialGradient534"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.61485849,0,0,0.48365086,699.42828,-280.26845)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5893"
|
||||
id="radialGradient536"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.18217879,0,0,0.57948295,785.06567,-317.57229)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6175"
|
||||
id="radialGradient538"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.17110206,0,0,0.57948295,813.03511,-347.11197)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6175"
|
||||
id="radialGradient540"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.65699536,0,0,0.23041338,805.19531,-234.77302)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6175"
|
||||
id="radialGradient542"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.65699536,0,0,0.23041338,673.99742,-230.76895)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5441"
|
||||
id="radialGradient544"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.44694866,0,0,0.46338383,720.63883,-314.42592)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6957"
|
||||
id="radialGradient546"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.81417897,0,0,0.30393809,713.08122,-253.70655)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient10317"
|
||||
id="radialGradient548"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.37560777,0,0,0.52796713,798.71131,-289.99247)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient7331"
|
||||
id="radialGradient550"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.51429536,0,0,0.55006434,705.69388,-287.70068)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient7451"
|
||||
id="radialGradient552"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.51429536,0,0,0.55006434,726.67823,-322.63777)"
|
||||
cx="85.568382"
|
||||
cy="110.37487"
|
||||
fx="85.568382"
|
||||
fy="110.37487"
|
||||
r="80.962494" /></defs><g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer7"
|
||||
inkscape:label="icon"><rect
|
||||
style="opacity:1;fill:#cccccc;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
|
||||
id="rect9549"
|
||||
width="16.933332"
|
||||
height="13.229165"
|
||||
x="0"
|
||||
y="1.8520831" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,13.493748 v 0.529167 h 0.529166 v -0.529167 z"
|
||||
id="path2369" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,12.699998 v 0.529167 h 0.529166 v -0.529167 z"
|
||||
id="path2367" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,11.906248 v 0.529167 h 0.529166 v -0.529167 z"
|
||||
id="path2365" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,11.112498 v 0.529167 h 0.529166 v -0.529167 z"
|
||||
id="path2363" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,10.318749 v 0.529166 h 0.529166 v -0.529166 z"
|
||||
id="path2361" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,9.5249987 v 0.5291663 h 0.529166 V 9.5249987 Z"
|
||||
id="path2359" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,8.7312488 v 0.5291666 h 0.529166 V 8.7312488 Z"
|
||||
id="path2357" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,6.0854158 v 2.3812497 h 0.529166 V 6.0854158 Z"
|
||||
id="path2355" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,5.2916659 v 0.5291666 h 0.529166 V 5.2916659 Z"
|
||||
id="path2353" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,4.497916 v 0.5291666 h 0.529166 V 4.497916 Z"
|
||||
id="path2351" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,3.7041662 v 0.5291665 h 0.529166 V 3.7041662 Z"
|
||||
id="path2349" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 16.139581,2.9104163 v 0.5291666 h 0.529166 V 2.9104163 Z"
|
||||
id="rect14444" /><rect
|
||||
style="opacity:1;fill:#666666;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
|
||||
id="rect15056"
|
||||
width="1.0583332"
|
||||
height="0.52916658"
|
||||
x="15.610415"
|
||||
y="2.1166663" /><rect
|
||||
style="opacity:1;fill:#666666;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
|
||||
id="rect15468"
|
||||
width="1.0583332"
|
||||
height="0.52916658"
|
||||
x="14.287498"
|
||||
y="2.1166663" /><rect
|
||||
style="opacity:1;fill:#666666;stroke-width:0.0500064;stroke-linecap:square;stroke-dasharray:none"
|
||||
id="rect15470"
|
||||
width="1.0583332"
|
||||
height="0.52916658"
|
||||
x="12.964582"
|
||||
y="2.1166663" /><rect
|
||||
style="opacity:1;fill:#999999;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
id="rect15882"
|
||||
width="3.9687495"
|
||||
height="0.52916658"
|
||||
x="0.26458329"
|
||||
y="2.1166663" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-16.139581 h 0.529167 v -0.529167 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2231" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-15.345831 h 0.529167 v -0.529167 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2229" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-14.552081 h 0.529167 v -0.529167 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2227" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-11.641665 h 0.529167 v -2.645833 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2225" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-5.8208325 h 0.529167 v -5.5562495 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2223" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-4.7624993 h 0.529167 v -0.7937499 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2221" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-1.8520831 h 0.529167 V -4.497916 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2219" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-1.0583332 h 0.529167 v -0.5291666 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="path2217" /><path
|
||||
style="opacity:1;fill:#000000;stroke-width:0.0500063;stroke-linecap:square;stroke-dasharray:none"
|
||||
d="m 14.287498,-0.2645833 h 0.529167 v -0.52916659 h -0.529167 z"
|
||||
transform="rotate(90)"
|
||||
id="rect16090" /></g><g
|
||||
id="g1799"
|
||||
transform="matrix(0.9833263,0,0,0.93331382,-31.070772,-23.035828)"
|
||||
style="stroke-width:1.04385"><rect
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.445374;stroke-linecap:square"
|
||||
id="rect486"
|
||||
width="135.46664"
|
||||
height="101.59999"
|
||||
x="753.36902"
|
||||
y="-330.61847"
|
||||
inkscape:label="rect-bg"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-56.418761,66.544469)"
|
||||
mask="none" /><path
|
||||
id="rect488"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient522);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-red"
|
||||
d="m 725.48004,-288.15082 v 101.59998 h 101.67054 v -101.59998 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect490"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient524);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-red"
|
||||
d="m 754.10795,-288.15082 v 101.59998 h 106.83874 v -101.59998 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect492"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient526);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 726.11063,-288.15082 v 39.33912 h 103.1919 v -39.33912 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect494"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient528);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 789.16083,-285.35065 v 98.79981 h 71.78586 v -98.79981 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect496"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient530);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 808.70031,-273.18864 v 66.02235 h 52.24638 v -66.02235 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect498"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient532);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 772.61997,-255.80111 v 66.02236 h 50.262 v -66.02236 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect500"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient534);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 725.48004,-266.04489 v 78.31666 h 76.3411 v -78.31666 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect502"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient536);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 785.90646,-288.15082 v 81.45637 h 29.49662 v -81.45637 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect504"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient538);fill-opacity:1;stroke-width:0.44543;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 813.8244,-288.15082 v 51.91565 h 27.70629 v -51.91565 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect506"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient540);fill-opacity:1;stroke-width:0.445429;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 808.21965,-227.99781 v 37.31065 h 52.72704 v -37.31065 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect508"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient542);fill-opacity:1;stroke-width:0.445429;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 725.48004,-223.99378 v 37.31065 h 57.9261 v -37.31065 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect510"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient544);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-yellow"
|
||||
d="m 725.48004,-288.15082 v 62.38874 h 69.58982 v -62.38874 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect512"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient546);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-white"
|
||||
d="m 725.48004,-244.76798 v 49.2169 h 123.18557 v -49.2169 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect514"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient548);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-white"
|
||||
d="m 800.4409,-274.46305 v 85.49128 h 60.50579 v -85.49128 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect516"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient550);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-white"
|
||||
d="m 725.48004,-271.52176 v 84.97092 h 65.85919 v -84.97092 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /><path
|
||||
id="rect518"
|
||||
mask="none"
|
||||
style="fill:url(#radialGradient552);fill-opacity:1;stroke-width:0.445431;stroke-linecap:square;stroke-dasharray:none"
|
||||
inkscape:label="rect-white"
|
||||
d="m 729.04751,-288.15082 v 70.7628 h 83.27759 v -70.7628 z"
|
||||
transform="matrix(0.1171875,0,0,0.1171875,-53.150408,61.568041)" /></g></svg>
|
Before Width: | Height: | Size: 23 KiB |
@ -1,120 +0,0 @@
|
||||
rendered_icons_optionally_from_svg = {
|
||||
'icon_exe' : { 'png': 'icon_exe.png' , 'svg': 'icon_exe.svg', 'width': '256', 'height': '256' },
|
||||
'icon_exe_48': { 'png': 'icon_exe_48.png', 'svg': 'icon_exe.svg', 'width': '48', 'height': '48' },
|
||||
'icon_exe_32': { 'png': 'icon_exe_32.png', 'svg': 'icon_exe.svg', 'width': '32', 'height': '32' },
|
||||
'icon_exe_16': { 'png': 'icon_exe_16.png', 'svg': 'icon_exe.svg', 'width': '16', 'height': '16' },
|
||||
'icon_cps' : { 'png': 'icon_cps.png' , 'svg': 'icon_cps.svg', 'width': '256', 'height': '256' },
|
||||
'icon_cps_48': { 'png': 'icon_cps_48.png', 'svg': 'icon_cps.svg', 'width': '48', 'height': '48' },
|
||||
'icon_cps_32': { 'png': 'icon_cps_32.png', 'svg': 'icon_cps.svg', 'width': '32', 'height': '32' },
|
||||
'icon_cps_16': { 'png': 'icon_cps_16.png', 'svg': 'icon_cps.svg', 'width': '16', 'height': '16' },
|
||||
}
|
||||
rendered_icons = {}
|
||||
if render_icons_with_inkscape.allowed()
|
||||
foreach key, info : rendered_icons_optionally_from_svg
|
||||
rendered_icons += { key: custom_target(
|
||||
key + '-from-svg',
|
||||
output: info['png'],
|
||||
command: [
|
||||
inkscape,
|
||||
'--export-area-page',
|
||||
'--export-type', 'png',
|
||||
'--export-filename', '@OUTPUT@',
|
||||
'--export-width', info['width'],
|
||||
'--export-height', info['height'],
|
||||
files(info['svg']),
|
||||
],
|
||||
) }
|
||||
endforeach
|
||||
else
|
||||
foreach key, info : rendered_icons_optionally_from_svg
|
||||
rendered_icons += { key: files('generated_icons/' + info['png']) }
|
||||
endforeach
|
||||
endif
|
||||
|
||||
if host_platform == 'windows'
|
||||
windows_icons = get_option('windows_icons')
|
||||
windows_utf8cp = get_option('windows_utf8cp')
|
||||
rc_conf_depends = []
|
||||
rc_conf_depend_files = [
|
||||
'resource.h',
|
||||
]
|
||||
icon_exe_ico_path = ''
|
||||
icon_cps_ico_path = ''
|
||||
winutf8_xml_path = ''
|
||||
if windows_icons
|
||||
make_ico = executable('makeico', sources: 'MakeIco.cpp', native: true)
|
||||
generated_win_icos = {}
|
||||
win_icos = {
|
||||
'icon_exe': [ 'icon_exe', 'icon_exe_48', 'icon_exe_32', 'icon_exe_16' ],
|
||||
'icon_cps': [ 'icon_cps', 'icon_cps_48', 'icon_cps_32', 'icon_cps_16' ],
|
||||
}
|
||||
foreach key, icons : win_icos
|
||||
command = [
|
||||
make_ico,
|
||||
'@OUTPUT@',
|
||||
]
|
||||
foreach ikey : icons
|
||||
command += [ rendered_icons[ikey] ]
|
||||
endforeach
|
||||
generated_win_icos += { key: custom_target(
|
||||
key + '-ico',
|
||||
output: key + '.ico',
|
||||
command: command,
|
||||
) }
|
||||
endforeach
|
||||
rc_conf_depends += [
|
||||
generated_win_icos['icon_exe'],
|
||||
generated_win_icos['icon_cps'],
|
||||
]
|
||||
icon_exe_ico_path = join_paths(meson.current_build_dir(), 'icon_exe.ico')
|
||||
icon_cps_ico_path = join_paths(meson.current_build_dir(), 'icon_cps.ico')
|
||||
endif
|
||||
if windows_utf8cp
|
||||
rc_conf_depend_files += [
|
||||
'winutf8.xml',
|
||||
]
|
||||
winutf8_xml_path = join_paths(meson.current_source_dir(), 'winutf8.xml')
|
||||
endif
|
||||
rc_conf_data = configuration_data()
|
||||
rc_conf_data.merge_from(conf_data)
|
||||
rc_conf_data.set('HAVE_ICONS', windows_icons ? 1 : 0)
|
||||
rc_conf_data.set('HAVE_UTF8CP', windows_utf8cp ? 1 : 0)
|
||||
rc_conf_data.set('RESOUCE_H', join_paths(meson.current_source_dir(), 'resource.h'))
|
||||
rc_conf_data.set('WINUTF8_XML', winutf8_xml_path)
|
||||
rc_conf_data.set('ICON_EXE_ICO', icon_exe_ico_path)
|
||||
rc_conf_data.set('ICON_CPS_ICO', icon_cps_ico_path)
|
||||
powder_files += windows_mod.compile_resources(
|
||||
configure_file(
|
||||
input: 'powder-res.template.rc',
|
||||
output: 'powder-res.rc',
|
||||
configuration: rc_conf_data,
|
||||
),
|
||||
depends: rc_conf_depends,
|
||||
depend_files: rc_conf_depend_files,
|
||||
)
|
||||
elif host_platform == 'darwin'
|
||||
configure_file(
|
||||
input: 'Info.template.plist',
|
||||
output: 'Info.plist',
|
||||
configuration: conf_data,
|
||||
)
|
||||
elif host_platform == 'linux'
|
||||
data_files += to_array.process(rendered_icons['icon_exe'], extra_args: 'icon_exe_png')
|
||||
data_files += to_array.process(rendered_icons['icon_cps'], extra_args: 'icon_cps_png')
|
||||
data_files += to_array.process('save.xml', extra_args: 'save_xml')
|
||||
data_files += to_array.process(configure_file(
|
||||
input: 'powder.template.desktop',
|
||||
output: 'powder.desktop',
|
||||
configuration: conf_data,
|
||||
), extra_args: 'powder_desktop')
|
||||
|
||||
configure_file(
|
||||
input: 'appdata.template.xml',
|
||||
output: 'appdata.xml',
|
||||
configuration: conf_data,
|
||||
)
|
||||
endif
|
||||
|
||||
data_files += to_array.process('save_local.png', extra_args: 'save_local_png')
|
||||
data_files += to_array.process('save_online.png', extra_args: 'save_online_png')
|
||||
data_files += to_array.process('font.bz2', extra_args: 'compressed_font_data')
|