| #include <stdlib.h> |
| #include <time.h> |
| #include "sum.h" |
| #include "lcms.h" |
| #include "qcms.h" |
| |
| int main(int argc, char **argv) |
| { |
| char *input_path = argv[1]; |
| char *output_path = argv[2]; |
| |
| qcms_profile *input_profile, *output_profile; |
| qcms_transform *transform; |
| #define ALL |
| #ifndef ALL |
| #define LENGTH 1 |
| #else |
| #define LENGTH (256*256*256) |
| #endif |
| static unsigned char src[LENGTH*3]; |
| static unsigned char qoutput[LENGTH*3]; |
| static unsigned char loutput[LENGTH*3]; |
| #ifdef ALL |
| int i,j,k,l=0; |
| for (i=0; i<256; i++) { |
| for (j=0; j<256; j++) { |
| for (k=0; k<256; k++) { |
| src[l++] = i; |
| src[l++] = j; |
| src[l++] = k; |
| } |
| } |
| } |
| #else |
| int i; |
| src[0] = 19; |
| src[1] = 28; |
| src[2] = 56; |
| #endif |
| clock_t lcms_start = clock(); |
| cmsHPROFILE linput_profile, loutput_profile; |
| cmsHTRANSFORM transformFixed; |
| linput_profile = cmsOpenProfileFromFile(input_path, "r"); |
| loutput_profile = cmsOpenProfileFromFile(output_path, "r"); |
| #if 0 |
| cmsPrecacheProfile(loutput_profile, CMS_PRECACHE_LI168_REVERSE); |
| cmsPrecacheProfile(linput_profile, CMS_PRECACHE_LI8F_FORWARD); |
| int flags = cmsFLAGS_FLOATSHAPER; |
| #else |
| int flags = 0; |
| #endif |
| transformFixed = cmsCreateTransform( |
| linput_profile, TYPE_RGB_8, |
| loutput_profile, TYPE_RGB_8, |
| INTENT_RELATIVE_COLORIMETRIC, flags); |
| #if 0 |
| QCMS_INTENT_PERCEPTUAL = 0, |
| QCMS_INTENT_RELATIVE_COLORIMETRIC = 1, |
| QCMS_INTENT_SATURATION = 2, |
| QCMS_INTENT_ABSOLUTE_COLORIMETRIC = 3 |
| |
| #endif |
| cmsDoTransform(transformFixed, src, loutput, LENGTH); |
| clock_t lcms_time = clock() - lcms_start; |
| clock_t qcms_start = clock(); |
| input_profile = qcms_profile_from_path(input_path); |
| output_profile = qcms_profile_from_path(output_path); |
| qcms_profile_precache_output_transform(output_profile); |
| |
| transform = qcms_transform_create(input_profile, QCMS_DATA_RGB_8, output_profile, QCMS_DATA_RGB_8, QCMS_INTENT_PERCEPTUAL); |
| qcms_transform_data(transform, src, qoutput, LENGTH); |
| clock_t qcms_time = clock() - qcms_start; |
| printf("lcms: %ld\n", lcms_time); |
| printf("qcms: %ld\n", qcms_time); |
| int total_diff = 0; |
| for (i=0; i<LENGTH; i++) { |
| int diff = 0; |
| diff += abs(loutput[i*3]-qoutput[i*3]); |
| diff += abs(loutput[i*3+1]-qoutput[i*3+1]); |
| diff += abs(loutput[i*3+2]-qoutput[i*3+2]); |
| total_diff += diff; |
| if (diff > 3) { |
| printf("differing output(%d): (%d %d %d) -> l(%d %d %d) vs. q(%d %d %d)\n", |
| diff, src[i*3], src[i*3+1], src[i*3+2], |
| loutput[i*3], loutput[i*3+1], loutput[i*3+2], |
| qoutput[i*3], |
| qoutput[i*3+1], |
| qoutput[i*3+2]); |
| //exit(1); |
| } |
| } |
| printf("%d - %f\n", total_diff, (double)total_diff/LENGTH); |
| qcms_profile_release(input_profile); |
| qcms_profile_release(output_profile); |
| return 0; |
| } |