Thread: [Lcms-user] Problem in method wrapper for c# application
An ICC-based CMM for color management
Brought to you by:
mm2
From: Devon Y. <9to...@gm...> - 2013-02-22 20:37:04
|
Hi guys, I wanted to use the smart function, "cmsDoTransform", in c# so I made my own wrapper and tried it. But while the program is running, *the first call works fine* but *the second call throws "System.AccessViolationException".* Please take a look at my code in C++ wrapper and let me know what I am missing. Thanks in advance! code in c++: extern "C" __declspec(dllexport) void ToneMapping(int* intPtr, int size, char* icc1, int len_icc1, char* icc2, int len_icc2) { char* icc_1 = (char*)malloc(sizeof(char)*len_icc1 +1); char* icc_2 = (char*)malloc(sizeof(char)*len_icc2 +1); memcpy(icc_1, icc1, len_icc1); memcpy(icc_2, icc2, len_icc2); cmsHPROFILE hInProfile, hOutProfile; cmsHTRANSFORM hTransform; hInProfile = cmsOpenProfileFromFile(icc_2, "r"); hOutProfile = cmsOpenProfileFromFile(icc_1, "r"); hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_8, hOutProfile, TYPE_BGR_8, INTENT_PERCEPTUAL, 0); cmsDoTransform(hTransform, intPtr, intPtr, size); free(icc_1); free(icc_2); } |
From: Christian S. <rea...@mo...> - 2013-02-22 20:56:34
|
On 22.02.2013, at 21:36, Devon Yoo <9to...@gm...> wrote: > char* icc_1 = (char*)malloc(sizeof(char)*len_icc1 +1); > char* icc_2 = (char*)malloc(sizeof(char)*len_icc2 +1); nil checks after malloc? > hInProfile = cmsOpenProfileFromFile(icc_2, "r"); > hOutProfile = cmsOpenProfileFromFile(icc_1, "r"); nil checks after opening profile? > hTransform = cmsCreateTransform(hInProfile, > TYPE_BGR_8, > hOutProfile, > TYPE_BGR_8, > INTENT_PERCEPTUAL, 0); Nil check after transform? > free(icc_1); > free(icc_2); You need to verify that results are valid! Greetings Christian -- Read our blog about news on our plugins: http://www.mbsplugins.de/ |
From: Devon Y. <9to...@gm...> - 2013-02-22 21:57:33
|
Thanks for the reply. I totally had to do the nill check where you pointed out. But that does not solve the problem either. Here's the new code: extern "C" __declspec(dllexport) int ToneMapping(int* intPtr, int size, char* icc1, int len_icc1, char* icc2, int len_icc2) { char* icc_1 = NULL; char* icc_2 = NULL; icc_1 = (char*)malloc(sizeof(char)*len_icc1 +1); icc_2 = (char*)malloc(sizeof(char)*len_icc2 +1); if(icc_1 == NULL || icc_2 == NULL) return -1; memcpy(icc_1, icc1, len_icc1); memcpy(icc_2, icc2, len_icc2); cmsHPROFILE hInProfile = NULL; cmsHPROFILE hOutProfile = NULL; cmsHTRANSFORM hTransform = NULL; hInProfile = cmsOpenProfileFromFile(icc_2, "r"); hOutProfile = cmsOpenProfileFromFile(icc_1, "r"); if(hInProfile == NULL || hOutProfile == NULL) return -2; hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_8, hOutProfile, TYPE_BGR_8, INTENT_PERCEPTUAL, 0); if(hTransform == NULL) return -3; cmsDoTransform(hTransform, intPtr, intPtr, size); free(icc_1); free(icc_2); free(hInProfile); free(hOutProfile); free(hTransform); return 1; } it's first call returns 1 which means it works fine. But the next calls return -2 which means "cmsOpenProfileFromFile" gives NULL. Do you know why it happens? On Fri, Feb 22, 2013 at 12:56 PM, Christian Schmitz < rea...@mo...> wrote: > > On 22.02.2013, at 21:36, Devon Yoo <9to...@gm...> wrote: > > > char* icc_1 = (char*)malloc(sizeof(char)*len_icc1 +1); > > char* icc_2 = (char*)malloc(sizeof(char)*len_icc2 +1); > > nil checks after malloc? > > > hInProfile = cmsOpenProfileFromFile(icc_2, "r"); > > hOutProfile = cmsOpenProfileFromFile(icc_1, "r"); > > nil checks after opening profile? > > > hTransform = cmsCreateTransform(hInProfile, > > > TYPE_BGR_8, > > > hOutProfile, > > > TYPE_BGR_8, > > > INTENT_PERCEPTUAL, 0); > > Nil check after transform? > > > free(icc_1); > > free(icc_2); > > You need to verify that results are valid! > > Greetings > Christian > > -- > Read our blog about news on our plugins: > > http://www.mbsplugins.de/ > > |
From: Christian S. <rea...@mo...> - 2013-02-22 22:38:22
|
On 22.02.2013, at 22:57, Devon Yoo <9to...@gm...> wrote: > Thanks for the reply. I totally had to do the nill check where you pointed out. But that does not solve the problem either. How about debugging? or print debug messages? FInd a way to find the line where it happens. > free(hInProfile); > free(hOutProfile); > free(hTransform); This is wrong. Use the dedicated functions for freeing transforms or profiles. Greetings Christian -- Read our blog about news on our plugins: http://www.mbsplugins.de/ |
From: Devon Y. <9to...@gm...> - 2013-02-22 22:38:36
|
Basically the icc file cannot be opened because it is in use by vshost.exe which means free(hInProfile);free(hOutProfile);free(hTransform); is wrong just like you said. I have actually tried to find the right freeing function for transforms and profiles but coudlnt find any. Can you tell me anything you know of? On Fri, Feb 22, 2013 at 2:34 PM, Christian Schmitz < rea...@mo...> wrote: > > On 22.02.2013, at 22:57, Devon Yoo <9to...@gm...> wrote: > > > Thanks for the reply. I totally had to do the nill check where you > pointed out. But that does not solve the problem either. > > How about debugging? > or print debug messages? > > FInd a way to find the line where it happens. > > > free(hInProfile); > > free(hOutProfile); > > free(hTransform); > > This is wrong. Use the dedicated functions for freeing transforms or > profiles. > > > Greetings > Christian > > -- > Read our blog about news on our plugins: > > http://www.mbsplugins.de/ > > |
From: Christian S. <rea...@mo...> - 2013-02-22 23:18:34
|
On 22.02.2013, at 23:38, Devon Yoo <9to...@gm...> wrote: > I have actually tried to find the right freeing function for transforms and profiles but coudlnt find any. Can you tell me anything you know of? Please look into lcms2.h and search for delete or free or close. You probably find functions. Greetings Christian |
From: Sebastien L. <sl...@po...> - 2013-02-23 08:57:27
|
Hi Devon, Just call cmsCloseProfile(hInProfile) and cmsCloseProfile(hOutProfile) after your call to cmsCreateTransform (lcms keep an internal reference to the profiles used by any allocated transform) And call cmsDeleteTransform(hTransform) once cmsDoTransform is done. If the 2 icc profiles are the same each time you call the function, to optimize, you may split your function in 2 functions : - one to setup the transform (called once. hProfile are allocated, used to create the transform and released) - another one to use it (called as much as you need). And when you quit the application, you may delete the hTransform... Read lcms documentation. It is very well explained. (RTFM) Regards Sébastien |