parent
b4456006fd
commit
25e42ac526
1
src/E.h
1
src/E.h
|
@ -673,6 +673,7 @@ void EdgeWindowsHide(void);
|
|||
#define EDBUG_TYPE_SYNC 145
|
||||
#define EDBUG_TYPE_PAGER 146
|
||||
#define EDBUG_TYPE_SELECTION 147
|
||||
#define EDBUG_TYPE_FONTS 148
|
||||
|
||||
int EventDebug(unsigned int type);
|
||||
void EventDebugSet(unsigned int type, int value);
|
||||
|
|
|
@ -243,8 +243,8 @@ LangInit(void)
|
|||
if (EventDebug(EDBUG_TYPE_VERBOSE))
|
||||
{
|
||||
Eprintf("Locale: %s\n", setlocale(LC_ALL, NULL));
|
||||
Eprintf("Character encoding: locale=%s internal=%s\n", enc_loc,
|
||||
enc_int);
|
||||
Eprintf("Character encoding: locale=%s internal=%s MB_CUR_MAX=%d\n",
|
||||
enc_loc, enc_int, MB_CUR_MAX);
|
||||
}
|
||||
|
||||
if (!strcasecmp(enc_loc, "utf8") || !strcasecmp(enc_loc, "utf-8"))
|
||||
|
|
12
src/tclass.c
12
src/tclass.c
|
@ -55,12 +55,8 @@ TextstateCreate(void)
|
|||
if (!ts)
|
||||
return NULL;
|
||||
|
||||
ts->fontname = NULL;
|
||||
ts->style.mode = MODE_WRAP_CHAR;
|
||||
ts->style.orientation = FONT_TO_RIGHT;
|
||||
ts->efont = NULL;
|
||||
ts->xfont = NULL;
|
||||
ts->xfontset = 0;
|
||||
|
||||
return ts;
|
||||
}
|
||||
|
@ -70,10 +66,8 @@ TextStateDestroy(TextState * ts)
|
|||
{
|
||||
if (ts->fontname)
|
||||
Efree(ts->fontname);
|
||||
if (ts->xfont)
|
||||
XFreeFont(disp, ts->xfont);
|
||||
if (ts->efont)
|
||||
Efont_free(ts->efont);
|
||||
if (ts->ops)
|
||||
ts->ops->Destroy(ts);
|
||||
Efree(ts);
|
||||
}
|
||||
|
||||
|
@ -440,7 +434,7 @@ TextclassConfigLoad(FILE * fs)
|
|||
break;
|
||||
case TEXT_EFFECT:
|
||||
if (ts)
|
||||
ts->effect = atoi(s2);
|
||||
ts->style.effect = atoi(s2);
|
||||
break;
|
||||
case TEXT_FG_COL:
|
||||
if (ts)
|
||||
|
|
92
src/tclass.h
92
src/tclass.h
|
@ -27,33 +27,85 @@
|
|||
#include "etypes.h"
|
||||
#include "xwin.h"
|
||||
|
||||
#define MODE_VERBATIM 0
|
||||
#define MODE_WRAP_CHAR 1
|
||||
#define MODE_WRAP_WORD 2
|
||||
#define MODE_VERBATIM 0
|
||||
#define MODE_WRAP_CHAR 1
|
||||
#define MODE_WRAP_WORD 2
|
||||
|
||||
#define FONT_TO_RIGHT 0
|
||||
#define FONT_TO_DOWN 1
|
||||
#define FONT_TO_UP 2
|
||||
#define FONT_TO_LEFT 3
|
||||
#define FONT_TO_RIGHT 0
|
||||
#define FONT_TO_DOWN 1
|
||||
#define FONT_TO_UP 2
|
||||
#define FONT_TO_LEFT 3
|
||||
|
||||
typedef struct _efont Efont;
|
||||
#define FONT_TYPE_UNKNOWN 0
|
||||
#define FONT_TYPE_IFT 1 /* Imlib2/FreeType */
|
||||
#define FONT_TYPE_XFS 2 /* XFontSet */
|
||||
#define FONT_TYPE_XFONT 3 /* XFontStruct */
|
||||
|
||||
#if FONT_TYPE_IFT
|
||||
typedef void EFont;
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Win win;
|
||||
EImage *im;
|
||||
Drawable draw;
|
||||
GC gc;
|
||||
int r, g, b;
|
||||
} FontDrawContext;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int (*Load) (TextState * ts);
|
||||
void (*Destroy) (TextState * ts);
|
||||
void (*TextSize) (TextState * ts, const char *text, int len,
|
||||
int *width, int *height, int *ascent);
|
||||
void (*TextMangle) (TextState * ts, char **ptext,
|
||||
int *pwidth, int textwidth_limit);
|
||||
void (*TextDraw) (TextState * ts, FontDrawContext * ctx,
|
||||
int x, int y, const char *text, int len);
|
||||
void (*FdcInit) (TextState * ts, FontDrawContext * ctx,
|
||||
Win win);
|
||||
void (*FdcSetColor) (TextState * ts, FontDrawContext * ctx,
|
||||
XColor * xc);
|
||||
} FontOps;
|
||||
|
||||
struct _textstate
|
||||
{
|
||||
char *fontname;
|
||||
char type;
|
||||
char need_utf8;
|
||||
struct
|
||||
{
|
||||
char mode;
|
||||
char orientation;
|
||||
char effect;
|
||||
} style;
|
||||
XColor fg_col;
|
||||
XColor bg_col;
|
||||
int effect;
|
||||
Efont *efont;
|
||||
XFontStruct *xfont;
|
||||
XFontSet xfontset;
|
||||
int xfontset_ascent;
|
||||
char need_utf8;
|
||||
union
|
||||
{
|
||||
#if FONT_TYPE_IFT
|
||||
struct
|
||||
{
|
||||
EFont *font;
|
||||
} ift;
|
||||
#endif
|
||||
#if FONT_TYPE_XFS
|
||||
struct
|
||||
{
|
||||
XFontSet font;
|
||||
int ascent;
|
||||
} xfs;
|
||||
#endif
|
||||
#if FONT_TYPE_XFONT
|
||||
struct
|
||||
{
|
||||
XFontStruct *font;
|
||||
} xf;
|
||||
#endif
|
||||
} f;
|
||||
const FontOps *ops;
|
||||
};
|
||||
|
||||
struct _textclass
|
||||
|
@ -94,16 +146,4 @@ void TextDraw(TextClass * tclass, Win win, Drawable draw,
|
|||
const char *text, int x, int y, int w, int h,
|
||||
int fsize, int justification);
|
||||
|
||||
/* ttfont.c */
|
||||
void Efont_extents(Efont * f, const char *text,
|
||||
int *font_ascent_return,
|
||||
int *font_descent_return, int *width_return,
|
||||
int *max_ascent_return,
|
||||
int *max_descent_return, int *lbearing_return,
|
||||
int *rbearing_return);
|
||||
Efont *Efont_load(const char *file, int size);
|
||||
void Efont_free(Efont * f);
|
||||
void EFont_draw_string(EImage * im, Efont * f, int x, int y,
|
||||
int r, int g, int b, const char *text);
|
||||
|
||||
#endif /* _TCLASS_H */
|
||||
|
|
974
src/text.c
974
src/text.c
File diff suppressed because it is too large
Load Diff
194
src/ttfont.c
194
src/ttfont.c
|
@ -26,10 +26,7 @@
|
|||
#include "tclass.h"
|
||||
#include <Imlib2.h>
|
||||
|
||||
struct _efont
|
||||
{
|
||||
Imlib_Font *face;
|
||||
};
|
||||
#if FONT_TYPE_IFT
|
||||
|
||||
static void
|
||||
EFonts_Init(void)
|
||||
|
@ -48,56 +45,12 @@ EFonts_Init(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if 0 /* Unused - Remove? */
|
||||
void
|
||||
EFont_draw_string(Win win, Drawable draw, Efont * f, int x, int y,
|
||||
int r, int g, int b, const char *text)
|
||||
{
|
||||
EImage *im;
|
||||
int w, h, ascent, descent;
|
||||
|
||||
Efont_extents(f, text, &ascent, &descent, &w, NULL, NULL, NULL, NULL);
|
||||
h = ascent + descent;
|
||||
|
||||
im = EImageGrabDrawable(draw, None, x, y - ascent, w, h, 0);
|
||||
imlib_context_set_image(im);
|
||||
imlib_context_set_color(r, g, b, 255);
|
||||
imlib_context_set_font(f->face);
|
||||
imlib_text_draw(0, 0, text);
|
||||
EImageRenderOnDrawable(im, win, draw, x, y - ascent, w, h, 0);
|
||||
EImageFree(im);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
EFont_draw_string(EImage * im, Efont * f, int x, int y,
|
||||
int r, int g, int b, const char *text)
|
||||
{
|
||||
imlib_context_set_image(im);
|
||||
imlib_context_set_color(r, g, b, 255);
|
||||
imlib_context_set_font(f->face);
|
||||
imlib_text_draw(x, y - imlib_get_font_ascent(), text);
|
||||
}
|
||||
|
||||
void
|
||||
Efont_free(Efont * f)
|
||||
{
|
||||
if (!f)
|
||||
return;
|
||||
|
||||
imlib_context_set_font(f->face);
|
||||
imlib_free_font();
|
||||
|
||||
Efree(f);
|
||||
}
|
||||
|
||||
Efont *
|
||||
static EFont *
|
||||
Efont_load(const char *file, int size)
|
||||
{
|
||||
static char ttfont_path_set = 0;
|
||||
char s[4096];
|
||||
Efont *f;
|
||||
Imlib_Font *ff;
|
||||
EFont *f;
|
||||
|
||||
if (!ttfont_path_set)
|
||||
{
|
||||
|
@ -106,41 +59,124 @@ Efont_load(const char *file, int size)
|
|||
}
|
||||
|
||||
Esnprintf(s, sizeof(s), "%s/%d", file, size);
|
||||
ff = imlib_load_font(s);
|
||||
if (ff == NULL)
|
||||
return NULL;
|
||||
|
||||
f = Emalloc(sizeof(Efont));
|
||||
f->face = ff;
|
||||
f = imlib_load_font(s);
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
void
|
||||
Efont_extents(Efont * f, const char *text, int *font_ascent_return,
|
||||
int *font_descent_return, int *width_return,
|
||||
int *max_ascent_return, int *max_descent_return,
|
||||
int *lbearing_return __UNUSED__, int *rbearing_return __UNUSED__)
|
||||
static void
|
||||
Efont_free(EFont * f)
|
||||
{
|
||||
int w, h;
|
||||
|
||||
if (!f)
|
||||
return;
|
||||
|
||||
imlib_context_set_font(f->face);
|
||||
imlib_get_text_advance(text, &w, &h);
|
||||
if (width_return)
|
||||
*width_return = w;
|
||||
if (font_ascent_return)
|
||||
*font_ascent_return = imlib_get_font_ascent();
|
||||
if (font_descent_return)
|
||||
*font_descent_return = imlib_get_font_descent();
|
||||
if (max_ascent_return)
|
||||
*max_ascent_return = imlib_get_maximum_font_ascent();
|
||||
if (max_descent_return)
|
||||
*max_descent_return = imlib_get_maximum_font_descent();
|
||||
imlib_context_set_font(f);
|
||||
imlib_free_font();
|
||||
}
|
||||
|
||||
static void
|
||||
Efont_extents(EFont * f, const char *text, int len __UNUSED__,
|
||||
int *width, int *height, int *ascent)
|
||||
{
|
||||
int h, asc, dsc;
|
||||
|
||||
imlib_context_set_font(f);
|
||||
imlib_get_text_advance(text, width, &h);
|
||||
asc = imlib_get_font_ascent();
|
||||
dsc = imlib_get_font_descent();
|
||||
*height = asc + dsc;
|
||||
*ascent = asc;
|
||||
}
|
||||
|
||||
static void
|
||||
EFont_draw_string(EImage * im, EFont * f, int x, int y,
|
||||
int r, int g, int b, const char *text)
|
||||
{
|
||||
imlib_context_set_image(im);
|
||||
imlib_context_set_color(r, g, b, 255);
|
||||
imlib_context_set_font(f);
|
||||
imlib_text_draw(x, y - imlib_get_font_ascent(), text);
|
||||
}
|
||||
|
||||
extern const FontOps FontOpsIft;
|
||||
|
||||
/*
|
||||
* Imlib2/FreeType
|
||||
*/
|
||||
extern const FontOps FontOpsIft;
|
||||
|
||||
static int
|
||||
IftLoad(TextState * ts)
|
||||
{
|
||||
char s[4096], *s2, *ss;
|
||||
|
||||
s2 = Estrdup(ts->fontname);
|
||||
if (!s2)
|
||||
return -1;
|
||||
ss = strchr(s2, '/');
|
||||
if (ss)
|
||||
{
|
||||
*ss++ = '\0';
|
||||
Esnprintf(s, sizeof(s), "%s.ttf", s2);
|
||||
ts->f.ift.font = Efont_load(s2, atoi(ss));
|
||||
}
|
||||
Efree(s2);
|
||||
|
||||
if (!ts->f.ift.font)
|
||||
return -1;
|
||||
|
||||
ts->need_utf8 = 1;
|
||||
ts->type = FONT_TYPE_IFT;
|
||||
ts->ops = &FontOpsIft;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
IftUnload(TextState * ts)
|
||||
{
|
||||
Efont_free(ts->f.ift.font);
|
||||
}
|
||||
|
||||
static void
|
||||
IftTextSize(TextState * ts, const char *text, int len,
|
||||
int *width, int *height, int *ascent)
|
||||
{
|
||||
Efont_extents(ts->f.ift.font, text, len, width, height, ascent);
|
||||
}
|
||||
|
||||
static void
|
||||
IftTextDraw(TextState * ts, FontDrawContext * fdc, int x, int y,
|
||||
const char *text, int len __UNUSED__)
|
||||
{
|
||||
EFont_draw_string(fdc->im, ts->f.ift.font, x, y, fdc->r, fdc->g, fdc->b,
|
||||
text);
|
||||
}
|
||||
|
||||
static void
|
||||
IftFdcInit(TextState * ts __UNUSED__, FontDrawContext * fdc __UNUSED__,
|
||||
Win win __UNUSED__)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
IftFdcSetColor(TextState * ts __UNUSED__, FontDrawContext * fdc, XColor * xc)
|
||||
{
|
||||
EGetColor(xc, &(fdc->r), &(fdc->g), &(fdc->b));
|
||||
}
|
||||
|
||||
#if 0 /* Well... */
|
||||
static void
|
||||
IftTextMangle(TextState * ts, char **ptext, int *pw, int textwidth_limit)
|
||||
{
|
||||
ts = NULL;
|
||||
ptext = NULL;
|
||||
pw = NULL;
|
||||
textwidth_limit = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
const FontOps FontOpsIft = {
|
||||
IftLoad, IftUnload, IftTextSize, NULL, IftTextDraw,
|
||||
IftFdcInit, IftFdcSetColor
|
||||
};
|
||||
|
||||
#if TEST_TTFONT
|
||||
#include <time.h>
|
||||
|
||||
|
@ -196,3 +232,5 @@ EGetColor(const XColor * pxc, int *pr, int *pg, int *pb)
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* FONT_TYPE_IFT */
|
||||
|
|
Loading…
Reference in New Issue