Merge branch 'master' into doxygen

Conflicts:
	SDL2pp/AudioDevice.hh
This commit is contained in:
Dmitry Marakasov 2014-12-25 14:37:04 +03:00
commit e02beb8692
20 changed files with 185 additions and 27 deletions

View File

@ -8,4 +8,4 @@ before_install:
- sudo apt-get update -qq
- 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
script: cmake . -DRUN_GUI_TESTS=OFF -DCMAKE_INSTALL_PREFIX=`pwd`/_prefix -DSDL2PP_WITH_WERROR=YES && make && make test && make install
script: cmake . -DSDL2PP_ENABLE_GUI_TEST=OFF -DCMAKE_INSTALL_PREFIX=`pwd`/_prefix -DSDL2PP_WITH_WERROR=YES && make && make test && make install

View File

@ -5,6 +5,12 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
SET(SDL2PP_MAJOR_VERSION 0)
SET(SDL2PP_MINOR_VERSION 4)
SET(SDL2PP_PATCH_VERSION 0)
SET(SDL2PP_VERSION "${SDL2PP_MAJOR_VERSION}.${SDL2PP_MINOR_VERSION}.${SDL2PP_PATCH_VERSION}")
# there are functions present on wiki, but not yet in stable SDL2 releases;
# we hide these under following options
OPTION(SDL2PP_WITH_2_0_4 "Enable new functions available only in SDL2 2.0.4+" OFF)
@ -37,6 +43,8 @@ ELSE(MSVC)
SET(WERROR_FLAG "-Werror")
ENDIF(MSVC)
LIST(REMOVE_DUPLICATES SDL2_ALL_INCLUDE_DIRS)
INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${SDL2_ALL_INCLUDE_DIRS})
@ -94,15 +102,41 @@ IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
TARGET_LINK_LIBRARIES(SDL2pp ${SDL2_ALL_LIBRARIES})
SET_TARGET_PROPERTIES(SDL2pp PROPERTIES VERSION 1.0.0 SOVERSION 1)
# demos and tests
OPTION(RUN_GUI_TESTS "Run GUI tests (requires X11 display)" ON)
ENABLE_TESTING()
# examples and tests
OPTION(SDL2PP_WITH_EXAMPLES "Build examples" ON)
OPTION(SDL2PP_WITH_TESTS "Build tests" ON)
OPTION(SDL2PP_ENABLE_GUI_TEST "Enable GUI test (requires X11 display)" ON)
ADD_SUBDIRECTORY(demos)
ADD_SUBDIRECTORY(tests)
IF(SDL2PP_WITH_EXAMPLES)
ADD_SUBDIRECTORY(examples)
ENDIF(SDL2PP_WITH_EXAMPLES)
IF(SDL2PP_WITH_TESTS)
ENABLE_TESTING()
ADD_SUBDIRECTORY(tests)
ENDIF(SDL2PP_WITH_TESTS)
# pkgconfig
SET(PKGCONFIGDIR lib/pkgconfig CACHE STRING "directory where to install pkg-config files")
IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
SET(PKGCONFIGDIR libdata/pkgconfig)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
SET(SDL2_PKGCONFIG_CFLAGS "")
FOREACH(INCDIR IN LISTS SDL2_ALL_INCLUDE_DIRS)
SET(SDL2_PKGCONFIG_CFLAGS "${SDL2_PKGCONFIG_CFLAGS} -I${INCDIR}")
ENDFOREACH(INCDIR IN SDL2_ALL_INCLUDE_DIRS)
CONFIGURE_FILE(
sdl2pp.pc.in
sdl2pp.pc
@ONLY
)
# install
INSTALL(FILES ${LIBRARY_HEADERS} ${PROJECT_BINARY_DIR}/SDL2pp/Config.hh DESTINATION include/SDL2pp)
INSTALL(TARGETS SDL2pp LIBRARY DESTINATION lib)
INSTALL(FILES ${PROJECT_BINARY_DIR}/sdl2pp.pc DESTINATION ${PKGCONFIGDIR})
ELSE(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
MESSAGE(STATUS "libSDL2pp bundled build")

View File

@ -83,13 +83,34 @@ Dependencies:
* SDL_image2 (optional)
To build standalone version:
```cmake . && make```
## Installation ##
To install the library systemwide, run:
```cmake . && make && make install```
You can change installation prefix with CMAKE_INSTALL_PREFIX cmake
variable:
```cmake -DCMAKE_INSTALL_PREFIX=/usr/local . && make && make install```
SDL2pp install pkg-config file, so it can be used with any build
system which interacts with pkg-config, including CMake and GNU
Autotools.
SDL2pp is also already available from following package repositories:
* [Arch Linux AUR](https://aur.archlinux.org/packages/sdl2pp-git/)
* [FreeBSD ports](http://www.freshports.org/devel/sdl2pp/)
## Bundling ##
The library is easy to integrate into other CMake-using projects
(and as the library has no stable API yet, this way of using it is
preferred).
still recommended).
Just place the library into dedicated directory in your project
(for example, lib/SDL2pp) and add
@ -111,7 +132,7 @@ ADD_EXECUTABLE(mytarget ...)
TARGET_LINK_LIBRARIES(mytarget ${SDL2PP_LIBRARIES})
```
if bundled, libSDL2pp does not build demos and becomes a static
if bundled, libSDL2pp does not build examples and becomes a static
library, providing required SDL2 includes/libs in the mentioned
variables.

View File

@ -135,9 +135,23 @@ public:
////////////////////////////////////////////////////////////
LockHandle& operator=(LockHandle&& other) noexcept;
// Deleted copy constructor and assignment
LockHandle(const LockHandle& other) = delete;
LockHandle& operator=(const LockHandle& other) = delete;
////////////////////////////////////////////////////////////
/// \brief Copy constructor
///
/// \param other SDL2pp::AudioDevice::LockHandle to copy data from
///
////////////////////////////////////////////////////////////
LockHandle(const LockHandle& other);
////////////////////////////////////////////////////////////
/// \brief Assignment operator
///
/// \param other SDL2pp::AudioDevice::LockHandle to copy data from
///
/// \returns Reference to self
///
////////////////////////////////////////////////////////////
LockHandle& operator=(const LockHandle& other);
};
typedef std::function<void(Uint8* stream, int len)> AudioCallback;

View File

@ -53,4 +53,21 @@ AudioDevice::LockHandle& AudioDevice::LockHandle::operator=(AudioDevice::LockHan
return *this;
}
AudioDevice::LockHandle::LockHandle(const AudioDevice::LockHandle& other) : device_(other.device_) {
SDL_LockAudioDevice(device_->device_id_);
}
AudioDevice::LockHandle& AudioDevice::LockHandle::operator=(const AudioDevice::LockHandle& other) {
if (&other == this)
return *this;
if (device_ != nullptr)
SDL_UnlockAudioDevice(device_->device_id_);
device_ = other.device_;
SDL_LockAudioDevice(device_->device_id_);
return *this;
}
}

View File

@ -22,6 +22,12 @@
#ifndef SDL2PP_CONFIG_HH
#define SDL2PP_CONFIG_HH
#define SDL2PP_MAJOR_VERSION @SDL2PP_MAJOR_VERSION@
#define SDL2PP_MINOR_VERSION @SDL2PP_MINOR_VERSION@
#define SDL2PP_PATCH_VERSION @SDL2PP_PATCH_VERSION@
#define SDL2PP_VERSION "@SDL2PP_VERSION@"
#cmakedefine SDL2PP_WITH_IMAGE
#cmakedefine SDL2PP_WITH_2_0_4

View File

@ -137,4 +137,34 @@ bool Rect::Contains(const Point& point) const {
return !(point.GetX() < GetX() || point.GetY() < GetY() || point.GetX() > GetX2() || point.GetY() > GetY2());
}
Rect Rect::operator+(const Point& offset) const {
assert(!IsNull() && !offset.IsNull());
return Rect(rect_.x + offset.GetX(), rect_.y + offset.GetY(), rect_.w, rect_.h);
}
Rect& Rect::operator+=(const Point& offset) {
assert(!IsNull() && !offset.IsNull());
rect_.x += offset.GetX();
rect_.y += offset.GetY();
return *this;
}
Rect Rect::operator-(const Point& offset) const {
assert(!IsNull() && !offset.IsNull());
return Rect(rect_.x - offset.GetX(), rect_.y - offset.GetY(), rect_.w, rect_.h);
}
Rect& Rect::operator-=(const Point& offset) {
assert(!IsNull() && !offset.IsNull());
rect_.x -= offset.GetX();
rect_.y -= offset.GetY();
return *this;
}
}

View File

@ -78,6 +78,12 @@ public:
void SetY2(int y2);
bool Contains(const Point& point) const;
Rect operator+(const Point& offset) const;
Rect& operator+=(const Point& offset);
Rect operator-(const Point& offset) const;
Rect& operator-=(const Point& offset);
};
}

View File

@ -98,7 +98,7 @@ void Texture::SetColorMod(Uint8 r, Uint8 g, Uint8 b) {
throw Exception("SDL_SetTextureColorMod failed");
}
Texture::LockHandle Texture::Lock(const Rect& rect) {
Texture::LockHandle Texture::Lock(const Rect& rect = Rect::Null()) {
return LockHandle(this, rect);
}

14
sdl2pp.pc.in Normal file
View File

@ -0,0 +1,14 @@
# libSDL2pp pkg-config source file
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: sdl2pp
Description: C++11 bindings/wrappers for SDL2.
Version: @SDL2PP_VERSION@
Requires:
Conflicts:
Libs: -L${libdir} -lSDL2pp
Cflags: -I${includedir}@SDL2_PKGCONFIG_CFLAGS@

View File

@ -30,7 +30,7 @@ ENDFOREACH(TEST ${TESTS})
FOREACH(TEST ${GUI_TESTS})
ADD_EXECUTABLE(${TEST} ${TEST}.cc)
TARGET_LINK_LIBRARIES(${TEST} SDL2pp)
IF(RUN_GUI_TESTS)
IF(SDL2PP_ENABLE_GUI_TEST)
ADD_TEST(${TEST} ${TEST})
ENDIF(RUN_GUI_TESTS)
ENDIF(SDL2PP_ENABLE_GUI_TEST)
ENDFOREACH(TEST ${TESTS})

View File

@ -173,4 +173,20 @@ BEGIN_TEST()
EXPECT_TRUE(!r.Contains(Point(15, 20)));
EXPECT_TRUE(!r.Contains(Point(10, 25)));
}
{
// Rect offset
Rect r(1, 2, 3, 4);
EXPECT_TRUE(r + Point(10, 20) == Rect(11, 22, 3, 4));
EXPECT_TRUE(r - Point(10, 20) == Rect(-9, -18, 3, 4));
r += Point(10, 20);
EXPECT_TRUE(r == Rect(11, 22, 3, 4));
r -= Point(20, 40);
EXPECT_TRUE(r == Rect(-9, -18, 3, 4));
}
END_TEST()

View File

@ -24,19 +24,19 @@ BEGIN_TEST()
{
// Seeks
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
EXPECT_TRUE(rw.Tell() == 0);
EXPECT_TRUE(rw.Seek(1, SEEK_SET) == 1);
EXPECT_TRUE(rw.Seek(1, RW_SEEK_SET) == 1);
EXPECT_TRUE(rw.Tell() == 1);
EXPECT_TRUE(rw.Seek(1, SEEK_CUR) == 2);
EXPECT_TRUE(rw.Seek(1, RW_SEEK_CUR) == 2);
EXPECT_TRUE(rw.Tell() == 2);
EXPECT_TRUE(rw.Seek(-1, SEEK_END) == 3);
EXPECT_TRUE(rw.Seek(-1, RW_SEEK_END) == 3);
EXPECT_TRUE(rw.Tell() == 3);
}
{
// Read via C++
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
char buf[4] = {0};
EXPECT_TRUE(rw.Read(buf, 1, 4) == 4);
@ -48,7 +48,7 @@ BEGIN_TEST()
{
// Read via C++
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
char buf[4] = {0};
EXPECT_TRUE(rw.Read(buf, 4, 1) == 1);
@ -60,7 +60,7 @@ BEGIN_TEST()
{
// Read via SDL
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
char buf[4] = {0};
EXPECT_TRUE(SDL_RWread(rw.Get(), buf, 1, 4) == 4);
@ -72,17 +72,17 @@ BEGIN_TEST()
{
// Overread
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
char buf[6] = {0};
EXPECT_TRUE(SDL_RWread(rw.Get(), buf, 3, 2) == 1);
rw.Seek(0, SEEK_SET);
rw.Seek(0, RW_SEEK_SET);
EXPECT_TRUE(SDL_RWread(rw.Get(), buf, 2, 3) == 2);
}
{
// Write
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
char buf[2] = {'1', '2'};
EXPECT_TRUE(rw.Write(buf, 1, 2) == 2);
@ -98,7 +98,7 @@ BEGIN_TEST()
{
// Write past EOF
char buf[2] = {'x', 'y'};
EXPECT_TRUE(rw.Seek(100, SEEK_SET) == 100);
EXPECT_TRUE(rw.Seek(100, RW_SEEK_SET) == 100);
EXPECT_TRUE(rw.Write(buf, 1, 2) == 2);
EXPECT_TRUE(rw.Tell() == 102);
@ -123,7 +123,7 @@ BEGIN_TEST()
{
// Read via C++
EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0);
EXPECT_TRUE(rw.Seek(0, RW_SEEK_SET) == 0);
char buf[4] = {0};
EXPECT_TRUE(rw.Read(buf, 1, 4) == 4);
@ -152,7 +152,7 @@ BEGIN_TEST()
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.Seek(2, RW_SEEK_SET) == 2);
EXPECT_TRUE(rw.Write(buf, 2, 2) == 2);
EXPECT_TRUE(vec.size() == 8);