From 916b759b8ff37c3ecbac03c919480efdf68eb04d Mon Sep 17 00:00:00 2001 From: Ingo Date: Mon, 28 Oct 2013 23:30:04 +0100 Subject: [PATCH] IGV-demosaic, wrong rendering of top and bottom border, Issue 1908 --- rtengine/demosaic_algos.cc | 74 ++++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index f7da43348..341f2905d 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -35,10 +35,7 @@ #include "../rtgui/multilangmgr.h" #include "procparams.h" #include "sleef.c" -#ifdef __SSE2__ -#include "sleefsseavx.c" -#endif - +#include "opthelper.h" #ifdef _OPENMP #include @@ -886,7 +883,6 @@ void RawImageSource::border_interpolate2( int winw, int winh, int lborders) int bord=lborders; int width=winw; int height=winh; -//#pragma omp parallel for for (int i=0; i -1) && (i1 < height) && (j1 > -1)) { + int c = FC(i1,j1); + sum[c] += rawData[i1][j1]; + sum[c+3]++; + } + } + int c=FC(i,j); + if (c==1) { + red[i][j]=sum[0]/sum[3]; + green[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + green[i][j]=sum[1]/sum[4]; + if (c==0) { + red[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + red[i][j]=sum[0]/sum[3]; + blue[i][j]=rawData[i][j]; + } + } + }//j + } + + for (int i=height-bord; i -1) && (i1 < height) && (j1 < width)) { + int c = FC(i1,j1); + sum[c] += rawData[i1][j1]; + sum[c+3]++; + } + } + int c=FC(i,j); + if (c==1) { + red[i][j]=sum[0]/sum[3]; + green[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + green[i][j]=sum[1]/sum[4]; + if (c==0) { + red[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + red[i][j]=sum[0]/sum[3]; + blue[i][j]=rawData[i][j]; + } + } + }//j + } } @@ -1463,11 +1521,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // SSE version by Ingo Weyrich 5/2013 #ifdef __SSE2__ #define CLIPV(a) LIMV(a,zerov,c65535v) -#ifdef WIN32 -__attribute__((force_align_arg_pointer)) void RawImageSource::igv_interpolate(int winw, int winh) -#else -void RawImageSource::igv_interpolate(int winw, int winh) -#endif +SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) { static const float eps=1e-5f, epssq=1e-5f;//mod epssq -10f =>-5f Jacques 3/2013 to prevent artifact (divide by zero)