diff --git a/includes/misc.hpp b/includes/misc.hpp new file mode 100644 index 0000000..14e6eaa --- /dev/null +++ b/includes/misc.hpp @@ -0,0 +1,16 @@ +#ifndef MISC_HPP +#define MISC_HPP + +#include +#include + +namespace misc { + //Realiza um std::make_shared e converte para classe base com reinterpret_pointer_cast + template + std::shared_ptr reinterpret_make_shared(_Types&&... _Args) { + auto derived = std::make_shared(std::forward<_Types>(_Args)...); + return reinterpret_pointer_cast(derived); + } +} + +#endif \ No newline at end of file diff --git a/includes/pipeline/graphics.hpp b/includes/pipeline/graphics.hpp index e87b6f6..04484a0 100644 --- a/includes/pipeline/graphics.hpp +++ b/includes/pipeline/graphics.hpp @@ -97,6 +97,9 @@ namespace xna { //Attempts to copy a region from a specified bitmap. bool TryCopyFrom(BitmapContent const& sourceBitmap, Rectangle const& sourceRegion, Rectangle const& destionationRegion) override { return false; } + + private: + }; diff --git a/sources/pipeline/graphics.cpp b/sources/pipeline/graphics.cpp index bd572f9..52892f2 100644 --- a/sources/pipeline/graphics.cpp +++ b/sources/pipeline/graphics.cpp @@ -1,7 +1,9 @@ #include "pipeline/graphics.hpp" +#include "misc.hpp" #include -namespace xna { +namespace xna { + void xna::BitmapContent::Copy(BitmapContent const& sourceBitmap, Rectangle const& sourceRegion, BitmapContent& destinationBitmap, Rectangle const& destinationRegion) { BitmapContent::ValidateCopyArguments(sourceBitmap, sourceRegion, destinationBitmap, destinationRegion); @@ -9,25 +11,20 @@ namespace xna { if (sourceBitmap.TryCopyTo(destinationBitmap, sourceRegion, destinationRegion) || destinationBitmap.TryCopyFrom(sourceBitmap, sourceRegion, destinationRegion)) return; - auto bitmapContent1 = std::make_shared>(sourceBitmap.Width(), sourceBitmap.Height()); - auto rectangle1 = Rectangle(0, 0, bitmapContent1->Width(), bitmapContent1->Height()); + auto bitmapContent1 = misc::reinterpret_make_shared>(sourceBitmap.Width(), sourceBitmap.Height()); + auto rectangle1 = Rectangle(0, 0, bitmapContent1->Width(), bitmapContent1->Height()); - auto bmp1 = reinterpret_pointer_cast(bitmapContent1); - - if (sourceBitmap.TryCopyTo(*bmp1, sourceRegion, rectangle1) && destinationBitmap.TryCopyFrom(*bmp1, rectangle1, destinationRegion)) + if (sourceBitmap.TryCopyTo(*bitmapContent1, sourceRegion, rectangle1) && destinationBitmap.TryCopyFrom(*bitmapContent1, rectangle1, destinationRegion)) return; - auto bitmapContent2 = std::make_shared>(sourceBitmap.Width(), sourceBitmap.Height()); - auto bitmapContent3 = std::make_shared>(destinationBitmap.Width(), destinationBitmap.Height()); + auto bitmapContent2 = misc::reinterpret_make_shared>(sourceBitmap.Width(), sourceBitmap.Height()); + auto bitmapContent3 = misc::reinterpret_make_shared>(destinationBitmap.Width(), destinationBitmap.Height()); auto rectangle2 = Rectangle(0, 0, sourceBitmap.Width(), sourceBitmap.Height()); - auto rectangle3 = Rectangle(0, 0, destinationBitmap.Width(), destinationBitmap.Height()); + auto rectangle3 = Rectangle(0, 0, destinationBitmap.Width(), destinationBitmap.Height()); - auto bmpContent2 = reinterpret_pointer_cast(bitmapContent2); - auto bmpContent3 = reinterpret_pointer_cast(bitmapContent3); - - if (!sourceBitmap.TryCopyTo(*bmpContent2, rectangle2, rectangle2) || !destinationBitmap.TryCopyTo(*bmpContent3, rectangle3, rectangle3) - || !bmpContent3->TryCopyFrom(*bmpContent2, sourceRegion, destinationRegion) || !destinationBitmap.TryCopyFrom(*bmpContent3, rectangle3, rectangle3)) + if (!sourceBitmap.TryCopyTo(*bitmapContent2, rectangle2, rectangle2) || !destinationBitmap.TryCopyTo(*bitmapContent3, rectangle3, rectangle3) + || !bitmapContent3->TryCopyFrom(*bitmapContent2, sourceRegion, destinationRegion) || !destinationBitmap.TryCopyFrom(*bitmapContent3, rectangle3, rectangle3)) { Exception::Throw(Exception::INVALID_OPERATION); }