Compare commits

..

No commits in common. "rawhide" and "f40" have entirely different histories.

10 changed files with 845 additions and 40 deletions

1
.gitignore vendored
View file

@ -10,4 +10,3 @@ xfig.3.2.5b.full.tar.gz
/xfig-3.2.8a.tar.xz
/xfig-3.2.8b.tar.xz
/xfig-3.2.9.tar.xz
/mcj-xfig-ce9782a404b6a527393839369aac13dcfb66ff16.zip

View file

@ -0,0 +1,644 @@
From 1e2d842875502b4ce0e74ec779454304c71efe54 Mon Sep 17 00:00:00 2001
From: "Dr. Werner Fink" <https://build.opensuse.org/users/WernerFink>
Date: Sat, 30 Sep 2023 23:10:46 +0200
Subject: [PATCH] Map symbol and dingbat glyphs to their unicode locations
Under suse, symbol and dingbat glyphs are not displayed without
remapping to their correct unicode code points. Based on the
mappings defined in
usr/share/fonts/encodings/adobe-dingbats.enc.gz and
/usr/share/fonts/encodings/adobe-symbol.enc.gz.
Also include some aliases for these two fonts.
Under archlinux and debian, these mappings were not necessary, but
do not seem to do any harm.
---
src/u_fonts.c | 500 ++++++++++++++++++++++++++++++++++++++++++++++-
src/u_fonts.h | 11 ++
src/w_drawprim.c | 17 +-
3 files changed, 516 insertions(+), 12 deletions(-)
diff --git a/src/u_fonts.c b/src/u_fonts.c
index b29d0ea..5e454eb 100644
--- a/src/u_fonts.c
+++ b/src/u_fonts.c
@@ -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,27 @@ 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 +480,25 @@ 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 +514,30 @@ textmaxheight(int psflag, int font, int size, int *ascent, int *descent)
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 +565,428 @@ text_origin(int *draw_x, int *draw_y, int base_x, int base_y, int align,
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;
+}
diff --git a/src/u_fonts.h b/src/u_fonts.h
index 10b5f7c..725161a 100644
--- a/src/u_fonts.h
+++ b/src/u_fonts.h
@@ -71,4 +71,15 @@ extern void text_origin(int *draw_x, int *draw_y, int base_x, int base_y,
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 */
diff --git a/src/w_drawprim.c b/src/w_drawprim.c
index 959e3a6..7487833 100644
--- a/src/w_drawprim.c
+++ b/src/w_drawprim.c
@@ -162,6 +162,8 @@ pw_xfttext(XftDraw *xftdraw, int x, int y, int depth, XftFont *font,
{
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 y, int depth, XftFont *font,
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
--
2.43.0

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

View file

@ -1,2 +1,2 @@
SHA512 (mcj-xfig-ce9782a404b6a527393839369aac13dcfb66ff16.zip) = a0d483d77edb16d869596a53f89783efd232832b4447089227f34ff552836209f595e5cc9f179242386e85f6f8378607433913720aab29b9d69a2a4007404b47
SHA512 (xfig-3.2.9.tar.xz) = ec33476ca4349cdc106ac2308c61f6ecd014bb7331a4fc3616c9f94b93bdc391ce9affe87139c70da88549449b45309d6d9ec78a1e8477450bda4bc370cbbc9a
SHA512 (xfig-icons.tar.gz) = f7d9b314d57994d479712740dcac4a2c924ddacea028db1c6cdeef36fb7d846885c45d21499f7453c750c265eeb5877e4b032454911ce91667ccc550cb2112e5

View file

@ -0,0 +1,13 @@
diff -up xfig-3.2.9/configure~ xfig-3.2.9/configure
diff -up xfig-3.2.9/src/u_fonts.h~ xfig-3.2.9/src/u_fonts.h
--- xfig-3.2.9/src/u_fonts.h~ 2024-02-26 13:37:49.000000000 +0100
+++ xfig-3.2.9/src/u_fonts.h 2024-02-26 14:05:16.718889666 +0100
@@ -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);

31
xfig.appdata.xml Normal file
View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<component type="desktop">
<id>xfig.desktop</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>MIT</project_license>
<name>Xfig</name>
<summary>Xfig drawing application</summary>
<description>
<p>
Xfig is an X Window System tool for creating basic vector graphics,
including bezier curves, lines, rulers and more. The resulting
graphics can be saved, printed on PostScript printers or converted to
a variety of other formats (e.g., X11 bitmaps, Encapsulated
PostScript, LaTeX).
</p>
<p>
You should install xfig if you need a simple program to create vector
graphics.
</p>
</description>
<url type="homepage">https://en.wikipedia.org/wiki/Xfig</url>
<url type="help">http://epb.lbl.gov/xfig/</url>
<screenshots>
<screenshot type="default">http://mcj.sourceforge.net/images/screen-image.png</screenshot>
<screenshot>http://mcj.sourceforge.net/images/library-icon-view.png</screenshot>
<screenshot>http://mcj.sourceforge.net/images/file-panel.png</screenshot>
<screenshot>http://mcj.sourceforge.net/images/color-panel.png</screenshot>
<screenshot>http://mcj.sourceforge.net/images/dimline-panel.png</screenshot>
</screenshots>
<updatecontact>jwrdegoede_at_fedoraproject.org</updatecontact>
</component>

49
xfig.desktop Normal file
View file

@ -0,0 +1,49 @@
[Desktop Entry]
Categories=Graphics;
MimeType=image/fig;image/x-xfig;
Exec=/usr/bin/xfig %f
Icon=xfig
Type=Application
Name=Xfig
Name[eo]=XDesegno
Name[et]=Ffig
Name[ja]=xfig
Name[no]=X-figur
Comment=Xfig drawing application
Comment[bg]=Xfig ïðîãðàìà çà ðèñóâàíå
Comment[ca]=Aplicació de dibuix Xfig
Comment[cs]=Aplikace pro kreslení vektorových obrázků
Comment[da]=Xfig tegneprogram
Comment[de]=Xfig-Zeichenprogramm
Comment[el]=Xfig
Comment[eo]=Desegnilo "Xfig"
Comment[es]=Aplicación de diseño vectorial (objetos)
Comment[et]=XFig joonistusprogramm
Comment[fi]=Xfig vektoripiirto-ohjelma
Comment[fr]=Programme de dessin objet Xfig
Comment[gl]=Aplicación de debuxo (obxectos)
Comment[he]=Xfig רויצה םושיי
Comment[hr]=Program za crtanje
Comment[hu]=Rajzolóprogram
Comment[is]=Hlutbundið teikniforrit
Comment[it]=Applicazione di disegno Xfig
Comment[lt]=Xfig braižymo programa
Comment[mk]=Едноставна апликација за векторско цртање
Comment[nl]=Xfig-tekenprogramma
Comment[no]=Xfig-tegneprogram
Comment[no_NY]=Teikneprogrammet Xfig
Comment[pl]=Aplikacja do kreślenia
Comment[pt]=Aplicação de desenho
Comment[ro]=Program de desenare vectorială
Comment[ru]=Приложения для рисования векторной графики
Comment[sk]=Xfig aplikácia pre kreslenie vektorových obrázkov
Comment[sl]=Program za risanje Xfig
Comment[sr]=Xfig prgram za vektorsko crtanje
Comment[sv]=Xfig ritprogram
Comment[ta]=Xfig Ũþø ÀÂýÀ¡Î
Comment[tr]=Xfig çizim uygulaması
Comment[uk]=Xfig
Comment[zh_CN.GB2312]=Xfig
Terminal=false
StartupNotify=false
Keywords=vector;graphics;figure;drawing;

View file

@ -1,5 +1,2 @@
addFilter("W: spelling-error.*")
addFilter("W: invalid-url Source1")
addFilter("W: no-%check-section")
addFilter("W: files-duplicate /usr/share/")
addFilter("E: non-executable-script /usr/share/xfig/Libraries/Maps/")
addFilter("E: spelling-error")

View file

@ -1,23 +1,36 @@
%global commit ce9782a404b6a527393839369aac13dcfb66ff16
%global commitdate 20250317
%global shortcommit %(c=%{commit}; echo ${c:0:7})
%global app_defaults_dir %{_datadir}/X11/app-defaults
Summary: An X Window System tool for drawing basic vector graphics
Name: xfig
Version: 3.2.9a
Release: 3.%{commitdate}git%{shortcommit}%{?dist}
Version: 3.2.9
Release: 4%{?dist}
License: MIT
URL: https://en.wikipedia.org/wiki/Xfig
#Source0: http://downloads.sourceforge.net/mcj/xfig-%%{version}.tar.xz
Source0: https://sourceforge.net/code-snapshots/git/m/mc/mcj/xfig.git/mcj-xfig-%{commit}.zip
Source0: http://downloads.sourceforge.net/mcj/xfig-%{version}.tar.xz
Source1: xfig-icons.tar.gz
Source2: xfig.desktop
Source3: xfig.appdata.xml
# https://sourceforge.net/p/mcj/tickets/165/
# https://bugzilla.redhat.com/show_bug.cgi?id=2252679
# https://sourceforge.net/p/mcj/xfig/ci/68403622a6f6c7d74f73e38989cfc0ed86fb83fc/
Patch0: Sanitize-a-call-to-realloc-ticket-165.patch
# https://sourceforge.net/p/mcj/tickets/163/
# https://sourceforge.net/p/mcj/xfig/ci/a4a2f3f3aa29ec7fc84f9d782306b37bbe75025c/
Patch1: Fix-exporting-only-active-layers-ticket-163.patch
# https://sourceforge.net/p/mcj/tickets/159/
# https://bugzilla.redhat.com/show_bug.cgi?id=2260359
# https://sourceforge.net/p/mcj/xfig/ci/1e2d842875502b4ce0e74ec779454304c71efe54/
Patch2: 0001-Map-symbol-and-dingbat-glyphs-to-their-unicode-locat.patch
# compile fix for above patch
Patch3: xfig-3.2.9-compile-fix.patch
#Patch0: xfig-3.2.5a-default-apps.patch
#Patch1: xfig-3.2.5-urwfonts.patch
BuildRequires: make
BuildRequires: gcc libtool
BuildRequires: transfig
BuildRequires: libjpeg-devel
BuildRequires: libpng-devel
BuildRequires: libtiff-devel
BuildRequires: libICE-devel
BuildRequires: libSM-devel
BuildRequires: libX11-devel
@ -30,6 +43,7 @@ BuildRequires: libXpm-devel
BuildRequires: libXt-devel
BuildRequires: Xaw3d-devel
BuildRequires: man2html-core ImageMagick
BuildRequires: desktop-file-utils libappstream-glib
# For eps preview generation
Requires: ghostscript
Requires: transfig
@ -58,7 +72,7 @@ graphics.
%prep
%autosetup -p1 -a 1 -n mcj-xfig-%{commit}
%autosetup -p1 -a 1
for i in doc/html/japanese/button_frame.fig doc/html/japanese/japanese.ps \
doc/html/animate.js; do
sed -i.orig 's/\r//' $i; touch -r $i.orig $i; rm $i.orig
@ -86,41 +100,26 @@ convert %{name}32x32.xpm \
convert %{name}64x64.xpm \
$RPM_BUILD_ROOT%{_datadir}/icons/hicolor/64x64/apps/%{name}.png
mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications
desktop-file-install --dir $RPM_BUILD_ROOT%{_datadir}/applications %{SOURCE2}
mkdir -p $RPM_BUILD_ROOT%{_datadir}/appdata
install -p -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_datadir}/appdata
appstream-util validate-relax --nonet \
$RPM_BUILD_ROOT%{_datadir}/appdata/%{name}.appdata.xml
%files
%doc %{_docdir}/%{name}
%{_bindir}/%{name}
%{_datadir}/%{name}
%{_mandir}/man1/%{name}.1*
%{_datadir}/X11/app-defaults/Fig
%{_datadir}/metainfo/org.xfig.xfig.metainfo.xml
%{_datadir}/applications/org.xfig.xfig.desktop
%{app_defaults_dir}/Fig
%{_datadir}/appdata/%{name}.appdata.xml
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/??x??/apps/%{name}.png
%changelog
* Fri Jul 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 3.2.9a-3.20250317gitce9782a
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
* Sat Jan 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 3.2.9a-2.20250317gitce9782a
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Wed Aug 6 2025 Hans de Goede <hans@hansg.org> - 3.2.9a-1.20250317gitce9782a
- Update to 3.2.9a + latest git changes to fix build with -std=c11
- Switch to upstream appdata/metainfo and desktop file
- Drop all patches (all upstreamed)
- Resolves: rhbz#2341567
- Resolves: rhbz#2385740
* Fri Jul 25 2025 Fedora Release Engineering <releng@fedoraproject.org> - 3.2.9-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Sun Jan 19 2025 Fedora Release Engineering <releng@fedoraproject.org> - 3.2.9-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Sat Jul 20 2024 Fedora Release Engineering <releng@fedoraproject.org> - 3.2.9-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Mon Feb 26 2024 Hans de Goede <hdegoede@redhat.com> - 3.2.9-4
- Fix missing Dingbats and Symbol glyphs
- Resolves: rhbz#2260359