#pragma region CPL License /* Nuclex Native Framework Copyright (C) 2002-2013 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library 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 IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #pragma endregion // CPL License // If the library is compiled as a DLL, this ensures symbols are exported #define NUCLEX_GRAPHICS_SOURCE 1 #include "Nuclex/Graphics/Rasterization/Texture.h" #include #include namespace Nuclex { namespace Graphics { namespace Rasterization { // ------------------------------------------------------------------------------------------- // Texture::Texture(std::size_t sizeInBytes, PixelFormat::Enum pixelFormat, Usage::Enum usage) : SizeInBytes(sizeInBytes), PixelFormat(pixelFormat), usage(usage), Pixels(new std::uint8_t[sizeInBytes]) {} // ------------------------------------------------------------------------------------------- // Texture::Texture(const Texture &other) : SizeInBytes(other.SizeInBytes), PixelFormat(other.PixelFormat), Pixels(new std::uint8_t[other.SizeInBytes]) { std::copy_n(other.Pixels, this->SizeInBytes, this->Pixels); } // ------------------------------------------------------------------------------------------- // Texture::~Texture() { delete []this->Pixels; } // ------------------------------------------------------------------------------------------- // Texture &Texture::operator =(const Texture &other) { if(other.PixelFormat != this->PixelFormat) { throw std::runtime_error("Pixel format mismatch"); } // TODO: Copy existing texture return *this; } // ------------------------------------------------------------------------------------------- // void Texture::SuppressChangeNotifications() { this->changedRegion.Left = static_cast(-1); this->changedRegion.Right = 0; this->changedRegion.Top = static_cast(-1); this->changedRegion.Bottom = 0; this->changedRegion.Front = static_cast(-1); this->changedRegion.Back = 0; } // ------------------------------------------------------------------------------------------- // void Texture::PermitChangeNotifications() { Box changedRegion = this->changedRegion; this->changedRegion.Reset(); if(!changedRegion.IsEmpty()) { OnChanged(changedRegion); } } // ------------------------------------------------------------------------------------------- // Texture::Observer *Texture::GetObserver(const void *owner) const { return this->observers.Get(owner); } // ------------------------------------------------------------------------------------------- // void Texture::AttachObserver(const void *owner, Observer *observer) { using namespace std; bool wasUnique = this->observers.AttachUnique(owner, observer); // Observer management should be accurate and error-free! assert(wasUnique && "Only one observer can be attached per owner"); wasUnique; // avoid unreferenced parameter warning } // ------------------------------------------------------------------------------------------- // void Texture::DetachObserver(const void *owner) { using namespace std; bool wasAttached = this->observers.Detach(owner); // Observer management should be accurate and error-free! assert(wasAttached && "Attempted to detach an observer that was not attached"); wasAttached; // avoid unreferenced parameter warning } // ------------------------------------------------------------------------------------------- // void Texture::OnDestroying() { std::vector copy = this->observers.Copy(); for(std::size_t index = 0; index < copy.size(); ++index) { copy[index]->Destroying(); } } // ------------------------------------------------------------------------------------------- // void Texture::OnCleared() { std::vector copy = this->observers.Copy(); for(std::size_t index = 0; index < copy.size(); ++index) { copy[index]->Cleared(); } } // ------------------------------------------------------------------------------------------- // void Texture::OnChanged(const Box &changedRegion) { if(this->changedRegion.IsEmpty()) { std::vector copy = this->observers.Copy(); for(std::size_t index = 0; index < copy.size(); ++index) { copy[index]->Changed(changedRegion); } } else { // Change notifications are currently suppressed this->changedRegion.Merge(changedRegion); } } // ------------------------------------------------------------------------------------------- // }}} // namespace Nuclex::Graphics::Rasterization