~ubuntu-branches/debian/lenny/italc/lenny

« back to all changes in this revision

Viewing changes to common/ivs/libvncserver/font.c

  • Committer: Bazaar Package Importer
  • Author(s): Patrick Winnertz
  • Date: 2008-06-17 13:46:54 UTC
  • mfrom: (1.2.1 upstream) (4.1.1 gutsy)
  • Revision ID: james.westby@ubuntu.com-20080617134654-cl0gi4u524cv1ici
Tags: 1:1.0.9~rc3-1
* Package new upstream version
  - upstream ported the code to qt4.4 (Closes: #481974)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <rfb/rfb.h>
2
 
 
3
 
int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
4
 
                 int x,int y,unsigned char c,rfbPixel col)
5
 
{
6
 
  int i,j,width,height;
7
 
  unsigned char* data=font->data+font->metaData[c*5];
8
 
  unsigned char d=*data;
9
 
  int rowstride=rfbScreen->paddedWidthInBytes;
10
 
  int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8;
11
 
  char *colour=(char*)&col;
12
 
 
13
 
  if(!rfbEndianTest)
14
 
    colour += 4-bpp;
15
 
 
16
 
  width=font->metaData[c*5+1];
17
 
  height=font->metaData[c*5+2];
18
 
  x+=font->metaData[c*5+3];
19
 
  y+=-font->metaData[c*5+4]-height+1;
20
 
 
21
 
  for(j=0;j<height;j++) {
22
 
    for(i=0;i<width;i++) {
23
 
      if((i&7)==0) {
24
 
        d=*data;
25
 
        data++;
26
 
      }
27
 
      if(d&0x80)
28
 
        memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,colour,bpp);
29
 
      d<<=1;
30
 
    }
31
 
    /* if((i&7)!=0) data++; */
32
 
  }
33
 
  return(width);
34
 
}
35
 
 
36
 
void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
37
 
                   int x,int y,const char* string,rfbPixel colour)
38
 
{
39
 
  while(*string) {
40
 
    x+=rfbDrawChar(rfbScreen,font,x,y,*string,colour);
41
 
    string++;
42
 
  }
43
 
}
44
 
 
45
 
/* TODO: these two functions need to be more efficient */
46
 
int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
47
 
                        int x,int y,unsigned char c,
48
 
                        int x1,int y1,int x2,int y2,
49
 
                        rfbPixel col,rfbPixel bcol)
50
 
{
51
 
  int i,j,width,height;
52
 
  unsigned char* data=font->data+font->metaData[c*5];
53
 
  unsigned char d;
54
 
  int rowstride=rfbScreen->paddedWidthInBytes;
55
 
  int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8,extra_bytes=0;
56
 
  char* colour=(char*)&col;
57
 
  char* bcolour=(char*)&bcol;
58
 
 
59
 
  if(!rfbEndianTest) {
60
 
    colour+=4-bpp;
61
 
    bcolour+=4-bpp;
62
 
  }
63
 
 
64
 
  width=font->metaData[c*5+1];
65
 
  height=font->metaData[c*5+2];
66
 
  x+=font->metaData[c*5+3];
67
 
  y+=-font->metaData[c*5+4]-height+1;
68
 
 
69
 
  /* after clipping, x2 will be count of bytes between rows,
70
 
   * x1 start of i, y1 start of j, width and height will be adjusted. */
71
 
  if(y1>y) { y1-=y; data+=(width+7)/8; height-=y1; y+=y1; } else y1=0;
72
 
  if(x1>x) { x1-=x; data+=x1; width-=x1; x+=x1; extra_bytes+=x1/8; } else x1=0;
73
 
  if(y2<y+height) height-=y+height-y2;
74
 
  if(x2<x+width) { extra_bytes+=(x1+width)/8-(x+width-x2+7)/8; width-=x+width-x2; }
75
 
 
76
 
  d=*data;
77
 
  for(j=y1;j<height;j++) {
78
 
    if((x1&7)!=0)
79
 
      d=data[-1]; /* TODO: check if in this case extra_bytes is correct! */
80
 
    for(i=x1;i<width;i++) {
81
 
      if((i&7)==0) {
82
 
        d=*data;
83
 
        data++;
84
 
      }
85
 
      /* if(x+i>=x1 && x+i<x2 && y+j>=y1 && y+j<y2) */ {
86
 
         if(d&0x80) {
87
 
           memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,
88
 
                  colour,bpp);
89
 
         } else if(bcol!=col) {
90
 
           memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,
91
 
                  bcolour,bpp);
92
 
         }
93
 
      }
94
 
      d<<=1;
95
 
    }
96
 
    /* if((i&7)==0) data++; */
97
 
    data += extra_bytes;
98
 
  }
99
 
  return(width);
100
 
}
101
 
 
102
 
void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
103
 
                           int x,int y,const char* string,
104
 
                           int x1,int y1,int x2,int y2,
105
 
                           rfbPixel colour,rfbPixel backColour)
106
 
{
107
 
  while(*string) {
108
 
    x+=rfbDrawCharWithClip(rfbScreen,font,x,y,*string,x1,y1,x2,y2,
109
 
                           colour,backColour);
110
 
    string++;
111
 
  }
112
 
}
113
 
 
114
 
int rfbWidthOfString(rfbFontDataPtr font,const char* string)
115
 
{
116
 
  int i=0;
117
 
  while(*string) {
118
 
    i+=font->metaData[*string*5+1];
119
 
    string++;
120
 
  }
121
 
  return(i);
122
 
}
123
 
 
124
 
int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c)
125
 
{
126
 
  return(font->metaData[c*5+1]+font->metaData[c*5+3]);
127
 
}
128
 
 
129
 
void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2)
130
 
{
131
 
  *x1+=font->metaData[c*5+3];
132
 
  *y1+=-font->metaData[c*5+4]-font->metaData[c*5+2]+1;
133
 
  *x2=*x1+font->metaData[c*5+1];
134
 
  *y2=*y1+font->metaData[c*5+2];
135
 
}
136
 
 
137
 
#ifndef INT_MAX
138
 
#define INT_MAX 0x7fffffff
139
 
#endif
140
 
 
141
 
void rfbWholeFontBBox(rfbFontDataPtr font,
142
 
                      int *x1, int *y1, int *x2, int *y2)
143
 
{
144
 
   int i;
145
 
   int* m=font->metaData;
146
 
   
147
 
   (*x1)=(*y1)=INT_MAX; (*x2)=(*y2)=-INT_MAX+1;
148
 
   for(i=0;i<256;i++) {
149
 
      if(m[i*5+1]-m[i*5+3]>(*x2))
150
 
        (*x2)=m[i*5+1]-m[i*5+3];
151
 
      if(-m[i*5+2]+m[i*5+4]<(*y1))
152
 
        (*y1)=-m[i*5+2]+m[i*5+4];
153
 
      if(m[i*5+3]<(*x1))
154
 
        (*x1)=m[i*5+3];
155
 
      if(-m[i*5+4]>(*y2))
156
 
        (*y2)=-m[i*5+4];
157
 
   }
158
 
}
159
 
 
160
 
rfbFontDataPtr rfbLoadConsoleFont(char *filename)
161
 
{
162
 
  FILE *f=fopen(filename,"rb");
163
 
  rfbFontDataPtr p;
164
 
  int i;
165
 
 
166
 
  if(!f) return(0);
167
 
 
168
 
  p=(rfbFontDataPtr)malloc(sizeof(rfbFontData));
169
 
  p->data=(unsigned char*)malloc(4096);
170
 
  if(1!=fread(p->data,4096,1,f)) {
171
 
    free(p->data);
172
 
    free(p);
173
 
    return(0);
174
 
  }
175
 
  fclose(f);
176
 
  p->metaData=(int*)malloc(256*5*sizeof(int));
177
 
  for(i=0;i<256;i++) {
178
 
    p->metaData[i*5+0]=i*16; /* offset */
179
 
    p->metaData[i*5+1]=8; /* width */
180
 
    p->metaData[i*5+2]=16; /* height */
181
 
    p->metaData[i*5+3]=0; /* xhot */
182
 
    p->metaData[i*5+4]=0; /* yhot */
183
 
  }
184
 
  return(p);
185
 
}
186
 
 
187
 
void rfbFreeFont(rfbFontDataPtr f)
188
 
{
189
 
  free(f->data);
190
 
  free(f->metaData);
191
 
  free(f);
192
 
}