SHA256
1
0
forked from pool/xfig
Dr. Werner Fink 2024-09-09 08:04:32 +00:00 committed by Git OBS Bridge
commit 8c7bfa5d99
20 changed files with 2652 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

124
042708.patch Normal file
View File

@ -0,0 +1,124 @@
From 042708a455f264e5b78d55f4df51ce3e508cc2ba Mon Sep 17 00:00:00 2001
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date: Mon, 2 Sep 2024 21:01:08 +0200
Subject: [PATCH] Place the dimension line text into the widget, #179
Draw the text that should appear in the example dimension line into
the dimension line widget, not onto the canvas.
---
src/w_indpanel.c | 45 +++++++++++++++++++++++++++++----------------
1 file changed, 29 insertions(+), 16 deletions(-)
diff --git src/w_indpanel.c src/w_indpanel.c
index 95218fd..bde8298 100644
--- src/w_indpanel.c
+++ src/w_indpanel.c
@@ -2499,7 +2499,6 @@ static Widget tick_thick_w;
static Widget box_thick_w, font_size_w, dimline_style_panel;
static Widget left_arrow_type_panel, right_arrow_type_panel;
static Widget font_button;
-static Pixmap dimline_examp_pixmap = (Pixmap) 0;
static Widget exampline;
static Widget fixed_chk, actual_chk;
static Widget dimline_precw;
@@ -2599,15 +2598,7 @@ void popup_dimline_panel(ind_sw_info *isw)
/* make an example line that shows current settings as a label */
- /* make a pixmap to draw it into */
- if (dimline_examp_pixmap == (Pixmap) 0)
- dimline_examp_pixmap = XCreatePixmap(tool_d, canvas_win,
- DIMLINE_PIXMAP_WIDTH, DIMLINE_PIXMAP_HEIGHT, tool_dpth);
- /* clear it */
- XFillRectangle(tool_d, dimline_examp_pixmap, ind_blank_gc, 0, 0,
- DIMLINE_PIXMAP_WIDTH, 30);
-
- /* now make the label widget to display the pixmap */
+ /* make the label widget to display the pixmap */
FirstArg(XtNfromVert, below);
NextArg(XtNborderWidth, 0);
NextArg(XtNwidth, DIMLINE_PIXMAP_WIDTH);
@@ -2619,7 +2610,9 @@ void popup_dimline_panel(ind_sw_info *isw)
NextArg(XtNinternational, False);
exampline = XtCreateManagedWidget("", labelWidgetClass,
form, Args, ArgCount);
- draw_cur_dimline(); /* this draws it into dimline_examp_pixmap */
+
+ /* draws the example dimension line into the label */
+ draw_cur_dimline();
/******************************/
/* frame for Line information */
@@ -3098,6 +3091,7 @@ void draw_cur_dimline(void)
F_compound *dimline_example;
F_point *point;
Boolean save_showlen, save_shownums;
+ static Pixmap dimline_examp_pixmap = (Pixmap)0;
/* make the a dimension line */
line = create_line();
@@ -3114,8 +3108,15 @@ void draw_cur_dimline(void)
/* make it 3-3/4 inches long */
append_point((int)((appres.INCHES? DIMLINE_IP_LENGTH*PIX_PER_INCH:
DIMLINE_SI_LENGTH*PIX_PER_CM)+75), 275, &point);
- /* make a dimension line from that line */
- dimline_example = create_dimension_line(line, False);
+
+ /*
+ * With xfig -debug, create_dimension_line() already draws the bounding
+ * boxes of some elements into the canvas. First create the pixmap to draw
+ * the dimension line into.
+ */
+ if (!dimline_examp_pixmap)
+ dimline_examp_pixmap = XCreatePixmap(tool_d, canvas_win,
+ DIMLINE_PIXMAP_WIDTH, DIMLINE_PIXMAP_HEIGHT, tool_dpth);
/* clear it */
XFillRectangle(tool_d, dimline_examp_pixmap, ind_blank_gc, 0, 0,
@@ -3127,8 +3128,19 @@ void draw_cur_dimline(void)
appres.showlengths = appres.shownums = False;
/* now draw it into our pixmap */
- canvas_win = (Window) dimline_examp_pixmap;
+ canvas_win = (Window)dimline_examp_pixmap;
+ XftDrawChange(canvas_draw, dimline_examp_pixmap);
preview_in_progress = True;
+
+ /* Now create an (empty) dimension line compound, with the side effect that
+ * under appres.DEBUG some boxes are drawn. */
+ if ((dimline_example = create_dimension_line(line, False)) == NULL) {
+ free_linestorage(line);
+ XFreePixmap(tool_d, dimline_examp_pixmap);
+ dimline_examp_pixmap = (Pixmap)0;
+ return;
+ }
+
/* locate the line components of the dimension line */
dimline_components(dimline_example, &line, &tick1, &tick2, &poly);
draw_line(line,PAINT);
@@ -3141,6 +3153,7 @@ void draw_cur_dimline(void)
/* restore the canvas */
canvas_win = main_canvas;
+ XftDrawChange(canvas_draw, main_canvas);
/* and the showlengths and shownums settings */
appres.showlengths = save_showlen;
appres.shownums = save_shownums;
@@ -3148,12 +3161,12 @@ void draw_cur_dimline(void)
/* fool the toolkit... you know the drill by now */
XtUnmanageChild(exampline);
- FirstArg(XtNbitmap, (Pixmap) 0);
+ FirstArg(XtNbitmap, (Pixmap)0);
SetValues(exampline);
FirstArg(XtNbitmap, dimline_examp_pixmap);
SetValues(exampline);
XtManageChild(exampline);
- /* finally, free the dimline */
+ /* finally, free the dimline and the pixmap*/
free_compound(&dimline_example);
}
--
2.35.3

56
7e0157.patch Normal file
View File

@ -0,0 +1,56 @@
From 7e0157b422b696d848c312aace78c89f3f914192 Mon Sep 17 00:00:00 2001
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date: Mon, 2 Sep 2024 21:30:00 +0200
Subject: [PATCH] Correctly scale the example dimension line in the widget
Draw the example dimension line into the correct position into its
widget. Before, moving the canvas, probably changing the zoom, then
entering line drawing mode and clicking on the dimension line widget in
the indicator panel would not render the example line correctly.
---
src/w_indpanel.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git src/w_indpanel.c src/w_indpanel.c
index bde8298..5ab33f6 100644
--- src/w_indpanel.c
+++ src/w_indpanel.c
@@ -3091,6 +3091,9 @@ void draw_cur_dimline(void)
F_compound *dimline_example;
F_point *point;
Boolean save_showlen, save_shownums;
+ int save_zoomxoff, save_zoomyoff;
+ float save_zoomscale;
+ float save_display_zoomscale;
static Pixmap dimline_examp_pixmap = (Pixmap)0;
/* make the a dimension line */
@@ -3126,6 +3129,14 @@ void draw_cur_dimline(void)
save_showlen = appres.showlengths;
save_shownums = appres.shownums;
appres.showlengths = appres.shownums = False;
+ /* and draw at scale 1 into the correct position */
+ save_zoomxoff = zoomxoff;
+ save_zoomyoff = zoomyoff;
+ save_zoomscale = zoomscale;
+ save_display_zoomscale = display_zoomscale;
+ zoomxoff = zoomyoff = 0;
+ display_zoomscale = 1.0f;
+ zoomscale = display_zoomscale / ZOOM_FACTOR;
/* now draw it into our pixmap */
canvas_win = (Window)dimline_examp_pixmap;
@@ -3157,6 +3168,10 @@ void draw_cur_dimline(void)
/* and the showlengths and shownums settings */
appres.showlengths = save_showlen;
appres.shownums = save_shownums;
+ zoomxoff = save_zoomxoff;
+ zoomyoff = save_zoomyoff;
+ zoomscale = save_zoomscale;
+ display_zoomscale = save_display_zoomscale;
preview_in_progress = False;
/* fool the toolkit... you know the drill by now */
--
2.35.3

View File

@ -0,0 +1,29 @@
From a4a2f3f3aa29ec7fc84f9d782306b37bbe75025c Mon Sep 17 00:00:00 2001
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date: Sun, 31 Dec 2023 22:51:29 +0100
Subject: [PATCH] Fix exporting only active layers, ticket #163
---
src/u_print.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/u_print.c b/src/u_print.c
index c24c096..57921b3 100644
--- a/src/u_print.c
+++ b/src/u_print.c
@@ -861,10 +861,10 @@ build_layer_list(char *layers)
}
if (len < notlen && firstyes != -1) {
/* use list of layers TO print */
- sprintf(layers," -D +%s ",list);
+ sprintf(layers, "+%s", list);
} else if (firstno != -1){
/* use list of layers to NOT print */
- sprintf(layers," -D -%s ",notlist);
+ sprintf(layers, "-%s", notlist);
}
}
--
2.39.2

View File

@ -0,0 +1,44 @@
From 68403622a6f6c7d74f73e38989cfc0ed86fb83fc Mon Sep 17 00:00:00 2001
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date: Sun, 31 Dec 2023 15:18:45 +0100
Subject: [PATCH] Sanitize a call to realloc(), ticket #165
---
src/u_print.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/u_print.c b/src/u_print.c
index 2ed385f..c24c096 100644
--- a/src/u_print.c
+++ b/src/u_print.c
@@ -130,7 +130,7 @@ start_argumentlist(char *arg[restrict], char argbuf[restrict][ARGBUF_SIZE],
arg[0] = fig2dev_cmd;
arg[1] = "-L";
*a = 2; /* arg[2] will be the output language */
- if (appres.magnification < 99.99 | appres.magnification > 100.01) {
+ if (appres.magnification < 99.99 || appres.magnification > 100.01) {
int n;
arg[++*a] = "-m";
n = snprintf(argbuf[++*b], ARGBUF_SIZE,
@@ -531,6 +531,7 @@ print_export(char *file, int xoff, int yoff, char *backgrnd, char *transparent,
} else if (cur_exp_lang == LANG_PSTEX ||
cur_exp_lang == LANG_PDFTEX) {
size_t len = strlen(outfile);
+ char *s;
/* Options were already set above
- output the first file */
@@ -544,8 +545,9 @@ print_export(char *file, int xoff, int yoff, char *backgrnd, char *transparent,
goto free_outfile;
}
memcpy(tmp_name, outfile, len + 1);
- if (!realloc(outfile, len + 3)) {
+ if (!(outfile = realloc(s = outfile, len + 3))) {
ret = 1;
+ outfile = s; /* for free(outfile) below */
goto free_tmp_name;
}
strcpy(outfile + len, "_t");
--
2.39.2

33
a038d6.patch Normal file
View File

@ -0,0 +1,33 @@
From a038d6624eb0bb4479d11f5b2bf472714c200365 Mon Sep 17 00:00:00 2001
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date: Sun, 1 Sep 2024 23:00:42 +0200
Subject: [PATCH] Do not lose input in xfig -debug mode
Starting with xfig -debug, entering line drawing mode and clicking on
the dimension line attributes in the indicator panel (below the canvas)
would lose the input, one has to quit xfig from the window manager or by
signal.
---
src/w_indpanel.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git src/w_indpanel.c src/w_indpanel.c
index 5ab33f6..9e4755b 100644
--- src/w_indpanel.c
+++ src/w_indpanel.c
@@ -2995,10 +2995,8 @@ void popup_dimline_panel(ind_sw_info *isw)
actions_added = True;
}
- if (appres.DEBUG)
- XtPopup(choice_popup, XtGrabNone); /* makes debugging easier */
- else
- XtPopup(choice_popup, XtGrabExclusive);
+ XtPopup(choice_popup, XtGrabExclusive);
+
/* if the file message window is up add it to the grab */
file_msg_add_grab();
(void) XSetWMProtocols(tool_d, XtWindow(choice_popup), &wm_delete_window, 1);
--
2.35.3

63
f3466c.patch Normal file
View File

@ -0,0 +1,63 @@
Based on f3466c988d67b90d8767c8173d9fae1b64211759 Mon Sep 17 00:00:00 2001
From: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date: Mon, 2 Sep 2024 21:57:04 +0200
Subject: [PATCH] With xfig -debug, do not draw bounding boxes into widgets
Do not draw bounding boxes into the example libraries and
example dimension line.
---
src/u_draw.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git src/u_draw.c src/u_draw.c
index 71edbab..22740db 100644
--- src/u_draw.c
+++ src/u_draw.c
@@ -3,7 +3,7 @@
* Copyright (c) 1985-1988 by Supoj Sutanthavibul
* Parts Copyright (c) 1989-2015 by Brian V. Smith
* Parts Copyright (c) 1991 by Paul King
- * Parts Copyright (c) 2016-2023 by Thomas Loimer
+ * Parts Copyright (c) 2016-2024 by Thomas Loimer
*
* Parts Copyright (c) 1992 by James Tough
* Parts Copyright (c) 1998 by Georg Stemmer
@@ -1336,7 +1336,7 @@ void draw_text(F_text *text, int op)
return;
/* outline the text bounds in red if debug resource is set */
- if (appres.DEBUG) {
+ if (appres.DEBUG && !preview_in_progress) {
pw_vector(canvas_win, x1, y1, x2, y2, op, 1, RUBBER_LINE, 0.0, RED);
pw_vector(canvas_win, x2, y2, x3, y3, op, 1, RUBBER_LINE, 0.0, RED);
pw_vector(canvas_win, x3, y3, x4, y4, op, 1, RUBBER_LINE, 0.0, RED);
@@ -1593,7 +1593,7 @@ void clip_arrows(F_line *obj, int objtype, int op, int skip)
}
n = i;
/* draw the clipping area for debugging */
- if (appres.DEBUG) {
+ if (appres.DEBUG && !preview_in_progress) {
for (i=0; i<n; i++) {
if (i==n-1)
j=0;
@@ -1632,7 +1632,7 @@ void clip_arrows(F_line *obj, int objtype, int op, int skip)
}
n = i;
/* draw the clipping area for debugging */
- if (appres.DEBUG) {
+ if (appres.DEBUG && !preview_in_progress) {
int j;
for (i=0; i<n; i++) {
if (i==n-1)
@@ -2127,7 +2127,7 @@ void debug_depth(int depth, int x, int y)
char str[10];
PR_SIZE size;
- if (appres.DEBUG) {
+ if (appres.DEBUG && !preview_in_progress) {
sprintf(str,"%d",depth);
size = textsize(roman_font, strlen(str), str);
pw_text(canvas_win, x-size.length-round(3.0/zoomscale), round(y-3.0/zoomscale),
--
2.35.3

46
font-test.fig Normal file
View File

@ -0,0 +1,46 @@
#FIG 3.2
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 12330 31770 162 162 12330 31770 12465 31860
1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 495 -540 142 142 495 -540 630 -495
4 0 0 50 0 0 50 0.0000 4 150 1230 450 1000 Times-Roman\001
4 0 0 50 0 1 50 0.0000 4 150 1065 450 2000 Times-Italic\001
4 0 0 50 0 2 50 0.0000 4 150 1095 450 3000 Times-Bold\001
4 0 0 50 0 4 50 0.0000 4 135 1350 450 5000 AvantGarde-Book\001
4 0 0 50 0 5 50 0.0000 4 165 1980 450 6000 AvantGarde-BookOblique\001
4 0 0 50 0 6 50 0.0000 4 135 1350 450 7000 AvantGarde-Demi\001
4 0 0 50 0 7 50 0.0000 4 165 1980 450 8000 AvantGarde-DemiOblique\001
4 0 0 50 0 8 50 0.0000 4 165 1170 450 9000 Bookman-Light\001
4 0 0 50 0 9 50 0.0000 4 165 1710 450 10000 Bookman-LightItalic\001
4 0 0 50 0 10 50 0.0000 4 135 1080 450 11000 Bookman-Demi\001
4 0 0 50 0 11 50 0.0000 4 135 1620 450 12000 Bookman-DemiItalic\001
4 0 0 50 0 12 50 0.0000 4 150 945 450 13000 Courier\001
4 0 0 50 0 13 50 0.0000 4 195 2025 450 14000 Courier-Oblique\001
4 0 0 50 0 14 50 0.0000 4 150 1620 450 15000 Courier-Bold\001
4 0 0 50 0 15 50 0.0000 4 195 2565 450 16000 Courier-BoldOblique\001
4 0 0 50 0 16 50 0.0000 4 165 900 450 17000 Helvetica\001
4 0 0 50 0 17 50 0.0000 4 210 1740 450 18000 Helvetica-Oblique\001
4 0 0 50 0 18 50 0.0000 4 165 1500 450 19000 Helvetica-Bold\001
4 0 0 50 0 19 50 0.0000 4 210 2310 450 20000 Helvetica-BoldOblique\001
4 0 0 50 0 20 50 0.0000 4 135 1440 450 21000 Helvetica-Narrow\001
4 0 0 50 0 21 50 0.0000 4 165 2160 450 22000 Helvetica-Narrow-Oblique\001
4 0 0 50 0 22 50 0.0000 4 135 1890 450 23000 Helvetica-Narrow-Bold\001
4 0 0 50 0 23 50 0.0000 4 165 2520 450 24000 Helvetica-Narrow-BoldOblique\001
4 0 0 50 0 24 50 0.0000 4 210 2805 450 25000 NewCenturySchlbk-Roman\001
4 0 0 50 0 25 50 0.0000 4 210 2475 450 26000 NewCenturySchlbk-Italic\001
4 0 0 50 0 26 50 0.0000 4 210 2760 450 27000 NewCenturySchlbk-Bold\001
4 0 0 50 0 27 50 0.0000 4 210 3315 450 28000 NewCenturySchlbk-BoldItalic\001
4 0 0 50 0 28 50 0.0000 4 135 1260 450 29000 Palatino-Roman\001
4 0 0 50 0 29 50 0.0000 4 135 1350 450 30000 Palatino-Italic\001
4 0 0 50 0 30 50 0.0000 4 135 1170 450 31000 Palatino-Bold\001
4 0 0 50 0 31 50 0.0000 4 135 1710 450 32000 Palatino-BoldItalic\001
4 0 0 50 0 32 50 0.0000 4 360 1275 450 33000 Symbol\001
4 0 0 50 0 33 50 0.0000 4 165 2250 450 34000 ZapfChancery-MediumItalic\001
4 0 0 50 0 34 50 0.0000 4 165 1080 450 35000 ZapfDingbats\001
4 0 0 50 0 3 50 0.0000 4 150 1515 450 4000 Times-BoldItalic\001

58
xfig-3.2.6.dif Normal file
View File

@ -0,0 +1,58 @@
---
app-defaults/Fig | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
--- app-defaults/Fig
+++ app-defaults/Fig 2023-09-13 09:21:18.377983211 +0000
@@ -15,6 +15,7 @@
! The following fixes a problem that some window managers have
! with xfig continually resizing itself
Fig*AllowShellResize: False
+Fig.inches: False
! Image editor - can edit imported image
Fig.image_editor: xdg-open
@@ -166,8 +167,11 @@ Fig*canvas.shadowWidth: 0
! If on monochrome server, or no Fig-color app-defaults file
! This background resource shows between the buttons like a border
-Fig*mode_panel.background: black
+Fig*mode_panel.background: gray67
Fig*mode_panel.foreground: black
+Fig*mode_panel*topShadow: white
+Fig*mode_panel*topShadowPixel: white
+Fig*mode_panel*bottomShadowPixel: gray17
! Specify a private Compose key database file. If this resource contains a "/"
! then the wired-in name of the xfig global directory will not be prefixed
@@ -638,7 +642,29 @@ Fig*sideruler.background: gray95
! file panel and scrollbar
Fig*FigList*background: gray95
Fig*List*background: gray95
-Fig*Scrollbar.background: gray80
+Fig*Scrollbar.background: gray77
+
+Fig*Scrollbar.foreground: gray37
+Fig*ScrollbarBackground: gray67
+Fig*ScrollbarForeground: gray37
+
+Fig*horizontal.shadowWidth: 2
+Fig*horizontal.topShadowPixel: gray95
+Fig*horizontal.bottomShadowPixel: gray37
+Fig*horizontal.topShadow: gray95
+Fig*horizontal.bottomShadow: gray37
+
+Fig*Scrollbar.shadowWidth: 2
+Fig*Scrollbar.topShadow: gray95
+Fig*Scrollbar.bottomShadow: gray37
+Fig*Scrollbar.topShadowPixel: gray95
+Fig*Scrollbar.bottomShadowPixel: gray37
+
+Fig*stdColor.shadowWidth: 2
+Fig*stdColor.topShadow: gray95
+Fig*stdColor.bottomShadow: gray37
+Fig*stdColor.topShadowPixel: gray95
+Fig*stdColor.bottomShadowPixel: gray37
Fig*Label.background: gray80
Fig*ind_box.background: gray80

619
xfig-3.2.9-dingbats.dif Normal file
View File

@ -0,0 +1,619 @@
---
src/u_fonts.c | 497 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
src/u_fonts.h | 11 +
src/w_drawprim.c | 17 +
3 files changed, 513 insertions(+), 12 deletions(-)
--- src/u_fonts.c
+++ src/u_fonts.c 2023-09-19 10:03:39.825796406 +0000
@@ -124,9 +124,9 @@ const char *const xft_name[NUM_FONTS] =
"palatino:italic", /* Palatino-Italic */
"palatino:bold", /* Palatino-Bold */
"palatino:bold:italic", /* Palatino-BoldItalic */
- "symbol", /* Symbol */
+ "symbol,StandardSymbolsPS,StandardSymbolsL", /* Symbol */
"zapfchancery:medium:italic", /* ZapfChancery-MediumItalic */
- "zapfdingbats" /* ZapfDingbats */
+ "zapfdingbats,ITCZapfDingbats,Dingbats,D050000L" /* ZapfDingbats */
};
@@ -307,6 +307,7 @@ textextents(F_text *t)
{
XGlyphInfo extents;
XftFont *rotfont;
+ map_f map = NULL;
int len = (int)strlen(t->cstring);
/* shortcut, nothing to do for an empty string */
@@ -325,8 +326,20 @@ textextents(F_text *t)
/* Get the font at native Fig resolution (often, 1200 ppi) */
rotfont = getfont(psfont_text(t), t->font, t->size * ZOOM_FACTOR,
(double)t->angle);
- XftTextExtentsUtf8(tool_d, rotfont, (XftChar8 *)t->cstring, len,
- &extents);
+ if ((map = adobe_charset(rotfont))) {
+ XftChar32 glyphs[len], *glyph;
+ XftChar8 *s = (XftChar8 *)t->cstring;
+ int glen = 0;
+
+ for (XftChar8 *chr = s; chr < s+len; chr++) {
+ XftChar32 glyph = XftCharIndex(tool_d, rotfont, map(*chr));
+ if (glyph)
+ glyphs[glen++] = glyph;
+ }
+ XftGlyphExtents(tool_d, rotfont, glyphs, glen, &extents);
+ } else
+ XftTextExtentsUtf8(tool_d, rotfont, (XftChar8 *)t->cstring, len,
+ &extents);
/* libxft keeps the last 16, closed fonts in cache.
Hence, no need to keep rotfont open, in our own cache. */
closefont(rotfont);
@@ -409,13 +422,26 @@ textextents(F_text *t)
} else {
/* a font at an angle */
XftFont *horfont;
+ map_f map = NULL;
double cosa, sina;
struct f_pos tl, bl, tr, br;
horfont = getfont(psfont_text(t), t->font,
t->size * ZOOM_FACTOR, 0.0);
- XftTextExtentsUtf8(tool_d, horfont, (XftChar8 *)t->cstring, len,
- &extents);
+ if ((map = adobe_charset(horfont))) {
+ XftChar32 glyphs[len], *glyph;
+ XftChar8 *s = (XftChar8 *)t->cstring;
+ int glen = 0;
+
+ for (XftChar8 *chr = s; chr < s+len; chr++) {
+ XftChar32 glyph = XftCharIndex(tool_d, horfont, map(*chr));
+ if (glyph)
+ glyphs[glen++] = glyph;
+ }
+ XftGlyphExtents(tool_d, horfont, glyphs, glen, &extents);
+ } else
+ XftTextExtentsUtf8(tool_d, horfont, (XftChar8 *)t->cstring,
+ len, &extents);
/* See above, libxft keeps a cache of 16 closed fonts. */
closefont(horfont);
@@ -453,11 +479,24 @@ int
textlength(XftFont *horfont, XftChar8 *string, int len)
{
XGlyphInfo extents;
+ map_f map = NULL;
if (len == 0)
return 0;
- XftTextExtentsUtf8(tool_d, horfont, string, len, &extents);
+ if ((map = adobe_charset(horfont))) {
+ XftChar32 glyphs[len], *glyph;
+ XftChar8 *chr, *s = string;
+ int glen = 0;
+
+ for (XftChar8 *chr = s; chr < s+len; chr++) {
+ XftChar32 glyph = XftCharIndex(tool_d, horfont, map(*chr));
+ if (glyph)
+ glyphs[glen++] = glyph;
+ }
+ XftGlyphExtents(tool_d, horfont, glyphs, glen, &extents);
+ } else
+ XftTextExtentsUtf8(tool_d, horfont, string, len, &extents);
return (int)extents.xOff;
}
@@ -473,16 +512,29 @@ textmaxheight(int psflag, int font, int
XGlyphInfo extents;
XftFont *horfont;
XftChar8 max_height_str[] = "{|(fgjOÜ";
+ map_f map = NULL;
+ size_t len = sizeof(max_height_str);
horfont = getfont(psflag, font, size * ZOOM_FACTOR, 0.0);
- XftTextExtentsUtf8(tool_d, horfont, max_height_str,
- (int)sizeof(max_height_str), &extents);
+ if ((map = adobe_charset(horfont))) {
+ XftChar32 glyphs[len], *glyph;
+ XftChar8 *s = max_height_str;
+ int glen = 0;
+
+ for (XftChar8 *chr = s; chr < s+len; chr++) {
+ XftChar32 glyph = XftCharIndex(tool_d, horfont, map(*chr));
+ if (glyph)
+ glyphs[glen++] = glyph;
+ }
+ XftGlyphExtents(tool_d, horfont, glyphs, glen, &extents);
+ } else
+ XftTextExtentsUtf8(tool_d, horfont, max_height_str,
+ (int)len, &extents);
closefont(horfont);
*ascent = extents.y;
*descent = extents.height - extents.y;
}
-
/*
* Return the drawing origin, given the marker position (base_x, base_y)
* and the alignment.
@@ -510,3 +562,428 @@ text_origin(int *draw_x, int *draw_y, in
break;
}
}
+/*
+ * Unicode mapping found in
+ * /usr/share/fonts/encodings/adobe-dingbats.enc.gz
+ */
+XftChar32 map_dingbats(XftChar8 in)
+{
+ switch (in) {
+ case 0x20: return 0x0020; /* SPACE */
+ case 0x21: return 0x2701; /* UPPER BLADE SCISSORS */
+ case 0x22: return 0x2702; /* BLACK SCISSORS */
+ case 0x23: return 0x2703; /* LOWER BLADE SCISSORS */
+ case 0x24: return 0x2704; /* WHITE SCISSORS */
+ case 0x25: return 0x260E; /* BLACK TELEPHONE */
+ case 0x26: return 0x2706; /* TELEPHONE LOCATION SIGN */
+ case 0x27: return 0x2707; /* TAPE DRIVE */
+ case 0x28: return 0x2708; /* AIRPLANE */
+ case 0x29: return 0x2709; /* ENVELOPE */
+ case 0x2A: return 0x261B; /* BLACK RIGHT POINTING INDEX */
+ case 0x2B: return 0x261E; /* WHITE RIGHT POINTING INDEX */
+ case 0x2C: return 0x270C; /* VICTORY HAND */
+ case 0x2D: return 0x270D; /* WRITING HAND */
+ case 0x2E: return 0x270E; /* LOWER RIGHT PENCIL */
+ case 0x2F: return 0x270F; /* PENCIL */
+ case 0x30: return 0x2710; /* UPPER RIGHT PENCIL */
+ case 0x31: return 0x2711; /* WHITE NIB */
+ case 0x32: return 0x2712; /* BLACK NIB */
+ case 0x33: return 0x2713; /* CHECK MARK */
+ case 0x34: return 0x2714; /* HEAVY CHECK MARK */
+ case 0x35: return 0x2715; /* MULTIPLICATION X */
+ case 0x36: return 0x2716; /* HEAVY MULTIPLICATION X */
+ case 0x37: return 0x2717; /* BALLOT X */
+ case 0x38: return 0x2718; /* HEAVY BALLOT X */
+ case 0x39: return 0x2719; /* OUTLINED GREEK CROSS */
+ case 0x3A: return 0x271A; /* HEAVY GREEK CROSS */
+ case 0x3B: return 0x271B; /* OPEN CENTRE CROSS */
+ case 0x3C: return 0x271C; /* HEAVY OPEN CENTRE CROSS */
+ case 0x3D: return 0x271D; /* LATIN CROSS */
+ case 0x3E: return 0x271E; /* SHADOWED WHITE LATIN CROSS */
+ case 0x3F: return 0x271F; /* OUTLINED LATIN CROSS */
+ case 0x40: return 0x2720; /* MALTESE CROSS */
+ case 0x41: return 0x2721; /* STAR OF DAVID */
+ case 0x42: return 0x2722; /* FOUR TEARDROP-SPOKED ASTERISK */
+ case 0x43: return 0x2723; /* FOUR BALLOON-SPOKED ASTERISK */
+ case 0x44: return 0x2724; /* HEAVY FOUR BALLOON-SPOKED ASTERISK */
+ case 0x45: return 0x2725; /* FOUR CLUB-SPOKED ASTERISK */
+ case 0x46: return 0x2726; /* BLACK FOUR POINTED STAR */
+ case 0x47: return 0x2727; /* WHITE FOUR POINTED STAR */
+ case 0x48: return 0x2605; /* BLACK STAR */
+ case 0x49: return 0x2729; /* STRESS OUTLINED WHITE STAR */
+ case 0x4A: return 0x272A; /* CIRCLED WHITE STAR */
+ case 0x4B: return 0x272B; /* OPEN CENTRE BLACK STAR */
+ case 0x4C: return 0x272C; /* BLACK CENTRE WHITE STAR */
+ case 0x4D: return 0x272D; /* OUTLINED BLACK STAR */
+ case 0x4E: return 0x272E; /* HEAVY OUTLINED BLACK STAR */
+ case 0x4F: return 0x272F; /* PINWHEEL STAR */
+ case 0x50: return 0x2730; /* SHADOWED WHITE STAR */
+ case 0x51: return 0x2731; /* HEAVY ASTERISK */
+ case 0x52: return 0x2732; /* OPEN CENTRE ASTERISK */
+ case 0x53: return 0x2733; /* EIGHT SPOKED ASTERISK */
+ case 0x54: return 0x2734; /* EIGHT POINTED BLACK STAR */
+ case 0x55: return 0x2735; /* EIGHT POINTED PINWHEEL STAR */
+ case 0x56: return 0x2736; /* SIX POINTED BLACK STAR */
+ case 0x57: return 0x2737; /* EIGHT POINTED RECTILINEAR BLACK STAR */
+ case 0x58: return 0x2738; /* HEAVY EIGHT POINTED RECTILINEAR BLACK STAR */
+ case 0x59: return 0x2739; /* TWELVE POINTED BLACK STAR */
+ case 0x5A: return 0x273A; /* SIXTEEN POINTED ASTERISK */
+ case 0x5B: return 0x273B; /* TEARDROP-SPOKED ASTERISK */
+ case 0x5C: return 0x273C; /* OPEN CENTRE TEARDROP-SPOKED ASTERISK */
+ case 0x5D: return 0x273D; /* HEAVY TEARDROP-SPOKED ASTERISK */
+ case 0x5E: return 0x273E; /* SIX PETALLED BLACK AND WHITE FLORETTE */
+ case 0x5F: return 0x273F; /* BLACK FLORETTE */
+ case 0x60: return 0x2740; /* WHITE FLORETTE */
+ case 0x61: return 0x2741; /* EIGHT PETALLED OUTLINED BLACK FLORETTE */
+ case 0x62: return 0x2742; /* CIRCLED OPEN CENTRE EIGHT POINTED STAR */
+ case 0x63: return 0x2743; /* HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK */
+ case 0x64: return 0x2744; /* SNOWFLAKE */
+ case 0x65: return 0x2745; /* TIGHT TRIFOLIATE SNOWFLAKE */
+ case 0x66: return 0x2746; /* HEAVY CHEVRON SNOWFLAKE */
+ case 0x67: return 0x2747; /* SPARKLE */
+ case 0x68: return 0x2748; /* HEAVY SPARKLE */
+ case 0x69: return 0x2749; /* BALLOON-SPOKED ASTERISK */
+ case 0x6A: return 0x274A; /* EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
+ case 0x6B: return 0x274B; /* HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
+ case 0x6C: return 0x25CF; /* BLACK CIRCLE */
+ case 0x6D: return 0x274D; /* SHADOWED WHITE CIRCLE */
+ case 0x6E: return 0x25A0; /* BLACK SQUARE */
+ case 0x6F: return 0x274F; /* LOWER RIGHT DROP-SHADOWED WHITE SQUARE */
+ case 0x70: return 0x2750; /* UPPER RIGHT DROP-SHADOWED WHITE SQUARE */
+ case 0x71: return 0x2751; /* LOWER RIGHT SHADOWED WHITE SQUARE */
+ case 0x72: return 0x2752; /* UPPER RIGHT SHADOWED WHITE SQUARE */
+ case 0x73: return 0x25B2; /* BLACK UP-POINTING TRIANGLE */
+ case 0x74: return 0x25BC; /* BLACK DOWN-POINTING TRIANGLE */
+ case 0x75: return 0x25C6; /* BLACK DIAMOND */
+ case 0x76: return 0x2756; /* BLACK DIAMOND MINUS WHITE X */
+ case 0x77: return 0x25D7; /* RIGHT HALF BLACK CIRCLE */
+ case 0x78: return 0x2758; /* LIGHT VERTICAL BAR */
+ case 0x79: return 0x2759; /* MEDIUM VERTICAL BAR */
+ case 0x7A: return 0x275A; /* HEAVY VERTICAL BAR */
+ case 0x7B: return 0x275B; /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ case 0x7C: return 0x275C; /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */
+ case 0x7D: return 0x275D; /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ case 0x7E: return 0x275E; /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ case 0x80: return 0xF8D7; /* MEDIUM LEFT PARENTHESIS ORNAMENT */
+ case 0x81: return 0xF8D8; /* MEDIUM RIGHT PARENTHESIS ORNAMENT */
+ case 0x82: return 0xF8D9; /* MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT */
+ case 0x83: return 0xF8DA; /* MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT */
+ case 0x84: return 0xF8DB; /* MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT */
+ case 0x85: return 0xF8DC; /* MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT */
+ case 0x86: return 0xF8DD; /* HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT */
+ case 0x87: return 0xF8DE; /* HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT */
+ case 0x88: return 0xF8DF; /* HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT */
+ case 0x89: return 0xF8E0; /* HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT */
+ case 0x8A: return 0xF8E1; /* LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT */
+ case 0x8B: return 0xF8E2; /* LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT */
+ case 0x8C: return 0xF8E3; /* MEDIUM LEFT CURLY BRACKET ORNAMENT */
+ case 0x8D: return 0xF8E4; /* MEDIUM RIGHT CURLY BRACKET ORNAMENT */
+ case 0xA1: return 0x2761; /* CURVED STEM PARAGRAPH SIGN ORNAMENT */
+ case 0xA2: return 0x2762; /* HEAVY EXCLAMATION MARK ORNAMENT */
+ case 0xA3: return 0x2763; /* HEAVY HEART EXCLAMATION MARK ORNAMENT */
+ case 0xA4: return 0x2764; /* HEAVY BLACK HEART */
+ case 0xA5: return 0x2765; /* ROTATED HEAVY BLACK HEART BULLET */
+ case 0xA6: return 0x2766; /* FLORAL HEART */
+ case 0xA7: return 0x2767; /* ROTATED FLORAL HEART BULLET */
+ case 0xA8: return 0x2663; /* BLACK CLUB SUIT */
+ case 0xA9: return 0x2666; /* BLACK DIAMOND SUIT */
+ case 0xAA: return 0x2665; /* BLACK HEART SUIT */
+ case 0xAB: return 0x2660; /* BLACK SPADE SUIT */
+ case 0xAC: return 0x2460; /* CIRCLED DIGIT ONE */
+ case 0xAD: return 0x2461; /* CIRCLED DIGIT TWO */
+ case 0xAE: return 0x2462; /* CIRCLED DIGIT THREE */
+ case 0xAF: return 0x2463; /* CIRCLED DIGIT FOUR */
+ case 0xB0: return 0x2464; /* CIRCLED DIGIT FIVE */
+ case 0xB1: return 0x2465; /* CIRCLED DIGIT SIX */
+ case 0xB2: return 0x2466; /* CIRCLED DIGIT SEVEN */
+ case 0xB3: return 0x2467; /* CIRCLED DIGIT EIGHT */
+ case 0xB4: return 0x2468; /* CIRCLED DIGIT NINE */
+ case 0xB5: return 0x2469; /* CIRCLED NUMBER TEN */
+ case 0xB6: return 0x2776; /* DINGBAT NEGATIVE CIRCLED DIGIT ONE */
+ case 0xB7: return 0x2777; /* DINGBAT NEGATIVE CIRCLED DIGIT TWO */
+ case 0xB8: return 0x2778; /* DINGBAT NEGATIVE CIRCLED DIGIT THREE */
+ case 0xB9: return 0x2779; /* DINGBAT NEGATIVE CIRCLED DIGIT FOUR */
+ case 0xBA: return 0x277A; /* DINGBAT NEGATIVE CIRCLED DIGIT FIVE */
+ case 0xBB: return 0x277B; /* DINGBAT NEGATIVE CIRCLED DIGIT SIX */
+ case 0xBC: return 0x277C; /* DINGBAT NEGATIVE CIRCLED DIGIT SEVEN */
+ case 0xBD: return 0x277D; /* DINGBAT NEGATIVE CIRCLED DIGIT EIGHT */
+ case 0xBE: return 0x277E; /* DINGBAT NEGATIVE CIRCLED DIGIT NINE */
+ case 0xBF: return 0x277F; /* DINGBAT NEGATIVE CIRCLED NUMBER TEN */
+ case 0xC0: return 0x2780; /* DINGBAT CIRCLED SANS-SERIF DIGIT ONE */
+ case 0xC1: return 0x2781; /* DINGBAT CIRCLED SANS-SERIF DIGIT TWO */
+ case 0xC2: return 0x2782; /* DINGBAT CIRCLED SANS-SERIF DIGIT THREE */
+ case 0xC3: return 0x2783; /* DINGBAT CIRCLED SANS-SERIF DIGIT FOUR */
+ case 0xC4: return 0x2784; /* DINGBAT CIRCLED SANS-SERIF DIGIT FIVE */
+ case 0xC5: return 0x2785; /* DINGBAT CIRCLED SANS-SERIF DIGIT SIX */
+ case 0xC6: return 0x2786; /* DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN */
+ case 0xC7: return 0x2787; /* DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT */
+ case 0xC8: return 0x2788; /* DINGBAT CIRCLED SANS-SERIF DIGIT NINE */
+ case 0xC9: return 0x2789; /* DINGBAT CIRCLED SANS-SERIF NUMBER TEN */
+ case 0xCA: return 0x278A; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE */
+ case 0xCB: return 0x278B; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO */
+ case 0xCC: return 0x278C; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE */
+ case 0xCD: return 0x278D; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR */
+ case 0xCE: return 0x278E; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE */
+ case 0xCF: return 0x278F; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX */
+ case 0xD0: return 0x2790; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN */
+ case 0xD1: return 0x2791; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT */
+ case 0xD2: return 0x2792; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE */
+ case 0xD3: return 0x2793; /* DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN */
+ case 0xD4: return 0x2794; /* HEAVY WIDE-HEADED RIGHTWARDS ARROW */
+ case 0xD5: return 0x2192; /* RIGHTWARDS ARROW */
+ case 0xD6: return 0x2194; /* LEFT RIGHT ARROW */
+ case 0xD7: return 0x2195; /* UP DOWN ARROW */
+ case 0xD8: return 0x2798; /* HEAVY SOUTH EAST ARROW */
+ case 0xD9: return 0x2799; /* HEAVY RIGHTWARDS ARROW */
+ case 0xDA: return 0x279A; /* HEAVY NORTH EAST ARROW */
+ case 0xDB: return 0x279B; /* DRAFTING POINT RIGHTWARDS ARROW */
+ case 0xDC: return 0x279C; /* HEAVY ROUND-TIPPED RIGHTWARDS ARROW */
+ case 0xDD: return 0x279D; /* TRIANGLE-HEADED RIGHTWARDS ARROW */
+ case 0xDE: return 0x279E; /* HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW */
+ case 0xDF: return 0x279F; /* DASHED TRIANGLE-HEADED RIGHTWARDS ARROW */
+ case 0xE0: return 0x27A0; /* HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW */
+ case 0xE1: return 0x27A1; /* BLACK RIGHTWARDS ARROW */
+ case 0xE2: return 0x27A2; /* THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD */
+ case 0xE3: return 0x27A3; /* THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD */
+ case 0xE4: return 0x27A4; /* BLACK RIGHTWARDS ARROWHEAD */
+ case 0xE5: return 0x27A5; /* HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */
+ case 0xE6: return 0x27A6; /* HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */
+ case 0xE7: return 0x27A7; /* SQUAT BLACK RIGHTWARDS ARROW */
+ case 0xE8: return 0x27A8; /* HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW */
+ case 0xE9: return 0x27A9; /* RIGHT-SHADED WHITE RIGHTWARDS ARROW */
+ case 0xEA: return 0x27AA; /* LEFT-SHADED WHITE RIGHTWARDS ARROW */
+ case 0xEB: return 0x27AB; /* BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW */
+ case 0xEC: return 0x27AC; /* FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW */
+ case 0xED: return 0x27AD; /* HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW */
+ case 0xEE: return 0x27AE; /* HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW */
+ case 0xEF: return 0x27AF; /* NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW */
+ case 0xF1: return 0x27B1; /* NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW */
+ case 0xF2: return 0x27B2; /* CIRCLED HEAVY WHITE RIGHTWARDS ARROW */
+ case 0xF3: return 0x27B3; /* WHITE-FEATHERED RIGHTWARDS ARROW */
+ case 0xF4: return 0x27B4; /* BLACK-FEATHERED SOUTH EAST ARROW */
+ case 0xF5: return 0x27B5; /* BLACK-FEATHERED RIGHTWARDS ARROW */
+ case 0xF6: return 0x27B6; /* BLACK-FEATHERED NORTH EAST ARROW */
+ case 0xF7: return 0x27B7; /* HEAVY BLACK-FEATHERED SOUTH EAST ARROW */
+ case 0xF8: return 0x27B8; /* HEAVY BLACK-FEATHERED RIGHTWARDS ARROW */
+ case 0xF9: return 0x27B9; /* HEAVY BLACK-FEATHERED NORTH EAST ARROW */
+ case 0xFA: return 0x27BA; /* TEARDROP-BARBED RIGHTWARDS ARROW */
+ case 0xFB: return 0x27BB; /* HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW */
+ case 0xFC: return 0x27BC; /* WEDGE-TAILED RIGHTWARDS ARROW */
+ case 0xFD: return 0x27BD; /* HEAVY WEDGE-TAILED RIGHTWARDS ARROW */
+ case 0xFE: return 0x27BE; /* OPEN-OUTLINED RIGHTWARDS ARROW */
+ default: return 0x0000;
+ }
+};
+
+/*
+ * Unicode mapping found in
+ * /usr/share/fonts/encodings/adobe-symbol.enc.gz
+ * Duplicates are disabled
+ */
+XftChar32 map_symbols(XftChar8 in)
+{
+ switch(in) {
+ case 0x20: return 0x0020; /* SPACE */
+ case 0x21: return 0x0021; /* EXCLAMATION MARK */
+ case 0x23: return 0x0023; /* NUMBER SIGN */
+ case 0x25: return 0x0025; /* PERCENT SIGN */
+ case 0x26: return 0x0026; /* AMPERSAND */
+ case 0x28: return 0x0028; /* OPENING PARENTHESIS */
+ case 0x29: return 0x0029; /* CLOSING PARENTHESIS */
+ case 0x2B: return 0x002B; /* PLUS SIGN */
+ case 0x2C: return 0x002C; /* COMMA */
+ case 0x2E: return 0x002E; /* PERIOD */
+ case 0x2F: return 0x002F; /* SLASH */
+ case 0x30: return 0x0030; /* DIGIT ZERO */
+ case 0x31: return 0x0031; /* DIGIT ONE */
+ case 0x32: return 0x0032; /* DIGIT TWO */
+ case 0x33: return 0x0033; /* DIGIT THREE */
+ case 0x34: return 0x0034; /* DIGIT FOUR */
+ case 0x35: return 0x0035; /* DIGIT FIVE */
+ case 0x36: return 0x0036; /* DIGIT SIX */
+ case 0x37: return 0x0037; /* DIGIT SEVEN */
+ case 0x38: return 0x0038; /* DIGIT EIGHT */
+ case 0x39: return 0x0039; /* DIGIT NINE */
+ case 0x3A: return 0x003A; /* COLON */
+ case 0x3B: return 0x003B; /* SEMICOLON */
+ case 0x3C: return 0x003C; /* LESS-THAN SIGN */
+ case 0x3D: return 0x003D; /* EQUALS SIGN */
+ case 0x3E: return 0x003E; /* GREATER-THAN SIGN */
+ case 0x3F: return 0x003F; /* QUESTION MARK */
+ case 0x5B: return 0x005B; /* OPENING SQUARE BRACKET */
+ case 0x5D: return 0x005D; /* CLOSING SQUARE BRACKET */
+ case 0x5F: return 0x005F; /* SPACING UNDERSCORE */
+ case 0x7B: return 0x007B; /* OPENING CURLY BRACKET */
+ case 0x7C: return 0x007C; /* VERTICAL BAR */
+ case 0x7D: return 0x007D; /* CLOSING CURLY BRACKET */
+ case 0xD3: return 0x00A9; /* COPYRIGHT SIGN */
+ case 0xE3: return 0x00A9; /* COPYRIGHT SIGN */
+ case 0xD8: return 0x00AC; /* NOT SIGN */
+ case 0xD2: return 0x00AE; /* REGISTERED TRADE MARK SIGN */
+ case 0xE2: return 0x00AE; /* REGISTERED TRADE MARK SIGN */
+ case 0xB0: return 0x00B0; /* DEGREE SIGN */
+ case 0xB1: return 0x00B1; /* PLUS-OR-MINUS SIGN */
+ case 0xB4: return 0x00D7; /* MULTIPLICATION SIGN */
+ case 0xB8: return 0x00F7; /* DIVISION SIGN */
+ case 0xA6: return 0x0192; /* LATIN SMALL LETTER SCRIPT F */
+ case 0x41: return 0x0391; /* GREEK CAPITAL LETTER ALPHA */
+ case 0x42: return 0x0392; /* GREEK CAPITAL LETTER BETA */
+ case 0x47: return 0x0393; /* GREEK CAPITAL LETTER GAMMA */
+ case 0x44: return 0x0394; /* GREEK CAPITAL LETTER DELTA */
+ case 0x45: return 0x0395; /* GREEK CAPITAL LETTER EPSILON */
+ case 0x5A: return 0x0396; /* GREEK CAPITAL LETTER ZETA */
+ case 0x48: return 0x0397; /* GREEK CAPITAL LETTER ETA */
+ case 0x51: return 0x0398; /* GREEK CAPITAL LETTER THETA */
+ case 0x49: return 0x0399; /* GREEK CAPITAL LETTER IOTA */
+ case 0x4B: return 0x039A; /* GREEK CAPITAL LETTER KAPPA */
+ case 0x4C: return 0x039B; /* GREEK CAPITAL LETTER LAMBDA */
+ case 0x4D: return 0x039C; /* GREEK CAPITAL LETTER MU */
+ case 0x4E: return 0x039D; /* GREEK CAPITAL LETTER NU */
+ case 0x58: return 0x039E; /* GREEK CAPITAL LETTER XI */
+ case 0x4F: return 0x039F; /* GREEK CAPITAL LETTER OMICRON */
+ case 0x50: return 0x03A0; /* GREEK CAPITAL LETTER PI */
+ case 0x52: return 0x03A1; /* GREEK CAPITAL LETTER RHO */
+ case 0x53: return 0x03A3; /* GREEK CAPITAL LETTER SIGMA */
+ case 0x54: return 0x03A4; /* GREEK CAPITAL LETTER TAU */
+ case 0x55: return 0x03A5; /* GREEK CAPITAL LETTER UPSILON */
+ case 0x46: return 0x03A6; /* GREEK CAPITAL LETTER PHI */
+ case 0x43: return 0x03A7; /* GREEK CAPITAL LETTER CHI */
+ case 0x59: return 0x03A8; /* GREEK CAPITAL LETTER PSI */
+ case 0x57: return 0x03A9; /* GREEK CAPITAL LETTER OMEGA */
+ case 0x61: return 0x03B1; /* GREEK SMALL LETTER ALPHA */
+ case 0x62: return 0x03B2; /* GREEK SMALL LETTER BETA */
+ case 0x67: return 0x03B3; /* GREEK SMALL LETTER GAMMA */
+ case 0x64: return 0x03B4; /* GREEK SMALL LETTER DELTA */
+ case 0x65: return 0x03B5; /* GREEK SMALL LETTER EPSILON */
+ case 0x7A: return 0x03B6; /* GREEK SMALL LETTER ZETA */
+ case 0x68: return 0x03B7; /* GREEK SMALL LETTER ETA */
+ case 0x71: return 0x03B8; /* GREEK SMALL LETTER THETA */
+ case 0x69: return 0x03B9; /* GREEK SMALL LETTER IOTA */
+ case 0x6B: return 0x03BA; /* GREEK SMALL LETTER KAPPA */
+ case 0x6C: return 0x03BB; /* GREEK SMALL LETTER LAMBDA */
+ case 0x6D: return 0x03BC; /* GREEK SMALL LETTER MU */
+ case 0x6E: return 0x03BD; /* GREEK SMALL LETTER NU */
+ case 0x78: return 0x03BE; /* GREEK SMALL LETTER XI */
+ case 0x6F: return 0x03BF; /* GREEK SMALL LETTER OMICRON */
+ case 0x70: return 0x03C0; /* GREEK SMALL LETTER PI */
+ case 0x72: return 0x03C1; /* GREEK SMALL LETTER RHO */
+ case 0x56: return 0x03C2; /* GREEK SMALL LETTER FINAL SIGMA */
+ case 0x73: return 0x03C3; /* GREEK SMALL LETTER SIGMA */
+ case 0x74: return 0x03C4; /* GREEK SMALL LETTER TAU */
+ case 0x75: return 0x03C5; /* GREEK SMALL LETTER UPSILON */
+ case 0x66: return 0x03C6; /* GREEK SMALL LETTER PHI */
+ case 0x63: return 0x03C7; /* GREEK SMALL LETTER CHI */
+ case 0x79: return 0x03C8; /* GREEK SMALL LETTER PSI */
+ case 0x77: return 0x03C9; /* GREEK SMALL LETTER OMEGA */
+ case 0x4A: return 0x03D1; /* GREEK SMALL LETTER SCRIPT THETA */
+ case 0xA1: return 0x03D2; /* GREEK CAPITAL LETTER UPSILON HOOK */
+ case 0x6A: return 0x03D5; /* GREEK SMALL LETTER SCRIPT PHI */
+ case 0x76: return 0x03D6; /* GREEK SMALL LETTER OMEGA PI */
+ case 0xB7: return 0x2022; /* BULLET */
+ case 0xBC: return 0x2026; /* HORIZONTAL ELLIPSIS */
+ case 0xA2: return 0x2032; /* PRIME */
+ case 0xB2: return 0x2033; /* DOUBLE PRIME */
+ case 0x60: return 0x203E; /* SPACING OVERSCORE */
+ case 0xA4: return 0x2044; /* FRACTION SLASH */
+ case 0xC1: return 0x2111; /* BLACK-LETTER I */
+ case 0xC3: return 0x2118; /* SCRIPT P */
+ case 0xC2: return 0x211C; /* BLACK-LETTER R */
+ case 0xD4: return 0x2122; /* TRADEMARK */
+ case 0xE4: return 0x2122; /* TRADEMARK */
+/* case 0x57: return 0x2126; /* OHM */
+ case 0xC0: return 0x2135; /* FIRST TRANSFINITE CARDINAL */
+ case 0xAC: return 0x2190; /* LEFT ARROW */
+ case 0xAD: return 0x2191; /* UP ARROW */
+ case 0xAE: return 0x2192; /* RIGHT ARROW */
+ case 0xAF: return 0x2193; /* DOWN ARROW */
+ case 0xAB: return 0x2194; /* LEFT RIGHT ARROW */
+ case 0xBF: return 0x21B5; /* DOWN ARROW WITH CORNER LEFT */
+ case 0xDC: return 0x21D0; /* LEFT DOUBLE ARROW */
+ case 0xDD: return 0x21D1; /* UP DOUBLE ARROW */
+ case 0xDE: return 0x21D2; /* RIGHT DOUBLE ARROW */
+ case 0xDF: return 0x21D3; /* DOWN DOUBLE ARROW */
+ case 0xDB: return 0x21D4; /* LEFT RIGHT DOUBLE ARROW */
+ case 0x22: return 0x2200; /* FOR ALL */
+ case 0xB6: return 0x2202; /* PARTIAL DIFFERENTIAL */
+ case 0x24: return 0x2203; /* THERE EXISTS */
+ case 0xC6: return 0x2205; /* EMPTY SET */
+/* case 0x44: return 0x2206; /* INCREMENT */
+ case 0xD1: return 0x2207; /* NABLA */
+ case 0xCE: return 0x2208; /* ELEMENT OF */
+ case 0xCF: return 0x2209; /* NOT AN ELEMENT OF */
+ case 0x27: return 0x220B; /* CONTAINS AS MEMBER */
+ case 0xD5: return 0x220F; /* N-ARY PRODUCT */
+ case 0xE5: return 0x2211; /* N-ARY SUMMATION */
+ case 0x2D: return 0x2212; /* MINUS SIGN */
+/* case 0xA4: return 0x2215; /* DIVISION SLASH */
+ case 0x2A: return 0x2217; /* ASTERISK OPERATOR */
+ case 0xD6: return 0x221A; /* SQUARE ROOT */
+ case 0xB5: return 0x221D; /* PROPORTIONAL TO */
+ case 0xA5: return 0x221E; /* INFINITY */
+ case 0xD0: return 0x2220; /* ANGLE */
+ case 0xD9: return 0x2227; /* LOGICAL AND */
+ case 0xDA: return 0x2228; /* LOGICAL OR */
+ case 0xC7: return 0x2229; /* INTERSECTION */
+ case 0xC8: return 0x222A; /* UNION */
+ case 0xF2: return 0x222B; /* INTEGRAL */
+ case 0x5C: return 0x2234; /* THEREFORE */
+ case 0x7E: return 0x223C; /* TILDE OPERATOR */
+ case 0x40: return 0x2245; /* APPROXIMATELY EQUAL TO */
+ case 0xBB: return 0x2248; /* ALMOST EQUAL TO */
+ case 0xB9: return 0x2260; /* NOT EQUAL TO */
+ case 0xBA: return 0x2261; /* IDENTICAL TO */
+ case 0xA3: return 0x2264; /* LESS THAN OR EQUAL TO */
+ case 0xB3: return 0x2265; /* GREATER THAN OR EQUAL TO */
+ case 0xCC: return 0x2282; /* SUBSET OF */
+ case 0xC9: return 0x2283; /* SUPERSET OF */
+ case 0xCB: return 0x2284; /* NOT A SUBSET OF */
+ case 0xCD: return 0x2286; /* SUBSET OF OR EQUAL TO */
+ case 0xCA: return 0x2287; /* SUPERSET OF OR EQUAL TO */
+ case 0xC5: return 0x2295; /* CIRCLED PLUS */
+ case 0xC4: return 0x2297; /* CIRCLED TIMES */
+ case 0x5E: return 0x22A5; /* UP TACK */
+ case 0xD7: return 0x22C5; /* DOT OPERATOR */
+ case 0xF3: return 0x2320; /* TOP HALF INTEGRAL */
+ case 0xF5: return 0x2321; /* BOTTOM HALF INTEGRAL */
+ case 0xE1: return 0x2329; /* BRA */
+ case 0xF1: return 0x232A; /* KET */
+ case 0xE0: return 0x25CA; /* LOZENGE */
+ case 0xAA: return 0x2660; /* BLACK SPADE SUIT */
+ case 0xA7: return 0x2663; /* BLACK CLUB SUIT */
+ case 0xA9: return 0x2665; /* BLACK HEART SUIT */
+ case 0xA8: return 0x2666; /* BLACK DIAMOND SUIT */
+ default: return 0x0000;
+ }
+};
+
+map_f adobe_charset(XftFont *font)
+{
+ map_f map = NULL;
+
+ /*
+ * Hack: does this font has small a in its charset?
+ * If not it is likly a Symbol or a Dingbats derivate.
+ */
+ if (XftCharExists(tool_d, font, 0x61))
+ return NULL;
+ else {
+ XftChar8 *pattern = FcNameUnparse(font->pattern);
+ char *fullname;
+
+ if ((fullname = strcasestr((char*)pattern, "fullname="))) {
+ char *colon;
+
+ fullname += 9;
+ if (colon = strchr(fullname, ':'))
+ *colon = '\0';
+ if (strcasestr(fullname, "symbol"))
+ map = map_symbols;
+ else if (strcasestr(fullname, "dingbats"))
+ map = map_dingbats;
+ else if (strcasestr(fullname, "d050000l"))
+ map = map_dingbats;
+ free(pattern);
+ }
+ }
+ return map;
+}
--- src/u_fonts.h
+++ src/u_fonts.h 2023-09-19 10:01:32.672091235 +0000
@@ -71,4 +71,15 @@ extern void text_origin(int *draw_x, int
extern struct _fstruct ps_fontinfo[];
extern struct _fstruct latex_fontinfo[];
+/*
+ * For (ITC) Zapf Dingbats, URW Dingbats, or URW D050000L as well
+ * as Symbol, Standard Symbols PS, or URW Standard Symbols L we
+ * need to map the byte characters into UTF-8 multi byte characters.
+ * This to make XftTextExtentsUtf8() and XftDrawStringUtf8() working.
+ */
+typedef XftChar8 *(*map_f)(XftChar8);
+extern XftChar32 map_dingbats(XftChar8);
+extern XftChar32 map_symbols(XftChar8);
+extern map_f adobe_charset(XftFont *font);
+
#endif /* U_FONTS_H */
--- src/w_drawprim.c
+++ src/w_drawprim.c 2023-09-19 10:01:32.672091235 +0000
@@ -162,6 +162,8 @@ pw_xfttext(XftDraw *xftdraw, int x, int
{
int zy = ZOOMY(y);
int zx = ZOOMX(x);
+ size_t len = strlen(s);
+ map_f map = NULL;
/* XGlyphInfo extents; */
if (*s == '\0')
@@ -181,8 +183,19 @@ pw_xfttext(XftDraw *xftdraw, int x, int
if (check_cancel())
return;
- XftDrawStringUtf8(xftdraw, &xftcolor[c], font, zx, zy, (XftChar8 *)s,
- (int)strlen(s));
+ if ((map = adobe_charset(font))) {
+ XftChar32 glyphs[len];
+ int glen = 0;
+
+ for (XftChar8 *chr = (XftChar8 *)s; chr < s+len; chr++) {
+ XftChar32 glyph = XftCharIndex(tool_d, font, map(*chr));
+ if (glyph)
+ glyphs[glen++] = glyph;
+ }
+ XftDrawGlyphs(xftdraw, &xftcolor[c], font, zx, zy, glyphs, glen);
+ } else
+ XftDrawStringUtf8(xftdraw, &xftcolor[c], font, zx, zy,
+ (XftChar8*)s, (int)len);
}
/* print "string" in window "w" using font specified in fstruct

15
xfig-3.2.9-gcc14.patch Normal file
View File

@ -0,0 +1,15 @@
---
src/u_fonts.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- src/u_fonts.h
+++ src/u_fonts.h 2024-08-28 07:00:30.512232174 +0000
@@ -77,7 +77,7 @@ extern struct _fstruct latex_fontinfo[];
* need to map the byte characters into UTF-8 multi byte characters.
* This to make XftTextExtentsUtf8() and XftDrawStringUtf8() working.
*/
-typedef XftChar8 *(*map_f)(XftChar8);
+typedef XftChar32 (*map_f)(XftChar8);
extern XftChar32 map_dingbats(XftChar8);
extern XftChar32 map_symbols(XftChar8);
extern map_f adobe_charset(XftFont *font);

3
xfig-3.2.9.tar.xz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8e02e971991f3340d86fc8529e51ec000809f71207f3276856414172718d61d6
size 5380408

View File

@ -0,0 +1,45 @@
---
src/main.c | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
--- src/main.c
+++ src/main.c 2023-09-13 09:37:09.600980464 +0000
@@ -366,8 +366,36 @@ static XtResource application_resources[
XtOffset(appresPtr, font_menu_language), XtRString, (caddr_t) ""},
{"fixedFontSet", "FontSet", XtRFontSet, sizeof(XFontSet),
XtOffset(appresPtr, fixed_fontset), XtRString,
- (caddr_t) "-*-times-medium-r-normal--16-*-*-*-*-*-*-*,"
- "-*-*-medium-r-normal--16-*-*-*-*-*-*-*,*--16-*" },
+ (caddr_t) "-urw-nimbus roman no9 l-medium-r-normal--34-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--24-*-*-*-*-*-jisx0208.1983-0,"
+ "-*-*-medium-r-normal--24-*-*-*-*-*-ksc5601.1987-0,"
+ "-*-times-medium-r-normal--24-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--24-*-*-*-*-*-*-*,*--24-*,"
+ "-*-times-medium-r-normal--16-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--16-*-*-*-*-*-*-*,*--16-*"
+ }, /*
+ {"normalFontSet", "NormalFontSet", XtRFontSet, sizeof(XFontSet),
+ XtOffset(appresPtr, normal_fontset), XtRString,
+ (caddr_t) "-urw-nimbus roman no9 l-medium-r-normal--34-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--24-*-*-*-*-*-jisx0208.1983-0,"
+ "-*-*-medium-r-normal--24-*-*-*-*-*-ksc5601.1987-0,"
+ "-*-times-medium-r-normal--24-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--24-*-*-*-*-*-*-*,"
+ "-*-*-*-r-*--24-*-*-*-*-*-*-*,"
+ "-*-times-medium-r-normal--16-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--16-*-*-*-*-*-*-*,*--16-*"
+ },
+ {"boldFontSet", "BoldFontSet", XtRFontSet, sizeof(XFontSet),
+ XtOffset(appresPtr, bold_fontset), XtRString,
+ (caddr_t) "-urw-nimbus roman no9 l-bold-r-normal--34-*-*-*-*-*-*-*,"
+ "-*-*-bold-r-normal--24-*-*-*-*-*-jisx0208.1983-0,"
+ "-*-*-bold-r-normal--24-*-*-*-*-*-ksc5601.1987-0,"
+ "-*-times-bold-r-normal--24-*-*-*-*-*-*-*,"
+ "-*-*-bold-r-normal--24-*-*-*-*-*-*-*,"
+ "-*-*-*-r-*--24-*-*-*-*-*-*-*,"
+ "-*-times-medium-r-normal--16-*-*-*-*-*-*-*,"
+ "-*-*-medium-r-normal--16-*-*-*-*-*-*-*,*--16-*"
+ }, */
{"fontSetSize", "FontSetSize", XtRInt, sizeof(int),
XtOffset(appresPtr, fontset_size), XtRImmediate, (caddr_t)0 },
{"inputStyle", "InputStyle", XtRString, sizeof(char *),

59
xfig.3.2.5b-fixes.dif Normal file
View File

@ -0,0 +1,59 @@
---
src/w_layers.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
--- src/w_layers.c
+++ src/w_layers.c 2016-09-22 08:45:38.381908911 +0000
@@ -128,9 +128,27 @@ init_depth_panel(Widget parent)
{
Widget label, below;
Widget layer_viewform;
+ Dimension ind_ht = 0, snap_ht = 0, mouse_ht;
- /* MOUSEFUN_HT and ind_panel height aren't known yet */
- LAYER_HT = TOPRULER_HT + CANVAS_HT;
+ if (XtIsManaged(ind_panel)) {
+ /* get height of indicator panel */
+ FirstArg(XtNheight, &ind_ht);
+ GetValues(ind_panel);
+ ind_ht += INTERNAL_BW*2;
+ }
+
+ if (XtIsManaged(snap_indicator_panel)) {
+ /* get height of snap panel */
+ FirstArg(XtNheight, &snap_ht);
+ GetValues(snap_indicator_panel);
+ snap_ht += INTERNAL_BW*4;
+ }
+
+ /* MOUSEFUN_HT height aren't known yet */
+ mouse_ht = MSGPANEL_HT + CMDFORM_HT + INTERNAL_BW;
+
+ /* now that the bitmaps have been created, put the checkmark in the proper toggle */
+ LAYER_HT = mouse_ht + TOPRULER_HT + CANVAS_HT + ind_ht + INTERNAL_BW*2 - snap_ht;
/* main form to hold all the layer stuff */
@@ -385,11 +403,18 @@ void
setup_depth_panel(void)
{
Dimension ind_ht, snap_ht=0;
+
/* get height of indicator and snap panels */
- FirstArg(XtNheight, &ind_ht);
- GetValues(ind_panel);
- FirstArg(XtNheight, &snap_ht);
- GetValues(snap_indicator_panel);
+ if (XtIsManaged(ind_panel)) {
+ FirstArg(XtNheight, &ind_ht);
+ GetValues(ind_panel);
+ ind_ht += INTERNAL_BW*2;
+ }
+ if (XtIsManaged(snap_indicator_panel)) {
+ FirstArg(XtNheight, &snap_ht);
+ GetValues(snap_indicator_panel);
+ snap_ht += INTERNAL_BW*4;
+ }
LAYER_HT = MOUSEFUN_HT + TOPRULER_HT + CANVAS_HT + ind_ht - snap_ht + INTERNAL_BW*4;
/* now that the bitmaps have been created, put the checkmark in the proper toggle */

45
xfig.3.2.5b-locale.dif Normal file
View File

@ -0,0 +1,45 @@
---
src/main.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
--- src/main.c
+++ src/main.c 2023-09-13 10:32:19.633436763 +0000
@@ -23,6 +23,7 @@
#include <errno.h>
#include <locale.h>
+#include <langinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -805,9 +806,6 @@ main(int argc, char **argv)
}
}
- setlocale(LC_ALL, "");
- XtSetLanguageProc(NULL, NULL, NULL);
-
/*
* save the command line arguments
*/
@@ -914,6 +912,10 @@ main(int argc, char **argv)
else
setup_icons_big();
+ if (NULL == strcasestr(nl_langinfo(CODESET),"ANSI") &&
+ NULL == strcasestr(nl_langinfo(CODESET),"ISO-8859-"))
+ appres.international = True;
+
/*************************************************/
/* indicate if the international option is unset */
/*************************************************/
@@ -1663,6 +1665,9 @@ setup_visual(int *argc_p, char **argv, A
*/
tool = XtAppInitialize (&tool_app, "Fig", options, XtNumber (options),
argc_p, argv, fallback_resources, args, 0);
+ setlocale(LC_ALL, "");
+ XtSetLanguageProc(tool_app, NULL, NULL);
+
/* save important info */
tool_d = XtDisplay(tool);
tool_s = XtScreen(tool);

49
xfig.3.2.5b-null.dif Normal file
View File

@ -0,0 +1,49 @@
---
src/w_dir.c | 4 ++++
src/w_library.c | 2 ++
src/w_srchrepl.c | 3 +++
3 files changed, 9 insertions(+)
--- src/w_dir.c
+++ src/w_dir.c 2023-09-13 09:39:27.454515496 +0000
@@ -151,6 +151,8 @@ FileSelected(Widget w, XtPointer client_
XawListReturnStruct *ret_struct = (XawListReturnStruct *) call_data;
+ if (!ret_struct)
+ return;
strcpy(CurrentSelectionName, ret_struct->string);
FirstArg(XtNstring, CurrentSelectionName);
if (browse_up) {
@@ -185,6 +187,8 @@ DirSelected(Widget w, XtPointer client_d
XawListReturnStruct *ret_struct = (XawListReturnStruct *) call_data;
+ if (!ret_struct)
+ return;
strcpy(CurrentSelectionName, ret_struct->string);
DoChangeDir(CurrentSelectionName);
}
--- src/w_library.c
+++ src/w_library.c 2023-09-13 09:38:05.523980529 +0000
@@ -514,6 +514,8 @@ NewObjectSel(Widget w, XtPointer closure
int new_obj;
XawListReturnStruct *ret_struct = (XawListReturnStruct *) call_data;
+ if (!ret_struct)
+ return;
new_obj = ret_struct->list_index;
if (icons_made) {
/* unhighlight the current view icon */
--- src/w_srchrepl.c
+++ src/w_srchrepl.c 2023-09-13 09:40:26.341462455 +0000
@@ -918,6 +918,9 @@ spell_select_word(Widget widget, XtPoint
(void)widget; (void)closure;
XawListReturnStruct *ret_struct = (XawListReturnStruct *) call_data;
+ if (!ret_struct)
+ return;
+
/* make correct button and correction entry sensitive */
XtSetSensitive(correct_button, True);
XtSetSensitive(correct_word, True);

1167
xfig.changes Normal file

File diff suppressed because it is too large Load Diff

10
xfig.desktop Normal file
View File

@ -0,0 +1,10 @@
[Desktop Entry]
Categories=VectorGraphics
Exec=@@BINDIR@@/xfig
InitialPreference=2
MimeType=image/x-xfig;
Name=xfig
GenericName=Vector Drawing
Terminal=false
Type=Application
Icon=xfig

163
xfig.spec Normal file
View File

@ -0,0 +1,163 @@
#
# spec file for package xfig
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: xfig
Version: 3.2.9
Release: 0
Summary: Facility for Interactive Generation of Figures under the X Window System
License: MIT
Group: Productivity/Graphics/Vector Editors
URL: https://sourceforge.net/projects/mcj/
#
# Remove forbidden files: aircraft.fig
# <uncompess> xfig-3.2.8a.tar
# tar -f xfig-3.2.8a.tar --delete xfig-3.2.8a/Libraries/Examples/aircraft.fig
# <compress> xfig-3.2.8a.tar
#
#Source: https://sourceforge.net/projects/mcj/files/xfig-%{version}.tar.xz/download#/xfig-%{version}.tar.xz
Source: xfig-%{version}.tar.xz
Source1: font-test.fig
Source4: xfig.desktop
Patch0: xfig-3.2.6.dif
Patch1: xfig-3.2.9-dingbats.dif
Patch3: xfig.3.2.3d-international-std-fonts.dif
# PATCH-FIX-UPSTREAM xfig.3.2.5b-mediaboxrealnb.dif [debian#530898]
Patch5: xfig.3.2.5b-null.dif
Patch6: xfig.3.2.5b-locale.dif
Patch7: xfig.3.2.5b-fixes.dif
# PATCH-FIX-UPSTREAM
Patch8: Sanitize-a-call-to-realloc-ticket-165.patch
# PATCH-FIX-UPSTREAM
Patch9: Fix-exporting-only-active-layers-ticket-163.patch
# PATCH-FIX-UPSTREAM
Patch10: xfig-3.2.9-gcc14.patch
# PATCH-FIX-UPSTREAM for boo#1230298 / upstream bug report #179
Patch11: 042708.patch
Patch12: 7e0157.patch
Patch13: a038d6.patch
Patch14: f3466c.patch
BuildRequires: dos2unix
BuildRequires: fdupes
BuildRequires: flex
BuildRequires: freetype2-devel
BuildRequires: libjpeg-devel
BuildRequires: libpng-devel
BuildRequires: netpbm
BuildRequires: pkgconfig
BuildRequires: update-desktop-files
BuildRequires: pkgconfig(fontconfig)
BuildRequires: pkgconfig(ijs)
BuildRequires: pkgconfig(libtiff-4)
BuildRequires: pkgconfig(x11)
BuildRequires: pkgconfig(xaw3d)
BuildRequires: pkgconfig(xaw6)
BuildRequires: pkgconfig(xft)
BuildRequires: pkgconfig(xi)
BuildRequires: pkgconfig(xmu)
BuildRequires: pkgconfig(xpm)
BuildRequires: pkgconfig(xt)
Requires: efont-unicode
Requires: fontconfig
%if 0%{?suse_version} >= 1699
Requires: (ghostscript-fonts-std or urw-base35-fonts)
%else
Requires: ghostscript-fonts-std
%endif
Requires: ifnteuro
Requires: netpbm
Requires: transfig >= %{version}
Requires: xorg-x11-fonts
Requires: xorg-x11-fonts-core
Provides: xfig.3.2.3d
%if ! %{defined make_build}
%define make_build make %{?_smp_mflags}
%endif
%if ! %{defined make_install}
%define make_install make install DESTDIR=%{?buildroot} INSTALL="install -p"
%endif
%description
Xfig is a menu-driven tool that allows the user to draw and manipulate
objects interactively in an X Window System window. The resulting
pictures can be saved, printed on PostScript printers, or converted to
a variety of other formats (to allow inclusion in LaTeX documents, for
example).
%prep
%setup -q -n xfig-%{version}
set +x
find -type f | xargs -r chmod a-x,go-w
find -type f | while read file; do
if grep -qr $'\r' $file ; then
dos2unix --keepdate --quiet $file
fi
done
set -x
%patch -P0
%patch -P1 -b .dingbats
%patch -P3 -b .international-std-fonts
%patch -P5 -b .null
%patch -P6 -b .locale
%patch -P7 -b .fixes
%patch -P8 -p1
%patch -P9 -p1
%patch -P10
%patch -P11
%patch -P12
%patch -P13
%patch -P14
cp %{SOURCE1} .
test ! -e Libraries/Examples/aircraft.fig || { echo forbidden file found 1>&2; exit 1; }
%build
CC=gcc
CFLAGS="%{optflags} -w -D_GNU_SOURCE -std=gnu99 -DUSE_XPM -DUSE_SPLASH"
CFLAGS="$CFLAGS $(getconf LFS_CFLAGS) -DMAXNUMPTS=50000"
export CC CFLAGS
chmod +x configure
%configure \
--docdir=%{_defaultdocdir}/%{name} \
--enable-tablet \
--enable-splash \
--with-x \
--with-xaw3d1_5e \
--with-xaw3d
touch src/splash.xbm
touch src/splash.xpm
%make_build CCOPTIONS="$CFLAGS"
%install
find -name '*.bak' -exec rm -vf '{}' \+
%make_install
mv %{buildroot}%{_mandir}/man1/xfig.1 %{buildroot}%{_mandir}/man1/xfig.1x
gzip -9 %{buildroot}%{_mandir}/man1/xfig.1x
%fdupes %{buildroot}
%suse_update_desktop_file xfig VectorGraphics
%files
%defattr(-,root,root,755)
%doc %{_docdir}/%{name}
%dir %{_datadir}/X11/app-defaults
%{_datadir}/X11/app-defaults/Fig
%{_bindir}/xfig*
%{_datadir}/applications/xfig.desktop
%{_datadir}/pixmaps/xfig.png
%{_datadir}/xfig
%{_mandir}/man1/xfig.1*.gz
%changelog