int run_blur(int c, char* src, char* dst){ BMP* bmp = bmp_read(src); if(bmp==0) { return -1;} // open error uint8_t* data = bmp_get_data(bmp); uint32_t h = *(bmp_get_h(bmp)); uint32_t w = *(bmp_get_w(bmp)); if(w%4!=0) { return -1;} // do not support padding uint8_t* dataC = 0; if(*(bmp_get_bitcount(bmp)) == 24) { dataC = malloc(sizeof(uint8_t)*4*h*w); to32(w,h,data,dataC); } else { dataC = data; } if(c==0) C_blur(w,h,dataC); else if(c==1) ASM_blur1(w,h,dataC); else if(c==2) ASM_blur2(w,h,dataC); else {return -1;} if(*(bmp_get_bitcount(bmp)) == 24) { to24(w,h,dataC,data); free(dataC); } bmp_save(dst,bmp); bmp_delete(bmp); return 0; }
int run_blur(int c, char* src, char* dst, int times){ BMP* bmp = bmp_read(src); if(bmp==0) { return -1;} // open error uint8_t* data = bmp_get_data(bmp); uint32_t h = *(bmp_get_h(bmp)); uint32_t w = *(bmp_get_w(bmp)); if(w%4!=0) { return -1;} // do not support padding uint8_t* dataC = 0; if(*(bmp_get_bitcount(bmp)) == 24) { dataC = malloc(sizeof(uint8_t)*4*h*w); to32(w,h,data,dataC); } else { dataC = data; } unsigned long start, end; switch(c){ case 0: RDTSC_START(start); C_blur(w,h,dataC); RDTSC_STOP(end); break; case 1: RDTSC_START(start); ASM_blur1(w,h,dataC); RDTSC_STOP(end); break; case 2: RDTSC_START(start); ASM_blur2(w,h,dataC); RDTSC_STOP(end); break; default: // return -1; break; } unsigned long delta = end - start; printf("%lu", delta); if(*(bmp_get_bitcount(bmp)) == 24) { to24(w,h,dataC,data); free(dataC); } bmp_delete(bmp); return 0; }