From 03af8246a682410a9b02357ac81dc57953f4226e Mon Sep 17 00:00:00 2001 From: spillerrec Date: Sun, 16 Sep 2018 23:09:59 +0200 Subject: [PATCH] ADD: Start on alpha support for Plane scaling #41 --- src/planes/ImageEx.cpp | 2 +- src/planes/ImageEx.hpp | 8 ++--- src/planes/Plane-scaling.cpp | 56 ++++++++++++++++++++++++++++++++- src/planes/Plane.hpp | 43 ++++++++++++------------- src/renders/AnimRender.cpp | 2 +- src/renders/AverageRender.cpp | 3 +- src/renders/EstimatorRender.cpp | 6 ++-- src/renders/PixelatorRender.cpp | 2 +- src/renders/RobustSrRender.cpp | 2 +- src/utils/PlaneUtils.hpp | 2 +- 10 files changed, 92 insertions(+), 34 deletions(-) diff --git a/src/planes/ImageEx.cpp b/src/planes/ImageEx.cpp index dae137f..7e8cae5 100644 --- a/src/planes/ImageEx.cpp +++ b/src/planes/ImageEx.cpp @@ -107,7 +107,7 @@ ImageEx ImageEx::toColorSpace( ColorSpace to ) const{ auto img_size = out.getSize(); for( auto& info : out.planes ) if( info.p.getSize() != img_size ) - info.p = info.p.scale_cubic( img_size ); + info.p = info.p.scale_cubic( alpha_plane(), img_size ); #pragma omp parallel for for( unsigned iy=0; iy size, ScalingFunction scaling=ScalingFunction::SCALE_MITCHELL ){ for( auto& info : planes ) - info.p = info.p.scale_select( size, scaling ); + info.p = info.p.scale_select( alpha_plane(), size, scaling ); if( alpha_plane() ) - alpha_plane() = alpha_plane().scale_select( size, scaling ); + alpha_plane() = alpha_plane().scale_select( {}, size, scaling ); } void scaleFactor( Size factor, ScalingFunction scaling=ScalingFunction::SCALE_MITCHELL ){ for( auto& info : planes ) - info.p = info.p.scale_select( ( info.p.getSize() * factor ).round(), scaling ); + info.p = info.p.scale_select( alpha_plane(), ( info.p.getSize() * factor ).round(), scaling ); if( alpha_plane() ) - alpha_plane() = alpha_plane().scale_select( ( alpha_plane().getSize() * factor ).round(), scaling ); + alpha_plane() = alpha_plane().scale_select( {}, ( alpha_plane().getSize() * factor ).round(), scaling ); } Point crop( unsigned left, unsigned top, unsigned right, unsigned bottom ); void crop( Point offset, Size size ); diff --git a/src/planes/Plane-scaling.cpp b/src/planes/Plane-scaling.cpp index 074794a..9001874 100644 --- a/src/planes/Plane-scaling.cpp +++ b/src/planes/Plane-scaling.cpp @@ -26,7 +26,8 @@ using namespace std; using namespace Overmix; -Plane Plane::scale_nearest( Point wanted ) const{ +Plane Plane::scale_nearest( const Plane& alpha, Point wanted ) const{ + //TODO: Support alpha Timer t( "scale_nearest" ); Plane scaled( wanted ); @@ -192,3 +193,56 @@ Plane Plane::scale_generic( Point wanted, double window, Plane::Filter } +Plane Plane::scale_generic_alpha( const Plane& alpha, Point wanted, double window, Plane::Filter f, Point offset ) const{ + //Do non-alpha version if alpha is not valid + if( !alpha.valid() ) + return scale_generic( wanted, window, f, offset ); + //TODO: check alpha size + + Timer t( "scale_generic_alpha" ); + if( !*this || wanted == getSize() ) + return *this; + + Plane scaled( wanted ); + + //Calculate all x-weights + std::vector points; + points.reserve( wanted.width() ); + for( unsigned ix=0; ix{ static double lancozs5( double x ){ return lancozs( x, 5 ); } static double lancozs7( double x ){ return lancozs( x, 7 ); } Plane scale_generic( Point size, double window, Filter f, Point offset={0.0,0.0} ) const; + Plane scale_generic_alpha( const Plane& alpha, Point size, double window, Filter f, Point offset={0.0,0.0} ) const; public: - Plane scale_nearest( Point size ) const; - Plane scale_linear( Point size, Point offset={0.0,0.0} ) const{ - return scale_generic( size, 1.5, linear, offset ); + Plane scale_nearest( const Plane& alpha, Point size ) const; + Plane scale_linear( const Plane& alpha, Point size, Point offset={0.0,0.0} ) const{ + return scale_generic_alpha( alpha, size, 1.5, linear, offset ); } - Plane scale_cubic( Point size, Point offset={0.0,0.0} ) const{ - return scale_generic( size, 2.5, mitchell, offset ); + Plane scale_cubic( const Plane& alpha, Point size, Point offset={0.0,0.0} ) const{ + return scale_generic_alpha( alpha, size, 2.5, mitchell, offset ); } - Plane scale_lanczos3( Point size, Point offset={0.0,0.0} ) const - { return scale_generic( size, 3.5, lancozs3, offset ); } - Plane scale_lanczos5( Point size, Point offset={0.0,0.0} ) const - { return scale_generic( size, 5.5, lancozs5, offset ); } - Plane scale_lanczos7( Point size, Point offset={0.0,0.0} ) const - { return scale_generic( size, 7.5, lancozs7, offset ); } - - Plane scale_select( Point size, ScalingFunction scaling, Point offset={0.0,0.0} ) const{ + Plane scale_lanczos3( const Plane& alpha, Point size, Point offset={0.0,0.0} ) const + { return scale_generic_alpha( alpha, size, 3.5, lancozs3, offset ); } + Plane scale_lanczos5( const Plane& alpha, Point size, Point offset={0.0,0.0} ) const + { return scale_generic_alpha( alpha, size, 5.5, lancozs5, offset ); } + Plane scale_lanczos7( const Plane& alpha, Point size, Point offset={0.0,0.0} ) const + { return scale_generic_alpha( alpha, size, 7.5, lancozs7, offset ); } + + Plane scale_select( const Plane& alpha, Point size, ScalingFunction scaling, Point offset={0.0,0.0} ) const{ switch( scaling ){ - case ScalingFunction::SCALE_NEAREST : return scale_nearest( size ); - case ScalingFunction::SCALE_LINEAR : return scale_linear( size, offset ); - case ScalingFunction::SCALE_MITCHELL: return scale_cubic( size, offset ); - case ScalingFunction::SCALE_CATROM : return scale_generic( size, 2.5, catrom, offset ); - case ScalingFunction::SCALE_SPLINE : return scale_generic( size, 2.5, spline, offset ); - case ScalingFunction::SCALE_LANCZOS_3 : return scale_lanczos3( size, offset ); - case ScalingFunction::SCALE_LANCZOS_5 : return scale_lanczos5( size, offset ); - case ScalingFunction::SCALE_LANCZOS_7 : return scale_lanczos7( size, offset ); + case ScalingFunction::SCALE_NEAREST : return scale_nearest( alpha, size ); + case ScalingFunction::SCALE_LINEAR : return scale_linear( alpha, size, offset ); + case ScalingFunction::SCALE_MITCHELL: return scale_cubic( alpha, size, offset ); + case ScalingFunction::SCALE_CATROM : return scale_generic_alpha( alpha, size, 2.5, catrom, offset ); + case ScalingFunction::SCALE_SPLINE : return scale_generic_alpha( alpha, size, 2.5, spline, offset ); + case ScalingFunction::SCALE_LANCZOS_3 : return scale_lanczos3( alpha, size, offset ); + case ScalingFunction::SCALE_LANCZOS_5 : return scale_lanczos5( alpha, size, offset ); + case ScalingFunction::SCALE_LANCZOS_7 : return scale_lanczos7( alpha, size, offset ); default: return Plane(); } } diff --git a/src/renders/AnimRender.cpp b/src/renders/AnimRender.cpp index eb9a9a9..dd6e036 100644 --- a/src/renders/AnimRender.cpp +++ b/src/renders/AnimRender.cpp @@ -72,7 +72,7 @@ AnimRender::AnimRender( const AContainer& aligner, ARender& render, AProcessWatc auto full_size = img.getSize(); for( unsigned i=0; i().to()*/ ); //TODO: offset + out = out.scale_select( Plane(), out.getSize() / upscale_factor, scale_method/*, pos - pos.to().to()*/ ); //TODO: offset + //TODO: Alpha return out; @@ -90,7 +91,8 @@ void sign( Plane& out, const Plane& p1, const Plane& p2, Point offset, d val.first = signFloat( val.first, val.second, beta ); //Upscale delta to fit - delta = delta.scale_select( delta.getSize()*scale, ScalingFunction::SCALE_MITCHELL ); + delta = delta.scale_select( Plane(), delta.getSize()*scale, ScalingFunction::SCALE_MITCHELL ); + //TODO: Alpha for( unsigned iy=0; iy lowres; for( auto g : group ) diff --git a/src/utils/PlaneUtils.hpp b/src/utils/PlaneUtils.hpp index c3b87fa..8477f08 100644 --- a/src/utils/PlaneUtils.hpp +++ b/src/utils/PlaneUtils.hpp @@ -46,7 +46,7 @@ using ModifiedPlane = Modified; inline ModifiedPlane getScaled( const Plane& p, Size size ){ if( p && p.getSize() != size ) - return { p.scale_cubic( size ) }; + return { p.scale_cubic( Plane(), size ) }; //TODO: alpha? else return { p }; }