Skip to content

Commit

Permalink
- use utf8_to_uvchr_buf for 5.16
Browse files Browse the repository at this point in the history
  • Loading branch information
dk committed May 22, 2012
1 parent dc42580 commit 387123d
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 20 deletions.
6 changes: 6 additions & 0 deletions include/apricot.h
Original file line number Diff line number Diff line change
Expand Up @@ -423,8 +423,14 @@ typedef struct { double r, ph; } TrigDComplex;
#endif
#define nilHandle Null(Handle)
#define nilSV &PL_sv_undef

#ifndef true
#define true TRUE
#endif

#ifndef false
#define false FALSE
#endif

/* Event structures */

Expand Down
2 changes: 1 addition & 1 deletion include/unix/guts.h
Original file line number Diff line number Diff line change
Expand Up @@ -1129,7 +1129,7 @@ extern int
prima_try_height( HeightGuessStack * p, int height);

extern void
prima_utf8_to_wchar( const char * utf8, XChar2b * u16, int length);
prima_utf8_to_wchar( const char * utf8, XChar2b * u16, int src_len, int target_len);

extern XChar2b *
prima_alloc_utf8_to_wchar( const char * utf8, int length);
Expand Down
8 changes: 7 additions & 1 deletion unix/apc_clipboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,13 @@ apc_clipboard_close( Handle self)
dst = XX-> internal[cfText]. data;
XX-> internal[cfText]. size = len;
while ( len--) {
register UV u = utf8_to_uvchr( src, &charlen);
register UV u =
#if PERL_PATCHLEVEL >= 16
utf8_to_uvchr_buf( src, src + XX-> internal[cfUTF8]. size, &charlen);
#else
utf8_to_uvchr( src, &charlen)
#endif
;
*(dst++) = ( u < 0x7f) ? u : '?'; /* XXX employ $LANG and iconv() */
src += charlen;
}
Expand Down
31 changes: 21 additions & 10 deletions unix/apc_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ get_font_abc( PCachedFont font, char * index, Bool utf8, FontABC * rec, MenuDraw
}
#endif
if ( utf8)
prima_utf8_to_wchar( index, ( XChar2b*) buf, 1);
prima_utf8_to_wchar( index, ( XChar2b*) buf, 2, 1);
else
buf[0] = *index;
cs = prima_char_struct( font-> fs, ( XChar2b*) buf, utf8);
Expand Down Expand Up @@ -630,11 +630,19 @@ menu_enter_item( PMenuSysData XX, PMenuWindow w, int index, int type)


static void
store_char( char * src, int * srcptr, char * dst, int * dstptr, Bool utf8, MenuDrawRec * data)
store_char( char * src, int srclen, int * srcptr, char * dst, int * dstptr, Bool utf8, MenuDrawRec * data)
{
if ( *srcptr >= srclen ) return;

if ( utf8) {
STRLEN char_len;
UV uv = utf8_to_uvchr(( U8*) src + *srcptr, &char_len);
UV uv =
#if PERL_PATCHLEVEL >= 16
utf8_to_uvchr_buf(( U8*) src + *srcptr, ( U8*) src + srclen, &char_len)
#else
utf8_to_uvchr(( U8*) src + *srcptr, &char_len)
#endif
;
*srcptr += char_len;
if ( data-> xft_map8) {
*(( uint32_t*)(dst + *dstptr)) = (uint32_t) uv;
Expand Down Expand Up @@ -776,9 +784,9 @@ prima_handle_menu_event( XEvent *ev, XWindow win, Handle self)
int s = 0, d = 0;
draw. pixel = clr;
draw. rgb = rgb;
store_char( ">", &s, buf, &d, 0, &draw);
store_char( ">", strlen(">"), &s, buf, &d, 0, &draw);
s = 0;
store_char( ">", &s, buf, &d, 0, &draw);
store_char( ">", strlen(">"), &s, buf, &d, 0, &draw);
text_out( kf, buf, 2,
x + MENU_XOFFSET + xtoffs,
y + MENU_ITEM_GAP + kf-> font. height - kf-> font. descent,
Expand Down Expand Up @@ -811,6 +819,7 @@ prima_handle_menu_event( XEvent *ev, XWindow win, Handle self)
if ( m-> text) {
int lineStart, lineEnd = 0, haveDash = 0;
int ay = y + deltaY - MENU_ITEM_GAP - kf-> font. descent;
int text_len = strlen(m-> text);

t = m-> text;
for (;;) {
Expand All @@ -820,7 +829,7 @@ prima_handle_menu_event( XEvent *ev, XWindow win, Handle self)
if (t[i] == '~' && t[i+1]) {
if ( t[i+1] == '~') {
int dummy = 0;
store_char( "~", &dummy, s, &l, false, &draw);
store_char( "~", strlen("~"), &dummy, s, &l, false, &draw);
i += 2;
slen++;
} else {
Expand All @@ -839,8 +848,8 @@ prima_handle_menu_event( XEvent *ev, XWindow win, Handle self)
if ( lineStart < 0)
lineStart = ( abc.a < 0) ? -abc.a : 0;
lineStart += abc.a + abc.b + abc.c;
}
store_char( t, &i, s, &l, m-> flags. utf8_text, &draw);
}
store_char( t, text_len, &i, s, &l, m-> flags. utf8_text, &draw);
slen++;
}
}
Expand Down Expand Up @@ -884,16 +893,18 @@ prima_handle_menu_event( XEvent *ev, XWindow win, Handle self)
int zy = vertical ?
y + ( deltaY + kf-> font. height) / 2 - kf-> font. descent:
y + deltaY - MENU_ITEM_GAP - kf-> font. descent;
int accel_len = strlen(m-> accel);

if ( m-> flags. utf8_accel)
ul = prima_utf8_length( m-> accel);
else
ul = strlen( m-> accel);
ul = accel_len;
if (( ul * 4 + 4) > sz) {
free(s);
if ( !( s = malloc( sz = (ul * 4 + 4)))) goto EXIT;
}
for ( i = 0; i < ul; i++)
store_char( m-> accel, &sl, s, &dl, m-> flags. utf8_accel, &draw);
store_char( m-> accel, accel_len, &sl, s, &dl, m-> flags. utf8_accel, &draw);
if ( m-> flags. disabled && !selected) {
draw. pixel = XX->c[ciLight3DColor];
draw. rgb = XX->rgb[ciLight3DColor];
Expand Down
16 changes: 12 additions & 4 deletions unix/apc_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1453,18 +1453,26 @@ prima_rect_intersect( XRectangle *t, const XRectangle *s)


void
prima_utf8_to_wchar( const char * utf8, XChar2b * u16, int length)
prima_utf8_to_wchar( const char * utf8, XChar2b * u16, int src_len, int target_len )
{
STRLEN charlen;
while ( length--) {
register UV u = ( utf8_to_uvchr(( U8*) utf8, &charlen));
while ( target_len--) {
register UV u = (
#if PERL_PATCHLEVEL >= 16
utf8_to_uvchr_buf(( U8*) utf8, ( U8*)(utf8 + src_len), &charlen)
#else
utf8_to_uvchr(( U8*) utf8, &charlen)
#endif
);
if ( u < 0x10000) {
u16-> byte1 = u >> 8;
u16-> byte2 = u & 0xff;
} else
u16-> byte1 = u16-> byte2 = 0xff;
u16++;
utf8 += charlen;
src_len -= charlen;
if ( src_len <= 0 || charlen == 0) break;
}
}

Expand All @@ -1474,7 +1482,7 @@ prima_alloc_utf8_to_wchar( const char * utf8, int length)
XChar2b * ret;
if ( length < 0) length = prima_utf8_length( utf8) + 1;
if ( !( ret = malloc( length * sizeof( XChar2b)))) return nil;
prima_utf8_to_wchar( utf8, ret, length);
prima_utf8_to_wchar( utf8, ret, strlen(utf8), length);
return ret;
}

Expand Down
25 changes: 21 additions & 4 deletions unix/xft.c
Original file line number Diff line number Diff line change
Expand Up @@ -916,12 +916,21 @@ xft_text2ucs4( const unsigned char * text, int len, Bool utf8, uint32_t * map8)
{
FcChar32 *ret, *r;
if ( utf8) {
STRLEN charlen;
STRLEN charlen, bytelen = strlen(text);
(void)bytelen;

if ( len < 0) len = prima_utf8_length(( char*) text);
if ( !( r = ret = malloc( len * sizeof( FcChar32)))) return nil;
while ( len--) {
*(r++) = utf8_to_uvchr(( U8*) text, &charlen);
*(r++) =
#if PERL_PATCHLEVEL >= 16
utf8_to_uvchr_buf(( U8*) text, ( U8*) + bytelen, &charlen)
#else
utf8_to_uvchr(( U8*) text, &charlen)
#endif
;
text += charlen;
if ( charlen == 0 ) break;
}
} else {
int i;
Expand All @@ -937,19 +946,27 @@ int
prima_xft_get_text_width( PCachedFont self, const char * text, int len, Bool addOverhang,
Bool utf8, uint32_t * map8, Point * overhangs)
{
int i, ret = 0;
int i, ret = 0, bytelen;
XftFont * font = self-> xft_base;

if ( overhangs) overhangs-> x = overhangs-> y = 0;
if ( utf8 ) bytelen = strlen(text);

for ( i = 0; i < len; i++) {
FcChar32 c;
FT_UInt ft_index;
XGlyphInfo glyph;
if ( utf8) {
STRLEN charlen;
c = ( FcChar32) utf8_to_uvchr(( U8*) text, &charlen);
c = ( FcChar32)
#if PERL_PATCHLEVEL >= 16
utf8_to_uvchr_buf(( U8*) text, (U8*) text + bytelen, &charlen)
#else
utf8_to_uvchr(( U8*) text, &charlen)
#endif
;
text += charlen;
if ( charlen == 0 ) break;
} else if ( ((Byte*)text)[i] > 127) {
c = map8[ ((Byte*)text)[i] - 128];
} else
Expand Down

0 comments on commit 387123d

Please sign in to comment.