scsh-checkins
[Top] [All Lists]

[Scsh-checkins] CVS: scx/c/xlib text.c,1.2,1.3

To: scsh-checkins@lists.sourceforge.net
Subject: [Scsh-checkins] CVS: scx/c/xlib text.c,1.2,1.3
From: Norbert Freudemann <nofreude@users.sourceforge.net>
Date: Thu, 19 Jul 2001 06:59:44 -0700
List-id: <scsh-checkins.lists.sourceforge.net>
Sender: scsh-checkins-admin@lists.sourceforge.net
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);
  }



<Prev in Thread] Current Thread [Next in Thread>
  • [Scsh-checkins] CVS: scx/c/xlib text.c,1.2,1.3, Norbert Freudemann <=