mirror of
https://github.com/libSDL2pp/libSDL2pp.git
synced 2025-09-19 04:04:41 -04:00
Merge branch 'master' into doxygen
Conflicts: README.md SDL2pp/SDL2pp.hh
This commit is contained in:
commit
d5ddaa63a9
@ -8,4 +8,4 @@ before_install:
|
|||||||
- sudo apt-get update -qq
|
- sudo apt-get update -qq
|
||||||
- sudo apt-get install -qq cmake libsdl2-dev libsdl2-image-dev g++-4.8
|
- sudo apt-get install -qq cmake libsdl2-dev libsdl2-image-dev g++-4.8
|
||||||
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
|
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
|
||||||
script: cmake . -DRUN_GUI_TESTS=OFF -DCMAKE_INSTALL_PREFIX=`pwd`/_prefix && make && make test && make install
|
script: cmake . -DRUN_GUI_TESTS=OFF -DCMAKE_INSTALL_PREFIX=`pwd`/_prefix -DSDL2PP_WITH_WERROR=YES && make && make test && make install
|
||||||
|
@ -7,7 +7,8 @@ SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
|||||||
|
|
||||||
# there are functions present on wiki, but not yet in stable SDL2 releases;
|
# there are functions present on wiki, but not yet in stable SDL2 releases;
|
||||||
# we hide these under following options
|
# we hide these under following options
|
||||||
OPTION(SDL2PP_NEW_2_0_4 "Enable new SDL2 functions present since SDL2 2.0.4" OFF)
|
OPTION(SDL2PP_WITH_2_0_4 "Enable new functions available only in SDL2 2.0.4+" OFF)
|
||||||
|
OPTION(SDL2PP_WITH_WERROR "Make warnings fatal" OFF)
|
||||||
|
|
||||||
IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
||||||
OPTION(SDL2PP_WITH_IMAGE "Enable SDL2_image support" ON)
|
OPTION(SDL2PP_WITH_IMAGE "Enable SDL2_image support" ON)
|
||||||
@ -39,6 +40,10 @@ ENDIF(MSVC)
|
|||||||
INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR})
|
INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR})
|
||||||
INCLUDE_DIRECTORIES(${SDL2_ALL_INCLUDE_DIRS})
|
INCLUDE_DIRECTORIES(${SDL2_ALL_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
IF(SDL2PP_WITH_WERROR)
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WERROR_FLAG}")
|
||||||
|
ENDIF(SDL2PP_WITH_WERROR)
|
||||||
|
|
||||||
# config.h
|
# config.h
|
||||||
CONFIGURE_FILE(
|
CONFIGURE_FILE(
|
||||||
SDL2pp/Config.hh.in
|
SDL2pp/Config.hh.in
|
||||||
@ -66,14 +71,15 @@ SET(LIBRARY_SOURCES
|
|||||||
|
|
||||||
SET(LIBRARY_HEADERS
|
SET(LIBRARY_HEADERS
|
||||||
SDL2pp/Audio.hh
|
SDL2pp/Audio.hh
|
||||||
|
SDL2pp/ContainerRWops.hh
|
||||||
SDL2pp/Exception.hh
|
SDL2pp/Exception.hh
|
||||||
SDL2pp/ExtraRWops.hh
|
|
||||||
SDL2pp/Point.hh
|
SDL2pp/Point.hh
|
||||||
SDL2pp/RWops.hh
|
SDL2pp/RWops.hh
|
||||||
SDL2pp/Rect.hh
|
SDL2pp/Rect.hh
|
||||||
SDL2pp/Renderer.hh
|
SDL2pp/Renderer.hh
|
||||||
SDL2pp/SDL.hh
|
SDL2pp/SDL.hh
|
||||||
SDL2pp/SDL2pp.hh
|
SDL2pp/SDL2pp.hh
|
||||||
|
SDL2pp/StreamRWops.hh
|
||||||
SDL2pp/Texture.hh
|
SDL2pp/Texture.hh
|
||||||
SDL2pp/Wav.hh
|
SDL2pp/Wav.hh
|
||||||
SDL2pp/Window.hh
|
SDL2pp/Window.hh
|
||||||
@ -82,8 +88,6 @@ SET(LIBRARY_HEADERS
|
|||||||
IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
||||||
MESSAGE(STATUS "libSDL2pp standalone build")
|
MESSAGE(STATUS "libSDL2pp standalone build")
|
||||||
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WERROR_FLAG}")
|
|
||||||
|
|
||||||
# library
|
# library
|
||||||
ADD_LIBRARY(SDL2pp SHARED ${LIBRARY_SOURCES} ${LIBRARY_HEADERS})
|
ADD_LIBRARY(SDL2pp SHARED ${LIBRARY_SOURCES} ${LIBRARY_HEADERS})
|
||||||
TARGET_LINK_LIBRARIES(SDL2pp ${SDL2_ALL_LIBRARIES})
|
TARGET_LINK_LIBRARIES(SDL2pp ${SDL2_ALL_LIBRARIES})
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
11
README.md
11
README.md
@ -1,5 +1,7 @@
|
|||||||
# libSDL2pp #
|
# libSDL2pp #
|
||||||
|
|
||||||
|
[](https://travis-ci.org/AMDmi3/libSDL2pp)
|
||||||
|
|
||||||
This library provides C++11 bindings/wrapper for SDL2.
|
This library provides C++11 bindings/wrapper for SDL2.
|
||||||
|
|
||||||
## Synopsis ##
|
## Synopsis ##
|
||||||
@ -53,6 +55,9 @@ try {
|
|||||||
Currently, the library provides wrapper classes for
|
Currently, the library provides wrapper classes for
|
||||||
|
|
||||||
* SDL iteslf
|
* SDL iteslf
|
||||||
|
* SDL_AudioDevice* functions
|
||||||
|
* SDL_*WAV functions
|
||||||
|
* SDL_AudioSpec
|
||||||
* SDL_Point
|
* SDL_Point
|
||||||
* SDL_RWops
|
* SDL_RWops
|
||||||
* SDL_Rect
|
* SDL_Rect
|
||||||
@ -120,8 +125,8 @@ adding new functionality) are welcome.
|
|||||||
|
|
||||||
Projects using libSDL2pp:
|
Projects using libSDL2pp:
|
||||||
|
|
||||||
* [openstrike](https://github.com/AMDmi3/openstrike)
|
* [OpenStrike](https://github.com/AMDmi3/openstrike) - Libre reimplementation of Jungle and Desert Strike games
|
||||||
* [opendaed](https://github.com/AMDmi3/opendaed)
|
* [OpenDaed](https://github.com/AMDmi3/opendaed) - Libre reimplementation of The Daedalus Encounter game
|
||||||
|
|
||||||
## Author ##
|
## Author ##
|
||||||
|
|
||||||
@ -133,4 +138,4 @@ Projects using libSDL2pp:
|
|||||||
|
|
||||||
## License ##
|
## License ##
|
||||||
|
|
||||||
libSDL2pp comes under zlib license, the same license as SDL2.
|
libSDL2pp comes under zlib license, the same license as SDL2. See COPYING.txt.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -32,19 +32,10 @@
|
|||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
|
|
||||||
class AudioSpec : public SDL_AudioSpec {
|
class AudioSpec : public SDL_AudioSpec {
|
||||||
public:
|
|
||||||
typedef std::function<void(Uint8* stream, int len)> AudioCallback;
|
|
||||||
|
|
||||||
private:
|
|
||||||
AudioCallback callback_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void SDLCallback(void *userdata, Uint8* stream, int len);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AudioSpec();
|
AudioSpec();
|
||||||
AudioSpec(int freq, SDL_AudioFormat format, Uint8 channels, Uint16 samples, AudioCallback&& callback = AudioCallback());
|
AudioSpec(int freq, SDL_AudioFormat format, Uint8 channels, Uint16 samples);
|
||||||
AudioSpec(const AudioSpec& other, AudioCallback&& callback = AudioCallback());
|
|
||||||
~AudioSpec();
|
~AudioSpec();
|
||||||
|
|
||||||
AudioSpec(AudioSpec&& other);
|
AudioSpec(AudioSpec&& other);
|
||||||
@ -52,8 +43,6 @@ public:
|
|||||||
AudioSpec(const AudioSpec& other) = delete;
|
AudioSpec(const AudioSpec& other) = delete;
|
||||||
AudioSpec& operator=(const AudioSpec& other) = delete;
|
AudioSpec& operator=(const AudioSpec& other) = delete;
|
||||||
|
|
||||||
void ChangeCallback(AudioCallback&& callback); // should be called with audio device using this spec locked!
|
|
||||||
|
|
||||||
void MergeChanges(const SDL_AudioSpec& obtained);
|
void MergeChanges(const SDL_AudioSpec& obtained);
|
||||||
const SDL_AudioSpec* Get() const;
|
const SDL_AudioSpec* Get() const;
|
||||||
|
|
||||||
@ -61,9 +50,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
class AudioDevice {
|
class AudioDevice {
|
||||||
private:
|
|
||||||
SDL_AudioDeviceID device_id_;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class LockHandle {
|
class LockHandle {
|
||||||
friend class AudioDevice;
|
friend class AudioDevice;
|
||||||
@ -74,6 +60,7 @@ public:
|
|||||||
LockHandle(AudioDevice* device);
|
LockHandle(AudioDevice* device);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
LockHandle();
|
||||||
~LockHandle();
|
~LockHandle();
|
||||||
|
|
||||||
LockHandle(LockHandle&& other) noexcept;
|
LockHandle(LockHandle&& other) noexcept;
|
||||||
@ -83,9 +70,18 @@ public:
|
|||||||
LockHandle& operator=(const LockHandle& other) = delete;
|
LockHandle& operator=(const LockHandle& other) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef std::function<void(Uint8* stream, int len)> AudioCallback;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SDL_AudioDeviceID device_id_;
|
||||||
|
AudioCallback callback_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void SDLCallback(void *userdata, Uint8* stream, int len);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AudioDevice(const std::string& device, bool iscapture, const AudioSpec& spec);
|
AudioDevice(const std::string& device, bool iscapture, const AudioSpec& spec, AudioCallback&& callback = AudioCallback());
|
||||||
AudioDevice(const std::string& device, bool iscapture, AudioSpec& spec, int allowed_changes);
|
AudioDevice(const std::string& device, bool iscapture, AudioSpec& spec, int allowed_changes, AudioCallback&& callback = AudioCallback());
|
||||||
virtual ~AudioDevice();
|
virtual ~AudioDevice();
|
||||||
|
|
||||||
AudioDevice(const AudioDevice& other) = delete;
|
AudioDevice(const AudioDevice& other) = delete;
|
||||||
@ -98,9 +94,11 @@ public:
|
|||||||
void Pause(bool pause_on);
|
void Pause(bool pause_on);
|
||||||
SDL_AudioStatus GetStatus() const;
|
SDL_AudioStatus GetStatus() const;
|
||||||
|
|
||||||
|
void ChangeCallback(AudioCallback&& callback);
|
||||||
|
|
||||||
LockHandle Lock();
|
LockHandle Lock();
|
||||||
|
|
||||||
#ifdef SDL2PP_NEW_2_0_4
|
#ifdef SDL2PP_WITH_2_0_4
|
||||||
void QueueAudio(const void* data, Uint32 len);
|
void QueueAudio(const void* data, Uint32 len);
|
||||||
void ClearQueuedAudio();
|
void ClearQueuedAudio();
|
||||||
Uint32 GetQueuedAudioSize() const;
|
Uint32 GetQueuedAudioSize() const;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -25,20 +25,39 @@
|
|||||||
|
|
||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
|
|
||||||
AudioDevice::AudioDevice(const std::string& device, bool iscapture, const AudioSpec& spec) {
|
void AudioDevice::SDLCallback(void *userdata, Uint8* stream, int len) {
|
||||||
SDL_AudioSpec obtained;
|
AudioDevice* audiodevice = static_cast<AudioDevice*>(userdata);
|
||||||
|
audiodevice->callback_(stream, len);
|
||||||
if ((device_id_ = SDL_OpenAudioDevice(device.empty() ? nullptr : device.c_str(), iscapture ? 1 : 0, &spec, &obtained, 0)) == 0)
|
|
||||||
throw Exception("SDL_OpenAudioDevice failed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDevice::AudioDevice(const std::string& device, bool iscapture, AudioSpec& spec, int allowed_changes) {
|
AudioDevice::AudioDevice(const std::string& device, bool iscapture, const AudioSpec& spec, AudioDevice::AudioCallback&& callback) {
|
||||||
|
SDL_AudioSpec spec_with_callback = *spec.Get();
|
||||||
|
if (callback) {
|
||||||
|
spec_with_callback.callback = SDLCallback;
|
||||||
|
spec_with_callback.userdata = static_cast<void*>(this);
|
||||||
|
}
|
||||||
SDL_AudioSpec obtained;
|
SDL_AudioSpec obtained;
|
||||||
|
|
||||||
if ((device_id_ = SDL_OpenAudioDevice(device.empty() ? nullptr : device.c_str(), iscapture ? 1 : 0, &spec, &obtained, allowed_changes)) == 0)
|
if ((device_id_ = SDL_OpenAudioDevice(device.empty() ? nullptr : device.c_str(), iscapture ? 1 : 0, &spec_with_callback, &obtained, 0)) == 0)
|
||||||
|
throw Exception("SDL_OpenAudioDevice failed");
|
||||||
|
|
||||||
|
callback_ = std::move(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioDevice::AudioDevice(const std::string& device, bool iscapture, AudioSpec& spec, int allowed_changes, AudioDevice::AudioCallback&& callback) {
|
||||||
|
SDL_AudioSpec spec_with_callback = *spec.Get();
|
||||||
|
if (callback) {
|
||||||
|
spec_with_callback.callback = SDLCallback;
|
||||||
|
spec_with_callback.userdata = static_cast<void*>(this);
|
||||||
|
}
|
||||||
|
SDL_AudioSpec obtained;
|
||||||
|
|
||||||
|
if ((device_id_ = SDL_OpenAudioDevice(device.empty() ? nullptr : device.c_str(), iscapture ? 1 : 0, &spec_with_callback, &obtained, allowed_changes)) == 0)
|
||||||
throw Exception("SDL_OpenAudioDevice failed");
|
throw Exception("SDL_OpenAudioDevice failed");
|
||||||
|
|
||||||
spec.MergeChanges(obtained);
|
spec.MergeChanges(obtained);
|
||||||
|
|
||||||
|
callback_ = std::move(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDevice::~AudioDevice() {
|
AudioDevice::~AudioDevice() {
|
||||||
@ -46,7 +65,7 @@ AudioDevice::~AudioDevice() {
|
|||||||
SDL_CloseAudioDevice(device_id_);
|
SDL_CloseAudioDevice(device_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDevice::AudioDevice(AudioDevice&& other) noexcept : device_id_(other.device_id_) {
|
AudioDevice::AudioDevice(AudioDevice&& other) noexcept : device_id_(other.device_id_), callback_(std::move(other.callback_)) {
|
||||||
other.device_id_ = 0;
|
other.device_id_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,6 +77,7 @@ AudioDevice& AudioDevice::operator=(AudioDevice&& other) noexcept {
|
|||||||
SDL_CloseAudioDevice(device_id_);
|
SDL_CloseAudioDevice(device_id_);
|
||||||
|
|
||||||
device_id_ = other.device_id_;
|
device_id_ = other.device_id_;
|
||||||
|
callback_ = std::move(other.callback_);
|
||||||
other.device_id_ = 0;
|
other.device_id_ = 0;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@ -75,11 +95,18 @@ SDL_AudioStatus AudioDevice::GetStatus() const {
|
|||||||
return SDL_GetAudioDeviceStatus(device_id_);
|
return SDL_GetAudioDeviceStatus(device_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioDevice::ChangeCallback(AudioDevice::AudioCallback&& callback) {
|
||||||
|
// make sure callback is not called while it's being replaced
|
||||||
|
LockHandle lock = Lock();
|
||||||
|
|
||||||
|
callback_ = std::move(callback);
|
||||||
|
}
|
||||||
|
|
||||||
AudioDevice::LockHandle AudioDevice::Lock() {
|
AudioDevice::LockHandle AudioDevice::Lock() {
|
||||||
return LockHandle(this);
|
return LockHandle(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SDL2PP_NEW_2_0_4
|
#ifdef SDL2PP_WITH_2_0_4
|
||||||
void AudioDevice::QueueAudio(const void* data, Uint32 len) {
|
void AudioDevice::QueueAudio(const void* data, Uint32 len) {
|
||||||
if (SDL_QueueAudio(device_id_, data, len) == 0)
|
if (SDL_QueueAudio(device_id_, data, len) == 0)
|
||||||
throw Exception("SDL_QueueAudio failed");
|
throw Exception("SDL_QueueAudio failed");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -23,6 +23,9 @@
|
|||||||
|
|
||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
|
|
||||||
|
AudioDevice::LockHandle::LockHandle() : device_(nullptr) {
|
||||||
|
}
|
||||||
|
|
||||||
AudioDevice::LockHandle::LockHandle(AudioDevice* device) : device_(device) {
|
AudioDevice::LockHandle::LockHandle(AudioDevice* device) : device_(device) {
|
||||||
SDL_LockAudioDevice(device_->device_id_);
|
SDL_LockAudioDevice(device_->device_id_);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -25,33 +25,16 @@
|
|||||||
|
|
||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
|
|
||||||
void AudioSpec::SDLCallback(void *userdata, Uint8* stream, int len) {
|
|
||||||
AudioSpec* audiospec = static_cast<AudioSpec*>(userdata);
|
|
||||||
audiospec->callback_(stream, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioSpec::AudioSpec() {
|
AudioSpec::AudioSpec() {
|
||||||
std::fill((char*)this, (char*)this + sizeof(SDL_AudioSpec), 0);
|
std::fill((char*)this, (char*)this + sizeof(SDL_AudioSpec), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioSpec::AudioSpec(int freq, SDL_AudioFormat format, Uint8 channels, Uint16 samples, AudioSpec::AudioCallback&& callback)
|
AudioSpec::AudioSpec(int freq, SDL_AudioFormat format, Uint8 channels, Uint16 samples) {
|
||||||
: callback_(std::move(callback)) {
|
|
||||||
std::fill((char*)this, (char*)this + sizeof(SDL_AudioSpec), 0);
|
std::fill((char*)this, (char*)this + sizeof(SDL_AudioSpec), 0);
|
||||||
SDL_AudioSpec::freq = freq;
|
SDL_AudioSpec::freq = freq;
|
||||||
SDL_AudioSpec::format = format;
|
SDL_AudioSpec::format = format;
|
||||||
SDL_AudioSpec::channels = channels;
|
SDL_AudioSpec::channels = channels;
|
||||||
SDL_AudioSpec::samples = samples;
|
SDL_AudioSpec::samples = samples;
|
||||||
if (callback) {
|
|
||||||
SDL_AudioSpec::callback = SDLCallback;
|
|
||||||
SDL_AudioSpec::userdata = static_cast<void*>(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioSpec::AudioSpec(const AudioSpec& other, AudioSpec::AudioCallback&& callback) : SDL_AudioSpec(*other.Get()), callback_(std::move(callback)) {
|
|
||||||
if (callback) {
|
|
||||||
SDL_AudioSpec::callback = SDLCallback;
|
|
||||||
SDL_AudioSpec::userdata = static_cast<void*>(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioSpec::~AudioSpec() {
|
AudioSpec::~AudioSpec() {
|
||||||
@ -60,10 +43,6 @@ AudioSpec::~AudioSpec() {
|
|||||||
AudioSpec::AudioSpec(AudioSpec&&) = default;
|
AudioSpec::AudioSpec(AudioSpec&&) = default;
|
||||||
AudioSpec& AudioSpec::operator=(AudioSpec&&) = default;
|
AudioSpec& AudioSpec::operator=(AudioSpec&&) = default;
|
||||||
|
|
||||||
void AudioSpec::ChangeCallback(AudioCallback&& callback) {
|
|
||||||
callback_ = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioSpec::MergeChanges(const SDL_AudioSpec& obtained) {
|
void AudioSpec::MergeChanges(const SDL_AudioSpec& obtained) {
|
||||||
freq = obtained.freq;
|
freq = obtained.freq;
|
||||||
format = obtained.format;
|
format = obtained.format;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -23,6 +23,6 @@
|
|||||||
#define SDL2PP_CONFIG_HH
|
#define SDL2PP_CONFIG_HH
|
||||||
|
|
||||||
#cmakedefine SDL2PP_WITH_IMAGE
|
#cmakedefine SDL2PP_WITH_IMAGE
|
||||||
#cmakedefine SDL2PP_NEW_2_0_4
|
#cmakedefine SDL2PP_WITH_2_0_4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -19,20 +19,41 @@
|
|||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SDL2PP_EXTRARWOPS_HH
|
#ifndef SDL2PP_CONTAINERRWOPS_HH
|
||||||
#define SDL2PP_EXTRARWOPS_HH
|
#define SDL2PP_CONTAINERRWOPS_HH
|
||||||
|
|
||||||
#include <SDL2pp/RWops.hh>
|
#include <SDL2pp/RWops.hh>
|
||||||
#include <SDL2pp/Exception.hh>
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
|
|
||||||
template<typename C>
|
template <class C>
|
||||||
class ContainerRWops : public CustomRWops {
|
class ContainerRWops : public CustomRWops {
|
||||||
protected:
|
protected:
|
||||||
C& container_;
|
C& container_;
|
||||||
size_t position_;
|
size_t position_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class CC>
|
||||||
|
typename std::enable_if<!std::is_const<CC>::value, size_t>::type WriteHelper(const void* ptr, size_t size, size_t maxnum) {
|
||||||
|
if (position_ + size * maxnum > container_.size())
|
||||||
|
container_.resize(position_ + size * maxnum);
|
||||||
|
|
||||||
|
std::copy(reinterpret_cast<const unsigned char*>(ptr), reinterpret_cast<const unsigned char*>(ptr) + size * maxnum, container_.begin() + position_);
|
||||||
|
|
||||||
|
position_ += size * maxnum;
|
||||||
|
|
||||||
|
return maxnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class CC>
|
||||||
|
typename std::enable_if<std::is_const<CC>::value, size_t>::type WriteHelper(const void*, size_t, size_t) {
|
||||||
|
SDL_SetError("Can't write to read-only container");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ContainerRWops(C& container) : container_(container), position_(0) {
|
ContainerRWops(C& container) : container_(container), position_(0) {
|
||||||
}
|
}
|
||||||
@ -54,7 +75,7 @@ public:
|
|||||||
position_ = container_.size() + offset;
|
position_ = container_.size() + offset;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw Exception("Unexpected whence value for WritableMemRWops::Seek");
|
throw std::logic_error("Unexpected whence value for ContainerRWops::Seek");
|
||||||
}
|
}
|
||||||
return position_;
|
return position_;
|
||||||
}
|
}
|
||||||
@ -73,69 +94,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual size_t Write(const void* ptr, size_t size, size_t maxnum) override {
|
virtual size_t Write(const void* ptr, size_t size, size_t maxnum) override {
|
||||||
if (position_ + size * maxnum > container_.size())
|
return WriteHelper<C>(ptr, size, maxnum);
|
||||||
container_.resize(position_ + size * maxnum);
|
|
||||||
|
|
||||||
std::copy(reinterpret_cast<const unsigned char*>(ptr), reinterpret_cast<const unsigned char*>(ptr) + size * maxnum, container_.begin() + position_);
|
|
||||||
|
|
||||||
position_ += size * maxnum;
|
|
||||||
|
|
||||||
return maxnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int Close() override {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename C>
|
|
||||||
class ConstContainerRWops : public CustomRWops {
|
|
||||||
protected:
|
|
||||||
const C& container_;
|
|
||||||
size_t position_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ConstContainerRWops(const C& container) : container_(container), position_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
ConstContainerRWops(const ConstContainerRWops<C>&) = default;
|
|
||||||
ConstContainerRWops& operator=(const ConstContainerRWops<C>&) = delete;
|
|
||||||
ConstContainerRWops(ConstContainerRWops<C>&&) noexcept = default;
|
|
||||||
ConstContainerRWops& operator=(ConstContainerRWops<C>&&) = delete;
|
|
||||||
|
|
||||||
virtual Sint64 Seek(Sint64 offset, int whence) override {
|
|
||||||
switch (whence) {
|
|
||||||
case RW_SEEK_SET:
|
|
||||||
position_ = offset;
|
|
||||||
break;
|
|
||||||
case RW_SEEK_CUR:
|
|
||||||
position_ = position_ + offset;
|
|
||||||
break;
|
|
||||||
case RW_SEEK_END:
|
|
||||||
position_ = container_.size() + offset;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw Exception("Unexpected whence value for WritableMemRWops::Seek");
|
|
||||||
}
|
|
||||||
return position_;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t Read(void* ptr, size_t size, size_t maxnum) override {
|
|
||||||
if (position_ + size > container_.size())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
int toread = std::min((container_.size() - position_), maxnum * size);
|
|
||||||
|
|
||||||
std::copy(container_.begin() + position_, container_.begin() + position_ + toread, reinterpret_cast<unsigned char*>(ptr));
|
|
||||||
|
|
||||||
position_ += toread;
|
|
||||||
|
|
||||||
return toread / size;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t Write(const void*, size_t, size_t) override {
|
|
||||||
SDL_SetError("Can't write to read-only container");
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int Close() override {
|
virtual int Close() override {
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -192,8 +192,57 @@ Sint64 RWops::Size() {
|
|||||||
Sint64 old_pos = Tell();
|
Sint64 old_pos = Tell();
|
||||||
Sint64 size = Seek(0, SEEK_END);
|
Sint64 size = Seek(0, SEEK_END);
|
||||||
Sint64 back_pos = Seek(old_pos, SEEK_SET);
|
Sint64 back_pos = Seek(old_pos, SEEK_SET);
|
||||||
|
(void)back_pos; // silence unused variable warning on release build
|
||||||
assert(back_pos == old_pos);
|
assert(back_pos == old_pos);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint16 RWops::ReadBE16() {
|
||||||
|
return SDL_ReadBE16(rwops_);
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 RWops::ReadBE32() {
|
||||||
|
return SDL_ReadBE32(rwops_);
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64 RWops::ReadBE64() {
|
||||||
|
return SDL_ReadBE64(rwops_);
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint16 RWops::ReadLE16() {
|
||||||
|
return SDL_ReadLE16(rwops_);
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 RWops::ReadLE32() {
|
||||||
|
return SDL_ReadLE32(rwops_);
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint64 RWops::ReadLE64() {
|
||||||
|
return SDL_ReadLE64(rwops_);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RWops::WriteBE16(Uint16 value) {
|
||||||
|
return SDL_WriteBE16(rwops_, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RWops::WriteBE32(Uint32 value) {
|
||||||
|
return SDL_WriteBE32(rwops_, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RWops::WriteBE64(Uint64 value) {
|
||||||
|
return SDL_WriteBE64(rwops_, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RWops::WriteLE16(Uint16 value) {
|
||||||
|
return SDL_WriteLE16(rwops_, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RWops::WriteLE32(Uint32 value) {
|
||||||
|
return SDL_WriteLE32(rwops_, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RWops::WriteLE64(Uint64 value) {
|
||||||
|
return SDL_WriteLE64(rwops_, value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -113,6 +113,19 @@ public:
|
|||||||
size_t Write(const void* ptr, size_t size, size_t num);
|
size_t Write(const void* ptr, size_t size, size_t num);
|
||||||
Sint64 Tell();
|
Sint64 Tell();
|
||||||
Sint64 Size();
|
Sint64 Size();
|
||||||
|
|
||||||
|
Uint16 ReadBE16();
|
||||||
|
Uint32 ReadBE32();
|
||||||
|
Uint64 ReadBE64();
|
||||||
|
Uint16 ReadLE16();
|
||||||
|
Uint32 ReadLE32();
|
||||||
|
Uint64 ReadLE64();
|
||||||
|
size_t WriteBE16(Uint16 value);
|
||||||
|
size_t WriteBE32(Uint32 value);
|
||||||
|
size_t WriteBE64(Uint64 value);
|
||||||
|
size_t WriteLE16(Uint16 value);
|
||||||
|
size_t WriteLE32(Uint32 value);
|
||||||
|
size_t WriteLE64(Uint64 value);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
@ -90,6 +90,7 @@
|
|||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#include <SDL2pp/RWops.hh>
|
#include <SDL2pp/RWops.hh>
|
||||||
#include <SDL2pp/ExtraRWops.hh>
|
#include <SDL2pp/ContainerRWops.hh>
|
||||||
|
#include <SDL2pp/StreamRWops.hh>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
159
SDL2pp/StreamRWops.hh
Normal file
159
SDL2pp/StreamRWops.hh
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL2PP_STREAMRWOPS_HH
|
||||||
|
#define SDL2PP_STREAMRWOPS_HH
|
||||||
|
|
||||||
|
#include <SDL2pp/RWops.hh>
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <iostream>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace SDL2pp {
|
||||||
|
|
||||||
|
template <class S>
|
||||||
|
class StreamRWops : public CustomRWops {
|
||||||
|
// since STL streams have different pointers for reading and writing,
|
||||||
|
// supporting both at the same time is impossible
|
||||||
|
static_assert(!(std::is_base_of<std::istream, S>::value && std::is_base_of<std::ostream, S>::value), "StreamRWops does not support reading and writing at the same time");
|
||||||
|
|
||||||
|
protected:
|
||||||
|
S& stream_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<std::is_base_of<std::istream, SS>::value && !std::is_base_of<std::ostream, SS>::value, void>::type SeekHelper(off_t off, std::ios_base::seekdir dir) {
|
||||||
|
stream_.seekg(off, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<!std::is_base_of<std::istream, SS>::value && std::is_base_of<std::ostream, SS>::value, void>::type SeekHelper(off_t off, std::ios_base::seekdir dir) {
|
||||||
|
stream_.seekp(off, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<std::is_base_of<std::istream, SS>::value && !std::is_base_of<std::ostream, SS>::value, off_t>::type TellHelper() {
|
||||||
|
return stream_.tellg();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<!std::is_base_of<std::istream, SS>::value && std::is_base_of<std::ostream, SS>::value, off_t>::type TellHelper() {
|
||||||
|
return stream_.tellp();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<std::is_base_of<std::istream, SS>::value, size_t>::type ReadHelper(void* ptr, size_t size, size_t maxnum) {
|
||||||
|
stream_.read(static_cast<char*>(ptr), size * maxnum);
|
||||||
|
size_t nread = stream_.gcount();
|
||||||
|
|
||||||
|
// eof is OK
|
||||||
|
if (stream_.rdstate() == (std::ios_base::eofbit | std::ios_base::failbit))
|
||||||
|
stream_.clear();
|
||||||
|
|
||||||
|
if (nread != size * maxnum) {
|
||||||
|
// short read
|
||||||
|
char* pos = static_cast<char*>(ptr);
|
||||||
|
pos += nread;
|
||||||
|
|
||||||
|
int count = nread % size;
|
||||||
|
|
||||||
|
// put partially read object back into the stream
|
||||||
|
while (--count >= 0)
|
||||||
|
stream_.putback(*--pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nread / size;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<!std::is_base_of<std::istream, SS>::value, size_t>::type ReadHelper(void*, size_t, size_t) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<std::is_base_of<std::ostream, SS>::value, size_t>::type WriteHelper(const void* ptr, size_t size, size_t maxnum) {
|
||||||
|
stream_.write(static_cast<const char*>(ptr), size * maxnum);
|
||||||
|
// XXX: there seem to be no reliable way to tell how much
|
||||||
|
// was actually written
|
||||||
|
if (stream_.rdstate() & std::ios_base::badbit)
|
||||||
|
return 0;
|
||||||
|
return maxnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<!std::is_base_of<std::ostream, SS>::value, size_t>::type WriteHelper(const void*, size_t, size_t) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<std::is_base_of<std::ostream, SS>::value, int>::type CloseHelper() {
|
||||||
|
stream_.flush();
|
||||||
|
return stream_.rdstate() & std::ios_base::badbit;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class SS>
|
||||||
|
typename std::enable_if<!std::is_base_of<std::ostream, SS>::value, int>::type CloseHelper() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
StreamRWops(S& stream) : stream_(stream) {
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamRWops(const StreamRWops<S>&) = default;
|
||||||
|
StreamRWops& operator=(const StreamRWops<S>&) = delete;
|
||||||
|
StreamRWops(StreamRWops<S>&&) noexcept = default;
|
||||||
|
StreamRWops& operator=(StreamRWops<S>&&) = delete;
|
||||||
|
|
||||||
|
virtual Sint64 Seek(Sint64 offset, int whence) override {
|
||||||
|
switch (whence) {
|
||||||
|
case RW_SEEK_SET:
|
||||||
|
SeekHelper<S>(offset, std::ios_base::beg);
|
||||||
|
break;
|
||||||
|
case RW_SEEK_CUR:
|
||||||
|
SeekHelper<S>(offset, std::ios_base::cur);
|
||||||
|
break;
|
||||||
|
case RW_SEEK_END:
|
||||||
|
SeekHelper<S>(offset, std::ios_base::end);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw std::logic_error("Unexpected whence value for StreamRWops::Seek");
|
||||||
|
}
|
||||||
|
return TellHelper<S>();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t Read(void* ptr, size_t size, size_t maxnum) override {
|
||||||
|
return ReadHelper<S>(ptr, size, maxnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t Write(const void* ptr, size_t size, size_t maxnum) override {
|
||||||
|
return WriteHelper<S>(ptr, size, maxnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int Close() override {
|
||||||
|
return CloseHelper<S>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
@ -60,6 +60,7 @@ public:
|
|||||||
LockHandle(Texture* texture, const Rect& rect);
|
LockHandle(Texture* texture, const Rect& rect);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
LockHandle();
|
||||||
~LockHandle();
|
~LockHandle();
|
||||||
|
|
||||||
LockHandle(LockHandle&& other) noexcept;
|
LockHandle(LockHandle&& other) noexcept;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
@ -28,6 +28,9 @@
|
|||||||
|
|
||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
|
|
||||||
|
Texture::LockHandle::LockHandle() : texture_(nullptr) {
|
||||||
|
}
|
||||||
|
|
||||||
Texture::LockHandle::LockHandle(Texture* texture, const Rect& rect) : texture_(texture) {
|
Texture::LockHandle::LockHandle(Texture* texture, const Rect& rect) : texture_(texture) {
|
||||||
if (SDL_LockTexture(texture_->Get(), rect.Get(), &pixels_, &pitch_) != 0)
|
if (SDL_LockTexture(texture_->Get(), rect.Get(), &pixels_, &pitch_) != 0)
|
||||||
throw Exception("SDL_LockTexture failed");
|
throw Exception("SDL_LockTexture failed");
|
||||||
@ -35,6 +38,8 @@ Texture::LockHandle::LockHandle(Texture* texture, const Rect& rect) : texture_(t
|
|||||||
|
|
||||||
Texture::LockHandle::LockHandle(Texture::LockHandle&& other) noexcept : texture_(other.texture_), pixels_(other.pixels_), pitch_(other.pitch_) {
|
Texture::LockHandle::LockHandle(Texture::LockHandle&& other) noexcept : texture_(other.texture_), pixels_(other.pixels_), pitch_(other.pitch_) {
|
||||||
other.texture_ = nullptr;
|
other.texture_ = nullptr;
|
||||||
|
other.pixels_ = nullptr;
|
||||||
|
other.pitch_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture::LockHandle& Texture::LockHandle::operator=(Texture::LockHandle&& other) noexcept {
|
Texture::LockHandle& Texture::LockHandle::operator=(Texture::LockHandle&& other) noexcept {
|
||||||
@ -49,6 +54,8 @@ Texture::LockHandle& Texture::LockHandle::operator=(Texture::LockHandle&& other)
|
|||||||
pitch_ = other.pitch_;
|
pitch_ = other.pitch_;
|
||||||
|
|
||||||
other.texture_ = nullptr;
|
other.texture_ = nullptr;
|
||||||
|
other.pixels_ = nullptr;
|
||||||
|
other.pitch_ = 0;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -35,16 +35,16 @@ int Run() {
|
|||||||
int64_t nsample = 0;
|
int64_t nsample = 0;
|
||||||
|
|
||||||
// Setup audio device, and provide callback which plays sine wave with specified frequency
|
// Setup audio device, and provide callback which plays sine wave with specified frequency
|
||||||
AudioSpec spec(samplerate, AUDIO_S16SYS, 1, 4096, [&nsample, frequency, samplerate](Uint8* stream, int len) {
|
AudioSpec spec(samplerate, AUDIO_S16SYS, 1, 4096);
|
||||||
|
|
||||||
|
// Open audio device
|
||||||
|
AudioDevice dev("", 0, spec, [&nsample, frequency, samplerate](Uint8* stream, int len) {
|
||||||
// fill provided buffer with sine wave
|
// fill provided buffer with sine wave
|
||||||
for (Uint8* ptr = stream; ptr < stream + len; ptr += 2)
|
for (Uint8* ptr = stream; ptr < stream + len; ptr += 2)
|
||||||
*(Uint16*)ptr = (Uint16)(32766.0f * sin(nsample++ / (float)samplerate * frequency));
|
*(Uint16*)ptr = (Uint16)(32766.0f * sin(nsample++ / (float)samplerate * frequency));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// Open audio device
|
|
||||||
AudioDevice dev("", 0, spec);
|
|
||||||
|
|
||||||
// Sound plays after this call
|
// Sound plays after this call
|
||||||
dev.Pause(false);
|
dev.Pause(false);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
@ -32,10 +32,10 @@ int Run() {
|
|||||||
SDL sdl(SDL_INIT_AUDIO);
|
SDL sdl(SDL_INIT_AUDIO);
|
||||||
|
|
||||||
Wav wav(TESTDATA_DIR "/test.wav");
|
Wav wav(TESTDATA_DIR "/test.wav");
|
||||||
|
|
||||||
// Setup audio device, and provide callback which plays looped wave sound
|
|
||||||
Uint8* wav_pos = wav.GetBuffer();
|
Uint8* wav_pos = wav.GetBuffer();
|
||||||
AudioSpec spec(wav.GetSpec(), [&wav, &wav_pos](Uint8* stream, int len) {
|
|
||||||
|
// Open audio device
|
||||||
|
AudioDevice dev("", 0, wav.GetSpec(), [&wav, &wav_pos](Uint8* stream, int len) {
|
||||||
// Fill provided buffer with wave contents
|
// Fill provided buffer with wave contents
|
||||||
Uint8* stream_pos = stream;
|
Uint8* stream_pos = stream;
|
||||||
Uint8* stream_end = stream + len;
|
Uint8* stream_end = stream + len;
|
||||||
@ -54,13 +54,6 @@ int Run() {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// Open audio device
|
|
||||||
AudioDevice dev("", 0, spec);
|
|
||||||
|
|
||||||
// Ensure SDL has set up format conversion for us
|
|
||||||
if (!spec.IsSameFormat(wav.GetSpec()))
|
|
||||||
throw std::runtime_error("WAV format is not the same as output format");
|
|
||||||
|
|
||||||
// Sound plays after this call
|
// Sound plays after this call
|
||||||
dev.Pause(false);
|
dev.Pause(false);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libSDL2pp - C++ wrapper for libSDL2
|
libSDL2pp - C++11 bindings/wrapper for SDL2
|
||||||
Copyright (C) 2013 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
Copyright (C) 2013-2014 Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -1,21 +1,3 @@
|
|||||||
# header tests: these just include specific headers to check if
|
|
||||||
# they are compilable (e.g., includes and forward declarations are
|
|
||||||
# complete and do not require extra includes)
|
|
||||||
SET(HEADER_TESTS
|
|
||||||
header_audio
|
|
||||||
header_exception
|
|
||||||
header_point
|
|
||||||
header_rect
|
|
||||||
header_renderer
|
|
||||||
header_rwops
|
|
||||||
header_extrarwops
|
|
||||||
header_sdl
|
|
||||||
header_sdl2pp
|
|
||||||
header_texture
|
|
||||||
header_wav
|
|
||||||
header_window
|
|
||||||
)
|
|
||||||
|
|
||||||
# simple command-line tests
|
# simple command-line tests
|
||||||
SET(CLI_TESTS
|
SET(CLI_TESTS
|
||||||
test_pointrect
|
test_pointrect
|
||||||
@ -30,9 +12,14 @@ SET(GUI_TESTS
|
|||||||
|
|
||||||
ADD_DEFINITIONS(-DTESTDATA_DIR="${PROJECT_SOURCE_DIR}/testdata")
|
ADD_DEFINITIONS(-DTESTDATA_DIR="${PROJECT_SOURCE_DIR}/testdata")
|
||||||
|
|
||||||
FOREACH(TEST ${HEADER_TESTS})
|
# header tests: these just include specific headers to check if
|
||||||
ADD_EXECUTABLE(${TEST} ${TEST}.cc)
|
# they are compilable (e.g., includes and forward declarations are
|
||||||
ENDFOREACH(TEST ${TESTS})
|
# complete and do not require extra includes)
|
||||||
|
FOREACH(HEADER ${LIBRARY_HEADERS})
|
||||||
|
STRING(REGEX REPLACE [^a-zA-Z0-9] _ HEADER_NORMALIZED ${HEADER})
|
||||||
|
CONFIGURE_FILE(header_test.cc.in ${HEADER_NORMALIZED}_test.cc)
|
||||||
|
ADD_EXECUTABLE(${HEADER_NORMALIZED}_test ${HEADER_NORMALIZED}_test.cc)
|
||||||
|
ENDFOREACH(HEADER ${TESTS})
|
||||||
|
|
||||||
FOREACH(TEST ${CLI_TESTS})
|
FOREACH(TEST ${CLI_TESTS})
|
||||||
ADD_EXECUTABLE(${TEST} ${TEST}.cc)
|
ADD_EXECUTABLE(${TEST} ${TEST}.cc)
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Audio.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
5
tests/header_containerrwops.cc
Normal file
5
tests/header_containerrwops.cc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#include <SDL2pp/ContainerRWops.hh>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
return 0;
|
||||||
|
}
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Exception.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/ExtraRWops.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Point.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Rect.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Renderer.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/RWops.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/SDL2pp.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
5
tests/header_streamrwops.cc
Normal file
5
tests/header_streamrwops.cc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#include <SDL2pp/StreamRWops.hh>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
return 0;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
#include <SDL2pp/SDL.hh>
|
#include <@HEADER@>
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
return 0;
|
return 0;
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Texture.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Wav.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <SDL2pp/Window.hh>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,7 +1,8 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <SDL2pp/Exception.hh>
|
#include <SDL2pp/Exception.hh>
|
||||||
#include <SDL2pp/ExtraRWops.hh>
|
#include <SDL2pp/ContainerRWops.hh>
|
||||||
|
#include <SDL2pp/StreamRWops.hh>
|
||||||
#include <SDL2pp/RWops.hh>
|
#include <SDL2pp/RWops.hh>
|
||||||
|
|
||||||
#include "testing.h"
|
#include "testing.h"
|
||||||
@ -118,7 +119,7 @@ BEGIN_TEST()
|
|||||||
{
|
{
|
||||||
const std::vector<char> buffer = { 'a', 'b', 'c', 'd' };
|
const std::vector<char> buffer = { 'a', 'b', 'c', 'd' };
|
||||||
|
|
||||||
RWops rw((ConstContainerRWops<std::vector<char>>(buffer)));
|
RWops rw((ContainerRWops<const std::vector<char>>(buffer)));
|
||||||
|
|
||||||
{
|
{
|
||||||
// Read via C++
|
// Read via C++
|
||||||
@ -133,12 +134,90 @@ BEGIN_TEST()
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// Write
|
// Write to const container fails
|
||||||
char buf[4] = {0};
|
char buf[4] = {0};
|
||||||
|
|
||||||
EXPECT_TRUE(rw.Write(buf, 1, 4) == 0);
|
EXPECT_TRUE(rw.Write(buf, 1, 4) == 0);
|
||||||
EXPECT_TRUE(rw.Write(buf, 4, 1) == 0);
|
EXPECT_TRUE(rw.Write(buf, 4, 1) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Write to non-const container
|
||||||
|
std::vector<char> vec;
|
||||||
|
|
||||||
|
RWops rw((ContainerRWops<std::vector<char>>(vec)));
|
||||||
|
|
||||||
|
char buf[4] = {'a', 'b', 'c', 'd'};
|
||||||
|
|
||||||
|
EXPECT_TRUE(rw.Write(buf, 1, 4) == 4);
|
||||||
|
EXPECT_TRUE(rw.Write(buf, 4, 1) == 1);
|
||||||
|
|
||||||
|
EXPECT_TRUE(rw.Seek(2, SEEK_SET) == 2);
|
||||||
|
EXPECT_TRUE(rw.Write(buf, 2, 2) == 2);
|
||||||
|
|
||||||
|
EXPECT_TRUE(vec.size() == 8);
|
||||||
|
EXPECT_TRUE(std::string(vec.data(), 8) == "ababcdcd");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test for StreamRWops
|
||||||
|
{
|
||||||
|
{
|
||||||
|
// write test
|
||||||
|
|
||||||
|
std::stringstream test;
|
||||||
|
RWops rw((StreamRWops<std::ostream>(test)));
|
||||||
|
|
||||||
|
char buf[4] = { 'a', 'b', 'c', 'd' };
|
||||||
|
EXPECT_TRUE(rw.Write(buf, 1, 4) == 4);
|
||||||
|
|
||||||
|
EXPECT_TRUE(rw.Seek(0, RW_SEEK_CUR) == 4);
|
||||||
|
|
||||||
|
EXPECT_TRUE(rw.Seek(2, RW_SEEK_SET) == 2);
|
||||||
|
|
||||||
|
EXPECT_TRUE(rw.Write(buf, 1, 4) == 4);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(test.str(), "ababcd");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// read test
|
||||||
|
|
||||||
|
std::stringstream test("abcdef");
|
||||||
|
RWops rw((StreamRWops<std::istream>(test)));
|
||||||
|
|
||||||
|
char buf[4];
|
||||||
|
EXPECT_EQUAL(rw.Read(buf, 1, 4), 4UL);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(std::string(buf, 4), "abcd");
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.Seek(0, RW_SEEK_CUR), 4);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.Seek(2, RW_SEEK_SET), 2);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.Read(buf, 1, 4), 4UL);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(std::string(buf, 4), "cdef");
|
||||||
|
|
||||||
|
// short read
|
||||||
|
EXPECT_EQUAL(rw.Seek(4, RW_SEEK_SET), 4);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.Read(buf, 1, 4), 2UL);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(std::string(buf, 2), "ef");
|
||||||
|
|
||||||
|
// short object read
|
||||||
|
EXPECT_EQUAL(rw.Seek(4, RW_SEEK_SET), 4);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.Read(buf, 4, 1), 0UL);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.Seek(0, RW_SEEK_CUR), 4);
|
||||||
|
|
||||||
|
// read end
|
||||||
|
EXPECT_EQUAL(rw.Read(buf, 1, 2), 2UL);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(std::string(buf, 2), "ef");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SDL file read test
|
// SDL file read test
|
||||||
@ -154,6 +233,36 @@ BEGIN_TEST()
|
|||||||
|
|
||||||
rw.Close();
|
rw.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fixed width reads/writes
|
||||||
|
{
|
||||||
|
std::vector<char> data, outdata;
|
||||||
|
for (int i = 0; i < 28; i++)
|
||||||
|
data.push_back(i);
|
||||||
|
|
||||||
|
RWops rw((ContainerRWops<std::vector<char>>(data)));
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw.ReadBE16(), 0x0001U);
|
||||||
|
EXPECT_EQUAL(rw.ReadLE16(), 0x0302U);
|
||||||
|
EXPECT_EQUAL(rw.ReadBE32(), 0x04050607U);
|
||||||
|
EXPECT_EQUAL(rw.ReadLE32(), 0x0B0A0908U);
|
||||||
|
EXPECT_EQUAL(rw.ReadBE64(), 0x0C0D0E0F10111213ULL);
|
||||||
|
EXPECT_EQUAL(rw.ReadLE64(), 0x1B1A191817161514ULL);
|
||||||
|
|
||||||
|
RWops rw1((ContainerRWops<std::vector<char>>(outdata)));
|
||||||
|
|
||||||
|
EXPECT_EQUAL(rw1.WriteBE16(0x0001U), 1U);
|
||||||
|
EXPECT_EQUAL(rw1.WriteLE16(0x0302U), 1U);
|
||||||
|
EXPECT_EQUAL(rw1.WriteBE32(0x04050607U), 1U);
|
||||||
|
EXPECT_EQUAL(rw1.WriteLE32(0x0B0A0908U), 1U);
|
||||||
|
EXPECT_EQUAL(rw1.WriteBE64(0x0C0D0E0F10111213ULL), 1U);
|
||||||
|
EXPECT_EQUAL(rw1.WriteLE64(0x1B1A191817161514ULL), 1U);
|
||||||
|
|
||||||
|
EXPECT_EQUAL(data.size(), outdata.size());
|
||||||
|
|
||||||
|
EXPECT_TRUE(data == outdata);
|
||||||
|
}
|
||||||
|
|
||||||
HANDLE_EXCEPTION(Exception& e)
|
HANDLE_EXCEPTION(Exception& e)
|
||||||
std::cerr << "unexpected SDL exception was thrown during the test: " << e.what() << ": " << e.GetSDLError() << std::endl;
|
std::cerr << "unexpected SDL exception was thrown during the test: " << e.what() << ": " << e.GetSDLError() << std::endl;
|
||||||
END_TEST()
|
END_TEST()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user