Hello,
this patch (relative to links-2.1pre17) adds rudimentary support for displaying hebrew text in the correct direction.
It does not include the changes for the build system, since I can't run the configure generated on my system from configure.in.
For compiling and linking the new code, USE_FRIBIDI needs to be defined in config.h, and -lfribidi should be on the link command line. I think adding lines like:
cf_use_bidi=no
AC_MSG_CHECKING([if you want to use bidi])
AC_ARG_ENABLE(bidi, [ --enable-bidi use bidi], cf_use_bidi=$enableval )
AC_MSG_RESULT($cf_use_bidi)
if test "$cf_use_bidi" = yes; then AC_DEFINE(USE_FRIBIDI) LIBS="$LIBS -lfribidi" fi
to configure.in should do the trick, but I am not really sure.
-- Matan Ziv-Av. [EMAIL PROTECTED]
--- ../o/links-2.1pre17/html_r.c 2005-01-22 22:51:53.000000000 +0200 +++ html_r.c 2005-03-22 23:29:20.173549984 +0200 @@ -5,6 +5,10 @@ #include "links.h" +#ifdef USE_FRIBIDI +#include <fribidi/fribidi.h> +#endif + #define format format_ struct f_data *init_formatted(struct document_options *opt) @@ -521,8 +525,10 @@ if (i + par_format.rightmargin > p->x) p->x = i + par_format.rightmargin; if (p->data) { #ifdef DEBUG +#ifndef USE_FRIBIDI if ((POS(i, p->cy) & 0xff) != ' ') internal("bad split: %c", (char)POS(i, p->cy)); #endif +#endif move_chars(p, i+1, p->cy, par_format.leftmargin, p->cy+1); del_chars(p, i, p->cy); } @@ -654,6 +660,7 @@ int bg, fg; int i; + int opcx; struct link *link; struct point *pt; if (l < 0) overalloc(); @@ -676,11 +683,15 @@ if (p->y < p->cy + 1) p->y = p->cy + 1; if (nowrap && p->cx + l > rm(par_format)) return; set_hline(p, p->cx, p->cy, l, c, (((fg&0x08)<<3)|(bg<<3)|(fg&0x07))<<8, 1); + opcx=p->cx; p->cx += l; nobreak = 0; - if (par_format.align != AL_NO) + if (par_format.align != AL_NO) { + int cont=1; + while (p->cx > rm(par_format) && p->cx > par_format.leftmargin) { int x; + cont=0; /*if (p->cx > p->x) { p->x = p->cx + par_format.rightmargin; if (c[l - 1] == ' ') p->x--; @@ -688,8 +699,50 @@ if (!(x = split_line(p))) break; /*if (LEN(p->cy-1) > p->x) p->x = LEN(p->cy-1);*/ align_line(p, p->cy - 1); +#ifdef USE_FRIBIDI + if(p->data){ + unsigned char txt[1024]; + unsigned char utext[1024]; + int ll, j, i; + i=LEN(p->cy-1); + FriBidiCharType base = FRIBIDI_TYPE_ON; + + for(j=opcx;j<i;j++)txt[j-opcx]=POS(j, p->cy-1); + txt[j-opcx]=0; + + ll=fribidi_iso8859_8_to_unicode(txt, i-opcx, utext); + fribidi_log2vis( utext, ll, &base, + txt, NULL, NULL, NULL); + fribidi_unicode_to_iso8859_8(txt, ll, utext); + for(j=opcx;j<i;j++)POS(j, p->cy-1)=utext[j-opcx]; + opcx=0; + } +#endif nobreak = x - 1; } + +#ifdef USE_FRIBIDI + if(!cont) { + opcx=0; + } + if(p->data) { + unsigned char txt[1024]; + unsigned char utext[1024]; + int ll, j, i; + i=LEN(p->cy); + FriBidiCharType base = FRIBIDI_TYPE_ON; + + for(j=opcx;j<i;j++)txt[j-opcx]=POS(j, p->cy); + txt[j-opcx]=0; + + ll=fribidi_iso8859_8_to_unicode(txt, i-opcx, utext); + fribidi_log2vis( utext, ll, &base, + txt, NULL, NULL, NULL); + fribidi_unicode_to_iso8859_8(txt, ll, utext); + for(j=opcx;j<i;j++)POS(j, p->cy)=utext[j-opcx]; + } +#endif + } if ((p->xa += l) - (c[l-1] == ' ' && par_format.align != AL_NO) + par_format.leftmargin + par_format.rightmargin > p->xmax) p->xmax = p->xa - (c[l-1] == ' ' && par_format.align != AL_NO) + par_format.leftmargin + par_format.rightmargin; return; --- ../o/links-2.1pre17/terminal.c 2005-01-02 22:17:26.000000000 +0200 +++ terminal.c 2005-03-22 18:05:54.568650344 +0200 @@ -5,6 +5,10 @@ #include "links.h" +#ifdef USE_FRIBIDI +#include <fribidi/fribidi.h> +#endif + #ifdef G void t_redraw(struct graphics_device *, struct rect *); @@ -1030,6 +1034,19 @@ void print_text(struct terminal *t, int x, int y, int l, unsigned char *text, unsigned c) { +#ifdef USE_FRIBIDI + unsigned char txt[1024]; + unsigned char utext[1024]; + int ll; + FriBidiCharType base = FRIBIDI_TYPE_ON; + + ll=fribidi_iso8859_8_to_unicode(text, strlen(text), utext); + fribidi_log2vis( utext, ll, &base, + txt, NULL, NULL, NULL); + fribidi_unicode_to_iso8859_8(txt, ll, utext); + text=utext; +#endif + NO_GFX; for (; l-- && *text; text++, x++) set_char(t, x, y, *text + c); } --- ../o/links-2.1pre17/dip.c 2005-01-02 22:17:25.000000000 +0200 +++ dip.c 2005-03-22 16:42:20.967833520 +0200 @@ -12,6 +12,10 @@ #include "links.h" +#ifdef USE_FRIBIDI +#include <fribidi/fribidi.h> +#endif + #ifdef HAVE_MATH_H #include <math.h> #endif /* HAVE_MATH_H */ @@ -1732,6 +1736,19 @@ my_width; struct rect saved_clip; +#ifdef USE_FRIBIDI + unsigned char txt[1024]; + unsigned char utext[1024]; + int l; + FriBidiCharType base = FRIBIDI_TYPE_ON; + + l=fribidi_utf8_to_unicode(text, strlen(text), utext); + fribidi_log2vis( utext, l, &base, + txt, NULL, NULL, NULL); + fribidi_unicode_to_utf8(txt, l, utext); + text=utext; +#endif + if (y+style->height<=device->clip.y1||y>=device->clip.y2) goto o; if (style -> flags){ /* Underline */
_______________________________________________ links-list mailing list links-list@linuxfromscratch.org http://linuxfromscratch.org/mailman/listinfo/links-list