/* babl - dynamically extendable universal pixel conversion library. * Copyright (C) 2005, Øyvind Kolås. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see * . */ #include "config.h" #include "babl-internal.h" static int ref_count = 0; #ifdef _WIN32 static HMODULE libbabl_dll = NULL; /* Minimal DllMain that just stores the handle to this DLL */ /* Avoid silly "no previous prototype" gcc warning */ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: libbabl_dll = hinstDLL; break; } return TRUE; } #else #define BABL_PATH LIBDIR BABL_DIR_SEPARATOR BABL_LIBRARY #endif /* _WIN32 */ /* * Returns a list of directories if the environment variable $BABL_PATH * is set, or the installation library directory by default. * This directory will be based on the compilation-time prefix for UNIX * and an actual DLL path for Windows. * * Returns: a string which must be freed after usage. */ static char * babl_dir_list (void) { char *ret; ret = getenv ("BABL_PATH"); if (!ret) { #ifdef _WIN32 /* Figure it out from the location of this DLL */ char *filename; int filename_size; char *sep1, *sep2; wchar_t w_filename[MAX_PATH]; DWORD nSize = sizeof (w_filename) / sizeof ((w_filename)[0]); if (GetModuleFileNameW (libbabl_dll, w_filename, nSize) == 0) babl_fatal ("GetModuleFilenameW failed"); filename_size = WideCharToMultiByte (CP_UTF8, 0, w_filename, -1, NULL, 0, NULL, NULL); filename = babl_malloc (sizeof (char) * filename_size); if (!WideCharToMultiByte (CP_UTF8, 0, w_filename, -1, filename, filename_size, NULL, NULL)) babl_fatal ("Converting module filename to UTF-8 failed"); /* If the DLL file name is of the format * \bin\*.dll, use \lib\{BABL_LIBRARY}. * Otherwise, use the directory where the DLL is. */ sep1 = strrchr (filename, BABL_DIR_SEPARATOR[0]); *sep1 = '\0'; sep2 = strrchr (filename, BABL_DIR_SEPARATOR[0]); if (sep2 != NULL) { if (strcasecmp (sep2 + 1, "bin") == 0) { char* filename_tmp; *(++sep2) = '\0'; filename_tmp = babl_malloc (sizeof (char) * (strlen (filename) + strlen (BABL_DIR_SEPARATOR BABL_LIBRARY) + 4)); strcpy (filename_tmp, filename); babl_free (filename); strcat (filename_tmp, "lib" BABL_DIR_SEPARATOR BABL_LIBRARY); filename = filename_tmp; } } ret = filename; #else ret = babl_malloc (sizeof (char) * (strlen (BABL_PATH) + 1)); strcpy (ret, BABL_PATH); #endif } else { char* ret_tmp = babl_malloc (sizeof (char) * (strlen (ret) + 1)); strcpy (ret_tmp, ret); ret = ret_tmp; } return ret; } void babl_init (void) { babl_cpu_accel_set_use (1); if (ref_count++ == 0) { char * dir_list; babl_internal_init (); babl_sampling_class_init (); babl_type_db (); babl_trc_class_init (); babl_space_class_init (); babl_component_db (); babl_model_db (); babl_format_db (); babl_conversion_db (); babl_extension_db (); babl_fish_db (); babl_core_init (); babl_sanity (); babl_extension_base (); babl_sanity (); dir_list = babl_dir_list (); babl_extension_load_dir_list (dir_list); babl_free (dir_list); babl_init_db (); } } void babl_exit (void) { if (!-- ref_count) { babl_store_db (); babl_extension_deinit (); babl_free (babl_extension_db ());; babl_free (babl_fish_db ());; babl_free (babl_conversion_db ());; babl_free (babl_format_db ());; babl_free (babl_model_db ());; babl_free (babl_component_db ());; babl_free (babl_type_db ());; babl_internal_destroy (); #if BABL_DEBUG_MEM babl_memory_sanity (); #endif } } #undef babl_model_is int babl_model_is (const Babl *babl, const char *model) { return babl && ((babl)==babl_model_with_space(model, babl)); }