Use native image API for NS

* configure.ac (NATIVE_IMAGE_API): Move above NS definitions.
(HAVE_NATIVE_IMAGE_API): Set for NS.
(HAVE_PNG, HAVE_JPEG, HAVE_GIF, HAVE_TIFF): Enable on NS builds.
* src/image.c (HAVE_NS): Fix a number of #if's so they no longer rely
on HAVE_NS.
(PIX_MASK_DRAW): Add for HAVE_NS so libpng support will compile.
(image_can_use_native_api):
(native_image_load): Add NS support.
(png_load):
(jpeg_load):
(tiff_load):
(gif_load): Remove NS specific definitions.
* src/nsimage.m (ns_can_use_native_image_api): New function.
* src/nsterm.h: (ns_can_use_native_image_api): New function.
This commit is contained in:
Alan Third 2020-04-14 22:56:06 +01:00
parent c019f03e38
commit e105d01c95
4 changed files with 91 additions and 73 deletions

View file

@ -1910,6 +1910,8 @@ else
bitmapdir=${bmd_acc#:}
fi
NATIVE_IMAGE_API=no
test "${with_ns}" = maybe && test "${opsys}" != darwin && with_ns=no
HAVE_NS=no
NS_GNUSTEP_CONFIG=no
@ -2021,6 +2023,11 @@ Either fix this, or re-configure with the option '--without-ns'.])])
AC_MSG_ERROR([Mac OS X 10.6 or newer is required]);
fi
fi
if test "${with_native_image_api}" = yes; then
AC_DEFINE(HAVE_NATIVE_IMAGE_API, 1, [Define to use native OS APIs for images.])
NATIVE_IMAGE_API="yes (ns)"
fi
fi
AC_SUBST(LIBS_GNUSTEP)
@ -2127,7 +2134,6 @@ LIB_WSOCK32=
NTLIB=
CM_OBJ="cm.o"
XARGS_LIMIT=
NATIVE_IMAGE_API=no
if test "${HAVE_W32}" = "yes"; then
AC_DEFINE(HAVE_NTGUI, 1, [Define to use native MS Windows GUI.])
if test "$with_toolkit_scroll_bars" = "no"; then
@ -3575,9 +3581,8 @@ AC_SUBST(LIBXPM)
### Use -ljpeg if available, unless '--with-jpeg=no'.
HAVE_JPEG=no
LIBJPEG=
if test "${NS_IMPL_COCOA}" = yes; then
: # Cocoa provides its own jpeg support, so do nothing.
elif test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes"; then
if test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes" \
|| test "${HAVE_NS}" = "yes"; then
if test "${with_jpeg}" != "no"; then
AC_CACHE_CHECK([for jpeglib 6b or later],
[emacs_cv_jpeglib],
@ -3726,13 +3731,12 @@ AC_SUBST(emacs_major_version)
HAVE_PNG=no
LIBPNG=
PNG_CFLAGS=
if test "${NS_IMPL_COCOA}" = yes; then
: # Cocoa provides its own png support, so do nothing.
elif test "${with_png}" != no; then
if test "${with_png}" != no; then
# mingw32 loads the library dynamically.
if test "$opsys" = mingw32; then
AC_CHECK_HEADER([png.h], [HAVE_PNG=yes])
elif test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes"; then
elif test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes" \
|| test "${HAVE_NS}" = "yes"; then
EMACS_CHECK_MODULES([PNG], [libpng >= 1.0.0])
if test $HAVE_PNG = yes; then
LIBPNG=$PNG_LIBS
@ -3806,7 +3810,8 @@ if test "${opsys}" = "mingw32"; then
if test "${HAVE_TIFF}" = "yes"; then
AC_DEFINE(HAVE_TIFF, 1, [Define to 1 if you have the tiff library (-ltiff).])
fi
elif test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes"; then
elif test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes" \
|| test "${HAVE_NS}" = "yes"; then
if test "${with_tiff}" != "no"; then
AC_CHECK_HEADER(tiffio.h,
[tifflibs="-lz -lm"
@ -3835,7 +3840,7 @@ if test "${opsys}" = "mingw32"; then
AC_DEFINE(HAVE_GIF, 1, [Define to 1 if you have a gif (or ungif) library.])
fi
elif test "${HAVE_X11}" = "yes" && test "${with_gif}" != "no" \
|| test "${HAVE_W32}" = "yes"; then
|| test "${HAVE_W32}" = "yes" || test "${HAVE_NS}" = "yes"; then
AC_CHECK_HEADER(gif_lib.h,
# EGifPutExtensionLast only exists from version libungif-4.1.0b1.
# Earlier versions can crash Emacs, but version 5.0 removes EGifPutExtensionLast.

View file

@ -24,7 +24,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
/* Include this before including <setjmp.h> to work around bugs with
older libpng; see Bug#17429. */
#if defined HAVE_PNG && !defined HAVE_NS
#if defined HAVE_PNG
# include <png.h>
#endif
@ -125,6 +125,7 @@ typedef struct ns_bitmap_record Bitmap_Record;
#define NO_PIXMAP 0
#define PIX_MASK_RETAIN 0
#define PIX_MASK_DRAW 1
#endif /* HAVE_NS */
@ -6242,6 +6243,8 @@ image_can_use_native_api (Lisp_Object type)
{
# ifdef HAVE_NTGUI
return w32_can_use_native_image_api (type);
# elif defined HAVE_NS
return ns_can_use_native_image_api (type);
# else
return false;
# endif
@ -6310,6 +6313,10 @@ native_image_load (struct frame *f, struct image *img)
return w32_load_image (f, img,
image_spec_value (img->spec, QCfile, NULL),
image_spec_value (img->spec, QCdata, NULL));
# elif defined HAVE_NS
return ns_load_image (f, img,
image_spec_value (img->spec, QCfile, NULL),
image_spec_value (img->spec, QCdata, NULL));
# else
return 0;
# endif
@ -6322,7 +6329,7 @@ native_image_load (struct frame *f, struct image *img)
PNG
***********************************************************************/
#if defined (HAVE_PNG) || defined (HAVE_NS)
#if defined (HAVE_PNG)
/* Indices of image specification fields in png_format, below. */
@ -6373,10 +6380,10 @@ png_image_p (Lisp_Object object)
return fmt[PNG_FILE].count + fmt[PNG_DATA].count == 1;
}
#endif /* HAVE_PNG || HAVE_NS */
#endif /* HAVE_PNG */
#if defined HAVE_PNG && !defined HAVE_NS
#ifdef HAVE_PNG
# ifdef WINDOWSNT
/* PNG library details. */
@ -6966,17 +6973,7 @@ png_load (struct frame *f, struct image *img)
return png_load_body (f, img, &c);
}
#elif defined HAVE_NS
static bool
png_load (struct frame *f, struct image *img)
{
return ns_load_image (f, img,
image_spec_value (img->spec, QCfile, NULL),
image_spec_value (img->spec, QCdata, NULL));
}
#endif /* HAVE_NS */
#endif /* HAVE_PNG */
@ -6984,7 +6981,7 @@ png_load (struct frame *f, struct image *img)
JPEG
***********************************************************************/
#if defined (HAVE_JPEG) || defined (HAVE_NS)
#if defined (HAVE_JPEG)
/* Indices of image specification fields in gs_format, below. */
@ -7036,7 +7033,7 @@ jpeg_image_p (Lisp_Object object)
return fmt[JPEG_FILE].count + fmt[JPEG_DATA].count == 1;
}
#endif /* HAVE_JPEG || HAVE_NS */
#endif /* HAVE_JPEG */
#ifdef HAVE_JPEG
@ -7538,18 +7535,6 @@ jpeg_load (struct frame *f, struct image *img)
return jpeg_load_body (f, img, &mgr);
}
#else /* HAVE_JPEG */
#ifdef HAVE_NS
static bool
jpeg_load (struct frame *f, struct image *img)
{
return ns_load_image (f, img,
image_spec_value (img->spec, QCfile, NULL),
image_spec_value (img->spec, QCdata, NULL));
}
#endif /* HAVE_NS */
#endif /* !HAVE_JPEG */
@ -7558,7 +7543,7 @@ jpeg_load (struct frame *f, struct image *img)
TIFF
***********************************************************************/
#if defined (HAVE_TIFF) || defined (HAVE_NS)
#if defined (HAVE_TIFF)
/* Indices of image specification fields in tiff_format, below. */
@ -7611,7 +7596,7 @@ tiff_image_p (Lisp_Object object)
return fmt[TIFF_FILE].count + fmt[TIFF_DATA].count == 1;
}
#endif /* HAVE_TIFF || HAVE_NS */
#endif /* HAVE_TIFF */
#ifdef HAVE_TIFF
@ -7979,16 +7964,6 @@ tiff_load (struct frame *f, struct image *img)
return 1;
}
#elif defined HAVE_NS
static bool
tiff_load (struct frame *f, struct image *img)
{
return ns_load_image (f, img,
image_spec_value (img->spec, QCfile, NULL),
image_spec_value (img->spec, QCdata, NULL));
}
#endif
@ -7997,7 +7972,7 @@ tiff_load (struct frame *f, struct image *img)
GIF
***********************************************************************/
#if defined (HAVE_GIF) || defined (HAVE_NS)
#if defined (HAVE_GIF)
/* Indices of image specification fields in gif_format, below. */
@ -8059,7 +8034,7 @@ gif_image_p (Lisp_Object object)
return fmt[GIF_FILE].count + fmt[GIF_DATA].count == 1;
}
#endif /* HAVE_GIF || HAVE_NS */
#endif /* HAVE_GIF */
#ifdef HAVE_GIF
@ -8576,18 +8551,6 @@ gif_load (struct frame *f, struct image *img)
return 1;
}
#else /* !HAVE_GIF */
#ifdef HAVE_NS
static bool
gif_load (struct frame *f, struct image *img)
{
return ns_load_image (f, img,
image_spec_value (img->spec, QCfile, NULL),
image_spec_value (img->spec, QCdata, NULL));
}
#endif /* HAVE_NS */
#endif /* HAVE_GIF */
@ -10256,19 +10219,19 @@ static struct image_type const image_types[] =
{ SYMBOL_INDEX (Qsvg), svg_image_p, svg_load, image_clear_image,
IMAGE_TYPE_INIT (init_svg_functions) },
#endif
#if defined HAVE_PNG || defined HAVE_NS
#if defined HAVE_PNG
{ SYMBOL_INDEX (Qpng), png_image_p, png_load, image_clear_image,
IMAGE_TYPE_INIT (init_png_functions) },
#endif
#if defined HAVE_GIF || defined HAVE_NS
#if defined HAVE_GIF
{ SYMBOL_INDEX (Qgif), gif_image_p, gif_load, gif_clear_image,
IMAGE_TYPE_INIT (init_gif_functions) },
#endif
#if defined HAVE_TIFF || defined HAVE_NS
#if defined HAVE_TIFF
{ SYMBOL_INDEX (Qtiff), tiff_image_p, tiff_load, image_clear_image,
IMAGE_TYPE_INIT (init_tiff_functions) },
#endif
#if defined HAVE_JPEG || defined HAVE_NS
#if defined HAVE_JPEG
{ SYMBOL_INDEX (Qjpeg), jpeg_image_p, jpeg_load, image_clear_image,
IMAGE_TYPE_INIT (init_jpeg_functions) },
#endif
@ -10418,22 +10381,22 @@ non-numeric, there is no explicit limit on the size of images. */);
add_image_type (Qxpm);
#endif
#if defined (HAVE_JPEG) || defined (HAVE_NS) || defined (HAVE_NATIVE_IMAGE_API)
#if defined (HAVE_JPEG) || defined (HAVE_NATIVE_IMAGE_API)
DEFSYM (Qjpeg, "jpeg");
add_image_type (Qjpeg);
#endif
#if defined (HAVE_TIFF) || defined (HAVE_NS) || defined (HAVE_NATIVE_IMAGE_API)
#if defined (HAVE_TIFF) || defined (HAVE_NATIVE_IMAGE_API)
DEFSYM (Qtiff, "tiff");
add_image_type (Qtiff);
#endif
#if defined (HAVE_GIF) || defined (HAVE_NS) || defined (HAVE_NATIVE_IMAGE_API)
#if defined (HAVE_GIF) || defined (HAVE_NATIVE_IMAGE_API)
DEFSYM (Qgif, "gif");
add_image_type (Qgif);
#endif
#if defined (HAVE_PNG) || defined (HAVE_NS) || defined(HAVE_NATIVE_IMAGE_API)
#if defined (HAVE_PNG) || defined (HAVE_NATIVE_IMAGE_API)
DEFSYM (Qpng, "png");
add_image_type (Qpng);
#endif

View file

@ -45,6 +45,55 @@ Updated by Christian Limpach (chris@nice.ch)
========================================================================== */
bool
ns_can_use_native_image_api (Lisp_Object type)
{
NSString *imageType = @"unknown";
NSArray *types;
NSTRACE ("ns_can_use_native_image_api");
if (EQ (type, Qnative_image))
return YES;
#ifdef NS_IMPL_COCOA
/* Work out the UTI of the image type. */
if (EQ (type, Qjpeg))
imageType = @"public.jpeg";
else if (EQ (type, Qpng))
imageType = @"public.png";
else if (EQ (type, Qgif))
imageType = @"com.compuserve.gif";
else if (EQ (type, Qtiff))
imageType = @"public.tiff";
else if (EQ (type, Qsvg))
imageType = @"public.svg-image";
/* NSImage also supports a host of other types such as PDF and BMP,
but we don't yet support these in image.c. */
types = [NSImage imageTypes];
#else
/* Work out the image type. */
if (EQ (type, Qjpeg))
imageType = @"jpeg";
else if (EQ (type, Qpng))
imageType = @"png";
else if (EQ (type, Qgif))
imageType = @"gif";
else if (EQ (type, Qtiff))
imageType = @"tiff";
types = [NSImage imageFileTypes];
#endif
/* Check if the type is supported on this system. */
if ([types indexOfObject:imageType] != NSNotFound)
return YES;
else
return NO;
}
void *
ns_image_from_XBM (char *bits, int width, int height,
unsigned long fg, unsigned long bg)

View file

@ -1189,6 +1189,7 @@ extern void syms_of_nsselect (void);
/* From nsimage.m, needed in image.c */
struct image;
extern bool ns_can_use_native_image_api (Lisp_Object type);
extern void *ns_image_from_XBM (char *bits, int width, int height,
unsigned long fg, unsigned long bg);
extern void *ns_image_for_XPM (int width, int height, int depth);