diff options
Diffstat (limited to 'testbed/testthread.cpp')
-rw-r--r-- | testbed/testthread.cpp | 148 |
1 files changed, 108 insertions, 40 deletions
diff --git a/testbed/testthread.cpp b/testbed/testthread.cpp index 435445c..d553567 100644 --- a/testbed/testthread.cpp +++ b/testbed/testthread.cpp @@ -1,52 +1,120 @@ #include <windows.h> -#include "lcms.h" +#include "lcms2_plugin.h" -static cmsHPROFILE prof_xyz,prof_rgb; -static cmsHTRANSFORM trans_xyz_to_rgb,trans_rgb_to_xyz; +static cmsContext ctx; +static cmsHPROFILE prof_cmyk, prof_rgb; +static volatile int rc = 0; -static DWORD WINAPI make_trans_xyz_to_rgb(LPVOID lpParameter) + +static +void* MyMtxCreate(cmsContext id) { - trans_xyz_to_rgb = cmsCreateTransform( - prof_xyz,TYPE_XYZ_DBL, - prof_rgb,TYPE_RGB_DBL, - INTENT_ABSOLUTE_COLORIMETRIC,cmsFLAGS_NOTPRECALC); - return 0; + return (void*) CreateMutex( NULL, FALSE, NULL); } -static DWORD WINAPI make_trans_rgb_to_xyz(LPVOID lpParameter) +static +void MyMtxDestroy(cmsContext id, void* mtx) { - trans_rgb_to_xyz = cmsCreateTransform( - prof_rgb,TYPE_RGB_DBL, - prof_xyz,TYPE_XYZ_DBL, - INTENT_ABSOLUTE_COLORIMETRIC,cmsFLAGS_NOTPRECALC); - return 0; + CloseHandle((HANDLE) mtx); +} + +static +cmsBool MyMtxLock(cmsContext id, void* mtx) +{ + WaitForSingleObject((HANDLE) mtx, INFINITE); + return TRUE; +} + +static +void MyMtxUnlock(cmsContext id, void* mtx) +{ + ReleaseMutex((HANDLE) mtx); +} + + +static cmsPluginMutex MutexPluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, + + MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock +}; + + +static DWORD WINAPI one_thread(LPVOID lpParameter) +{ + int i, j; + cmsUInt8Number rgb[3*1000]; + cmsUInt8Number cmyk[4*1000]; + + Sleep(rand() % 500 ); + cmsHTRANSFORM xform = cmsCreateTransformTHR(ctx, prof_rgb, TYPE_RGB_8, prof_cmyk, TYPE_CMYK_8, 0, 0); + + for (i=0; i < 10000; i++) { + + for (j=0; j < 1000; j++) + { + rgb[j * 3 ] = 189; + rgb[j * 3 + 1] = 100; + rgb[j * 3 + 2] = 75; + } + cmsDoTransform(xform, rgb, cmyk, 1000); + for (j=0; j < 1000; j++) + { + if (cmyk[j * 4 ] != 37 || + cmyk[j * 4 + 1 ] != 188 || + cmyk[j * 4 + 2 ] != 195 || + cmyk[j * 4 + 3 ] != 7) + { + OutputDebugString(L"ERROR\n"); + rc = 1; + } + + } + + } + + cmsDeleteTransform(xform); + + return 0; } -int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR -lpCmdLine,int nCmdShow) +int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { - prof_xyz = cmsCreateXYZProfile(); - prof_rgb = cmsOpenProfileFromFile("AdobeRGB1998.icc","rb"); -//cmsCreate_sRGBProfile(); - for (int i=0;i<10;++i) - { -#define try_threads -#ifdef try_threads - DWORD threadid; - HANDLE workers[2]; - workers[0] = CreateThread(NULL,0,make_trans_xyz_to_rgb,NULL,0,&threadid); - workers[1] = CreateThread(NULL,0,make_trans_rgb_to_xyz,NULL,0,&threadid); - WaitForMultipleObjects(2,workers,TRUE,INFINITE); - for (unsigned i=0;i<2;++i) - CloseHandle(workers[i]); -#else - make_trans_xyz_to_rgb(0); - make_trans_rgb_to_xyz(0); -#endif - cmsDeleteTransform(trans_xyz_to_rgb); - cmsDeleteTransform(trans_rgb_to_xyz); - } - cmsCloseProfile(prof_rgb); - cmsCloseProfile(prof_xyz); + int i; + cmsContext ctx; + + OutputDebugString(L"Test in progress...\n"); + + ctx = cmsCreateContext(&MutexPluginSample, 0); + + prof_cmyk = cmsOpenProfileFromFileTHR(ctx, "USWebCoatedSWOP.icc", "r"); + prof_rgb = cmsOpenProfileFromFileTHR(ctx, "AdobeRGB1998.icc","r"); + + +#define NWORKERS 10 + + HANDLE workers[NWORKERS]; + + + for (int i=0; i<NWORKERS; ++i) + { + DWORD threadid; + + workers[i] = CreateThread(NULL,0,one_thread,NULL,0,&threadid); + } + + WaitForMultipleObjects(NWORKERS,workers,TRUE,INFINITE); + + for ( i=0;i<NWORKERS;++i) + CloseHandle(workers[i]); + + + cmsCloseProfile(prof_rgb); + cmsCloseProfile(prof_cmyk); + cmsDeleteContext(ctx); + + OutputDebugString(L"Test Done\n"); + + return rc; } |