Update of /cvsroot/scsh/scx/c/xlib
In directory usw-pr-cvs1:/tmp/cvs-serv3948
Modified Files:
text.c
Log Message:
Changes for scheme48 and scx
Index: text.c
===================================================================
RCS file: /cvsroot/scsh/scx/c/xlib/text.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** text.c 2001/05/14 13:48:37 1.2
--- text.c 2001/07/19 13:59:42 1.3
***************
*** 1,30 ****
#include "xlib.h"
extern XDrawText(), XDrawText16();
- static s48_value Sym_1byte, Sym_2byte;
- static Two_Byte (format) s48_value format; {
- Check_Type (format, T_Symbol);
- if (S48_EQ_P(format, Sym_1byte))
- return 0;
- else if (S48_EQ_P(format, Sym_2byte))
- return 1;
- Primitive_Error ("index format must be '1-byte or '2-byte");
- /*NOTREACHED*/
- }
- static Get_1_Byte_Char (x) s48_value x; {
- register c = (int)s48_extract_integer (x);
- if (c < 0 || c > 255)
- Range_Error (x);
- return c;
- }
- static Get_2_Byte_Char (x) s48_value x; {
- register c = (int)s48_extract_integer (x);
- if (c < 0 || c > 65535)
- Range_Error (x);
- return c;
- }
/* Calculation of text widths and extents should not be done using
--- 1,9 ----
#include "xlib.h"
+ #include "scheme48.h"
extern XDrawText(), XDrawText16();
/* Calculation of text widths and extents should not be done using
***************
*** 34,180 ****
*/
- static s48_value Internal_Text_Metrics (font, t, f, width) s48_value font, t,
f; {
- char *s;
- XChar2b *s2;
- XFontStruct *info;
- s48_value *data;
- register i, n;
- int dir, fasc, fdesc;
- Alloca_Begin;
-
- Check_Type (font, T_Font);
- info = FONT(font)->info;
- Check_Type (t, T_Vector);
- n = S48_VECTOR_LENGTH(t);
- data = VECTOR(t)->data;
- if (Two_Byte (f)) {
- Alloca (s2, XChar2b*, n * sizeof (XChar2b));
- for (i = 0; i < n; i++) {
- register c = Get_2_Byte_Char (data[i]);
- s2[i].byte1 = (c >> 8) & 0xff;
- s2[i].byte2 = c & 0xff;
- }
- if (width)
- i = XTextWidth16 (info, s2, n);
- else
- XTextExtents16 (info, s2, n, &dir, &fasc, &fdesc, &CI);
- } else {
- Alloca (s, char*, n);
- for (i = 0; i < n; i++)
- s[i] = Get_1_Byte_Char (data[i]);
- if (width)
- i = XTextWidth (info, s, n);
- else
- XTextExtents (info, s, n, &dir, &fasc, &fdesc, &CI);
- }
- Alloca_End;
- return width ? s48_enter_integer (i) : Record_To_Vector (Char_Info_Rec,
- Char_Info_Size, Sym_Char_Info, FONT(font)->dpy, ~0L);
- }
! static s48_value P_Text_Width (font, t, f) s48_value font, t, f; {
! return Internal_Text_Metrics (font, t, f, 1);
}
- static s48_value P_Text_Extents (font, t, f) s48_value font, t, f; {
- return Internal_Text_Metrics (font, t, f, 0);
- }
! static s48_value P_Draw_Image_Text (d, gc, x, y, t, f) s48_value d, gc, x, y,
t, f; {
! Display *dpy;
! Drawable dr = Get_Drawable (d, &dpy);
! s48_value *data;
! register i, n;
! char *s;
! XChar2b *s2;
! Alloca_Begin;
!
! Check_Type (gc, T_Gc);
! Check_Type (t, T_Vector);
! n = S48_VECTOR_LENGTH(t);
! data = VECTOR(t)->data;
! if (Two_Byte (f)) {
! Alloca (s2, XChar2b*, n * sizeof (XChar2b));
! for (i = 0; i < n; i++) {
! register c = Get_2_Byte_Char (data[i]);
! s2[i].byte1 = (c >> 8) & 0xff;
! s2[i].byte2 = c & 0xff;
! }
! XDrawImageString16 (dpy, dr, GCONTEXT(gc)->gc, (int)s48_extract_integer
(x),
! (int)s48_extract_integer (y), s2, n);
! } else {
! Alloca (s, char*, n);
! for (i = 0; i < n; i++)
! s[i] = Get_1_Byte_Char (data[i]);
! XDrawImageString (dpy, dr, GCONTEXT(gc)->gc, (int)s48_extract_integer
(x),
! (int)s48_extract_integer (y), s, n);
}
! Alloca_End;
! return Void;
}
! static s48_value P_Draw_Poly_Text (d, gc, x, y, t, f) s48_value d, gc, x, y,
t, f; {
! Display *dpy;
! Drawable dr = Get_Drawable (d, &dpy);
! s48_value *data;
! register i, n, j, k;
! int twobyte, nitems;
! XTextItem *items;
! int (*func)();
! Alloca_Begin;
!
! Check_Type (gc, T_Gc);
! twobyte = Two_Byte (f);
! func = twobyte ? (int(*)())XDrawText16 : (int(*)())XDrawText;
! Check_Type (t, T_Vector);
! if ((n = S48_VECTOR_LENGTH(t)) == 0)
! return Void;
! for (data = VECTOR(t)->data, i = 0, nitems = 1; i < n; i++)
! if (TYPE(data[i]) == T_Font) nitems++;
! Alloca (items, XTextItem*, nitems * sizeof (XTextItem));
! items[0].delta = 0;
! items[0].font = None;
! for (j = k = i = 0; i <= n; i++) {
! if (i == n || TYPE(data[i]) == T_Font) {
! items[j].nchars = i-k;
! if (twobyte) {
! register XChar2b *p;
!
! Alloca (p, XChar2b*, (i-k) * sizeof (XChar2b));
! ((XTextItem16 *)items)[j].chars = p;
! for ( ; k < i; k++, p++) {
! register c = Get_2_Byte_Char (data[k]);
! p->byte1 = (c >> 8) & 0xff;
! p->byte2 = c & 0xff;
! }
! } else {
! register char *p;
!
! Alloca (p, char*, i-k);
! items[j].chars = p;
! for ( ; k < i; k++)
! *p++ = Get_1_Byte_Char (data[k]);
! }
! k++;
! j++;
! if (i < n) {
! items[j].delta = 0;
! Open_Font_Maybe (data[i]);
! items[j].font = FONT(data[i])->id;
! }
}
}
! (*func)(dpy, dr, GCONTEXT(gc)->gc, (int)s48_extract_integer (x),
(int)s48_extract_integer (y),
! items, nitems);
! Alloca_End;
! return Void;
}
!
! elk_init_xlib_text () {
! Define_Primitive (P_Text_Width, "text-width", 3, 3, EVAL);
! Define_Primitive (P_Text_Extents, "xlib-text-extents", 3, 3, EVAL);
! Define_Primitive (P_Draw_Image_Text, "draw-image-text", 6, 6, EVAL);
! Define_Primitive (P_Draw_Poly_Text, "draw-poly-text", 6, 6, EVAL);
! Define_Symbol (&Sym_1byte, "1-byte");
! Define_Symbol (&Sym_2byte, "2-byte");
}
--- 13,175 ----
*/
! s48_value Text_Width(s48_value Xfontstruct, s48_value text, s48_value format){
! char* s;
! XChar2b* s2;
! XFontStruct* font = EXTRACT_XFONTSTRUCT(Xfontstruct);
! int len = (int)S48_VECTOR_LENGHT(text), i, tmp;
! if (s48_extract_integer(format) == 2){
! for (i = 0; i < len; i++){
! tmp = (int)s48_extract_integer(S48_VECTOR_REF(text, i));
! s2[i].byte1 = (tmp >> 8) & 0xff;
! s2[i].byte2 = tmp & 0xff;
! }
! i = XTextWidth16(font, s2, len);
! }
! else{
! for (i = 0; i < len; i++){
! s[i] = (int)S48_extract_integer(S48_VECTOR_REF(text, i));
! }
! i = XTextWidth(font, s, len);
! }
! return s48_enter_integer((long)i);
! }
!
!
! s48_value Extents_Text (s48_value Xfontstruct, s48_value text,
! s48_value format, s48_value which){
! char* s;
! XChar2b* s2;
! XFontStruct* font = EXTRACT_XFONTSTRUCT(Xfontstruct);
! XCharStruct CI;
! int len = (int)S48_VECTOR_LENGHT(text), i, tmp, dir, fasc, fdesc;
! if (s48_extract_integer(format) == 2){
! for (i = 0; i < len; i++){
! tmp = (int)s48_extract_integer(S48_VECTOR_REF(text, i));
! s2[i].byte1 = (tmp >> 8) & 0xff;
! s2[i].byte2 = tmp & 0xff;
! }
! XTextExtents16(font, s2, len, &dir, &fasc, &fdesc, &CI);
! }else{
! for (i = 0; i < len; i++){
! s[i] = (int)s48_extract_integer(S48_VECTOR_REF(text, i));
! }
! XTextExtents(font, s, len, &dir, &fasc, &fdesc, &CI);
! }
! switch(s48_extract_integer(which)){
! case 0:
! return s48_enter_integer((long) CI.lbearing);
! case 1:
! return s48_enter_integer((long) CI.rbearing);
! case 2:
! return s48_enter_integer((long) CI.width);
! case 3:
! return s48_enter_integer((long) CI.ascent);
! case 4:
! return s48_enter_integer((long) CI.descent);
! }
! return S48_FALSE;
}
! s48_value Draw_Image_Text (s48_value Xdisplay, s48_value Xdrawable,
! s48_value Xgcontext, s48_value x, s48_value y,
! s48_value text, s48_value format){
! int i, len, tmp;
! char* s;
! XChar2b* s2;
! len = S48_VECTOR_LENGTH(text);
!
! if (s48_extract_integer(format) == 2){
! for (i = 0; i < len; i++) {
! tmp = (int)s48_extract_integer(S48_VECTOR_REF(text, i));
! s2[i].byte1 = (tmp >> 8) & 0xff;
! s2[i].byte2 = tmp & 0xff;
! }
! XDrawImageString16 (EXTRACT_DISPLAY(Xdisplay),
EXTRACT_DRAWABLE(Xdrawable),
! EXTRACT_GCONTEXT(Xgcontext),
! (int)s48_extract_integer(x),
! (int)s48_extract_integer(y), s2, len);
! }else{
! for (i = 0; i < len; i++){
! s[i] = (int)s48_extract_integer(S48_VECTOR_REF(text, i));
}
! XDrawImageString (EXTRACT_DISPLAY(Xdisplay), EXTRACT_INTEGER(Xdrawable),
! EXTRACT_GCONTEXT(Xgcontext),
! (int)s48_extract_integer(x),
! (int)s48_extract_integer(y), s, len);
! }
! return S48_UNSPECIFIC;
}
+
! s48_value Draw_Poly_Text (s48_value Xdisplay, s48_value Xdrawable,
! s48_value Xgcontext, s48_value x, s48_value y,
! s48_value text, s48_value format){
! int i, j, k, len, nitems, set = 0, tmp;
! XTextItem* item;
! s48_value temp_vec;
! int twobyte = (int)s48_extract_integer(format);
! len = S48_VECTOR_LENGTH(text);
!
! if (!len){
! return S48_UNSPECIFIC;
! }
! // count the strings in text:
! for (i = 0; i < len; i++){
! if (S48_VECTOR_P(S48_VECTOR_REF(text, i))){
! nitems++;
}
}
! //XTextItem* item[nitems];
! //Maybe no font as first Element of text?
! if (S48_VECTOR_P(S48_VECTOR_REF(text, 0))){
! item[0].delta = 0;
! item[0].font = None;
! }
! for (i = 0; i < len; i++) {
! if (S48_VECTOR_P(S48_VECTOR_REF(text,i))){
! temp_vec = S48_VECTOR_REF(text,i);
! k = S48_VECTOR_LENGTH(temp_vec);
! item[set].nchars = k;
! if (twobyte) {
! XChar2b s2[k];
! for (j = 0; j < k; j++){
! tmp = (int)s48_extract_integer(S48_VECTOR_REF(temp_vec, j));
! s2[j].byte1 = (tmp >> 8) & 0xff;
! s2[j].byte2 = tmp & 0xff;
! }
! (XTextItem16* )item[set].chars = s2;
! }else{
! char s[k];
! for(j = 0; j < k; j++){
! s[j] = (int)s48_extract_integer(S48_VECTOR_REF(temp_vec, j));
! }
! item[set].chars = s;
! }
! set++;
! }else{
! item[set].font = EXTRACT_XFONT(S48_VECTOR_REF(text, i));
! item[set].delta = 0;
! }
! }
! if (twobyte){
! XDrawText16(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable),
! EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x),
! (int)s48_extract_integer(y), (XTextItem16*) item, nitems);
! }else{
! XDrawText(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable),
! EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x),
! (int)s48_extract_integer(y), item, nitems);
! }
! return S48_UNSPECIFIC;
}
!
!
!
! void s48_init_text(void) {
! S48_EXPORT_FUNCTION(Text_Width);
! S48_EXPORT_FUNCTION(Extents_Text);
! S48_EXPORT_FUNCTION(Draw_Image_Text);
! S48_EXPORT_FUNCTION(Draw_Poly_Text);
}
|