mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-21 06:55:39 +00:00
Support lcms2 in MS-Windows builds
* lisp/term/w32-win.el (dynamic-library-alist): Include association for the lcms2 library. * src/lcms.c [WINDOWSNT]: Include windows.h and w32.h. Use DEF_DLL_FN to define pointers to dynamically loaded lcms2 functions. (cmsCIE2000DeltaE, cmsCIECAM02Init, cmsCIECAM02Forward) (cmsCIECAM02Done): New macros. (init_lcms_functions, Flcms2_available_p): New functions. (Flcms_cie_de2000, Flcms_cam02_ucs) [WINDOWSNT]: Call init_lcms_functions. (syms_of_lcms2): Defsubr lcms2-available-p. * src/w32fns.c (syms_of_w32fns): DEFSYM Qlcms2. * configure.ac: Include lcms2 in the final report and in emacs_config_features. * nt/INSTALL: * nt/INSTALL.W64: Update with the information about lcms2 library.
This commit is contained in:
parent
bc5485edef
commit
56ab0c4a4c
@ -5367,7 +5367,7 @@ emacs_config_features=
|
||||
for opt in XAW3D XPM JPEG TIFF GIF PNG RSVG CAIRO IMAGEMAGICK SOUND GPM DBUS \
|
||||
GCONF GSETTINGS NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT \
|
||||
LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS X_TOOLKIT OLDXMENU X11 NS MODULES \
|
||||
XWIDGETS LIBSYSTEMD CANNOT_DUMP; do
|
||||
XWIDGETS LIBSYSTEMD CANNOT_DUMP LCMS2; do
|
||||
|
||||
case $opt in
|
||||
CANNOT_DUMP) eval val=\${$opt} ;;
|
||||
@ -5400,6 +5400,7 @@ AS_ECHO([" Does Emacs use -lXaw3d? ${HAVE_XAW3D
|
||||
Does Emacs use a png library? ${HAVE_PNG} $LIBPNG
|
||||
Does Emacs use -lrsvg-2? ${HAVE_RSVG}
|
||||
Does Emacs use cairo? ${HAVE_CAIRO}
|
||||
Does Emacs use -llcms2? ${HAVE_LCMS2}
|
||||
Does Emacs use imagemagick (version 6)? ${HAVE_IMAGEMAGICK}
|
||||
Does Emacs support sound? ${HAVE_SOUND}
|
||||
Does Emacs use -lgpm? ${HAVE_GPM}
|
||||
|
@ -275,7 +275,8 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
||||
'(gnutls "libgnutls-30.dll")
|
||||
'(gnutls "libgnutls-28.dll" "libgnutls-26.dll"))
|
||||
'(libxml2 "libxml2-2.dll" "libxml2.dll")
|
||||
'(zlib "zlib1.dll" "libz-1.dll")))
|
||||
'(zlib "zlib1.dll" "libz-1.dll")
|
||||
'(lcms2 "liblcms2-2.dll")))
|
||||
|
||||
;;; multi-tty support
|
||||
(defvar w32-initialized nil
|
||||
|
@ -486,6 +486,8 @@ build will run on Windows 9X and newer systems).
|
||||
Does Emacs use a gif library? yes
|
||||
Does Emacs use a png library? yes
|
||||
Does Emacs use -lrsvg-2? yes
|
||||
Does Emacs use cairo? no
|
||||
Does Emacs use -llcms2? yes
|
||||
Does Emacs use imagemagick? no
|
||||
Does Emacs support sound? no
|
||||
Does Emacs use -lgpm? no
|
||||
@ -797,6 +799,13 @@ build will run on Windows 9X and newer systems).
|
||||
(This library is also a prerequisite for several image libraries, so
|
||||
you may already have it; look for zlib1.dll or libz-1.dll.)
|
||||
|
||||
* Optional support for lcms2 library
|
||||
|
||||
Emacs can expose some capabilities of the Little CMS color
|
||||
management engine to Lisp programs using the lcms2 library.
|
||||
Prebuilt binaries of lcms2 DLL (for 32-bit builds of Emacs) are
|
||||
available from the ezwinports site and from the MSYS2 project.
|
||||
|
||||
|
||||
This file is part of GNU Emacs.
|
||||
|
||||
|
@ -63,6 +63,7 @@ packages (you can copy and paste it into the shell with Shift + Insert):
|
||||
mingw-w64-x86_64-libpng \
|
||||
mingw-w64-x86_64-libjpeg-turbo \
|
||||
mingw-w64-x86_64-librsvg \
|
||||
mingw-w64-x86_64-liblcms2 \
|
||||
mingw-w64-x86_64-libxml2 \
|
||||
mingw-w64-x86_64-gnutls \
|
||||
mingw-w64-x86_64-zlib
|
||||
|
84
src/lcms.c
84
src/lcms.c
@ -25,6 +25,48 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "lisp.h"
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
# include <windows.h>
|
||||
# include "w32.h"
|
||||
|
||||
DEF_DLL_FN (cmsFloat64Number, cmsCIE2000DeltaE,
|
||||
(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl,
|
||||
cmsFloat64Number Kc, cmsFloat64Number Kh));
|
||||
DEF_DLL_FN (cmsHANDLE, cmsCIECAM02Init,
|
||||
(cmsContext ContextID, const cmsViewingConditions* pVC));
|
||||
DEF_DLL_FN (void, cmsCIECAM02Forward,
|
||||
(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut));
|
||||
DEF_DLL_FN (void, cmsCIECAM02Done, (cmsHANDLE hModel));
|
||||
|
||||
static bool lcms_initialized;
|
||||
|
||||
static bool
|
||||
init_lcms_functions (void)
|
||||
{
|
||||
HMODULE library = w32_delayed_load (Qlcms2);
|
||||
|
||||
if (!library)
|
||||
return false;
|
||||
|
||||
LOAD_DLL_FN (library, cmsCIE2000DeltaE);
|
||||
LOAD_DLL_FN (library, cmsCIECAM02Init);
|
||||
LOAD_DLL_FN (library, cmsCIECAM02Forward);
|
||||
LOAD_DLL_FN (library, cmsCIECAM02Done);
|
||||
return true;
|
||||
}
|
||||
|
||||
# undef cmsCIE2000DeltaE
|
||||
# undef cmsCIECAM02Init
|
||||
# undef cmsCIECAM02Forward
|
||||
# undef cmsCIECAM02Done
|
||||
|
||||
# define cmsCIE2000DeltaE fn_cmsCIE2000DeltaE
|
||||
# define cmsCIECAM02Init fn_cmsCIECAM02Init
|
||||
# define cmsCIECAM02Forward fn_cmsCIECAM02Forward
|
||||
# define cmsCIECAM02Done fn_cmsCIECAM02Done
|
||||
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
static bool
|
||||
parse_lab_list (Lisp_Object lab_list, cmsCIELab *color)
|
||||
{
|
||||
@ -58,6 +100,16 @@ chroma, and hue, respectively. The parameters each default to 1. */)
|
||||
cmsCIELab Lab1, Lab2;
|
||||
cmsFloat64Number Kl, Kc, Kh;
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
if (!lcms_initialized)
|
||||
lcms_initialized = init_lcms_functions ();
|
||||
if (!lcms_initialized)
|
||||
{
|
||||
message1 ("lcms2 library not found");
|
||||
return Qnil;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!(CONSP (color1) && parse_lab_list (color1, &Lab1)))
|
||||
signal_error ("Invalid color", color1);
|
||||
if (!(CONSP (color2) && parse_lab_list (color2, &Lab2)))
|
||||
@ -112,6 +164,16 @@ Optional argument is the XYZ white point, which defaults to illuminant D65. */)
|
||||
double Jp1, ap1, bp1, Jp2, ap2, bp2;
|
||||
double Mp1, Mp2, FL, k, k4;
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
if (!lcms_initialized)
|
||||
lcms_initialized = init_lcms_functions ();
|
||||
if (!lcms_initialized)
|
||||
{
|
||||
message1 ("lcms2 library not found");
|
||||
return Qnil;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!(CONSP (color1) && parse_xyz_list (color1, &xyz1)))
|
||||
signal_error ("Invalid color", color1);
|
||||
if (!(CONSP (color2) && parse_xyz_list (color2, &xyz2)))
|
||||
@ -170,6 +232,27 @@ Optional argument is the XYZ white point, which defaults to illuminant D65. */)
|
||||
(bp2 - bp1) * (bp2 - bp1)));
|
||||
}
|
||||
|
||||
DEFUN ("lcms2-available-p", Flcms2_available_p, Slcms2_available_p, 0, 0, 0,
|
||||
doc: /* Return t if lcms2 color calculations are available in this instance of Emacs. */)
|
||||
(void)
|
||||
{
|
||||
#ifdef WINDOWSNT
|
||||
Lisp_Object found = Fassq (Qlcms2, Vlibrary_cache);
|
||||
if (CONSP (found))
|
||||
return XCDR (found);
|
||||
else
|
||||
{
|
||||
Lisp_Object status;
|
||||
lcms_initialized = init_lcms_functions ();
|
||||
status = lcms_initialized ? Qt : Qnil;
|
||||
Vlibrary_cache = Fcons (Fcons (Qlcms2, status), Vlibrary_cache);
|
||||
return status;
|
||||
}
|
||||
#else /* !WINDOWSNT */
|
||||
return Qt;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Initialization */
|
||||
void
|
||||
@ -177,6 +260,7 @@ syms_of_lcms2 (void)
|
||||
{
|
||||
defsubr (&Slcms_cie_de2000);
|
||||
defsubr (&Slcms_cam02_ucs);
|
||||
defsubr (&Slcms2_available_p);
|
||||
|
||||
Fprovide (intern_c_string ("lcms2"), Qnil);
|
||||
}
|
||||
|
@ -10405,6 +10405,7 @@ syms_of_w32fns (void)
|
||||
DEFSYM (Qlibxml2, "libxml2");
|
||||
DEFSYM (Qserif, "serif");
|
||||
DEFSYM (Qzlib, "zlib");
|
||||
DEFSYM (Qlcms2, "lcms2");
|
||||
|
||||
Fput (Qundefined_color, Qerror_conditions,
|
||||
listn (CONSTYPE_PURE, 2, Qundefined_color, Qerror));
|
||||
|
Loading…
Reference in New Issue
Block a user