From f5fa211cfe21acf0619f34aafae93b97b3c77ac2 Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Fri, 6 Sep 2013 01:59:26 +0400 Subject: [PATCH] Implement texture locking --- CMakeLists.txt | 1 + SDL2pp/Texture.cc | 4 +++ SDL2pp/Texture.hh | 26 ++++++++++++++++++ SDL2pp/TextureLock.cc | 63 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 SDL2pp/TextureLock.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 8755f0d..50f43e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ SET(LIBRARY_SOURCES SDL2pp/Renderer.cc SDL2pp/SDL.cc SDL2pp/Texture.cc + SDL2pp/TextureLock.cc SDL2pp/Window.cc ) diff --git a/SDL2pp/Texture.cc b/SDL2pp/Texture.cc index 62d062f..697eac3 100644 --- a/SDL2pp/Texture.cc +++ b/SDL2pp/Texture.cc @@ -94,4 +94,8 @@ void Texture::SetColorMod(Uint8 r, Uint8 g, Uint8 b) { throw Exception("SDL_SetTextureColorMod failed"); } +Texture::LockHandle Texture::Lock(const Rect& rect) { + return LockHandle(this, rect); +} + } diff --git a/SDL2pp/Texture.hh b/SDL2pp/Texture.hh index 85b342a..631fa57 100644 --- a/SDL2pp/Texture.hh +++ b/SDL2pp/Texture.hh @@ -41,6 +41,30 @@ class Texture { private: SDL_Texture* texture_; +public: + class LockHandle { + friend class Texture; + private: + Texture* texture_; + void* pixels_; + int pitch_; + + private: + LockHandle(Texture* texture, const Rect& rect); + + public: + ~LockHandle(); + + LockHandle(LockHandle&& other) noexcept; + LockHandle& operator=(LockHandle&& other) noexcept; + + LockHandle(const LockHandle& other) = delete; + LockHandle& operator=(const LockHandle& other) = delete; + + void* GetPixels() const; + int GetPitch() const; + }; + public: Texture(Renderer& renderer, Uint32 format, int access, int w, int h); #ifdef SDL2PP_WITH_IMAGE @@ -61,6 +85,8 @@ public: void SetBlendMode(SDL_BlendMode blendMode); void SetAlphaMod(Uint8 alpha = 255); void SetColorMod(Uint8 r = 255, Uint8 g = 255, Uint8 b = 255); + + LockHandle Lock(const Rect& rect); }; } diff --git a/SDL2pp/TextureLock.cc b/SDL2pp/TextureLock.cc new file mode 100644 index 0000000..8230499 --- /dev/null +++ b/SDL2pp/TextureLock.cc @@ -0,0 +1,63 @@ +/* + libSDL2pp - C++ wrapper for libSDL2 + Copyright (C) 2013 Dmitry Marakasov + + 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. +*/ + +#include + +#include +#include + +#include + +namespace SDL2pp { + +Texture::LockHandle::LockHandle(Texture* texture, const Rect& rect) : texture_(texture) { + if (SDL_LockTexture(texture_->Get(), rect.Get(), &pixels_, &pitch_) != 0) + throw Exception("SDL_LockTexture failed"); +} + +Texture::LockHandle::LockHandle(Texture::LockHandle&& other) noexcept : texture_(other.texture_), pixels_(other.pixels_), pitch_(other.pitch_) { + other.texture_ = nullptr; +} + +Texture::LockHandle& Texture::LockHandle::operator=(Texture::LockHandle&& other) noexcept { + texture_ = other.texture_; + pixels_ = other.pixels_; + pitch_ = other.pitch_; + + other.texture_ = nullptr; + + return *this; +} + +Texture::LockHandle::~LockHandle() { + if (texture_ != nullptr) + SDL_UnlockTexture(texture_->Get()); +} + +void* Texture::LockHandle::GetPixels() const { + return pixels_; +} + +int Texture::LockHandle::GetPitch() const { + return pitch_; +} + +}