string.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "lib9.h"
  2. #include "draw.h"
  3. #include "memdraw.h"
  4. #include "memlayer.h"
  5. Point
  6. memimagestring(Memimage *b, Point p, Memimage *color, Point cp, Memsubfont *f, char *cs)
  7. {
  8. int w, width;
  9. uchar *s;
  10. Rune c;
  11. Fontchar *i;
  12. s = (uchar*)cs;
  13. for(; c=*s; p.x+=width, cp.x+=width){
  14. width = 0;
  15. if(c < Runeself)
  16. s++;
  17. else{
  18. w = chartorune(&c, (char*)s);
  19. if(w == 0){
  20. s++;
  21. continue;
  22. }
  23. s += w;
  24. }
  25. if(c >= f->n)
  26. continue;
  27. i = f->info+c;
  28. width = i->width;
  29. memdraw(b, Rect(p.x+i->left, p.y+i->top, p.x+i->left+(i[1].x-i[0].x), p.y+i->bottom),
  30. color, cp, f->bits, Pt(i->x, i->top), SoverD);
  31. }
  32. return p;
  33. }
  34. Point
  35. memsubfontwidth(Memsubfont *f, char *cs)
  36. {
  37. Rune c;
  38. Point p;
  39. uchar *s;
  40. Fontchar *i;
  41. int w, width;
  42. p = Pt(0, f->height);
  43. s = (uchar*)cs;
  44. for(; c=*s; p.x+=width){
  45. width = 0;
  46. if(c < Runeself)
  47. s++;
  48. else{
  49. w = chartorune(&c, (char*)s);
  50. if(w == 0){
  51. s++;
  52. continue;
  53. }
  54. s += w;
  55. }
  56. if(c >= f->n)
  57. continue;
  58. i = f->info+c;
  59. width = i->width;
  60. }
  61. return p;
  62. }