]> granicus.if.org Git - imagemagick/commitdiff
https://github.com/ImageMagick/ImageMagick/issues/44
authorCristy <urban-warrior@imagemagick.org>
Tue, 6 Oct 2015 11:52:01 +0000 (07:52 -0400)
committerCristy <urban-warrior@imagemagick.org>
Tue, 6 Oct 2015 11:52:01 +0000 (07:52 -0400)
MagickCore/configure.c
MagickCore/module.c
MagickCore/opencl.c

index 8fa7728bf5589bb3e2b0665e4fdf09dc53a6adcf..d51e227ae7837eda7dabe5e1898456f47e82f6ba 100755 (executable)
@@ -75,7 +75,7 @@
 #endif
 #ifdef MAGICKCORE_ZERO_CONFIGURATION_SUPPORT
 #define MAGICKCORE_FEATURE_ZERO_CONFIGURATION_STR "Zero-Configuration "
-#else 
+#else
 #define MAGICKCORE_FEATURE_ZERO_CONFIGURATION_STR ""
 #endif
 #ifdef HDRI_SUPPORT
@@ -884,8 +884,14 @@ MagickExport LinkedListInfo *GetConfigurePaths(const char *filename,
       *home;
 
     home=GetEnvironmentValue("XDG_CONFIG_HOME");
+    if (home == (char *) NULL)
+      home=GetEnvironmentValue("LOCALAPPDATA");
+    if (home == (char *) NULL)
+      home=GetEnvironmentValue("APPDATA");
+    if (home == (char *) NULL)
+      home=GetEnvironmentValue("USERPROFILE");
     if (home != (char *) NULL)
-      { 
+      {
         /*
           Search $XDG_CONFIG_HOME/ImageMagick.
         */
@@ -895,8 +901,6 @@ MagickExport LinkedListInfo *GetConfigurePaths(const char *filename,
         home=DestroyString(home);
       }
     home=GetEnvironmentValue("HOME");
-    if (home == (char *) NULL)
-      home=GetEnvironmentValue("USERPROFILE");
     if (home != (char *) NULL)
       {
         /*
index e94a8061664e94863ecb1452ef9822eace10c4e1..7d21f3472351752025591d3193d083f68e0d5dbd 100644 (file)
@@ -781,8 +781,14 @@ static MagickBooleanType GetMagickModulePath(const char *filename,
       *home;
 
     home=GetEnvironmentValue("XDG_CONFIG_HOME");
+    if (home == (char *) NULL)
+      home=GetEnvironmentValue("LOCALAPPDATA");
+    if (home == (char *) NULL)
+      home=GetEnvironmentValue("APPDATA");
+    if (home == (char *) NULL)
+      home=GetEnvironmentValue("USERPROFILE");
     if (home != (char *) NULL)
-      { 
+      {
         /*
           Search $XDG_CONFIG_HOME/ImageMagick.
         */
@@ -793,8 +799,6 @@ static MagickBooleanType GetMagickModulePath(const char *filename,
           return(MagickTrue);
       }
     home=GetEnvironmentValue("HOME");
-    if (home == (char *) NULL)
-      home=GetEnvironmentValue("USERPROFILE");
     if (home != (char *) NULL)
       {
         /*
@@ -1369,7 +1373,7 @@ MagickPrivate MagickBooleanType OpenModules(ExceptionInfo *exception)
   modules=GetModuleList("*",MagickImageCoderModule,&number_modules,exception);
   if ((modules == (char **) NULL) || (*modules == (char *) NULL))
     {
-      if (modules != (char **) NULL) 
+      if (modules != (char **) NULL)
         modules=(char **) RelinquishMagickMemory(modules);
       return(MagickFalse);
     }
index e1f750f96158b7a4e4d72db2d33e674a10f0f71a..f69c0944f1402a36d0cda372fb15df3671d0a195 100644 (file)
@@ -36,9 +36,9 @@
 %
 %
 */
+\f
 /*
-Include declarations.
+  Include declarations.
 */
 #include "MagickCore/studio.h"
 #include "MagickCore/artifact.h"
@@ -94,10 +94,10 @@ Include declarations.
 #endif
 
 
-#define NUM_CL_RAND_GENERATORS 1024  /* number of random number generators running in parallel */ 
+#define NUM_CL_RAND_GENERATORS 1024  /* number of random number generators running in parallel */
 
 /*
- * 
+ *
  * Dynamic library loading functions
  *
  */
@@ -111,7 +111,7 @@ void *OsLibraryLoad(const char *libraryName)
 {
 #ifdef MAGICKCORE_WINDOWS_SUPPORT
     return (void *)LoadLibraryA(libraryName);
-#else 
+#else
     return (void *)dlopen(libraryName, RTLD_NOW);
 #endif
 }
@@ -156,7 +156,7 @@ void OsLibraryUnload(void *library)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-% AcquireMagickOpenCLEnv() allocates the MagickCLEnv structure 
+% AcquireMagickOpenCLEnv() allocates the MagickCLEnv structure
 %
 */
 
@@ -267,7 +267,7 @@ static MagickBooleanType bindOpenCLFunctions(void* library)
 }
 
 MagickLibrary * GetOpenCLLib()
-{ 
+{
   if (OpenCLLib == NULL)
   {
     if (OpenCLLibLock == NULL)
@@ -287,7 +287,7 @@ MagickLibrary * GetOpenCLLib()
 #ifdef MAGICKCORE_OPENCL_MACOSX
       status = bindOpenCLFunctions(library);
 #else
-      
+
       memset(OpenCLLib, 0, sizeof(MagickLibrary));
 #ifdef MAGICKCORE_WINDOWS_SUPPORT
       library = OsLibraryLoad("OpenCL.dll");
@@ -304,11 +304,11 @@ MagickLibrary * GetOpenCLLib()
 #endif
     }
 
-    UnlockSemaphoreInfo(OpenCLLibLock); 
+    UnlockSemaphoreInfo(OpenCLLibLock);
   }
-  
 
-  return OpenCLLib; 
+
+  return OpenCLLib;
 }
 
 
@@ -336,7 +336,7 @@ MagickLibrary * GetOpenCLLib()
 */
 
 MagickExport MagickCLEnv GetDefaultOpenCLEnv()
-{ 
+{
   if (defaultCLEnv == NULL)
   {
     if (defaultCLEnvLock == NULL)
@@ -345,9 +345,9 @@ MagickExport MagickCLEnv GetDefaultOpenCLEnv()
     }
     LockSemaphoreInfo(defaultCLEnvLock);
     defaultCLEnv = AcquireMagickOpenCLEnv();
-    UnlockSemaphoreInfo(defaultCLEnvLock); 
+    UnlockSemaphoreInfo(defaultCLEnvLock);
   }
-  return defaultCLEnv; 
+  return defaultCLEnv;
 }
 
 static void LockDefaultOpenCLEnv() {
@@ -379,9 +379,9 @@ static void UnlockDefaultOpenCLEnv() {
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  SetDefaultOpenCLEnv() sets the new OpenCL environment as default 
+%  SetDefaultOpenCLEnv() sets the new OpenCL environment as default
 %  and returns the old OpenCL environment
-%  
+%
 %  The format of the SetDefaultOpenCLEnv() method is:
 %
 %      MagickCLEnv SetDefaultOpenCLEnv(MagickCLEnv clEnv)
@@ -391,7 +391,7 @@ static void UnlockDefaultOpenCLEnv() {
 %    o clEnv: the new default OpenCL environment.
 %
 */
-MagickExport MagickCLEnv SetDefaultOpenCLEnv(MagickCLEnv clEnv)     
+MagickExport MagickCLEnv SetDefaultOpenCLEnv(MagickCLEnv clEnv)
 {
   MagickCLEnv oldEnv;
   LockDefaultOpenCLEnv();
@@ -399,7 +399,7 @@ MagickExport MagickCLEnv SetDefaultOpenCLEnv(MagickCLEnv clEnv)
   defaultCLEnv = clEnv;
   UnlockDefaultOpenCLEnv();
   return oldEnv;
-} 
+}
 
 
 
@@ -414,18 +414,18 @@ MagickExport MagickCLEnv SetDefaultOpenCLEnv(MagickCLEnv clEnv)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  SetMagickOpenCLEnvParam() sets the parameters in the OpenCL environment  
-%  
+%  SetMagickOpenCLEnvParam() sets the parameters in the OpenCL environment
+%
 %  The format of the SetMagickOpenCLEnvParam() method is:
 %
-%      MagickBooleanType SetMagickOpenCLEnvParam(MagickCLEnv clEnv, 
-%        MagickOpenCLEnvParam param, size_t dataSize, void* data, 
+%      MagickBooleanType SetMagickOpenCLEnvParam(MagickCLEnv clEnv,
+%        MagickOpenCLEnvParam param, size_t dataSize, void* data,
 %        ExceptionInfo* exception)
 %
 %  A description of each parameter follows:
 %
 %    o clEnv: the OpenCL environment.
-%    
+%
 %    o param: the parameter to be set.
 %
 %    o dataSize: the data size of the parameter value.
@@ -514,23 +514,23 @@ MagickExport
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetMagickOpenCLEnvParam() gets the parameters in the OpenCL environment  
-%  
+%  GetMagickOpenCLEnvParam() gets the parameters in the OpenCL environment
+%
 %  The format of the GetMagickOpenCLEnvParam() method is:
 %
-%      MagickBooleanType GetMagickOpenCLEnvParam(MagickCLEnv clEnv, 
-%        MagickOpenCLEnvParam param, size_t dataSize, void* data, 
+%      MagickBooleanType GetMagickOpenCLEnvParam(MagickCLEnv clEnv,
+%        MagickOpenCLEnvParam param, size_t dataSize, void* data,
 %        ExceptionInfo* exception)
 %
 %  A description of each parameter follows:
 %
 %    o clEnv: the OpenCL environment.
-%    
+%
 %    o param: the parameter to be returned.
 %
 %    o dataSize: the data size of the parameter value.
 %
-%    o data:  the location where the returned parameter value will be stored 
+%    o data:  the location where the returned parameter value will be stored
 %
 %    o exception: return any errors or warnings
 %
@@ -540,7 +540,7 @@ MagickExport
   MagickBooleanType GetMagickOpenCLEnvParam(MagickCLEnv clEnv, MagickOpenCLEnvParam param
                                           , size_t dataSize, void* data, ExceptionInfo* exception)
 {
-  MagickBooleanType 
+  MagickBooleanType
    status;
 
   magick_unreferenced(exception);
@@ -608,11 +608,11 @@ cleanup:
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetOpenCLContext() returns the OpenCL context  
-%  
+%  GetOpenCLContext() returns the OpenCL context
+%
 %  The format of the GetOpenCLContext() method is:
 %
-%      cl_context GetOpenCLContext(MagickCLEnv clEnv) 
+%      cl_context GetOpenCLContext(MagickCLEnv clEnv)
 %
 %  A description of each parameter follows:
 %
@@ -640,7 +640,7 @@ static char* getBinaryCLProgramName(MagickCLEnv clEnv, MagickOpenCLProgram prog,
   /* strip out illegal characters for file names */
   while (*ptr != '\0')
   {
-    if ( *ptr == ' ' || *ptr == '\\' || *ptr == '/' || *ptr == ':' || *ptr == '*' 
+    if ( *ptr == ' ' || *ptr == '\\' || *ptr == '/' || *ptr == ':' || *ptr == '*'
         || *ptr == '?' || *ptr == '"' || *ptr == '<' || *ptr == '>' || *ptr == '|')
     {
       *ptr = '_';
@@ -827,7 +827,7 @@ static unsigned int stringSignature(const char* string)
 /* OpenCL kernels for accelerate.c */
 extern const char *accelerateKernels, *accelerateKernels2;
 
-static MagickBooleanType CompileOpenCLKernels(MagickCLEnv clEnv, ExceptionInfo* exception) 
+static MagickBooleanType CompileOpenCLKernels(MagickCLEnv clEnv, ExceptionInfo* exception)
 {
   MagickBooleanType status = MagickFalse;
   cl_int clStatus;
@@ -835,7 +835,7 @@ static MagickBooleanType CompileOpenCLKernels(MagickCLEnv clEnv, ExceptionInfo*
   char* accelerateKernelsBuffer = NULL;
 
   /* The index of the program strings in this array has to match the value of the enum MagickOpenCLProgram */
-  const char* MagickOpenCLProgramStrings[MAGICK_OPENCL_NUM_PROGRAMS]; 
+  const char* MagickOpenCLProgramStrings[MAGICK_OPENCL_NUM_PROGRAMS];
 
   char options[MagickPathExtent];
   unsigned int optionsSignature;
@@ -868,7 +868,7 @@ static MagickBooleanType CompileOpenCLKernels(MagickCLEnv clEnv, ExceptionInfo*
   sprintf(accelerateKernelsBuffer,"%s%s",accelerateKernels,accelerateKernels2);
   MagickOpenCLProgramStrings[MAGICK_OPENCL_ACCELERATE] = accelerateKernelsBuffer;
 
-  for (i = 0; i < MAGICK_OPENCL_NUM_PROGRAMS; i++) 
+  for (i = 0; i < MAGICK_OPENCL_NUM_PROGRAMS; i++)
   {
     MagickBooleanType loadSuccessful = MagickFalse;
     unsigned int programSignature = stringSignature(MagickOpenCLProgramStrings[i]) ^ optionsSignature;
@@ -1024,7 +1024,7 @@ static MagickBooleanType InitOpenCLPlatformDevice(MagickCLEnv clEnv, ExceptionIn
     status = clEnv->library->clGetPlatformIDs(0, NULL, &numPlatforms);
     if (status != CL_SUCCESS)
     {
-      (void) ThrowMagickException(exception, GetMagickModule(), DelegateWarning, 
+      (void) ThrowMagickException(exception, GetMagickModule(), DelegateWarning,
         "clGetplatformIDs failed.", "(%d)", status);
       goto cleanup;
     }
@@ -1053,7 +1053,7 @@ static MagickBooleanType InitOpenCLPlatformDevice(MagickCLEnv clEnv, ExceptionIn
 
   /* Device selection */
   clEnv->device = NULL;
-  for (j = 0; j < 2; j++) 
+  for (j = 0; j < 2; j++)
   {
 
     cl_device_type deviceType;
@@ -1181,7 +1181,7 @@ MagickBooleanType InitOpenCLEnvInternal(MagickCLEnv clEnv, ExceptionInfo* except
     SetMagickOpenCLEnvParamInternal(clEnv, MAGICK_OPENCL_ENV_PARAM_OPENCL_DISABLED
         , sizeof(MagickBooleanType), &flag, exception);
   }
-  
+
   if (clEnv->OpenCLDisabled != MagickFalse)
     goto cleanup;
 
@@ -1337,7 +1337,7 @@ MagickBooleanType RelinquishOpenCLCommandQueue(MagickCLEnv clEnv, cl_command_que
 %
 %  The format of the AcquireOpenCLKernel method is:
 %
-%      cl_kernel AcquireOpenCLKernel(MagickCLEnv clEnv, 
+%      cl_kernel AcquireOpenCLKernel(MagickCLEnv clEnv,
 %        MagickOpenCLProgram program, const char* kernelName)
 %
 %  A description of each parameter follows:
@@ -1464,7 +1464,7 @@ typedef enum {
 /* device type */
 typedef enum {
   DS_DEVICE_NATIVE_CPU = 0
- ,DS_DEVICE_OPENCL_DEVICE 
+ ,DS_DEVICE_OPENCL_DEVICE
 } ds_device_type;
 
 
@@ -1532,7 +1532,7 @@ static ds_status initDSProfile(ds_profile** p, const char* version) {
   profile = (ds_profile*)malloc(sizeof(ds_profile));
   if (profile == NULL)
     return DS_MEMORY_ERROR;
-  
+
   memset(profile, 0, sizeof(ds_profile));
 
   OpenCLLib->clGetPlatformIDs(0, NULL, &numPlatforms);
@@ -1552,11 +1552,11 @@ static ds_status initDSProfile(ds_profile** p, const char* version) {
 
   profile->numDevices = numDevices+1;     /* +1 to numDevices to include the native CPU */
 
-  profile->devices = (ds_device*)malloc(profile->numDevices*sizeof(ds_device));    
+  profile->devices = (ds_device*)malloc(profile->numDevices*sizeof(ds_device));
   if (profile->devices == NULL) {
     profile->numDevices = 0;
     status = DS_MEMORY_ERROR;
-    goto cleanup;    
+    goto cleanup;
   }
   memset(profile->devices, 0, profile->numDevices*sizeof(ds_device));
 
@@ -1570,7 +1570,7 @@ static ds_status initDSProfile(ds_profile** p, const char* version) {
       cl_uint num;
 
       int d;
-      for (d = 0; d < 2; d++) { 
+      for (d = 0; d < 2; d++) {
         unsigned int j;
         cl_device_type deviceType;
         switch(d) {
@@ -1636,8 +1636,8 @@ cleanup:
   return status;
 }
 
-/* Pointer to a function that calculates the score of a device (ex: device->score) 
- update the data size of score. The encoding and the format of the score data 
+/* Pointer to a function that calculates the score of a device (ex: device->score)
+ update the data size of score. The encoding and the format of the score data
  is implementation defined. The function should return DS_SUCCESS if there's no error to be reported.
  */
 typedef ds_status (*ds_perf_evaluator)(ds_device* device, void* data);
@@ -1662,7 +1662,7 @@ static ds_status profileDevices(ds_profile* profile, const ds_evaluation_type ty
 
   for (i = 0; i < profile->numDevices; i++) {
     ds_status evaluatorStatus;
-    
+
     switch (type) {
     case DS_EVALUATE_NEW_ONLY:
       if (profile->devices[i].score != NULL)
@@ -1742,7 +1742,7 @@ static ds_status writeProfileToFile(ds_profile* profile, ds_score_serializer ser
 
       switch(profile->devices[i].type) {
       case DS_DEVICE_NATIVE_CPU:
-        { 
+        {
           /* There's no need to emit a device name for the native CPU device. */
           /*
           fwrite(DS_TAG_DEVICE_NAME, sizeof(char), strlen(DS_TAG_DEVICE_NAME), profileFile);
@@ -1751,7 +1751,7 @@ static ds_status writeProfileToFile(ds_profile* profile, ds_score_serializer ser
           */
         }
         break;
-      case DS_DEVICE_OPENCL_DEVICE: 
+      case DS_DEVICE_OPENCL_DEVICE:
         {
           char tmp[16];
 
@@ -1810,7 +1810,7 @@ static ds_status readProFile(const char* fileName, char** content, size_t* conte
     return DS_FILE_ERROR;
   }
 
-  fseek(input, 0L, SEEK_END); 
+  fseek(input, 0L, SEEK_END);
   size = ftell(input);
   rewind(input);
   binary = (char*)malloc(size);
@@ -1860,7 +1860,7 @@ static const char* findString(const char* contentStart, const char* contentEnd,
 }
 
 
-typedef ds_status (*ds_score_deserializer)(ds_device* device, const unsigned char* serializedScore, unsigned int serializedScoreSize); 
+typedef ds_status (*ds_score_deserializer)(ds_device* device, const unsigned char* serializedScore, unsigned int serializedScoreSize);
 static ds_status readProfileFromFile(ds_profile* profile, ds_score_deserializer deserializer, const char* file) {
 
   ds_status status = DS_SUCCESS;
@@ -1897,7 +1897,7 @@ static ds_status readProfileFromFile(ds_profile* profile, ds_score_deserializer
     }
 
     versionStringLength = strlen(profile->version);
-    if (versionStringLength!=(size_t)(dataEnd-dataStart)   
+    if (versionStringLength!=(size_t)(dataEnd-dataStart)
         || strncmp(profile->version, dataStart, versionStringLength)!=(int)0) {
       /* version mismatch */
       status = DS_PROFILE_FILE_ERROR;
@@ -1947,7 +1947,7 @@ RestoreMSCWarning
       deviceTypeStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_TYPE);
       if (deviceTypeStart==NULL) {
         status = DS_PROFILE_FILE_ERROR;
-        goto cleanup;       
+        goto cleanup;
       }
       deviceTypeStart+=strlen(DS_TAG_DEVICE_TYPE);
       deviceTypeEnd = findString(deviceTypeStart, contentEnd, DS_TAG_DEVICE_TYPE_END);
@@ -1964,39 +1964,39 @@ RestoreMSCWarning
         deviceNameStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_NAME);
         if (deviceNameStart==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
         deviceNameStart+=strlen(DS_TAG_DEVICE_NAME);
         deviceNameEnd = findString(deviceNameStart, contentEnd, DS_TAG_DEVICE_NAME_END);
         if (deviceNameEnd==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
 
 
         deviceDriverStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_DRIVER_VERSION);
         if (deviceDriverStart==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
         deviceDriverStart+=strlen(DS_TAG_DEVICE_DRIVER_VERSION);
         deviceDriverEnd = findString(deviceDriverStart, contentEnd, DS_TAG_DEVICE_DRIVER_VERSION_END);
         if (deviceDriverEnd ==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
 
 
         tmpStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_MAX_COMPUTE_UNITS);
         if (tmpStart==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
         tmpStart+=strlen(DS_TAG_DEVICE_MAX_COMPUTE_UNITS);
         tmpEnd = findString(tmpStart, contentEnd, DS_TAG_DEVICE_MAX_COMPUTE_UNITS_END);
         if (tmpEnd ==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
         memcpy(tmp,tmpStart,tmpEnd-tmpStart);
         tmp[tmpEnd-tmpStart] = '\0';
@@ -2006,13 +2006,13 @@ RestoreMSCWarning
         tmpStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_MAX_CLOCK_FREQ);
         if (tmpStart==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
         tmpStart+=strlen(DS_TAG_DEVICE_MAX_CLOCK_FREQ);
         tmpEnd = findString(tmpStart, contentEnd, DS_TAG_DEVICE_MAX_CLOCK_FREQ_END);
         if (tmpEnd ==NULL) {
           status = DS_PROFILE_FILE_ERROR;
-          goto cleanup;       
+          goto cleanup;
         }
         memcpy(tmp,tmpStart,tmpEnd-tmpStart);
         tmp[tmpEnd-tmpStart] = '\0';
@@ -2024,7 +2024,7 @@ RestoreMSCWarning
           if (profile->devices[i].type == DS_DEVICE_OPENCL_DEVICE) {
             size_t actualDeviceNameLength;
             size_t driverVersionLength;
-            
+
             actualDeviceNameLength = strlen(profile->devices[i].oclDeviceName);
             driverVersionLength = strlen(profile->devices[i].oclDriverVersion);
             if (actualDeviceNameLength == (size_t)(deviceNameEnd - deviceNameStart)
@@ -2037,7 +2037,7 @@ RestoreMSCWarning
               deviceScoreStart = findString(dataStart, contentEnd, DS_TAG_SCORE);
               if (deviceNameStart==NULL) {
                 status = DS_PROFILE_FILE_ERROR;
-                goto cleanup;       
+                goto cleanup;
               }
               deviceScoreStart+=strlen(DS_TAG_SCORE);
               deviceScoreEnd = findString(deviceScoreStart, contentEnd, DS_TAG_SCORE_END);
@@ -2056,7 +2056,7 @@ RestoreMSCWarning
             deviceScoreStart = findString(dataStart, contentEnd, DS_TAG_SCORE);
             if (deviceScoreStart==NULL) {
               status = DS_PROFILE_FILE_ERROR;
-              goto cleanup;       
+              goto cleanup;
             }
             deviceScoreStart+=strlen(DS_TAG_SCORE);
             deviceScoreEnd = findString(deviceScoreStart, contentEnd, DS_TAG_SCORE_END);
@@ -2211,7 +2211,7 @@ static ds_status AcceleratePerfEvaluator(ds_device *device,
     DestroyImage(inputImage);
   }
   /* end of microbenchmark */
-  
+
   if (device->score == NULL)
     device->score=malloc(sizeof(AccelerateScoreType));
   *(AccelerateScoreType*)device->score=readAccelerateTimer(&timer);
@@ -2261,7 +2261,7 @@ ds_status AccelerateScoreRelease(void* score) {
 ds_status canWriteProfileToFile(const char *path)
 {
   FILE* profileFile = fopen(path, "ab");
+
   if (profileFile==NULL)
     return DS_FILE_ERROR;
 
@@ -2400,12 +2400,12 @@ cleanup:
 %
 %  InitImageMagickOpenCL() provides a simplified interface to initialize
 %  the OpenCL environtment in ImageMagick
-%  
+%
 %  The format of the InitImageMagickOpenCL() method is:
 %
-%      MagickBooleanType InitImageMagickOpenCL(ImageMagickOpenCLMode mode, 
-%                                        void* userSelectedDevice, 
-%                                        void* selectedDevice) 
+%      MagickBooleanType InitImageMagickOpenCL(ImageMagickOpenCLMode mode,
+%                                        void* userSelectedDevice,
+%                                        void* selectedDevice)
 %
 %  A description of each parameter follows:
 %
@@ -2544,7 +2544,7 @@ MagickBooleanType OpenCLThrowMagickException(ExceptionInfo *exception,
 }
 
 MagickPrivate cl_mem GetAndLockRandSeedBuffer(MagickCLEnv clEnv)
-{ 
+{
   LockSemaphoreInfo(clEnv->lock);
   if (clEnv->seedsLock == NULL)
   {
@@ -2570,7 +2570,7 @@ MagickPrivate cl_mem GetAndLockRandSeedBuffer(MagickCLEnv clEnv)
       unsigned int *seeds;
 
       queue = AcquireOpenCLCommandQueue(clEnv);
-      seeds = (unsigned int*) clEnv->library->clEnqueueMapBuffer(queue, clEnv->seeds, CL_TRUE, 
+      seeds = (unsigned int*) clEnv->library->clEnqueueMapBuffer(queue, clEnv->seeds, CL_TRUE,
                                                   CL_MAP_WRITE, 0,
                                                   clEnv->numGenerators*4
                                                   *sizeof(unsigned int),
@@ -2594,16 +2594,16 @@ MagickPrivate cl_mem GetAndLockRandSeedBuffer(MagickCLEnv clEnv)
 
         randomInfo = DestroyRandomInfo(randomInfo);
       }
-      clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, clEnv->seeds, seeds, 0, 
+      clStatus = clEnv->library->clEnqueueUnmapMemObject(queue, clEnv->seeds, seeds, 0,
                                           NULL, NULL);
       clEnv->library->clFinish(queue);
 cleanup:
-      if (queue != NULL) 
+      if (queue != NULL)
         RelinquishOpenCLCommandQueue(clEnv, queue);
     }
   }
   UnlockSemaphoreInfo(clEnv->lock);
-  return clEnv->seeds; 
+  return clEnv->seeds;
 }
 
 MagickPrivate void UnlockRandSeedBuffer(MagickCLEnv clEnv) {
@@ -2647,7 +2647,7 @@ MagickExport MagickBooleanType RelinquishMagickOpenCLEnv(
 
 /*
 * Return the OpenCL environment
-*/ 
+*/
 MagickExport MagickCLEnv GetDefaultOpenCLEnv(
   ExceptionInfo *magick_unused(exception))
 {
@@ -2662,7 +2662,7 @@ MagickExport MagickCLEnv SetDefaultOpenCLEnv(
   magick_unreferenced(clEnv);
 
   return (MagickCLEnv) NULL;
-} 
+}
 
 MagickExport MagickBooleanType SetMagickOpenCLEnvParam(
   MagickCLEnv magick_unused(clEnv),MagickOpenCLEnvParam magick_unused(param),
@@ -2762,7 +2762,7 @@ MagickExport MagickBooleanType InitImageMagickOpenCL(
 MagickPrivate
 MagickBooleanType OpenCLThrowMagickException(ExceptionInfo *exception,
   const char *module,const char *function,const size_t line,
-  const ExceptionType severity,const char *tag,const char *format,...) 
+  const ExceptionType severity,const char *tag,const char *format,...)
 {
   magick_unreferenced(exception);
   magick_unreferenced(module);
@@ -2818,52 +2818,45 @@ const char* GetOpenCLCachedFilesDirectory() {
       char *temp = NULL;
       struct stat attributes;
       MagickBooleanType status;
+      int mkdirStatus = 0;
 
 
 
       home=GetEnvironmentValue("MAGICK_OPENCL_CACHE_DIR");
       if (home == (char *) NULL)
       {
-#ifdef MAGICKCORE_WINDOWS_SUPPORT
-        home=GetEnvironmentValue("LOCALAPPDATA");
+        home=GetEnvironmentValue("XDG_CACHE_HOME");
+        if (home == (char *) NULL)
+          home=GetEnvironmentValue("LOCALAPPDATA");
         if (home == (char *) NULL)
           home=GetEnvironmentValue("APPDATA");
         if (home == (char *) NULL)
           home=GetEnvironmentValue("USERPROFILE");
-#else
-        home=GetEnvironmentValue("HOME");
-#endif
       }
-      
+
       if (home != (char *) NULL)
       {
-        int mkdirStatus = 0;
-        /*
-        */
-
-        /* first check if $HOME/.cache exists */
-        (void) FormatLocaleString(path,MagickPathExtent,"%s%s.cache",
-          home,DirectorySeparator);
+        /* first check if $HOME exists */
+        (void) FormatLocaleString(path,MagickPathExtent,"%s",home);
         status=GetPathAttributes(path,&attributes);
-        if (status == MagickFalse) 
+        if (status == MagickFalse)
         {
-          
+
 #ifdef MAGICKCORE_WINDOWS_SUPPORT
           mkdirStatus = mkdir(path);
 #else
           mkdirStatus = mkdir(path, 0777);
 #endif
         }
-        
-        /* first check if $HOME/.cache/ImageMagick exists */
-        if (mkdirStatus==0) 
+
+        /* first check if $HOME/ImageMagick exists */
+        if (mkdirStatus==0)
         {
             (void) FormatLocaleString(path,MagickPathExtent,
-              "%s%s.cache%sImageMagick",home,DirectorySeparator,
-              DirectorySeparator);
-                    
+              "%s%sImageMagick",home,DirectorySeparator);
+
             status=GetPathAttributes(path,&attributes);
-            if (status == MagickFalse) 
+            if (status == MagickFalse)
             {
 #ifdef MAGICKCORE_WINDOWS_SUPPORT
               mkdirStatus = mkdir(path);
@@ -2879,10 +2872,53 @@ const char* GetOpenCLCachedFilesDirectory() {
           CopyMagickString(temp,path,strlen(path)+1);
         }
         home=DestroyString(home);
+      } else {
+        home=GetEnvironmentValue("HOME");
+        if (home != (char *) NULL)
+        {
+          /* first check if $HOME/.cache exists */
+          (void) FormatLocaleString(path,MagickPathExtent,"%s%s.cache",
+            home,DirectorySeparator);
+          status=GetPathAttributes(path,&attributes);
+          if (status == MagickFalse)
+          {
+
+#ifdef   MAGICKCORE_WINDOWS_SUPPORT
+            mkdirStatus = mkdir(path);
+#else
+            mkdirStatus = mkdir(path, 0777);
+#endif
+          }
+
+          /* first check if $HOME/.cache/ImageMagick exists */
+          if (mkdirStatus==0)
+          {
+              (void) FormatLocaleString(path,MagickPathExtent,
+                "%s%s.cache%sImageMagick",home,DirectorySeparator,
+                DirectorySeparator);
+
+              status=GetPathAttributes(path,&attributes);
+              if (status == MagickFalse)
+              {
+#ifdef   MAGICKCORE_WINDOWS_SUPPORT
+                mkdirStatus = mkdir(path);
+#else
+                mkdirStatus = mkdir(path, 0777);
+#endif
+              }
+          }
+
+          if (mkdirStatus==0)
+          {
+            temp = (char*)AcquireMagickMemory(strlen(path)+1);
+            CopyMagickString(temp,path,strlen(path)+1);
+          }
+          home=DestroyString(home);
+        }
       }
       openclCachedFilesDirectory = temp;
     }
-    UnlockSemaphoreInfo(openclCachedFilesDirectoryLock); 
+    UnlockSemaphoreInfo(openclCachedFilesDirectoryLock);
   }
   return openclCachedFilesDirectory;
 }
@@ -2896,7 +2932,7 @@ void startAccelerateTimer(AccelerateTimer* timer) {
       struct timeval s;
       gettimeofday(&s, 0);
       timer->_start = (long long)s.tv_sec * (long long)1.0E3 + (long long)s.tv_usec / (long long)1.0E3;
-#endif  
+#endif
 }
 
 void stopAccelerateTimer(AccelerateTimer* timer) {
@@ -2914,7 +2950,7 @@ void stopAccelerateTimer(AccelerateTimer* timer) {
 }
 
 void resetAccelerateTimer(AccelerateTimer* timer) {
-   timer->_clocks = 0; 
+   timer->_clocks = 0;
    timer->_start = 0;
 }
 
@@ -2928,8 +2964,8 @@ void initAccelerateTimer(AccelerateTimer* timer) {
    resetAccelerateTimer(timer);
 }
 
-double readAccelerateTimer(AccelerateTimer* timer) { 
-  return (double)timer->_clocks/(double)timer->_freq; 
+double readAccelerateTimer(AccelerateTimer* timer) {
+  return (double)timer->_clocks/(double)timer->_freq;
 };
 
 
@@ -2974,5 +3010,3 @@ void OpenCLLog(const char* message) {
   magick_unreferenced(message);
 #endif
 }
-
-