Exemple #1
0
c_haship_pubkey::c_haship_pubkey( const string_as_bin & input ) {
	_mark("Loadig pubkey from: " << ::to_debug(input) );
	this->load_from_bin(input.bytes);
	_mark("After loading: " << (*this) );
	//for(size_t i=0; i<input.bytes.size(); ++i) at(i) = input.bytes.at(i);
//	for(auto v : input.bytes) at(
}
void example_memcheck_2() { // to test valgrind detection of errors
	_mark("Valgrind memcheck test.");
	vector<int> vec(100);
	vec[2000] = 42;
	volatile auto * ptr = & vec[3000];
	*ptr = 42;
	_mark("Valgrdin memcheck test done (program not aborted), result");
}
void example_ubsan_1() { // to test UBSAN / ub sanitize
	_mark("UBSAN test.");
	// TODO make it work for "signed char" as well
	signed int i;
	i = std::numeric_limits<decltype(i)>::max();
	i += static_cast<decltype(i)>(5); // overflow of signed
	_mark("UBSAN test done (program not aborted)");
}
void example_memcheck_1() { // to test valgrind detection of errors
	_mark("Valgrind memcheck test.");
	vector<int> vec(100);
	int* ptr = & vec.at(0);
	ptr += 200;
	volatile int read = *ptr;
	volatile int result = (read==0) ? 0 : 1; // to silence "unused var" and to cause e.g. cause "jump depends on uninitialized"
	_mark("Valgrdin memcheck test done (program not aborted), result"<<result);
}
void example_tsan_1() { // to test STAN / thread sanitizer
	_mark("TSAN test.");
	int data=10;
	// run concurent update of data:
	auto thread1 = std::thread( [&](){ data=20; } );
	auto thread2 = std::thread( [&](){ data=30; } );
	thread1.join();
	thread2.join();
	_mark("TSAN test done (program not aborted)");
}
double ApplyCurve(FIBITMAP *src, FIBITMAP *dst, std::vector<cp> ctpts, int threadcount)
{
    _mark();
    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    unsigned w = FreeImage_GetWidth(src);
    unsigned h = FreeImage_GetHeight(src);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);

    Curve c;
    BYTE LUT8[256];
    WORD LUT16[65536];
    c.setControlPoints(ctpts);
    int bpp = FreeImage_GetBPP(src);
    if (bpp == 24) {
        c.clampto(0.0,255.0);
        for (int x=0; x<256; x++) {
            LUT8[x] = (BYTE)floor(c.getpoint(x) + 0.5);
        }
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < h; y++) {
            for(unsigned x = 0; x < w; x++) {
                BYTE * bdstpix = (BYTE *) dstbits + dpitch*y + 3*x;
                BYTE *pixel = (BYTE *) (srcbits + spitch*y + 3*x);
                bdstpix[FI_RGBA_RED]   = LUT8[pixel[FI_RGBA_RED]];
                bdstpix[FI_RGBA_GREEN] = LUT8[pixel[FI_RGBA_GREEN]];
                bdstpix[FI_RGBA_BLUE]  = LUT8[pixel[FI_RGBA_BLUE]];

                //bdstpix[FI_RGBA_RED]   = ((BYTE *) LUT8)[pixel[FI_RGBA_RED]];
                //bdstpix[FI_RGBA_GREEN] = ((BYTE *) LUT8)[pixel[FI_RGBA_GREEN]];
                //bdstpix[FI_RGBA_BLUE]  = ((BYTE *) LUT8)[pixel[FI_RGBA_BLUE]];
            }
        }
    }
    if (bpp == 48) {
        c.scalepoints(256.0);
        c.clampto(0.0,65535.0);
        for (int x=0; x<65536; x++) {
            LUT16[x] = (WORD)floor(c.getpoint(x) + 0.5);
        }
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < h; y++) {
            for(unsigned x = 0; x < w; x++) {
                FIRGB16 * wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);
                FIRGB16 * pixel   = (FIRGB16 *) (srcbits + spitch*y + 6*x);
                wdstpix->red   = LUT16[pixel->red];
                wdstpix->green = LUT16[pixel->green];
                wdstpix->blue  = LUT16[pixel->blue];

                //wdstpix->red   = ((WORD *) LUT16)[pixel->red];
                //wdstpix->green = ((WORD *) LUT16)[pixel->green];
                //wdstpix->blue  = ((WORD *) LUT16)[pixel->blue];
            }
        }
    }
    return _duration();
}
double ApplyLUT(FIBITMAP *src, FIBITMAP *dst, char * LUT, int threadcount)
{
    _mark();
    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    unsigned w = FreeImage_GetWidth(src);
    unsigned h = FreeImage_GetHeight(src);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);

    BYTE LUT8[256];
    WORD LUT16[65536];
    int bpp = FreeImage_GetBPP(src);
    if (bpp == 24) {
        for (int x=0; x<256; x++) {
            LUT8[x] = ((BYTE *) LUT)[x];;
        }
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < h; y++) {
            for(unsigned x = 0; x < w; x++) {
                BYTE * bdstpix = (BYTE *) (dstbits + dpitch*y + 3*x);
                BYTE * pixel   = (BYTE *) (srcbits + spitch*y + 3*x);
                bdstpix[FI_RGBA_RED]   = LUT8[pixel[FI_RGBA_RED]];
                bdstpix[FI_RGBA_GREEN] = LUT8[pixel[FI_RGBA_GREEN]];
                bdstpix[FI_RGBA_BLUE]  = LUT8[pixel[FI_RGBA_BLUE]];

                //bdstpix[FI_RGBA_RED]   = ((BYTE *) LUT8)[pixel[FI_RGBA_RED]];
                //bdstpix[FI_RGBA_GREEN] = ((BYTE *) LUT8)[pixel[FI_RGBA_GREEN]];
                //bdstpix[FI_RGBA_BLUE]  = ((BYTE *) LUT8)[pixel[FI_RGBA_BLUE]];


            }
        }
    }
    if (bpp == 48) {
        for (int x=0; x<65536; x++) {
            LUT16[x] = ((WORD *)LUT)[x];
        }
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < h-1; y++) {
            for(unsigned x = 0; x < w-1; x++) {
                FIRGB16 * wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);
                FIRGB16 * pixel   = (FIRGB16 *) (srcbits + spitch*y + 6*x);
                wdstpix->red   = LUT16[pixel->red];
                wdstpix->green = LUT16[pixel->green];
                wdstpix->blue  = LUT16[pixel->blue];

                //wdstpix->red   = ((WORD *) LUT16)[pixel->red];
                //wdstpix->green = ((WORD *) LUT16)[pixel->green];
                //wdstpix->blue  = ((WORD *) LUT16)[pixel->blue];


            }
        }
    }
    return _duration();
}
double ApplyLUT2LUMA(FIBITMAP *src, FIBITMAP *dst, char * LUT, int threadcount)
{
    _mark();
    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    unsigned w = FreeImage_GetWidth(src);
    unsigned h = FreeImage_GetHeight(src);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);

    BYTE LUT8[256];
    WORD LUT16[65536];
    int bpp = FreeImage_GetBPP(src);
    if (bpp == 24) {
        for (int x=0; x<256; x++) {
            LUT8[x] = ((BYTE *) LUT)[x];
        }
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < h; y++) {
            for(unsigned x = 0; x < w; x++) {
                BYTE * bdstpix = (BYTE *) (dstbits + dpitch*y + 3*x);
                BYTE * pixel   = (BYTE *) (srcbits + spitch*y + 3*x);

                int lumaorig = (int) LUMA(pixel[FI_RGBA_RED],pixel[FI_RGBA_GREEN],pixel[FI_RGBA_BLUE]);
                int diff = lumaorig - LUT8[lumaorig];

                bdstpix[FI_RGBA_RED]   = std::min(std::max(bdstpix[FI_RGBA_RED] + diff,0),255);
                bdstpix[FI_RGBA_GREEN] = std::min(std::max(bdstpix[FI_RGBA_GREEN] + diff,0),255);
                bdstpix[FI_RGBA_BLUE]  = std::min(std::max(bdstpix[FI_RGBA_BLUE]  + diff,0),255);

            }
        }
    }
    if (bpp == 48) {
        for (int x=0; x<65536; x++) {
            LUT16[x] = ((WORD *)LUT)[x];
        }
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < h-1; y++) {
            for(unsigned x = 0; x < w-1; x++) {
                FIRGB16 * wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);
                FIRGB16 * pixel   = (FIRGB16 *) (srcbits + spitch*y + 6*x);

                int lumaorig = (int) LUMA(pixel->red,pixel->green,pixel->blue);
                int diff = lumaorig - LUT16[lumaorig];

                wdstpix->red   = std::min(std::max(pixel->red + diff,0),65535);
                wdstpix->green = std::min(std::max(pixel->green + diff,0),65535);
                wdstpix->blue  = std::min(std::max(pixel->blue + diff,0),65535);

            }
        }
    }
    return _duration();
}
double ApplyGray(FIBITMAP *src, FIBITMAP *dst, double redpct, double greenpct, double bluepct, int threadcount)
{
    _mark();

    int bpp = FreeImage_GetBPP(src);

    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);


    switch(bpp) {
    case 48:
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < FreeImage_GetHeight(src); y++) {
            for(unsigned x = 0; x < FreeImage_GetWidth(src); x++) {
                FIRGB16 * wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);
                FIRGB16 * pixel   = (FIRGB16 *) (srcbits + spitch*y + 6*x);

                double G = floor((double) pixel->red*redpct + (double) pixel->green*greenpct + (double) pixel->blue*bluepct)+0.5;
                if (G>65535.0) G=65535.0;
                if (G<0.0) G=0.0;

                wdstpix->red = int(G);
                wdstpix->green = int(G);
                wdstpix->blue = int(G);
            }
        }
        break;
    case 24 :
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < FreeImage_GetHeight(src); y++) {
            for(unsigned x = 0; x < FreeImage_GetWidth(src); x++) {
                BYTE * bdstpix = (BYTE *) dstbits + dpitch*y + 3*x;
                BYTE *pixel = (BYTE *) (srcbits + spitch*y + 3*x);

                double G = floor((double) pixel[FI_RGBA_RED]*redpct + (double) pixel[FI_RGBA_GREEN]*greenpct + (double) pixel[FI_RGBA_BLUE]*bluepct)+0.5;
                if (G>255.0) G=255.0;
                if (G<0.0) G=0.0;

                bdstpix[FI_RGBA_RED] = int(G);
                bdstpix[FI_RGBA_GREEN] = int(G);
                bdstpix[FI_RGBA_BLUE]= int(G);

            }
        }
        break;
    }
    return _duration();

}
Exemple #10
0
Fichier : plsub.c Projet : EQ4/SPTK
int mark(int mrk, double ax[], double ay[], int n, double f, int m)
{
   int i;

   if (mrk < 0 || mrk > 15)
      return (1);
   m = (n < 0) ? m : 1;
   if ((n = abs(n)) < 1 || m < 0)
      return (1);
   ascale(_plnorm(f * 1.75));
   arotate(0);
   for (i = 0; i < n; i += m) {
      plot(ax[i], ay[i], 3);
      _mark(mrk);
   }
   return (0);
}
Exemple #11
0
size_t draft_net2_testsend(t_clock use_tdelta, t_netspeed_bps use_speed, size_t use_size, t_clock sim_length, int dbg) { 
	_mark("Test with use_tdelta="<<use_tdelta<<" use_speed="<<use_speed<<" use_size="<<use_size);
	
	t_netspeed_bps m_net_speed = use_speed;
	t_netsize_fraction m_net_reminder = 0; // bytes that remain partially accumulated from previous iterations
	
	size_t totall_sent=0;
	t_clock clock = 0;	 // world clock in simulation
	
	size_t c=0; // cycle number
	while (true) { // simulation
		++c;
		if (clock>=sim_length) break; // end
		
		t_clock tdelta = use_tdelta;
		clock += tdelta;
		size_t packet_size = use_size;
		
		t_netsize_fraction bytes_now_part = tdelta * m_net_speed ; // bytes we transfer just now 
		t_netsize_fraction bytes_now_all = bytes_now_part + m_net_reminder; // bytes we can now transfer with reminder
		
		t_netsize_fraction send_bytes = bytes_now_all;
		
		if (dbg) _info("=== clock="<<clock<<", cycle="<<c<<", m_net_reminder=" << m_net_reminder
		               << " bytes_now_all=" << bytes_now_all );
		while (send_bytes > packet_size) { // send a packet
			if (dbg) _info("*** SENDING at clock="<<clock<<", cycle="<<c<<", m_net_reminder=" << m_net_reminder);
			totall_sent += packet_size;
			send_bytes -= packet_size;
		}
		
		if (1) { // there is any more data waiting to be sent
			if (dbg) _info("Will send reminder to send_bytes="<<send_bytes);
			m_net_reminder = send_bytes; // "start" sending remaining data - in future
		}
		
		// TODO account for in progress the reminder of time in this cycle
	}
	return totall_sent;
}
Exemple #12
0
bool draft_net2_testsend_speeds(
		vector<t_clock> tab_tdelta, vector<t_netspeed_bps> tab_speed, vector<size_t> tab_size, int dbg
		,t_clock sim_length
	)
{ 
	_mark("Starting test " <<__FUNCTION__);
	
	vector<string> error_tab;
	
	std::ostringstream oss_main;
	for(auto use_tdelta : tab_tdelta) {
		for(auto use_speed : tab_speed) {
			for(auto use_size : tab_size) {
				size_t total = draft_net2_testsend(use_tdelta, use_speed, use_size, sim_length, dbg>=2);
				std::ostringstream oss;
				oss << "tdelta="<<use_tdelta<<" use_speed="<<use_speed<<" use_size="<<use_size<<" : ";
				double avg_speed = total / sim_length;
				double error = std::fabs( (avg_speed - use_speed) / use_speed );
				oss << " avg="<<avg_speed<<" bps, error="<<error;
				string msg = oss.str();
				
				if (error > 0.03) error_tab.push_back(msg);
				
				oss_main << msg << "\n";
				if (dbg >= 2) _info( msg );
			}
		}
	}
	_info("Sim results:\n" << oss_main.str());
	
	for (const auto & e : error_tab) _info("Error was: " << e);
	if (error_tab.size()) {
		_info("Found " << error_tab.size() << " errors."); 
		return false;
	} else _info("All in norm :)");
	return true;
}
Exemple #13
0
/// @brief This function tests the code from this file.
unique_ptr<c_world> draft_net2() { // the main function for test
/*	
	if (! draft_net2_testsend_alltests()) {
		_erro("Unit test failed!");
		return 0;
	}
	return 0; // !
*/	
    _mark("Starting test " <<__FUNCTION__);

    t_drawtarget_type drawtarget_type = e_drawtarget_type_allegro;
    c_simulation simulation(drawtarget_type);

    unique_ptr<c_world> world_ptr = make_unique<c_world>(simulation);
    c_world & world = * world_ptr;
	
	
	world.add_node("nodeA",100,100); // ***
	world.add_node("nodeB",150,200);
	world.add_node("nodeC1",300,300);
	world.add_node("nodeC2",300,350);
	world.add_node("nodeC3",300,400);
	world.add_node("nodeC4",300,450);
	world.add_node("nodeD", 50,200);
	world.add_node("nodeE",400,100); // ***

	{ int i=0, a=80, x0=500, y0=120;
	world.add_node("nodeF1",x0,y0+(a*i++));
	world.add_node("nodeF2",x0,y0+(a*i++));
	world.add_node("nodeF3",x0,y0+(a*i++));
	world.add_node("nodeF4",x0,y0+(a*i++));
	world.add_node("nodeF5",x0,y0+(a*i++));
	world.add_node("nodeF6",x0,y0+(a*i++));
	world.add_node("nodeF7",x0,y0+(a*i++));
	}

	world.add_node("nodeG1",650,100);
	world.add_node("nodeG2",650,300);

	world.add_node("nodeP",750,500);
	world.add_node("nodeX",800,500);
	
	world.add_osi2_switch("swA", 200,100);
	world.add_osi2_switch("swB", 300,100);
	world.add_osi2_switch("swC", 200,300);
	world.add_osi2_switch("swD", 300,200);


	
	_mark("Connecting devices");
	world.connect_network_devices("nodeA","swA", 1);
	world.connect_network_devices("nodeB","swA", 1);
	world.connect_network_devices("swA","swB", 1);
	world.connect_network_devices("swB","swD", 1);
	world.connect_network_devices("nodeA","nodeD", 1);
	world.connect_network_devices("swA","swC", 1);
	world.connect_network_devices("swC","nodeC1", 1);
	world.connect_network_devices("swC","nodeC2", 1);
	world.connect_network_devices("swC","nodeC3", 1);
	world.connect_network_devices("swC","nodeC4", 1);
	world.connect_network_devices("swD","nodeE", 1); // ***

	world.connect_network_devices("swD","nodeF1", 100);
	world.connect_network_devices("swD","nodeF2", 2);
	world.connect_network_devices("swD","nodeF3", 100);

	world.connect_network_devices("nodeF1","nodeF2", 1);
	world.connect_network_devices("nodeF2","nodeF3", 1);
	world.connect_network_devices("nodeF3","nodeF4", 1);
	world.connect_network_devices("nodeF4","nodeF5", 1);

	world.connect_network_devices("nodeF5","nodeG2", 1);
	world.connect_network_devices("nodeG2","nodeG1", 1);

	world.connect_network_devices("nodeG1","nodeP", 1);
	world.connect_network_devices("swD","nodeP", 50);
	world.connect_network_devices("nodeP","nodeX", 2);

	
	_mark("Testing - show object:");
	_info( world.find_object_by_name_as_switch("swA") );
	
	_mark("Testing - show object:");
	_info( world.find_object_by_name_as_switch("nodeA") );
	
	_mark("Find route:");
	t_osi2_route_result route = world.route_find_route_between(
		world.find_object_by_name_as_switch("nodeA"),
		world.find_object_by_name_as_switch("nodeE")
	);
	

	t_osi2_data data( std::string("HELLOWORLD") );
	/*
	_mark("Testing - send data:");
	world.find_object_by_name_as_switch("nodeA").send_data(
		world.find_object_by_name_as_switch("nodeE").get_uuid_any(), 
		data);
	*/
	
	_mark("Testing - show object:");
	_info( world.find_object_by_name_as_switch("swA") );

	c_dijkstry01 ( world.find_object_by_name_as_switch("nodeA") ,
			  world.find_object_by_name_as_switch("nodeX") );

#if 0
	world.connect_network_devices("","");
#endif
	
//	world.serialize(std::cout);
	
	
	/***
	 * 
	 * (outdated now - more elements are added)
	 * 
	 *  NodeA           SwitchA         SwitchB 
	 *   nic#0 -------> nic#0 --------> nic#0 ----------------> SwitchD 
	 *   nic#1 ---,     nic#1 --,       nic#1 ---------> NodeB  nic#0 -----> NodeE
	 *            |             |
	 *            |             |
	 *            |             |       SwitchC 
	 *            '--> NodeD    `-----> nic#0 -----> NodeC1
	 *                                  nic#1 -----> NodeC2
	 *                                  nic#2 -----> NodeC3
	 *                                  nic#3 -----> NodeC4
	 * 
	 * 
	 */
	
	
	return std::move(world_ptr);
}
double ApplyNLMeans(FIBITMAP *src, FIBITMAP *dst, double sigma, int local, int patch, int threadcount)
{
    _mark();
    int bpp = FreeImage_GetBPP(src);

    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);
    unsigned iw = FreeImage_GetWidth(src);
    unsigned ih = FreeImage_GetHeight(src);

    double sigma2 = pow(2*sigma,2);

    //y|x upper|lower bound computations, used to offset patch to avoid out-of-image references
    unsigned yplb = patch+local+1;
    unsigned ypub = ih-yplb;
    unsigned xplb = yplb;
    unsigned xpub = iw-xplb;

    switch(bpp) {
    case 48:
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = local; y < ih-local; y++) {
            unsigned py = y;
            if (py<yplb) py = yplb;
            if (py>ypub) py = ypub;
            for(unsigned x = local; x < iw-local; x++) {
                unsigned px = x;
                if (px<xplb) px = xplb;
                if (px>xpub) px = xpub;
                FIRGB16 *wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);

                double valueR = 0.0;
                double valueG = 0.0;
                double valueB = 0.0;
                double sum_weightsR = 0.0;
                double sum_weightsG = 0.0;
                double sum_weightsB = 0.0;
                for (int q = -local; q<=local; ++q) {
                    for (int p = -local; p<=local; ++p) {
                        double diffR = 0.0;
                        double diffG = 0.0;
                        double diffB = 0.0;
                        for (int s = -patch; s<=patch; ++s) {
                            for (int r = -patch; r<=patch; ++r) {
                                FIRGB16 *ppix = (FIRGB16 *) (srcbits + spitch*(py+q+s) + 6*(px+p+r));
                                FIRGB16 *lpix = (FIRGB16 *) (srcbits + spitch*(py+s) + 6*(px+r));
                                diffR += pow((float) (ppix->red/256 - lpix->red/256),2);
                                diffG += pow((float) (ppix->green/256 - lpix->green/256),2);
                                diffB += pow((float) (ppix->blue/256 - lpix->blue/256),2);
                                //gmic: diff += pow(i[x+p+r,y+q+s] - i[x+r,y+s],2);

                            }
                        }
                        double weightR = exp(-diffR/sigma2);
                        double weightG = exp(-diffG/sigma2);
                        double weightB = exp(-diffB/sigma2);
                        FIRGB16 *localpix = (FIRGB16 *) (srcbits + spitch*(y+q) + 6*(x+p));
                        valueR += weightR*localpix->red/256;
                        valueG += weightG*localpix->green/256;
                        valueB += weightB*localpix->blue/256;
                        //gmic: value += weight*i(x+p,y+q);
                        sum_weightsR += weightR;
                        sum_weightsG += weightG;
                        sum_weightsB += weightB;

                    }
                }
                wdstpix->red   = int((valueR/(1e-5 + sum_weightsR))*256);
                wdstpix->green = int((valueG/(1e-5 + sum_weightsG))*256);
                wdstpix->blue  = int((valueB/(1e-5 + sum_weightsB))*256);
            }
        }
        break;
    case 24 :
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = local; y < ih-local; y++) {
            unsigned py = y;
            if (py<yplb) py = yplb;
            if (py>ypub) py = ypub;
            for(unsigned x = local; x < iw-local; x++) {
                unsigned px = x;
                if (px<xplb) px = xplb;
                if (px>xpub) px = xpub;
                BYTE *bdstpix = (BYTE *) (dstbits + dpitch*y + 3*x);

                double valueR = 0.0;
                double valueG = 0.0;
                double valueB = 0.0;
                double sum_weightsR = 0.0;
                double sum_weightsG = 0.0;
                double sum_weightsB = 0.0;

                for (int q = -local; q<=local; ++q) {
                    for (int p = -local; p<=local; ++p) {
                        double diffR = 0;
                        double diffG = 0;
                        double diffB = 0;
                        for (int s = -patch; s<=patch; ++s) {
                            for (int r = -patch; r<=patch; ++r) {
                                BYTE *ppix = (BYTE *) (srcbits + spitch*(py+q+s) + 3*(px+p+r));
                                BYTE *lpix = (BYTE *) (srcbits + spitch*(py+s) + 3*(px+r));
                                diffR += pow((float) (ppix[FI_RGBA_RED] - lpix[FI_RGBA_RED]),2);
                                diffG += pow((float) (ppix[FI_RGBA_GREEN] - lpix[FI_RGBA_GREEN]),2);
                                diffB += pow((float) (ppix[FI_RGBA_BLUE] - lpix[FI_RGBA_BLUE]),2);
                                //gmic: diff += pow(i[x+p+r,y+q+s] - i[x+r,y+s],2);
                            }
                        }
                        double weightR = exp(-diffR/sigma2);
                        double weightG = exp(-diffG/sigma2);
                        double weightB = exp(-diffB/sigma2);
                        BYTE *localpix = (BYTE *) (srcbits + spitch*(y+q) + 3*(x+p));
                        valueR += weightR*localpix[FI_RGBA_RED];
                        valueG += weightG*localpix[FI_RGBA_GREEN];
                        valueB += weightB*localpix[FI_RGBA_BLUE];
                        //gmic: value += weight*i(x+p,y+q);
                        sum_weightsR += weightR;
                        sum_weightsG += weightG;
                        sum_weightsB += weightB;
                    }
                }
                bdstpix[FI_RGBA_RED]   = (BYTE) (valueR/(1e-5 + sum_weightsR));
                bdstpix[FI_RGBA_GREEN] = (BYTE) (valueG/(1e-5 + sum_weightsG));
                bdstpix[FI_RGBA_BLUE]  = (BYTE) (valueB/(1e-5 + sum_weightsB));
            }
        }
        break;
    }
    return _duration();

}
double ApplySaturation(FIBITMAP *src, FIBITMAP *dst, double saturate, int threadcount)
{
    _mark();

    int bpp = FreeImage_GetBPP(src);

    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);


    switch(bpp) {
    case 48:
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < FreeImage_GetHeight(src); y++) {
            for(unsigned x = 0; x < FreeImage_GetWidth(src); x++) {
                FIRGB16 * wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);
                FIRGB16 * pixel   = (FIRGB16 *) (srcbits + spitch*y + 6*x);

                double R = (double) pixel->red;
                double G = (double) pixel->green;
                double B = (double) pixel->blue;

                double  P=sqrt(
                              R*R*Pr+
                              G*G*Pg+
                              B*B*Pb ) ;

                R=P+(R-P)*saturate;
                G=P+(G-P)*saturate;
                B=P+(B-P)*saturate;

                if (R>65535.0) R=65535.0;
                if (G>65535.0) G=65535.0;
                if (B>65535.0) B=65535.0;
                if (R<0.0) R=0.0;
                if (G<0.0) G=0.0;
                if (B<0.0) B=0.0;
                wdstpix->red = int(R);
                wdstpix->green = int(G);
                wdstpix->blue = int(B);
            }
        }
        break;
    case 24 :
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 0; y < FreeImage_GetHeight(src); y++) {
            for(unsigned x = 0; x < FreeImage_GetWidth(src); x++) {
                BYTE * bdstpix = (BYTE *) dstbits + dpitch*y + 3*x;
                BYTE *pixel = (BYTE *) (srcbits + spitch*y + 3*x);

                double R = (double) pixel[FI_RGBA_RED];
                double G = (double) pixel[FI_RGBA_GREEN];
                double B = (double) pixel[FI_RGBA_BLUE];

                double  P=sqrt(
                              R*R*Pr+
                              G*G*Pg+
                              B*B*Pb ) ;

                R=P+(R-P)*saturate;
                G=P+(G-P)*saturate;
                B=P+(B-P)*saturate;

                if (R>255.0) R=255.0;
                if (G>255.0) G=255.0;
                if (B>255.0) B=255.0;
                if (R<0.0) R=0.0;
                if (G<0.0) G=0.0;
                if (B<0.0) B=0.0;
                bdstpix[FI_RGBA_RED] = int(R);
                bdstpix[FI_RGBA_GREEN] = int(G);
                bdstpix[FI_RGBA_BLUE]= int(B);
            }
        }
        break;
    }
    return _duration();

}
Exemple #16
0
// we assume we are already locked when inside here
// so we DO not call ENTER / LEAVE
int
DBFmalloc_mark(const char *func, const char *file, int line,
               ulong_t top, int todo)
{
    int			  rtn = 0;
    mse_t 		 *roots;
    int			  nroots;
    Block 		* bp;
    int			  nb;

    int i = 0;
    unsigned int start, end;
    int count=0;
    int cache = 0;

    extern int		  _malloc_scan_start();
    extern int		  _malloc_scan_finish();

    MALLOC_INIT();

    /*
     * Mark all the nodes as unreferenced at the start.
     * Make sure the malloc chain is valid or we will be in for trouble
     */
    if ((rtn = DBFmalloc_mark_all("DBFmalloc_mark", file, line, todo, 0)) != 0) {
        return rtn;
    }

    if ((roots = alloca(MAX_ROOTS * sizeof *roots)) == NULL) {
        return 0;
    }
    mc_cache_clear();
    cache = mc_get_cache_size();
    mc_set_cache(0);
    nroots = _malloc_scan_start(roots, MAX_ROOTS, top);

    _mark_stack_create();

    /*
     * We go through each root of the root set.
     * We never mark more than one page of a root at a time to avoid
     * having its unmarked children overflowing the mark stack.
     */

    start = roots[i].mse_start;
    end = roots[i].mse_end;
    if (end > start + __pagesize) end = start + __pagesize;

    while (i < nroots) {
        _mark_stack_push(start, end);

        count++;
        /* _mark will find every heap node reachable from the root
         * that was pushed onto the mark stack.
         */
        rtn += _mark(func, file, line, todo);
        start += __pagesize;
        if (start >= roots[i].mse_end) {
            i++;
            start = roots[i].mse_start;
            end = roots[i].mse_end;
            if (end > start + __pagesize) end = start + __pagesize;
        } else {
            end += __pagesize;
            if (end > roots[i].mse_end) end = roots[i].mse_end;
        }
    }
    _mark_stack_destroy();

//    /*
//     * Go through every Block in every Band and mark it
//     *  - this is because it's an internal structure and shouldn't be
//     *    reported as a leak
//     */
//    for (nb = 0; nb < *__pnband; nb++)
//    {
//	Band  *band;
//
//	band = __pBands[nb];
//
//	/*
//	 * For each Block on the allocated list
//	 */
//        for (bp = band->alist; bp; bp = bp->next)
//        {
//	    Dhead *dh = (Dhead *)bp - 1;
//            dh->d_debug.flag |= M_REFERENCED;
//        }
//
//	/*
//	 * For each Block on the depleted list
//	 */
//        for (bp = band->dlist; bp; bp = bp->next)
//        {
//	    Dhead *dh = (Dhead *)bp - 1;
//            dh->d_debug.flag |= M_REFERENCED;
//        }
//    }

    _malloc_scan_finish();
    mc_set_cache(cache);
    return rtn;
} /* malloc_mark(... */
double ApplyKernel(FIBITMAP *src, FIBITMAP *dst, double kernel[3][3], int threadcount)
{
    _mark();

    int bpp = FreeImage_GetBPP(src);

    unsigned spitch = FreeImage_GetPitch(src);
    unsigned dpitch = FreeImage_GetPitch(dst);
    BYTE * srcbits = FreeImage_GetBits(src);
    BYTE * dstbits = FreeImage_GetBits(dst);

    switch(bpp) {
    case 48:
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 1; y < FreeImage_GetHeight(src)-1; y++) {
            for(unsigned x = 1; x < FreeImage_GetWidth(src)-1; x++) {
                FIRGB16 *wdstpix = (FIRGB16 *) (dstbits + dpitch*y + 6*x);
                double R=0.0;
                double G=0.0;
                double B=0.0;
                for (unsigned kx=0; kx<3; kx++) {
                    int ix=kx*3;
                    for (int ky=0; ky<3; ky++) {
                        int i = ix+ky;
                        FIRGB16 *pixel = (FIRGB16 *) (srcbits + spitch*(y-1+ky) + 6*(x-1+kx));
                        R += pixel->red   * kernel[kx][ky];
                        G += pixel->green * kernel[kx][ky];
                        B += pixel->blue  * kernel[kx][ky];
                    }
                    wdstpix->red   = std::min(std::max(int(R), 0), 65535);
                    wdstpix->green = std::min(std::max(int(G), 0), 65535);
                    wdstpix->blue  = std::min(std::max(int(B), 0), 65535);
                }

            }
        }
        break;
    case 24 :
        #pragma omp parallel for num_threads(threadcount)
        for(unsigned y = 1; y < FreeImage_GetHeight(src)-1; y++) {
            for(unsigned x = 1; x < FreeImage_GetWidth(src)-1; x++) {
                BYTE *bdstpix = (BYTE *) dstbits + dpitch*y + 3*x;
                double R=0.0;
                double G=0.0;
                double B=0.0;
                for (unsigned kx=0; kx<3; kx++) {
                    int ix=kx*3;
                    for (int ky=0; ky<3; ky++) {
                        int i = ix+ky;
                        BYTE *pixel = (BYTE *) srcbits + spitch*(y-1+ky) + 3*(x-1+kx);
                        R += pixel[FI_RGBA_RED]   * kernel[kx][ky];
                        G += pixel[FI_RGBA_GREEN] * kernel[kx][ky];
                        B += pixel[FI_RGBA_BLUE]  * kernel[kx][ky];
                    }
                    bdstpix[FI_RGBA_RED]   = std::min(std::max(int(R), 0), 255);
                    bdstpix[FI_RGBA_GREEN] = std::min(std::max(int(G), 0), 255);
                    bdstpix[FI_RGBA_BLUE]  = std::min(std::max(int(B), 0), 255);
                }
            }
        }
        break;
    }
    return _duration();
}