Commit 576dfc8a authored by Stefan Kangas's avatar Stefan Kangas

Remove unused ftx font backend driver

* src/ftxfont.c: Remove file.
* admin/notes/font-backend:
* configure.ac:
* src/Makefile.in:
* src/deps.mk (ftxfont.o):
* src/font.c (syms_of_font):
* src/font.h (top-level, font_property_index):
* src/xfns.c (Fx_create_frame, x_create_tip_frame): Remove unused ftx
font backend driver.  Thanks to Glenn Morris for pointing out that it
can be removed.  (Bug#34663)
parent d672ad60
Pipeline #4560 passed with stage
in 56 minutes and 18 seconds
......@@ -15,8 +15,6 @@ The new files are:
device-independent methods of struct font_driver.
xftfont.c -- font-driver on X using Xft for FreeType fonts
utilizing methods provided by ftfont.c.
ftxfont.c -- font-driver on X directly using FreeType fonts
utilizing methods provided by ftfont.c.
w32font.c -- font driver on w32 using Windows native fonts,
corresponding to xfont.c
w32uniscribe.c -- font driver on w32, using the uniscribe API
......
......@@ -3372,8 +3372,6 @@ if test "${HAVE_X11}" = "yes"; then
fi # "$HAVE_XFT" != no
fi # "x${with_xft}" != "xno"
## We used to allow building with FreeType and without Xft.
## However, the ftx font backend driver is not in good shape.
if test "$HAVE_XFT" != "yes"; then
dnl For the "Does Emacs use" message at the end.
HAVE_XFT=no
......@@ -5280,9 +5278,9 @@ if test "${HAVE_X_WINDOWS}" = "yes" ; then
if test "$HAVE_CAIRO" = "yes"; then
FONT_OBJ="$FONT_OBJ ftfont.o ftcrfont.o"
elif test "$HAVE_XFT" = "yes"; then
FONT_OBJ="$FONT_OBJ ftfont.o xftfont.o ftxfont.o"
FONT_OBJ="$FONT_OBJ ftfont.o xftfont.o"
elif test "$HAVE_FREETYPE" = "yes"; then
FONT_OBJ="$FONT_OBJ ftfont.o ftxfont.o"
FONT_OBJ="$FONT_OBJ ftfont.o"
fi
fi
if test "${HAVE_HARFBUZZ}" = "yes" ; then
......
......@@ -28,6 +28,10 @@ applies, and please also update docstrings as needed.
'--with-cairo' is now the default, if the appropriate development files
are found by 'configure'
---
** The ftx font backend driver has been removed.
It was declared obsolete in Emacs 27.1.
* Startup Changes in Emacs 28.1
......
......@@ -295,8 +295,8 @@ EMACSRES = @EMACSRES@
W32_RES_LINK=@W32_RES_LINK@
## Empty if !HAVE_X_WINDOWS
## xfont.o ftfont.o xftfont.o ftxfont.o if HAVE_XFT
## xfont.o ftfont.o ftxfont.o if HAVE_FREETYPE
## xfont.o ftfont.o xftfont.o if HAVE_XFT
## xfont.o ftfont.o if HAVE_FREETYPE
## xfont.o ftfont.o ftcrfont.o if USE_CAIRO
## else xfont.o
## if HAVE_HARFBUZZ, hbfont.o is added regardless of the rest
......@@ -436,7 +436,7 @@ SOME_MACHINE_OBJECTS = dosfns.o msdos.o \
nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o macfont.o \
w32.o w32console.o w32cygwinx.o w32fns.o w32heap.o w32inevt.o w32notify.o \
w32menu.o w32proc.o w32reg.o w32select.o w32term.o w32xfns.o \
w16select.o widget.o xfont.o ftfont.o xftfont.o ftxfont.o gtkutil.o \
w16select.o widget.o xfont.o ftfont.o xftfont.o gtkutil.o \
xsettings.o xgselect.o termcap.o hbfont.o
## gmalloc.o if !SYSTEM_MALLOC && !DOUG_LEA_MALLOC, else empty.
......
......@@ -239,9 +239,6 @@ xfont.o: dispextern.h xterm.h frame.h blockinput.h character.h charset.h \
xftfont.o: xftfont.c dispextern.h xterm.h frame.h blockinput.h character.h \
charset.h font.h lisp.h globals.h $(config_h) atimer.h systime.h \
fontset.h ccl.h ftfont.h composite.h
ftxfont.o: ftxfont.c dispextern.h xterm.h frame.h blockinput.h character.h \
charset.h font.h lisp.h globals.h $(config_h) atimer.h systime.h \
fontset.h ccl.h
menu.o: menu.c lisp.h keyboard.h keymap.h frame.h termhooks.h blockinput.h \
dispextern.h $(srcdir)/../lwlib/lwlib.h xterm.h gtkutil.h menu.h \
lisp.h globals.h $(config_h) systime.h coding.h composite.h window.h \
......
......@@ -5545,7 +5545,6 @@ cause Xft crashes. Only has an effect in Xft builds. */);
#ifdef USE_CAIRO
syms_of_ftcrfont ();
#else
syms_of_ftxfont ();
#ifdef HAVE_XFT
syms_of_xftfont ();
#endif /* HAVE_XFT */
......
......@@ -69,8 +69,8 @@ INLINE_HEADER_BEGIN
enum font_property_index
{
/* FONT-TYPE is a symbol indicating a font backend; currently `x',
`xft', and `ftx' are available on X, `uniscribe' and `gdi' on
/* FONT-TYPE is a symbol indicating a font backend; currently `x'
and `xft' are available on X, `uniscribe' and `gdi' on
Windows, and `ns' under Cocoa / GNUstep. */
FONT_TYPE_INDEX,
......@@ -938,7 +938,6 @@ extern void syms_of_ftfont (void);
extern struct font_driver const xfont_driver;
extern Lisp_Object xfont_get_cache (struct frame *);
extern void syms_of_xfont (void);
extern void syms_of_ftxfont (void);
#ifdef HAVE_XFT
extern struct font_driver const xftfont_driver;
#ifdef HAVE_HARFBUZZ
......@@ -946,7 +945,6 @@ extern struct font_driver xfthbfont_driver;
#endif /* HAVE_HARFBUZZ */
#endif
#if defined HAVE_FREETYPE || defined HAVE_XFT
extern struct font_driver const ftxfont_driver;
extern void syms_of_xftfont (void);
#endif
#ifdef HAVE_BDFFONT
......
/* ftxfont.c -- FreeType font driver on X (without using XFT).
Copyright (C) 2006-2020 Free Software Foundation, Inc.
Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
National Institute of Advanced Industrial Science and Technology (AIST)
Registration Number H13PRO009
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
GNU Emacs 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
#include <X11/Xlib.h>
#include "lisp.h"
#include "xterm.h"
#include "frame.h"
#include "blockinput.h"
#include "font.h"
#include "pdumper.h"
/* FTX font driver. */
struct ftxfont_frame_data
{
/* Background and foreground colors. */
XColor colors[2];
/* GCs interpolating the above colors. gcs[0] is for a color
closest to BACKGROUND, and gcs[5] is for a color closest to
FOREGROUND. */
GC gcs[6];
struct ftxfont_frame_data *next;
};
/* Return an array of 6 GCs for antialiasing. */
static GC *
ftxfont_get_gcs (struct frame *f, unsigned long foreground, unsigned long background)
{
XColor color;
XGCValues xgcv;
int i;
struct ftxfont_frame_data *data = font_get_frame_data (f, Qftx);
struct ftxfont_frame_data *prev = NULL, *this = NULL, *new;
if (data)
{
for (this = data; this; prev = this, this = this->next)
{
if (this->colors[0].pixel < background)
continue;
if (this->colors[0].pixel > background)
break;
if (this->colors[1].pixel < foreground)
continue;
if (this->colors[1].pixel > foreground)
break;
return this->gcs;
}
}
new = xmalloc (sizeof *new);
new->next = this;
if (prev)
prev->next = new;
font_put_frame_data (f, Qftx, new);
new->colors[0].pixel = background;
new->colors[1].pixel = foreground;
block_input ();
XQueryColors (FRAME_X_DISPLAY (f), FRAME_X_COLORMAP (f), new->colors, 2);
for (i = 1; i < 7; i++)
{
/* Interpolate colors linearly. Any better algorithm? */
color.red
= (new->colors[1].red * i + new->colors[0].red * (8 - i)) / 8;
color.green
= (new->colors[1].green * i + new->colors[0].green * (8 - i)) / 8;
color.blue
= (new->colors[1].blue * i + new->colors[0].blue * (8 - i)) / 8;
if (! x_alloc_nearest_color (f, FRAME_X_COLORMAP (f), &color))
break;
xgcv.foreground = color.pixel;
new->gcs[i - 1] = XCreateGC (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
GCForeground, &xgcv);
}
unblock_input ();
if (i < 7)
{
block_input ();
for (i--; i >= 0; i--)
XFreeGC (FRAME_X_DISPLAY (f), new->gcs[i]);
unblock_input ();
if (prev)
prev->next = new->next;
else if (data)
font_put_frame_data (f, Qftx, new->next);
xfree (new);
return NULL;
}
return new->gcs;
}
static int
ftxfont_draw_bitmap (struct frame *f, GC gc_fore, GC *gcs, struct font *font,
unsigned int code, int x, int y, XPoint *p, int size,
int *n, bool flush)
{
struct font_bitmap bitmap;
unsigned char *b;
int i, j;
if (ftfont_get_bitmap (font, code, &bitmap, size > 0x100 ? 1 : 8) < 0)
return 0;
if (size > 0x100)
{
for (i = 0, b = bitmap.buffer; i < bitmap.rows;
i++, b += bitmap.pitch)
{
for (j = 0; j < bitmap.width; j++)
if (b[j / 8] & (1 << (7 - (j % 8))))
{
p[n[0]].x = x + bitmap.left + j;
p[n[0]].y = y - bitmap.top + i;
if (++n[0] == size)
{
XDrawPoints (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
gc_fore, p, size, CoordModeOrigin);
n[0] = 0;
}
}
}
if (flush && n[0] > 0)
XDrawPoints (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
gc_fore, p, n[0], CoordModeOrigin);
}
else
{
for (i = 0, b = bitmap.buffer; i < bitmap.rows;
i++, b += bitmap.pitch)
{
for (j = 0; j < bitmap.width; j++)
{
int idx = (bitmap.bits_per_pixel == 1
? ((b[j / 8] & (1 << (7 - (j % 8)))) ? 6 : -1)
: (b[j] >> 5) - 1);
if (idx >= 0)
{
XPoint *pp = p + size * idx;
pp[n[idx]].x = x + bitmap.left + j;
pp[n[idx]].y = y - bitmap.top + i;
if (++(n[idx]) == size)
{
XDrawPoints (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
idx == 6 ? gc_fore : gcs[idx], pp, size,
CoordModeOrigin);
n[idx] = 0;
}
}
}
}
if (flush)
{
for (i = 0; i < 6; i++)
if (n[i] > 0)
XDrawPoints (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
gcs[i], p + 0x100 * i, n[i], CoordModeOrigin);
if (n[6] > 0)
XDrawPoints (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f),
gc_fore, p + 0x600, n[6], CoordModeOrigin);
}
}
/* There is no ftfont_free_bitmap, so do not try to free BITMAP. */
return bitmap.advance;
}
static void
ftxfont_draw_background (struct frame *f, struct font *font, GC gc, int x, int y,
int width)
{
XGCValues xgcv;
XGetGCValues (FRAME_X_DISPLAY (f), gc,
GCForeground | GCBackground, &xgcv);
XSetForeground (FRAME_X_DISPLAY (f), gc, xgcv.background);
XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f), gc,
x, y - FONT_BASE (font), width, FONT_HEIGHT (font));
XSetForeground (FRAME_X_DISPLAY (f), gc, xgcv.foreground);
}
static Lisp_Object
ftxfont_list (struct frame *f, Lisp_Object spec)
{
return ftfont_list2 (f, spec, Qftx);
}
static Lisp_Object
ftxfont_match (struct frame *f, Lisp_Object spec)
{
return ftfont_match2 (f, spec, Qftx);
}
static Lisp_Object
ftxfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
{
Lisp_Object font_object = ftfont_open (f, entity, pixel_size);
if (NILP (font_object))
return Qnil;
struct font *font = XFONT_OBJECT (font_object);
font->driver = &ftxfont_driver;
return font_object;
}
static void
ftxfont_close (struct font *font)
{
ftfont_close (font);
}
static int
ftxfont_draw (struct glyph_string *s, int from, int to, int x, int y,
bool with_background)
{
struct frame *f = s->f;
struct face *face = s->face;
struct font *font = s->font;
XPoint p[0x700];
int n[7];
unsigned *code = s->char2b + from;
int len = to - from;
int i;
GC *gcs;
int xadvance;
n[0] = n[1] = n[2] = n[3] = n[4] = n[5] = n[6] = 0;
block_input ();
if (with_background)
ftxfont_draw_background (f, font, s->gc, x, y, s->width);
if (face->gc == s->gc)
{
gcs = ftxfont_get_gcs (f, face->foreground, face->background);
}
else
{
XGCValues xgcv;
unsigned long mask = GCForeground | GCBackground;
XGetGCValues (FRAME_X_DISPLAY (f), s->gc, mask, &xgcv);
gcs = ftxfont_get_gcs (f, xgcv.foreground, xgcv.background);
}
if (gcs)
{
if (s->num_clips)
for (i = 0; i < 6; i++)
XSetClipRectangles (FRAME_X_DISPLAY (f), gcs[i], 0, 0,
s->clip, s->num_clips, Unsorted);
for (i = 0; i < len; i++)
{
xadvance = ftxfont_draw_bitmap (f, s->gc, gcs, font, code[i], x, y,
p, 0x100, n, i + 1 == len);
x += (s->padding_p ? 1 : xadvance);
}
if (s->num_clips)
for (i = 0; i < 6; i++)
XSetClipMask (FRAME_X_DISPLAY (f), gcs[i], None);
}
else
{
/* We can't draw with antialiasing.
s->gc should already have a proper clipping setting. */
for (i = 0; i < len; i++)
{
xadvance = ftxfont_draw_bitmap (f, s->gc, NULL, font, code[i], x, y,
p, 0x700, n, i + 1 == len);
x += (s->padding_p ? 1 : xadvance);
}
}
unblock_input ();
return len;
}
static int
ftxfont_end_for_frame (struct frame *f)
{
struct ftxfont_frame_data *data = font_get_frame_data (f, Qftx);
block_input ();
while (data)
{
struct ftxfont_frame_data *next = data->next;
int i;
for (i = 0; i < 6; i++)
XFreeGC (FRAME_X_DISPLAY (f), data->gcs[i]);
xfree (data);
data = next;
}
unblock_input ();
font_put_frame_data (f, Qftx, NULL);
return 0;
}
static void syms_of_ftxfont_for_pdumper (void);
struct font_driver const ftxfont_driver =
{
/* We can't draw a text without device dependent functions. */
.type = LISPSYM_INITIALLY (Qftx),
.get_cache = ftfont_get_cache,
.list = ftxfont_list,
.match = ftxfont_match,
.list_family = ftfont_list_family,
.open_font = ftxfont_open,
.close_font = ftxfont_close,
.has_char = ftfont_has_char,
.encode_char = ftfont_encode_char,
.text_extents = ftfont_text_extents,
.draw = ftxfont_draw,
.get_bitmap = ftfont_get_bitmap,
.anchor_point = ftfont_anchor_point,
#ifdef HAVE_LIBOTF
.otf_capability = ftfont_otf_capability,
#endif
.end_for_frame = ftxfont_end_for_frame,
#if defined HAVE_M17N_FLT && defined HAVE_LIBOTF
.shape = ftfont_shape,
#endif
#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
.get_variation_glyphs = ftfont_variation_glyphs,
#endif
.filter_properties = ftfont_filter_properties,
.combining_capability = ftfont_combining_capability,
};
void
syms_of_ftxfont (void)
{
DEFSYM (Qftx, "ftx");
pdumper_do_now_and_after_load (syms_of_ftxfont_for_pdumper);
}
static void
syms_of_ftxfont_for_pdumper (void)
{
register_font_driver (&ftxfont_driver, NULL);
}
......@@ -3878,8 +3878,6 @@ This function is an internal primitive--use `make-frame' instead. */)
#ifdef HAVE_HARFBUZZ
register_font_driver (&xfthbfont_driver, f);
#endif
#else /* not HAVE_XFT */
register_font_driver (&ftxfont_driver, f);
#endif /* not HAVE_XFT */
#endif /* HAVE_FREETYPE */
#endif /* not USE_CAIRO */
......@@ -6364,8 +6362,6 @@ x_create_tip_frame (struct x_display_info *dpyinfo, Lisp_Object parms)
#ifdef HAVE_HARFBUZZ
register_font_driver (&xfthbfont_driver, f);
#endif
#else /* not HAVE_XFT */
register_font_driver (&ftxfont_driver, f);
#endif /* not HAVE_XFT */
#endif /* HAVE_FREETYPE */
#endif /* not USE_CAIRO */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment