1 | 'From Smalltalk/X, Version:6.2.3.0 on 01-04-2014 at 15:41:10' ! |
---|
2 | |
---|
3 | "{ Package: 'stx:libview' }" |
---|
4 | |
---|
5 | FontDescription subclass:#XftFontDescription |
---|
6 | instanceVariableNames:'device fontId sharedDrawId closestFont minCode maxCode' |
---|
7 | classVariableNames:'FC_FAMILY FC_STYLE FC_SLANT FC_WEIGHT FC_SIZE FC_ASPECT |
---|
8 | FC_PIXEL_SIZE FC_SPACING FC_FOUNDRY FC_ANTIALIAS FC_HINTING |
---|
9 | FC_HINT_STYLE FC_VERTICAL_LAYOUT FC_AUTOHINT FC_WIDTH FC_FILE |
---|
10 | FC_INDEX FC_FT_FACE FC_RASTERIZER FC_OUTLINE FC_SCALABLE FC_SCALE |
---|
11 | FC_DPI FC_RGBA FC_MINSPACE FC_SOURCE FC_CHARSET FC_LANG |
---|
12 | FC_FONTVERSION FC_FULLNAME FC_FAMILYLANG FC_STYLELANG |
---|
13 | FC_FULLNAMELANG FC_CAPABILITY FC_FONTFORMAT FC_EMBOLDEN |
---|
14 | FC_EMBEDDED_BITMAP FC_DECORATIVE FC_LCD_FILTER FC_NAMELANG |
---|
15 | FC_CHAR_WIDTH FC_CHAR_HEIGHT FC_MATRIX FC_WEIGHT_THIN |
---|
16 | FC_WEIGHT_EXTRALIGHT FC_WEIGHT_ULTRALIGHT FC_WEIGHT_LIGHT |
---|
17 | FC_WEIGHT_BOOK FC_WEIGHT_REGULAR FC_WEIGHT_NORMAL |
---|
18 | FC_WEIGHT_MEDIUM FC_WEIGHT_DEMIBOLD FC_WEIGHT_SEMIBOLD |
---|
19 | FC_WEIGHT_BOLD FC_WEIGHT_EXTRABOLD FC_WEIGHT_ULTRABOLD |
---|
20 | FC_WEIGHT_BLACK FC_WEIGHT_HEAVY FC_WEIGHT_EXTRABLACK |
---|
21 | FC_WEIGHT_ULTRABLACK FC_SLANT_ROMAN FC_SLANT_ITALIC |
---|
22 | FC_SLANT_OBLIQUE FC_WIDTH_ULTRACONDENSED FC_WIDTH_EXTRACONDENSED |
---|
23 | FC_WIDTH_CONDENSED FC_WIDTH_SEMICONDENSED FC_WIDTH_NORMAL |
---|
24 | FC_WIDTH_SEMIEXPANDED FC_WIDTH_EXPANDED FC_WIDTH_EXTRAEXPANDED |
---|
25 | FC_WIDTH_ULTRAEXPANDED FC_PROPORTIONAL FC_DUAL FC_MONO |
---|
26 | FC_CHARCELL FC_RGBA_UNKNOWN FC_RGBA_RGB FC_RGBA_BGR FC_RGBA_VRGB |
---|
27 | FC_RGBA_VBGR FC_RGBA_NONE FC_HINT_NONE FC_HINT_SLIGHT |
---|
28 | FC_HINT_MEDIUM FC_HINT_FULL FC_LCD_NONE FC_LCD_DEFAULT |
---|
29 | FC_LCD_LIGHT FC_LCD_LEGACY StXFace2FCWeightMap |
---|
30 | StXStyle2FCSlantMap CachedFontList SimpleViewUnusedSlotIndex' |
---|
31 | poolDictionaries:'' |
---|
32 | category:'Graphics-Support' |
---|
33 | ! |
---|
34 | |
---|
35 | Object subclass:#FCFontListParser |
---|
36 | instanceVariableNames:'pipeStream lineStream currentDescription' |
---|
37 | classVariableNames:'' |
---|
38 | poolDictionaries:'' |
---|
39 | privateIn:XftFontDescription |
---|
40 | ! |
---|
41 | |
---|
42 | ExternalAddress subclass:#FCPatternHandle |
---|
43 | instanceVariableNames:'' |
---|
44 | classVariableNames:'' |
---|
45 | poolDictionaries:'' |
---|
46 | privateIn:XftFontDescription |
---|
47 | ! |
---|
48 | |
---|
49 | ExternalAddress subclass:#XftDrawHandle |
---|
50 | instanceVariableNames:'' |
---|
51 | classVariableNames:'' |
---|
52 | poolDictionaries:'' |
---|
53 | privateIn:XftFontDescription |
---|
54 | ! |
---|
55 | |
---|
56 | ExternalAddress subclass:#XftFontHandle |
---|
57 | instanceVariableNames:'' |
---|
58 | classVariableNames:'' |
---|
59 | poolDictionaries:'' |
---|
60 | privateIn:XftFontDescription |
---|
61 | ! |
---|
62 | |
---|
63 | !XftFontDescription primitiveDefinitions! |
---|
64 | %{ |
---|
65 | /* |
---|
66 | * includes, defines, structure definitions |
---|
67 | * and typedefs come here. |
---|
68 | */ |
---|
69 | |
---|
70 | #undef True |
---|
71 | #undef False |
---|
72 | #undef Time |
---|
73 | #define Time XTime |
---|
74 | |
---|
75 | #ifdef XFT |
---|
76 | |
---|
77 | extern OBJ __GLOBAL_GET_BY_NAME(); |
---|
78 | |
---|
79 | # define __HANDLE_VAL(type, externalAddress) \ |
---|
80 | ((type)__externalAddressVal(externalAddress)) |
---|
81 | #define __HANDLE_NEW(ptr, __cls) \ |
---|
82 | ({ \ |
---|
83 | OBJ handle; \ |
---|
84 | handle = __MKEXTERNALADDRESS(ptr); \ |
---|
85 | __InstPtr(handle)->o_class = \ |
---|
86 | __GLOBAL_GET_BY_NAME(__cls); \ |
---|
87 | handle; \ |
---|
88 | }) |
---|
89 | |
---|
90 | |
---|
91 | |
---|
92 | # define DISPLAY(x) __HANDLE_VAL(Display*, x) |
---|
93 | # define SCREEN(x) ((int)(__intVal(x))) |
---|
94 | # define DRAWABLE(x) __HANDLE_VAL(Drawable, x) |
---|
95 | # define GC(x) __HANDLE_VAL(GC, x) |
---|
96 | # define VISUAL(x) __HANDLE_VAL(Visual*, x) |
---|
97 | # define COLORMAP(x) __HANDLE_VAL(Colormap, x) |
---|
98 | |
---|
99 | |
---|
100 | |
---|
101 | |
---|
102 | /* FontConfig objects */ |
---|
103 | # define FC_PATTERN(x) __HANDLE_VAL(XftPattern*, x) |
---|
104 | # define FC_PATTERN_HANDLE_NEW(x) __HANDLE_NEW(x, "XftFontDescription::FCPatternHandle") |
---|
105 | |
---|
106 | /* Xft Objects */ |
---|
107 | |
---|
108 | # define XFT_FONT(x) __HANDLE_VAL(XftFont*, x) |
---|
109 | # define XFT_FONT_HANDLE_NEW(x) __HANDLE_NEW(x, "XftFontDescription::XftFontHandle") |
---|
110 | |
---|
111 | # define XFT_DRAW(x) __HANDLE_VAL(XftDraw*, x) |
---|
112 | # define XFT_DRAW_HANDLE_NEW(x) __HANDLE_NEW(x, "XftFontDescription::XftDrawHandle") |
---|
113 | |
---|
114 | |
---|
115 | # include <X11/Xft/Xft.h> |
---|
116 | # include <X11/Xft/XftCompat.h> |
---|
117 | |
---|
118 | #endif |
---|
119 | |
---|
120 | %} |
---|
121 | ! ! |
---|
122 | |
---|
123 | !XftFontDescription class methodsFor:'documentation'! |
---|
124 | |
---|
125 | documentation |
---|
126 | " |
---|
127 | WARNING: Unfinished. |
---|
128 | |
---|
129 | Experimental implementation of custom font rendered using |
---|
130 | Xft library (UNIX / X Window only), To actually use it, |
---|
131 | add following definitions to the end of stx/configurations/myConf |
---|
132 | (works on Ubuntu 12.10) |
---|
133 | |
---|
134 | --- snip --- |
---|
135 | XDEFS+=-DXFT |
---|
136 | XINCLUDE+=$(shell pkg-config --cflags xft) |
---|
137 | LIB_XFT=-l:libXft.so.2 -l:libfontconfig.so.1 |
---|
138 | --- snip -- |
---|
139 | |
---|
140 | NOTE: This class should be named XftFont, however then |
---|
141 | there would be a name clash with XftFont structure |
---|
142 | defined in Xft.h - therefore the class is named |
---|
143 | XftFontDescription to avoid that name clash. |
---|
144 | |
---|
145 | |
---|
146 | [author:] |
---|
147 | Jan Vrany <jan.vrany@fit.cvut.cz> |
---|
148 | |
---|
149 | [instance variables:] |
---|
150 | |
---|
151 | [class variables:] |
---|
152 | |
---|
153 | [see also:] |
---|
154 | |
---|
155 | " |
---|
156 | ! ! |
---|
157 | |
---|
158 | !XftFontDescription class methodsFor:'initialization'! |
---|
159 | |
---|
160 | flushListOfAvailableFonts |
---|
161 | CachedFontList := nil. |
---|
162 | |
---|
163 | " |
---|
164 | XftFontDescription flushListOfAvailableFonts |
---|
165 | " |
---|
166 | ! |
---|
167 | |
---|
168 | initialize |
---|
169 | "Invoked at system start or when the class is dynamically loaded." |
---|
170 | |
---|
171 | " Taken from fontconfig,h " |
---|
172 | |
---|
173 | FC_FAMILY := 'family'. "/* String */ |
---|
174 | FC_STYLE := 'style'. "/* String */ |
---|
175 | FC_SLANT := 'slant'. "/* Int */ |
---|
176 | FC_WEIGHT := 'weight'. "/* Int */ |
---|
177 | FC_SIZE := 'size'. "/* Double */ |
---|
178 | FC_ASPECT := 'aspect'. "/* Double */ |
---|
179 | FC_PIXEL_SIZE := 'pixelsize'. "/* Double */ |
---|
180 | FC_SPACING := 'spacing'. "/* Int */ |
---|
181 | FC_FOUNDRY := 'foundry'. "/* String */ |
---|
182 | FC_ANTIALIAS := 'antialias'. "/* Bool (depends) */ |
---|
183 | FC_HINTING := 'hinting'. "/* Bool (true) */ |
---|
184 | FC_HINT_STYLE := 'hintstyle'. "/* Int */ |
---|
185 | FC_VERTICAL_LAYOUT := 'verticallayout'. "/* Bool (false) */ |
---|
186 | FC_AUTOHINT := 'autohint'. "/* Bool (false) */ |
---|
187 | FC_WIDTH := 'width'. "/* Int */ |
---|
188 | FC_FILE := 'file'. "/* String */ |
---|
189 | FC_INDEX := 'index'. "/* Int */ |
---|
190 | FC_FT_FACE := 'ftface'. "/* FT_Face */ |
---|
191 | FC_RASTERIZER := 'rasterizer'. "/* String */ |
---|
192 | FC_OUTLINE := 'outline'. "/* Bool */ |
---|
193 | FC_SCALABLE := 'scalable'. "/* Bool */ |
---|
194 | FC_SCALE := 'scale'. "/* double */ |
---|
195 | FC_DPI := 'dpi'. "/* double */ |
---|
196 | FC_RGBA := 'rgba'. "/* Int */ |
---|
197 | FC_MINSPACE := 'minspace'. "/* Bool use minimum line spacing */ |
---|
198 | FC_SOURCE := 'source'. "/* String (deprecated) */ |
---|
199 | FC_CHARSET := 'charset'. "/* CharSet */ |
---|
200 | FC_LANG := 'lang'. "/* String RFC 3066 langs */ |
---|
201 | FC_FONTVERSION := 'fontversion'. "/* Int from 'head'.table */ |
---|
202 | FC_FULLNAME := 'fullname'. "/* String */ |
---|
203 | FC_FAMILYLANG := 'familylang'. "/* String RFC 3066 langs */ |
---|
204 | FC_STYLELANG := 'stylelang'. "/* String RFC 3066 langs */ |
---|
205 | FC_FULLNAMELANG := 'fullnamelang'. "/* String RFC 3066 langs */ |
---|
206 | FC_CAPABILITY := 'capability'. "/* String */ |
---|
207 | FC_FONTFORMAT := 'fontformat'. "/* String */ |
---|
208 | FC_EMBOLDEN := 'embolden'. "/* Bool - true if emboldening needed*/ |
---|
209 | FC_EMBEDDED_BITMAP := 'embeddedbitmap'."/* Bool - true to enable embedded bitmaps */ |
---|
210 | FC_DECORATIVE := 'decorative'. "/* Bool - true if style is a decorative variant */ |
---|
211 | FC_LCD_FILTER := 'lcdfilter'. "/* Int */ |
---|
212 | FC_NAMELANG := 'namelang'. "/* String RFC 3866 langs */ |
---|
213 | |
---|
214 | |
---|
215 | "Adjust outline rasterizer" |
---|
216 | FC_CHAR_WIDTH := 'charwidth'."/* Int */ |
---|
217 | FC_CHAR_HEIGHT := 'charheight'."/* Int */ |
---|
218 | FC_MATRIX := 'matrix'. "/* FcMatrix */ |
---|
219 | |
---|
220 | FC_WEIGHT_THIN := 0. |
---|
221 | FC_WEIGHT_EXTRALIGHT := 40. |
---|
222 | FC_WEIGHT_ULTRALIGHT := FC_WEIGHT_EXTRALIGHT. |
---|
223 | FC_WEIGHT_LIGHT := 50. |
---|
224 | FC_WEIGHT_BOOK := 75. |
---|
225 | FC_WEIGHT_REGULAR := 80. |
---|
226 | FC_WEIGHT_NORMAL := FC_WEIGHT_REGULAR. |
---|
227 | FC_WEIGHT_MEDIUM := 100. |
---|
228 | FC_WEIGHT_DEMIBOLD := 180. |
---|
229 | FC_WEIGHT_SEMIBOLD := FC_WEIGHT_DEMIBOLD. |
---|
230 | FC_WEIGHT_BOLD := 200. |
---|
231 | FC_WEIGHT_EXTRABOLD := 205. |
---|
232 | FC_WEIGHT_ULTRABOLD := FC_WEIGHT_EXTRABOLD. |
---|
233 | FC_WEIGHT_BLACK := 210. |
---|
234 | FC_WEIGHT_HEAVY := FC_WEIGHT_BLACK. |
---|
235 | FC_WEIGHT_EXTRABLACK := 215. |
---|
236 | FC_WEIGHT_ULTRABLACK := FC_WEIGHT_EXTRABLACK. |
---|
237 | |
---|
238 | FC_SLANT_ROMAN := 0. |
---|
239 | FC_SLANT_ITALIC := 100. |
---|
240 | FC_SLANT_OBLIQUE := 110. |
---|
241 | |
---|
242 | FC_WIDTH_ULTRACONDENSED := 50. |
---|
243 | FC_WIDTH_EXTRACONDENSED := 63. |
---|
244 | FC_WIDTH_CONDENSED := 75. |
---|
245 | FC_WIDTH_SEMICONDENSED := 87. |
---|
246 | FC_WIDTH_NORMAL := 100. |
---|
247 | FC_WIDTH_SEMIEXPANDED := 113. |
---|
248 | FC_WIDTH_EXPANDED := 125. |
---|
249 | FC_WIDTH_EXTRAEXPANDED := 150. |
---|
250 | FC_WIDTH_ULTRAEXPANDED := 200. |
---|
251 | |
---|
252 | FC_PROPORTIONAL := 0. |
---|
253 | FC_DUAL := 90. |
---|
254 | FC_MONO := 100. |
---|
255 | FC_CHARCELL := 110. |
---|
256 | |
---|
257 | "sub-pixel order" |
---|
258 | FC_RGBA_UNKNOWN := 0. |
---|
259 | FC_RGBA_RGB := 1. |
---|
260 | FC_RGBA_BGR := 2. |
---|
261 | FC_RGBA_VRGB := 3. |
---|
262 | FC_RGBA_VBGR := 4. |
---|
263 | FC_RGBA_NONE := 5. |
---|
264 | |
---|
265 | "hinting style" |
---|
266 | FC_HINT_NONE := 0. |
---|
267 | FC_HINT_SLIGHT := 1. |
---|
268 | FC_HINT_MEDIUM := 2. |
---|
269 | FC_HINT_FULL := 3. |
---|
270 | |
---|
271 | "LCD filter" |
---|
272 | FC_LCD_NONE := 0. |
---|
273 | FC_LCD_DEFAULT := 1. |
---|
274 | FC_LCD_LIGHT := 2. |
---|
275 | FC_LCD_LEGACY := 3. |
---|
276 | |
---|
277 | StXFace2FCWeightMap := Dictionary withKeysAndValues:{ |
---|
278 | 'regular'. FC_WEIGHT_REGULAR. |
---|
279 | 'medium'. FC_WEIGHT_MEDIUM. |
---|
280 | 'bold'. FC_WEIGHT_BOLD. |
---|
281 | }. |
---|
282 | StXStyle2FCSlantMap := Dictionary withKeysAndValues:{ |
---|
283 | 'roman'. FC_SLANT_ROMAN. |
---|
284 | 'italic'. FC_SLANT_ITALIC. |
---|
285 | 'oblique'. FC_SLANT_OBLIQUE. |
---|
286 | }. |
---|
287 | |
---|
288 | SimpleViewUnusedSlotIndex := SimpleView instVarIndexFor: #unused. |
---|
289 | |
---|
290 | "Modified: / 01-04-2014 / 15:33:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
291 | ! ! |
---|
292 | |
---|
293 | !XftFontDescription class methodsFor:'instance creation'! |
---|
294 | |
---|
295 | family:familyString face:faceString style:styleString size:size sizeUnit:sizeUnit encoding:encoding |
---|
296 | "returns a font for given family, face, style, size and the specified encoding. |
---|
297 | The returned font is not associated to a specific device" |
---|
298 | |
---|
299 | |proto| |
---|
300 | |
---|
301 | CachedFontList notNil ifTrue:[ |
---|
302 | proto := CachedFontList |
---|
303 | detect:[:fn | |
---|
304 | fn family = familyString |
---|
305 | and:[ fn face = faceString |
---|
306 | and:[ (fn style = styleString |
---|
307 | or:[ (fn style = 'oblique' and:[styleString = 'italic']) |
---|
308 | or:[ (fn style = 'italic' and:[styleString = 'oblique']) ]]) ]]] |
---|
309 | ifNone:nil. |
---|
310 | proto notNil ifTrue:[ |
---|
311 | ^ (proto shallowCopy) |
---|
312 | setDevice: nil patternId: nil fontId: nil; |
---|
313 | family:familyString face:faceString style:styleString size:size sizeUnit:sizeUnit encoding:encoding |
---|
314 | ]. |
---|
315 | ]. |
---|
316 | ^ super |
---|
317 | family:familyString face:faceString style:styleString size:size sizeUnit:sizeUnit encoding:encoding |
---|
318 | ! |
---|
319 | |
---|
320 | new |
---|
321 | "/ self halt. |
---|
322 | ^ super new. |
---|
323 | ! ! |
---|
324 | |
---|
325 | !XftFontDescription class methodsFor:'examples'! |
---|
326 | |
---|
327 | example1 |
---|
328 | " |
---|
329 | XftFontDescription example1 |
---|
330 | " |
---|
331 | |top textView| |
---|
332 | |
---|
333 | top := StandardSystemView new. |
---|
334 | top extent:300@200. |
---|
335 | |
---|
336 | textView := EditTextView new. |
---|
337 | textView origin:0.0 @ 0.0 corner:1.0 @ 1.0. |
---|
338 | textView basicFont: (XftFontDescription family: 'DejaVu Sans' size: 16). |
---|
339 | |
---|
340 | top addSubView:textView. |
---|
341 | |
---|
342 | textView contents:('/etc/hosts' asFilename contentsOfEntireFile asText). |
---|
343 | |
---|
344 | top open. |
---|
345 | |
---|
346 | "Created: / 20-12-2013 / 00:04:57 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
347 | "Modified: / 30-12-2013 / 19:11:07 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
348 | ! |
---|
349 | |
---|
350 | example2 |
---|
351 | " |
---|
352 | XftFontDescription example2 |
---|
353 | " |
---|
354 | |top textView| |
---|
355 | |
---|
356 | top := StandardSystemView new. |
---|
357 | top extent:300@200. |
---|
358 | |
---|
359 | textView := EditTextView new. |
---|
360 | textView origin:0.0 @ 0.0 corner:1.0 @ 1.0. |
---|
361 | textView basicFont: (XftFontDescription family: 'DejaVu Sans' size: 30) asItalic. |
---|
362 | |
---|
363 | top addSubView:textView. |
---|
364 | |
---|
365 | textView contents:('/etc/hosts' asFilename contentsOfEntireFile). |
---|
366 | |
---|
367 | top open. |
---|
368 | |
---|
369 | "Created: / 30-12-2013 / 19:49:05 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
370 | ! ! |
---|
371 | |
---|
372 | !XftFontDescription class methodsFor:'queries'! |
---|
373 | |
---|
374 | listOfAvailableFonts |
---|
375 | "uses fc-list to get a list of available fontDescriptions" |
---|
376 | |
---|
377 | CachedFontList isNil ifTrue:[ |
---|
378 | CachedFontList := FCFontListParser new listOfAvailableFonts |
---|
379 | ]. |
---|
380 | ^ CachedFontList |
---|
381 | |
---|
382 | " |
---|
383 | XftFontDescription flushListOfAvailableFonts. |
---|
384 | XftFontDescription listOfAvailableFonts |
---|
385 | " |
---|
386 | ! ! |
---|
387 | |
---|
388 | !XftFontDescription methodsFor:'accessing'! |
---|
389 | |
---|
390 | encoding |
---|
391 | ^ encoding ? 'iso10646-1' |
---|
392 | ! |
---|
393 | |
---|
394 | face |
---|
395 | ^ face ? '' |
---|
396 | ! |
---|
397 | |
---|
398 | fullName |
---|
399 | ^ name ? (self userFriendlyName) |
---|
400 | ! |
---|
401 | |
---|
402 | graphicsDevice |
---|
403 | ^ device |
---|
404 | |
---|
405 | "Created: / 02-01-2014 / 23:22:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
406 | ! |
---|
407 | |
---|
408 | maxCode |
---|
409 | ^ maxCode ? 16rFFFF |
---|
410 | ! |
---|
411 | |
---|
412 | maxCode:something |
---|
413 | maxCode := something. |
---|
414 | ! |
---|
415 | |
---|
416 | minCode |
---|
417 | ^ minCode ? 0 |
---|
418 | ! |
---|
419 | |
---|
420 | minCode:something |
---|
421 | minCode := something. |
---|
422 | ! |
---|
423 | |
---|
424 | size |
---|
425 | ^ size ? 0 |
---|
426 | ! |
---|
427 | |
---|
428 | style |
---|
429 | ^ style ? '' |
---|
430 | ! ! |
---|
431 | |
---|
432 | !XftFontDescription methodsFor:'accessing-private'! |
---|
433 | |
---|
434 | getFontId |
---|
435 | ^ fontId |
---|
436 | |
---|
437 | "Created: / 02-01-2014 / 23:29:04 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
438 | ! ! |
---|
439 | |
---|
440 | !XftFontDescription methodsFor:'displaying'! |
---|
441 | |
---|
442 | displayString:aString from:index1 to:index2Arg x:xArg y:yArg in:aGC opaque:opaque |
---|
443 | "display a partial string at some position in aGC." |
---|
444 | |
---|
445 | |index2 bytesPerCharacter transformation isView clipR clipX clipY clipW clipH fg fgR fgG fgB fgA fgPixel bg bgR bgG bgB bgA bgPixel drawX drawY displayId screen drawableId drawIdToUse error stringLen| |
---|
446 | |
---|
447 | "limit the string len, otherwise bad output is generated" |
---|
448 | stringLen := index2Arg - index1. |
---|
449 | stringLen > 8000 ifTrue:[ |
---|
450 | index2 := index2Arg - (stringLen - 8000). |
---|
451 | ] ifFalse:[ |
---|
452 | index2 := index2Arg. |
---|
453 | ]. |
---|
454 | bytesPerCharacter := aString bitsPerCharacter // 8. |
---|
455 | transformation := aGC transformation. |
---|
456 | |
---|
457 | clipR := aGC clippingBoundsOrNil. |
---|
458 | clipR notNil ifTrue:[ |
---|
459 | clipX := clipR left. |
---|
460 | clipY := clipR top. |
---|
461 | clipW := clipR width. |
---|
462 | clipH := clipR height. |
---|
463 | ]. |
---|
464 | |
---|
465 | transformation isNil ifTrue:[ |
---|
466 | drawX := xArg. |
---|
467 | drawY := yArg. |
---|
468 | ] ifFalse:[ |
---|
469 | drawX := transformation applyToX:xArg. |
---|
470 | drawY := transformation applyToY:yArg. |
---|
471 | clipR notNil ifTrue:[ |
---|
472 | clipX := transformation applyToX:clipX. |
---|
473 | clipY := transformation applyToY:clipY. |
---|
474 | clipW := transformation applyScaleX:clipW. |
---|
475 | clipH := transformation applyScaleY:clipH. |
---|
476 | ]. |
---|
477 | ]. |
---|
478 | |
---|
479 | fg := aGC paint. |
---|
480 | fgPixel := fg colorId. |
---|
481 | "/ fgPixel notNil ifTrue:[ |
---|
482 | fgR := fg scaledRed. |
---|
483 | fgG := fg scaledGreen. |
---|
484 | fgB := fg scaledBlue. |
---|
485 | fgA := (fg alpha * 65535) rounded. |
---|
486 | "/]. |
---|
487 | fgR isNil ifTrue:[ |
---|
488 | "/ when drawing into a pixmap... |
---|
489 | fg colorId == 0 ifTrue:[ |
---|
490 | fgR := fgG := fgB := 0. |
---|
491 | ] ifFalse:[ |
---|
492 | fgR := fgG := fgB := 16rFFFF. |
---|
493 | ] |
---|
494 | ]. |
---|
495 | |
---|
496 | opaque ifTrue:[ |
---|
497 | bg := aGC backgroundPaint. |
---|
498 | bgPixel := bg colorId. |
---|
499 | "/bgPixel notNil ifTrue:[ |
---|
500 | bgR := bg scaledRed. |
---|
501 | bgG := bg scaledGreen. |
---|
502 | bgB := bg scaledBlue. |
---|
503 | bgA := (bg alpha * 65535) rounded. |
---|
504 | "/]. |
---|
505 | bgR isNil ifTrue:[ |
---|
506 | "/ when drawing into a pixmap... |
---|
507 | bg colorId == 0 ifTrue:[ |
---|
508 | bgR := bgG := bgB := 0. |
---|
509 | ] ifFalse:[ |
---|
510 | bgR := bgG := bgB := 16rFFFF. |
---|
511 | ] |
---|
512 | ]. |
---|
513 | ]. |
---|
514 | displayId := device displayIdOrErrorIfBroken. |
---|
515 | displayId isNil ifTrue:[ |
---|
516 | ^ self. |
---|
517 | ]. |
---|
518 | screen := device screen. |
---|
519 | drawableId := aGC drawableId. |
---|
520 | isView := aGC isKindOf: SimpleView. |
---|
521 | SimpleViewUnusedSlotIndex := SimpleView instVarIndexFor: #unused. |
---|
522 | |
---|
523 | %{ |
---|
524 | #ifdef XFT |
---|
525 | XftFont *font; |
---|
526 | XftDraw *draw; |
---|
527 | XftColor color; |
---|
528 | XGlyphInfo extents; |
---|
529 | XRectangle clipRX; |
---|
530 | char* string; |
---|
531 | int len; |
---|
532 | int __bytesPerCharacter; |
---|
533 | |
---|
534 | if (!(__bothSmallInteger(drawX, drawY) |
---|
535 | && __bothSmallInteger(index1, index2) |
---|
536 | && __isSmallInteger(bytesPerCharacter) |
---|
537 | && (__isSmallInteger(fgPixel) || (__bothSmallInteger(fgR, fgG) && __bothSmallInteger(fgB, fgA))) |
---|
538 | && (opaque == false || __isSmallInteger(bgPixel) || (__bothSmallInteger(bgR, bgG) && __bothSmallInteger(bgB, bgA))) |
---|
539 | && __isNonNilObject(aString) |
---|
540 | )) { |
---|
541 | goto err; |
---|
542 | } |
---|
543 | |
---|
544 | __bytesPerCharacter = __intVal(bytesPerCharacter); |
---|
545 | |
---|
546 | if (1 && (isView == true)) { |
---|
547 | int unusedSlotIndex = __intVal(@global(XftFontDescription:SimpleViewUnusedSlotIndex)) - 1; |
---|
548 | drawIdToUse = __InstPtr(aGC)->i_instvars[unusedSlotIndex]; |
---|
549 | if (drawIdToUse == nil) { |
---|
550 | drawIdToUse = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) , |
---|
551 | DRAWABLE( drawableId ) , |
---|
552 | DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) , |
---|
553 | DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) ); |
---|
554 | __InstPtr(aGC)->i_instvars[unusedSlotIndex] = drawIdToUse; |
---|
555 | __STORE(aGC, drawIdToUse); |
---|
556 | } |
---|
557 | } else { |
---|
558 | if ( __INST(sharedDrawId) == nil ) { |
---|
559 | __INST(sharedDrawId) = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) , |
---|
560 | DRAWABLE( drawableId ) , |
---|
561 | DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) , |
---|
562 | DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) ); |
---|
563 | __STORE(self, __INST(sharedDrawId)); |
---|
564 | } |
---|
565 | if ( XftDrawDrawable ( XFT_DRAW ( __INST(sharedDrawId) ) ) != DRAWABLE( drawableId ) ) { |
---|
566 | XftDrawChange( XFT_DRAW( __INST(sharedDrawId) ) , DRAWABLE( drawableId ) ); |
---|
567 | } |
---|
568 | drawIdToUse = __INST(sharedDrawId); |
---|
569 | } |
---|
570 | |
---|
571 | string = __stringVal( aString ) + (( __intVal(index1) - 1 ) * __bytesPerCharacter); |
---|
572 | len = __intVal(index2) - __intVal(index1) + 1; |
---|
573 | |
---|
574 | if (clipR != nil) { |
---|
575 | clipRX.x = __intVal(clipX); |
---|
576 | clipRX.y = __intVal(clipY); |
---|
577 | clipRX.width = __intVal(clipW); |
---|
578 | clipRX.height = __intVal(clipH); |
---|
579 | XftDrawSetClipRectangles( XFT_DRAW( drawIdToUse ) , 0, 0, &clipRX, 1); |
---|
580 | } else { |
---|
581 | XftDrawSetClip( XFT_DRAW( drawIdToUse ) , 0); |
---|
582 | } |
---|
583 | |
---|
584 | if (opaque == true) { |
---|
585 | if (bgPixel != nil) { |
---|
586 | color.pixel = (unsigned long)__intVal(bgPixel); |
---|
587 | } |
---|
588 | // else { |
---|
589 | color.color.red = __intVal(bgR); |
---|
590 | color.color.green = __intVal(bgG); |
---|
591 | color.color.blue = __intVal(bgB); |
---|
592 | color.color.alpha = __intVal(bgA); |
---|
593 | // } |
---|
594 | switch (__bytesPerCharacter) { |
---|
595 | case 1: |
---|
596 | XftTextExtents8( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar8*)string, len, &extents); |
---|
597 | break; |
---|
598 | case 2: |
---|
599 | XftTextExtents16( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar16*)string, len, &extents); |
---|
600 | break; |
---|
601 | case 4: |
---|
602 | XftTextExtents32( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar32*)string, len, &extents); |
---|
603 | break; |
---|
604 | } |
---|
605 | XftDrawRect( XFT_DRAW ( drawIdToUse ), &color, __intVal(drawX) - extents.x, __intVal(drawY) - XFT_FONT( __INST( fontId ) )->ascent, extents.width, XFT_FONT(__INST (fontId ) )->height); |
---|
606 | } |
---|
607 | if (fgPixel != nil) { |
---|
608 | color.pixel = (unsigned long)__intVal(fgPixel); |
---|
609 | } |
---|
610 | // else { |
---|
611 | color.color.red = __intVal(fgR); |
---|
612 | color.color.green = __intVal(fgG); |
---|
613 | color.color.blue = __intVal(fgB); |
---|
614 | color.color.alpha = __intVal(fgA); |
---|
615 | // } |
---|
616 | switch (__bytesPerCharacter) { |
---|
617 | case 1: |
---|
618 | XftDrawString8( XFT_DRAW ( drawIdToUse ), &color, XFT_FONT( __INST( fontId ) ), |
---|
619 | __intVal(drawX), |
---|
620 | __intVal(drawY), |
---|
621 | (FcChar8*)string, |
---|
622 | len); |
---|
623 | RETURN ( self ); |
---|
624 | break; |
---|
625 | case 2: |
---|
626 | XftDrawString16( XFT_DRAW ( drawIdToUse ), &color, XFT_FONT( __INST( fontId ) ), |
---|
627 | __intVal(drawX), |
---|
628 | __intVal(drawY), |
---|
629 | (FcChar16*)string, |
---|
630 | len); |
---|
631 | RETURN ( self ); |
---|
632 | break; |
---|
633 | case 4: |
---|
634 | XftDrawString32( XFT_DRAW ( drawIdToUse ), &color, XFT_FONT( __INST( fontId ) ), |
---|
635 | __intVal(drawX), |
---|
636 | __intVal(drawY), |
---|
637 | (FcChar32*)string, |
---|
638 | len); |
---|
639 | RETURN ( self ); |
---|
640 | break; |
---|
641 | } |
---|
642 | err:; |
---|
643 | #endif |
---|
644 | %}. |
---|
645 | self primitiveFailed: error. |
---|
646 | |
---|
647 | "Created: / 21-12-2013 / 21:11:07 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
648 | "Modified: / 01-04-2014 / 15:40:50 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
649 | ! ! |
---|
650 | |
---|
651 | !XftFontDescription methodsFor:'error reporting'! |
---|
652 | |
---|
653 | primitiveFailed |
---|
654 | <resource: #skipInDebuggersWalkBack> |
---|
655 | %{ |
---|
656 | #ifndef XFT |
---|
657 | %}. |
---|
658 | super primitiveFailed:'Xft support is not configured'. |
---|
659 | %{ |
---|
660 | #endif |
---|
661 | %}. |
---|
662 | super primitiveFailed |
---|
663 | ! |
---|
664 | |
---|
665 | primitiveFailed:errorString |
---|
666 | <resource: #skipInDebuggersWalkBack> |
---|
667 | %{ |
---|
668 | #ifndef XFT |
---|
669 | %}. |
---|
670 | super primitiveFailed:'Xft support is not configured'. |
---|
671 | %{ |
---|
672 | #endif |
---|
673 | %}. |
---|
674 | super primitiveFailed:errorString |
---|
675 | ! ! |
---|
676 | |
---|
677 | !XftFontDescription methodsFor:'getting a device font'! |
---|
678 | |
---|
679 | onDevice:aGraphicsDevice |
---|
680 | "Create a new XftFont representing the closes font as |
---|
681 | myself on aDevice; if one already exists, return the one." |
---|
682 | |
---|
683 | | myPatternId closestPatternId1 closestPatternId2 newFontId | |
---|
684 | |
---|
685 | "if I am already assigned to that device ..." |
---|
686 | (device == aGraphicsDevice) ifTrue:[^ self]. |
---|
687 | |
---|
688 | (aGraphicsDevice isNil and:[device notNil]) ifTrue:[ |
---|
689 | ^ self |
---|
690 | ]. |
---|
691 | |
---|
692 | (closestFont notNil and:[closestFont graphicsDevice == aGraphicsDevice]) ifTrue:[ |
---|
693 | ^ closestFont onDevice: aGraphicsDevice. |
---|
694 | ]. |
---|
695 | |
---|
696 | aGraphicsDevice deviceFonts do:[:aFont | |
---|
697 | ((aFont class == self class) and:[self sameDeviceFontAs:aFont]) ifTrue:[ |
---|
698 | ^ aFont |
---|
699 | ]. |
---|
700 | ]. |
---|
701 | |
---|
702 | [ |
---|
703 | myPatternId := self xftPatternCreate. |
---|
704 | self xftPatternAdd: myPatternId attribute: FC_FAMILY value: family. |
---|
705 | pixelSize notNil ifTrue:[ |
---|
706 | self xftPatternAdd: myPatternId attribute: FC_PIXEL_SIZE value: pixelSize. |
---|
707 | ] ifFalse:[ |
---|
708 | self xftPatternAdd: myPatternId attribute: FC_SIZE value: size. |
---|
709 | ]. |
---|
710 | self xftPatternAdd: myPatternId attribute: FC_WEIGHT value: (StXFace2FCWeightMap at: (face ? 'regular')). |
---|
711 | self xftPatternAdd: myPatternId attribute: FC_SLANT value: (StXStyle2FCSlantMap at: (style ? 'roman') ifAbsent:[StXStyle2FCSlantMap at: (style ? 'roman') asLowercase]). |
---|
712 | |
---|
713 | newFontId := self xftFontOpenPattern: aGraphicsDevice displayId pattern: myPatternId. |
---|
714 | newFontId notNil ifTrue:[ |
---|
715 | "/ Good, this font exists!! |
---|
716 | fontId := newFontId. |
---|
717 | device := aGraphicsDevice. |
---|
718 | aGraphicsDevice registerFont:self. |
---|
719 | ^ self. |
---|
720 | ] ifFalse:[ |
---|
721 | closestPatternId1 := self xftFontMatch: aGraphicsDevice displayId screen: aGraphicsDevice screen pattern: myPatternId. |
---|
722 | closestPatternId1 isNil ifTrue:[ |
---|
723 | self error: 'No font matches'. |
---|
724 | ]. |
---|
725 | " |
---|
726 | self xftPatternGet: closestPatternId attribute: 'family' index: 0. |
---|
727 | self xftPatternGet: closestPatternId attribute: 'size' index: 0. |
---|
728 | " |
---|
729 | closestPatternId2 := self xftPatternDuplicate: closestPatternId1. |
---|
730 | newFontId := self xftFontOpenPattern: aGraphicsDevice displayId pattern: closestPatternId1. |
---|
731 | "/ !!!!!!!! closestPatternId is no longer valid !!!!!!!! |
---|
732 | closestPatternId1 := nil. |
---|
733 | newFontId isNil ifTrue:[ |
---|
734 | self error: 'Pattern matched, but font could not be opened (should not happen)'. |
---|
735 | ]. |
---|
736 | "/ Search for existing registered font. Note, that XftFont instances |
---|
737 | "/ are shared (and refcounted) so newFontId = aFont getFontId is enough |
---|
738 | "/ to check whether some other font instance represents the same font... |
---|
739 | aGraphicsDevice deviceFonts do:[:aFont | |
---|
740 | ((self class == aFont class) and:[newFontId = aFont getFontId]) ifTrue:[ |
---|
741 | closestFont := aFont. |
---|
742 | ^ closestFont |
---|
743 | ]. |
---|
744 | ]. |
---|
745 | |
---|
746 | closestFont := self shallowCopy |
---|
747 | setDevice: aGraphicsDevice patternId: closestPatternId2 fontId: newFontId; |
---|
748 | yourself. |
---|
749 | aGraphicsDevice registerFont: closestFont. |
---|
750 | ^ closestFont |
---|
751 | ]. |
---|
752 | ] ensure:[ |
---|
753 | self xftPatternDestroy: myPatternId. |
---|
754 | self xftPatternDestroy: closestPatternId1. |
---|
755 | self xftPatternDestroy: closestPatternId2. |
---|
756 | ]. |
---|
757 | |
---|
758 | " |
---|
759 | (XftFontDescription family:'monospace' size:16) onDevice:Screen current |
---|
760 | " |
---|
761 | |
---|
762 | "Modified: / 14-04-1997 / 18:22:31 / cg" |
---|
763 | "Modified: / 02-01-2014 / 23:43:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
764 | ! |
---|
765 | |
---|
766 | onDevice:aWorkstation ifAbsent:aBlock |
---|
767 | "Create a new XftFont representing the same font as |
---|
768 | myself on aWorkstation. This does NOT try to look for existing |
---|
769 | or replacement fonts (i.e. can be used to get physical fonts)." |
---|
770 | |
---|
771 | "/ Apparently, this is not needed. |
---|
772 | self shouldImplement |
---|
773 | |
---|
774 | "Modified: / 02-01-2014 / 23:15:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
775 | "Modified (comment): / 04-01-2014 / 02:06:22 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
776 | ! ! |
---|
777 | |
---|
778 | !XftFontDescription methodsFor:'initialization'! |
---|
779 | |
---|
780 | setDevice: deviceArg patternId: patternIdArg fontId: fontIdArg |
---|
781 | device := deviceArg. |
---|
782 | fontId := fontIdArg. |
---|
783 | patternIdArg notNil ifTrue:[ |
---|
784 | family := self xftPatternGet: patternIdArg attribute: FC_FAMILY index: 0. |
---|
785 | size := self xftPatternGet: patternIdArg attribute: FC_SIZE index: 0. |
---|
786 | face := self xftPatternGet: patternIdArg attribute: FC_WEIGHT index: 0. |
---|
787 | face := StXFace2FCWeightMap keyAtValue: face. |
---|
788 | style := self xftPatternGet: patternIdArg attribute: FC_SLANT index: 0. |
---|
789 | style := StXStyle2FCSlantMap keyAtValue: style. |
---|
790 | |
---|
791 | name:= self xftPatternGet: patternIdArg attribute: 'fullname' index: 0. |
---|
792 | |
---|
793 | encoding:= self xftPatternGet: patternIdArg attribute: 'encoding' index: 0. |
---|
794 | ]. |
---|
795 | |
---|
796 | "Created: / 21-12-2013 / 00:46:10 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
797 | "Modified: / 30-12-2013 / 12:49:58 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
798 | ! ! |
---|
799 | |
---|
800 | !XftFontDescription methodsFor:'primitives'! |
---|
801 | |
---|
802 | xftAvailable |
---|
803 | %{ |
---|
804 | #ifdef XFT |
---|
805 | RETURN ( true ) |
---|
806 | #endif |
---|
807 | %}. |
---|
808 | ^ false |
---|
809 | |
---|
810 | "Created: / 20-12-2013 / 21:10:25 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
811 | ! |
---|
812 | |
---|
813 | xftDrawChange: xftDrawId drawable: drawableId |
---|
814 | | error | |
---|
815 | |
---|
816 | %{ |
---|
817 | #ifdef XFT |
---|
818 | if ( ! __isExternalAddressLike(xftDrawId) ) { |
---|
819 | error = @symbol(BadArg1); |
---|
820 | goto err; |
---|
821 | } |
---|
822 | if ( ! __isExternalAddressLike(drawableId) ) { |
---|
823 | error = @symbol(BadArg2); |
---|
824 | goto err; |
---|
825 | } |
---|
826 | if (XftDrawDrawable( XFT_DRAW(xftDrawId) ) != DRAWABLE( drawableId ) ) { |
---|
827 | XftDrawChange( XFT_DRAW(xftDrawId) , DRAWABLE( drawableId ) ); |
---|
828 | } |
---|
829 | RETURN ( self ); |
---|
830 | err:; |
---|
831 | #endif |
---|
832 | %}. |
---|
833 | self primitiveFailed: error |
---|
834 | |
---|
835 | "Created: / 26-12-2013 / 12:17:36 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
836 | ! |
---|
837 | |
---|
838 | xftDrawCreate: displayId screen: screen drawable: drawableId |
---|
839 | | error | |
---|
840 | |
---|
841 | %{ |
---|
842 | #ifdef XFT |
---|
843 | if ( ! __isExternalAddressLike(displayId) ) { |
---|
844 | error = @symbol(BadArg1); |
---|
845 | goto err; |
---|
846 | } |
---|
847 | if ( ! __isSmallInteger(screen) ) { |
---|
848 | error = @symbol(BadArg2); |
---|
849 | goto err; |
---|
850 | } |
---|
851 | if ( ! __isExternalAddressLike(drawableId) ) { |
---|
852 | error = @symbol(BadArg3); |
---|
853 | goto err; |
---|
854 | } |
---|
855 | RETURN ( XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) , |
---|
856 | DRAWABLE( drawableId ) , |
---|
857 | DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) , |
---|
858 | DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) ) ); |
---|
859 | err:; |
---|
860 | #endif |
---|
861 | %}. |
---|
862 | self primitiveFailed: error |
---|
863 | |
---|
864 | "Created: / 21-12-2013 / 21:12:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
865 | ! |
---|
866 | |
---|
867 | xftDrawRect: drawIdArg color: aColor x: x y: y width: w height: h |
---|
868 | | error r g b a pix | |
---|
869 | |
---|
870 | aColor isColor ifFalse:[^self primitiveFailed: #BadArg2]. |
---|
871 | |
---|
872 | r := aColor scaledRed. |
---|
873 | g := aColor scaledGreen. |
---|
874 | b := aColor scaledBlue. |
---|
875 | a := aColor alpha * 65535. |
---|
876 | r isNil ifTrue:[ |
---|
877 | "/ when drawing into a pixmap... |
---|
878 | aColor colorId == 0 ifTrue:[ |
---|
879 | r := g := b := 0. |
---|
880 | ] ifFalse:[ |
---|
881 | r := g := b := 16rFFFF. |
---|
882 | ] |
---|
883 | ]. |
---|
884 | pix := aColor colorId. |
---|
885 | %{ |
---|
886 | #ifdef XFT |
---|
887 | XftColor clr; |
---|
888 | if ( ! __isExternalAddressLike(drawIdArg) ) { |
---|
889 | error = @symbol(BadArg1); |
---|
890 | goto err; |
---|
891 | } |
---|
892 | if ( ! __isSmallInteger(pix) ) { |
---|
893 | error = @symbol(BadColorId); |
---|
894 | goto err; |
---|
895 | } |
---|
896 | if ( ! __isSmallInteger(x) ) { |
---|
897 | error = @symbol(BadArg3); |
---|
898 | goto err; |
---|
899 | } |
---|
900 | if ( ! __isSmallInteger(y) ) { |
---|
901 | error = @symbol(BadArg4); |
---|
902 | goto err; |
---|
903 | } |
---|
904 | if ( ! __isSmallInteger(w) ) { |
---|
905 | error = @symbol(BadArg5); |
---|
906 | goto err; |
---|
907 | } |
---|
908 | if ( ! __isSmallInteger(h) ) { |
---|
909 | error = @symbol(BadArg6); |
---|
910 | goto err; |
---|
911 | } |
---|
912 | clr.pixel = (unsigned long)__intVal(pix); |
---|
913 | clr.color.red = __intVal(r); |
---|
914 | clr.color.green = __intVal(g); |
---|
915 | clr.color.blue = __intVal(b); |
---|
916 | clr.color.alpha = __intVal(a); |
---|
917 | |
---|
918 | XftDrawRect(XFT_DRAW(drawIdArg), &clr, |
---|
919 | __intVal(x), __intVal(y), __intVal(w) ,__intVal(h)); |
---|
920 | |
---|
921 | RETURN ( self ); |
---|
922 | err:; |
---|
923 | #endif |
---|
924 | %}. |
---|
925 | self primitiveFailed: error. |
---|
926 | |
---|
927 | "Created: / 28-12-2013 / 23:35:42 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
928 | "Modified: / 31-12-2013 / 00:37:41 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
929 | ! |
---|
930 | |
---|
931 | xftDrawSetClip: drawIdArg rectangle: rect |
---|
932 | | error xObj yObj wObj hObj | |
---|
933 | |
---|
934 | rect notNil ifTrue:[ |
---|
935 | xObj := rect left. |
---|
936 | yObj := rect top. |
---|
937 | wObj := rect width. |
---|
938 | hObj := rect height. |
---|
939 | ]. |
---|
940 | %{ |
---|
941 | #ifdef XFT |
---|
942 | XRectangle r; |
---|
943 | if ( ! __isExternalAddressLike(drawIdArg) ) { |
---|
944 | error = @symbol(BadArg1); |
---|
945 | goto err; |
---|
946 | } |
---|
947 | if (rect != nil) { |
---|
948 | r.x = __intVal(xObj); |
---|
949 | r.y = __intVal(yObj); |
---|
950 | r.width = __intVal(wObj); |
---|
951 | r.height = __intVal(hObj); |
---|
952 | XftDrawSetClipRectangles( XFT_DRAW(drawIdArg) , 0, 0, &r, 1); |
---|
953 | } else { |
---|
954 | XftDrawSetClipRectangles( XFT_DRAW(drawIdArg) , 0, 0, (XRectangle*)NULL, 0); |
---|
955 | } |
---|
956 | RETURN ( self ); |
---|
957 | err:; |
---|
958 | #endif |
---|
959 | %}. |
---|
960 | self primitiveFailed: error. |
---|
961 | |
---|
962 | "Created: / 31-12-2013 / 01:24:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
963 | ! |
---|
964 | |
---|
965 | xftDrawString: drawIdArg color: aColor font: fontIdArg x: x y: y string: text from: start to: stop |
---|
966 | | error r g b a pix | |
---|
967 | |
---|
968 | aColor isColor ifFalse:[^self primitiveFailed: #BadArg2]. |
---|
969 | |
---|
970 | r := aColor scaledRed. |
---|
971 | g := aColor scaledGreen. |
---|
972 | b := aColor scaledBlue. |
---|
973 | a := aColor alpha * 65535. |
---|
974 | r isNil ifTrue:[ |
---|
975 | "/ when drawing into a pixmap... |
---|
976 | aColor colorId == 0 ifTrue:[ |
---|
977 | r := g := b := 0. |
---|
978 | ] ifFalse:[ |
---|
979 | r := g := b := 16rFFFF. |
---|
980 | ] |
---|
981 | ]. |
---|
982 | pix := aColor colorId. |
---|
983 | %{ |
---|
984 | #ifdef XFT |
---|
985 | int _start, _stop; |
---|
986 | int _x, _y; |
---|
987 | XftColor clr; |
---|
988 | if ( ! __isExternalAddressLike(drawIdArg) ) { |
---|
989 | error = @symbol(BadArg1); |
---|
990 | goto err; |
---|
991 | } |
---|
992 | if ( ! __isSmallInteger(pix) ) { |
---|
993 | error = @symbol(BadColorId); |
---|
994 | goto err; |
---|
995 | } |
---|
996 | if ( ! __isSmallInteger(x) ) { |
---|
997 | error = @symbol(BadArg4); |
---|
998 | goto err; |
---|
999 | } |
---|
1000 | _x = __intVal(x); |
---|
1001 | if ( ! __isSmallInteger(y) ) { |
---|
1002 | error = @symbol(BadArg5); |
---|
1003 | goto err; |
---|
1004 | } |
---|
1005 | _y = __intVal(y); |
---|
1006 | |
---|
1007 | |
---|
1008 | if ( ! __isSmallInteger(start) ) { |
---|
1009 | error = @symbol(BadArg6); |
---|
1010 | goto err; |
---|
1011 | } |
---|
1012 | _start = __intVal(start); |
---|
1013 | if ( ! __isSmallInteger(stop) ) { |
---|
1014 | error = @symbol(BadArg7); |
---|
1015 | goto err; |
---|
1016 | } |
---|
1017 | _stop = __intVal(stop); |
---|
1018 | |
---|
1019 | clr.pixel = (unsigned long)__intVal(pix); |
---|
1020 | clr.color.red = __intVal(r); |
---|
1021 | clr.color.green = __intVal(g); |
---|
1022 | clr.color.blue = __intVal(b); |
---|
1023 | clr.color.alpha = __intVal(a); |
---|
1024 | |
---|
1025 | if ( __isStringLike(text) ) { |
---|
1026 | XftDrawString8(XFT_DRAW(drawIdArg), &clr, XFT_FONT(fontIdArg), |
---|
1027 | _x, _y, |
---|
1028 | __stringVal(text) + (_start - 1), _stop - _start + 1); |
---|
1029 | RETURN ( self ); |
---|
1030 | } else { |
---|
1031 | error = @symbol(BadArg5); |
---|
1032 | goto err; |
---|
1033 | } |
---|
1034 | err:; |
---|
1035 | #endif |
---|
1036 | %}. |
---|
1037 | self primitiveFailed: error. |
---|
1038 | |
---|
1039 | "Created: / 28-12-2013 / 12:32:18 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1040 | "Modified: / 30-12-2013 / 20:00:49 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1041 | ! |
---|
1042 | |
---|
1043 | xftFontGetAscent: fontIdArg |
---|
1044 | | error | |
---|
1045 | |
---|
1046 | %{ |
---|
1047 | #ifdef XFT |
---|
1048 | int v; |
---|
1049 | if ( ! __isExternalAddressLike(fontIdArg) ) { |
---|
1050 | error = @symbol(BadArg1); |
---|
1051 | goto err; |
---|
1052 | } |
---|
1053 | v = XFT_FONT(fontIdArg)->ascent; |
---|
1054 | RETURN ( __MKINT( v ) ); |
---|
1055 | err:; |
---|
1056 | #endif |
---|
1057 | %}. |
---|
1058 | self primitiveFailed: error |
---|
1059 | |
---|
1060 | "Created: / 21-12-2013 / 00:56:13 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1061 | ! |
---|
1062 | |
---|
1063 | xftFontGetDescent:fontIdArg |
---|
1064 | | error | |
---|
1065 | |
---|
1066 | %{ |
---|
1067 | #ifdef XFT |
---|
1068 | int v; |
---|
1069 | if ( ! __isExternalAddressLike(fontIdArg) ) { |
---|
1070 | error = @symbol(BadArg1); |
---|
1071 | goto err; |
---|
1072 | } |
---|
1073 | v = XFT_FONT(fontIdArg)->descent; |
---|
1074 | RETURN ( __MKINT( v ) ); |
---|
1075 | err:; |
---|
1076 | #endif |
---|
1077 | %}. |
---|
1078 | self primitiveFailed: error |
---|
1079 | |
---|
1080 | "Created: / 21-12-2013 / 00:56:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1081 | ! |
---|
1082 | |
---|
1083 | xftFontGetHeight: fontIdArg |
---|
1084 | | error | |
---|
1085 | |
---|
1086 | %{ |
---|
1087 | #ifdef XFT |
---|
1088 | int v; |
---|
1089 | if ( ! __isExternalAddressLike(fontIdArg) ) { |
---|
1090 | error = @symbol(BadArg1); |
---|
1091 | goto err; |
---|
1092 | } |
---|
1093 | v = XFT_FONT(fontIdArg)->height; |
---|
1094 | RETURN ( __MKINT( v ) ); |
---|
1095 | err:; |
---|
1096 | #endif |
---|
1097 | %}. |
---|
1098 | self primitiveFailed: error |
---|
1099 | |
---|
1100 | "Created: / 21-12-2013 / 00:56:32 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1101 | ! |
---|
1102 | |
---|
1103 | xftFontGetMaxAdvanceWidth: fontIdArg |
---|
1104 | | error | |
---|
1105 | |
---|
1106 | %{ |
---|
1107 | #ifdef XFT |
---|
1108 | int v; |
---|
1109 | if ( ! __isExternalAddressLike(fontIdArg) ) { |
---|
1110 | error = @symbol(BadArg1); |
---|
1111 | goto err; |
---|
1112 | } |
---|
1113 | v = XFT_FONT(fontIdArg)->max_advance_width; |
---|
1114 | RETURN ( __MKINT( v ) ); |
---|
1115 | err:; |
---|
1116 | #endif |
---|
1117 | %}. |
---|
1118 | self primitiveFailed: error |
---|
1119 | |
---|
1120 | "Created: / 30-12-2013 / 20:02:20 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1121 | ! |
---|
1122 | |
---|
1123 | xftFontGetPattern: fontIdArg |
---|
1124 | | error | |
---|
1125 | |
---|
1126 | %{ |
---|
1127 | #ifdef XFT |
---|
1128 | XftPattern* p; |
---|
1129 | if ( ! __isExternalAddressLike(fontIdArg) ) { |
---|
1130 | error = @symbol(BadArg1); |
---|
1131 | goto err; |
---|
1132 | } |
---|
1133 | p = XFT_FONT(fontIdArg)->pattern; |
---|
1134 | if (p == NULL) { |
---|
1135 | RETURN ( nil ); |
---|
1136 | } else { |
---|
1137 | RETURN ( FC_PATTERN_HANDLE_NEW ( p ) ); |
---|
1138 | } |
---|
1139 | err:; |
---|
1140 | #endif |
---|
1141 | %}. |
---|
1142 | self primitiveFailed: error |
---|
1143 | |
---|
1144 | "Created: / 21-12-2013 / 00:55:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1145 | ! |
---|
1146 | |
---|
1147 | xftFontMatch: displayId screen: screen pattern: patternId |
---|
1148 | | error | |
---|
1149 | |
---|
1150 | %{ |
---|
1151 | #ifdef XFT |
---|
1152 | XftPattern* p; |
---|
1153 | XftResult r; |
---|
1154 | |
---|
1155 | if ( ! __isExternalAddressLike(displayId) ) { |
---|
1156 | error = @symbol(BadArg1); |
---|
1157 | goto err; |
---|
1158 | } |
---|
1159 | if ( ! __isSmallInteger( screen ) ) { |
---|
1160 | error = @symbol(BadArg2); |
---|
1161 | goto err; |
---|
1162 | } |
---|
1163 | if ( ! __isExternalAddressLike(patternId) ) { |
---|
1164 | error = @symbol(BadArg3); |
---|
1165 | goto err; |
---|
1166 | } |
---|
1167 | |
---|
1168 | XftConfigSubstitute(FC_PATTERN( patternId )); |
---|
1169 | XftDefaultSubstitute(DISPLAY(displayId) , SCREEN( screen ), FC_PATTERN( patternId )); |
---|
1170 | p = XftFontMatch( DISPLAY(displayId) , SCREEN( screen ), FC_PATTERN( patternId ), &r ); |
---|
1171 | if (p) { |
---|
1172 | RETURN ( FC_PATTERN_HANDLE_NEW ( p ) ); |
---|
1173 | } else { |
---|
1174 | error = @symbol(XftFontMatchReturnedNull); |
---|
1175 | } |
---|
1176 | err:; |
---|
1177 | #endif |
---|
1178 | %}. |
---|
1179 | self primitiveFailed: error |
---|
1180 | |
---|
1181 | "Created: / 21-12-2013 / 00:08:48 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1182 | ! |
---|
1183 | |
---|
1184 | xftFontOpenPattern: displayId pattern: patternId |
---|
1185 | | error | |
---|
1186 | |
---|
1187 | %{ |
---|
1188 | #ifdef XFT |
---|
1189 | XftFont* f; |
---|
1190 | if ( ! __isExternalAddressLike(displayId) ) { |
---|
1191 | error = @symbol(BadArg1); |
---|
1192 | goto err; |
---|
1193 | } |
---|
1194 | if ( ! __isExternalAddressLike(patternId) ) { |
---|
1195 | error = @symbol(BadArg2); |
---|
1196 | goto err; |
---|
1197 | } |
---|
1198 | |
---|
1199 | f = XftFontOpenPattern( DISPLAY(displayId) , FC_PATTERN( patternId ) ); |
---|
1200 | if (f == NULL) { |
---|
1201 | RETURN ( nil ); |
---|
1202 | } else { |
---|
1203 | RETURN ( XFT_FONT_HANDLE_NEW ( f ) ); |
---|
1204 | } |
---|
1205 | err:; |
---|
1206 | #endif |
---|
1207 | %}. |
---|
1208 | self primitiveFailed: error |
---|
1209 | |
---|
1210 | "Created: / 20-12-2013 / 23:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1211 | ! |
---|
1212 | |
---|
1213 | xftPatternAdd: pattern attribute: attribute value: value |
---|
1214 | "Add a value to the specified pattern element after existing values" |
---|
1215 | |
---|
1216 | ^ self xftPatternAdd: pattern attribute: attribute value: value append: true. |
---|
1217 | |
---|
1218 | "Created: / 20-12-2013 / 23:43:31 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1219 | ! |
---|
1220 | |
---|
1221 | xftPatternAdd: pattern attribute: attribute value: value append: append |
---|
1222 | "Add a value to the specified pattern element. If 'append' is true, the value |
---|
1223 | is added after existing values, otherwise it is added before them." |
---|
1224 | |
---|
1225 | | error | |
---|
1226 | |
---|
1227 | %{ |
---|
1228 | #ifdef XFT |
---|
1229 | XftValue v; |
---|
1230 | Bool b; |
---|
1231 | |
---|
1232 | if ( ! __isExternalAddressLike ( pattern ) ) { |
---|
1233 | error = @symbol(BadArg1); |
---|
1234 | goto err; |
---|
1235 | } |
---|
1236 | if ( ! __isStringLike ( attribute ) ) { |
---|
1237 | error = @symbol(BadArg2); |
---|
1238 | goto err; |
---|
1239 | } |
---|
1240 | if ( append != true && append != false ) { |
---|
1241 | error = @symbol(BadArg4); |
---|
1242 | goto err; |
---|
1243 | } |
---|
1244 | if ( __isStringLike ( value ) ) { |
---|
1245 | v.type = FcTypeString; |
---|
1246 | /* Passing pointer inside Smalltalk should be safe, |
---|
1247 | * Xft/FontConfig libraries seem to allocate and store |
---|
1248 | * a __copy__ of the string (if I understood the code correctly) |
---|
1249 | */ |
---|
1250 | v.u.s = __stringVal( value); |
---|
1251 | } else if ( __isSmallInteger( value ) ) { |
---|
1252 | v.type = XftTypeInteger; |
---|
1253 | v.u.i = (int)__intVal( value ); |
---|
1254 | } else if ( value == true || value == false ) { |
---|
1255 | v.type = XftTypeBool; |
---|
1256 | v.u.b = value == true ? True : False; |
---|
1257 | } else if ( __isFloat ( value ) ) { |
---|
1258 | v.type = XftTypeDouble; |
---|
1259 | v.u.d = __floatVal( value ); |
---|
1260 | } else if ( value == nil ) { |
---|
1261 | v.type = XftTypeVoid; |
---|
1262 | v.u.f = NULL; |
---|
1263 | } else { |
---|
1264 | error = @symbol(BadArg3); |
---|
1265 | goto err; |
---|
1266 | } |
---|
1267 | b = XftPatternAdd( FC_PATTERN(pattern), __stringVal(attribute), v, append == true ? True : False ); |
---|
1268 | RETURN ( b == True ? true : false ); |
---|
1269 | |
---|
1270 | err:; |
---|
1271 | #endif |
---|
1272 | %}. |
---|
1273 | self primitiveFailed: error |
---|
1274 | |
---|
1275 | "Created: / 20-12-2013 / 21:50:00 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1276 | ! |
---|
1277 | |
---|
1278 | xftPatternCreate |
---|
1279 | %{ |
---|
1280 | #ifdef XFT |
---|
1281 | RETURN ( FC_PATTERN_HANDLE_NEW ( XftPatternCreate() ) ); |
---|
1282 | #endif |
---|
1283 | %}. |
---|
1284 | self primitiveFailed. |
---|
1285 | |
---|
1286 | "Created: / 20-12-2013 / 21:19:00 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1287 | ! |
---|
1288 | |
---|
1289 | xftPatternDel: pattern attribute: attribute |
---|
1290 | | error | |
---|
1291 | %{ |
---|
1292 | #ifdef XFT |
---|
1293 | if ( ! __isExternalAddressLike ( pattern ) ) { |
---|
1294 | error = @symbol(BadArg1); |
---|
1295 | goto err; |
---|
1296 | } |
---|
1297 | if ( ! __isStringLike ( attribute ) ) { |
---|
1298 | error = @symbol(BadArg2); |
---|
1299 | goto err; |
---|
1300 | } |
---|
1301 | XftPatternDel( FC_PATTERN(pattern), __stringVal ( attribute ) ); |
---|
1302 | RETURN ( self ); |
---|
1303 | |
---|
1304 | err:; |
---|
1305 | #endif |
---|
1306 | %}. |
---|
1307 | self primitiveFailed: error |
---|
1308 | |
---|
1309 | "Created: / 20-12-2013 / 21:33:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1310 | ! |
---|
1311 | |
---|
1312 | xftPatternDestroy: addr |
---|
1313 | | error | |
---|
1314 | |
---|
1315 | addr isNil ifTrue:[ ^ self ]. |
---|
1316 | |
---|
1317 | %{ |
---|
1318 | #ifdef XFT |
---|
1319 | if ( ! __isExternalAddressLike(addr) ) { |
---|
1320 | error = @symbol(BadArg1); |
---|
1321 | goto err; |
---|
1322 | } |
---|
1323 | XftPatternDestroy( FC_PATTERN(addr) ); |
---|
1324 | RETURN ( self ); |
---|
1325 | |
---|
1326 | err:; |
---|
1327 | #endif |
---|
1328 | %}. |
---|
1329 | self primitiveFailed: error |
---|
1330 | |
---|
1331 | "Created: / 20-12-2013 / 21:33:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1332 | "Modified: / 20-12-2013 / 23:48:45 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1333 | ! |
---|
1334 | |
---|
1335 | xftPatternDuplicate: addr |
---|
1336 | | error | |
---|
1337 | |
---|
1338 | addr isNil ifTrue:[ ^ self ]. |
---|
1339 | |
---|
1340 | %{ |
---|
1341 | #ifdef XFT |
---|
1342 | if ( ! __isExternalAddressLike(addr) ) { |
---|
1343 | error = @symbol(BadArg1); |
---|
1344 | goto err; |
---|
1345 | } |
---|
1346 | RETURN ( FC_PATTERN_HANDLE_NEW ( XftPatternDuplicate( FC_PATTERN(addr) ) ) ); |
---|
1347 | err:; |
---|
1348 | #endif |
---|
1349 | %}. |
---|
1350 | self primitiveFailed: error |
---|
1351 | |
---|
1352 | "Created: / 21-12-2013 / 01:14:03 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1353 | ! |
---|
1354 | |
---|
1355 | xftPatternGet: pattern attribute: attribute index: index |
---|
1356 | "Return a value from the specified element -- multiple values can be indexed |
---|
1357 | with 'index' starting at zero." |
---|
1358 | |
---|
1359 | | error | |
---|
1360 | |
---|
1361 | %{ |
---|
1362 | #ifdef XFT |
---|
1363 | XftValue v; |
---|
1364 | XftResult r; |
---|
1365 | |
---|
1366 | if ( ! __isExternalAddressLike ( pattern ) ) { |
---|
1367 | error = @symbol(BadArg1); |
---|
1368 | goto err; |
---|
1369 | } |
---|
1370 | if ( ! __isStringLike ( attribute ) ) { |
---|
1371 | error = @symbol(BadArg2); |
---|
1372 | goto err; |
---|
1373 | } |
---|
1374 | if ( ! __isSmallInteger( index ) ) { |
---|
1375 | error = @symbol(BadArg3); |
---|
1376 | goto err; |
---|
1377 | } |
---|
1378 | r = XftPatternGet(FC_PATTERN(pattern), __stringVal( attribute ), __intVal( index ), &v); |
---|
1379 | if ( r != XftResultMatch) { |
---|
1380 | RETURN ( nil ); |
---|
1381 | } |
---|
1382 | if ( v.type == XftTypeString) { |
---|
1383 | RETURN ( __MKSTRING(v.u.s) ); |
---|
1384 | } else if ( v.type == XftTypeInteger ) { |
---|
1385 | RETURN ( __MKINT (v.u.i) ); |
---|
1386 | } else if ( v.type == XftTypeBool ) { |
---|
1387 | RETURN ( v.u.b == True ? true : false ); |
---|
1388 | } else if ( v.type == XftTypeDouble ) { |
---|
1389 | RETURN ( __MKFLOAT (v.u.d) ); |
---|
1390 | } else if ( v.type == XftTypeVoid ) { |
---|
1391 | RETURN ( nil ); |
---|
1392 | } else { |
---|
1393 | error = @symbol(UnssuportedTypeValue); |
---|
1394 | goto err; |
---|
1395 | } |
---|
1396 | err:; |
---|
1397 | #endif |
---|
1398 | %}. |
---|
1399 | self primitiveFailed: error |
---|
1400 | |
---|
1401 | "Created: / 20-12-2013 / 21:50:44 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1402 | "Modified: / 21-12-2013 / 01:06:25 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1403 | ! |
---|
1404 | |
---|
1405 | xftTextExtents: displayIdArg font: fontIdArg string: text from: start to: stop |
---|
1406 | | error extents bitsPerCharacter | |
---|
1407 | |
---|
1408 | extents := Array new: 6. |
---|
1409 | bitsPerCharacter := text bitsPerCharacter. |
---|
1410 | %{ |
---|
1411 | #ifdef XFT |
---|
1412 | XGlyphInfo info; |
---|
1413 | int bytesPerCharacter; |
---|
1414 | char *string; |
---|
1415 | int len; |
---|
1416 | |
---|
1417 | bytesPerCharacter = __intVal(bitsPerCharacter) / 8; |
---|
1418 | |
---|
1419 | if ( ! __isExternalAddressLike(displayIdArg) ) { |
---|
1420 | error = @symbol(BadArg1); |
---|
1421 | goto err; |
---|
1422 | } |
---|
1423 | if ( ! __isExternalAddressLike(fontIdArg) ) { |
---|
1424 | error = @symbol(BadArg2); |
---|
1425 | goto err; |
---|
1426 | } |
---|
1427 | if ( ! __isSmallInteger(start) ) { |
---|
1428 | error = @symbol(BadArg4); |
---|
1429 | goto err; |
---|
1430 | } |
---|
1431 | if ( ! __isSmallInteger(stop) ) { |
---|
1432 | error = @symbol(BadArg5); |
---|
1433 | goto err; |
---|
1434 | } |
---|
1435 | |
---|
1436 | string = __stringVal( text ) + (( __intVal(start) - 1 ) * bytesPerCharacter); |
---|
1437 | len = __intVal(stop) - __intVal(start) + 1; |
---|
1438 | |
---|
1439 | |
---|
1440 | switch (bytesPerCharacter) { |
---|
1441 | case 1: |
---|
1442 | XftTextExtents8(DISPLAY(displayIdArg), XFT_FONT(fontIdArg), (FcChar8*)string, len, &info); |
---|
1443 | break; |
---|
1444 | case 2: |
---|
1445 | XftTextExtents16(DISPLAY(displayIdArg), XFT_FONT(fontIdArg), (FcChar16*)string, len, &info); |
---|
1446 | break; |
---|
1447 | case 4: |
---|
1448 | XftTextExtents32(DISPLAY(displayIdArg), XFT_FONT(fontIdArg), (FcChar32*)string, len, &info); |
---|
1449 | break; |
---|
1450 | } |
---|
1451 | __ArrayInstPtr(extents)->a_element[0] = __MKSMALLINT(info.width); |
---|
1452 | __ArrayInstPtr(extents)->a_element[1] = __MKSMALLINT(info.height); |
---|
1453 | __ArrayInstPtr(extents)->a_element[2] = __MKSMALLINT(info.x); |
---|
1454 | __ArrayInstPtr(extents)->a_element[3] = __MKSMALLINT(info.y); |
---|
1455 | __ArrayInstPtr(extents)->a_element[4] = __MKSMALLINT(info.xOff); |
---|
1456 | __ArrayInstPtr(extents)->a_element[5] = __MKSMALLINT(info.yOff); |
---|
1457 | error = nil; |
---|
1458 | err:; |
---|
1459 | #endif |
---|
1460 | %}. |
---|
1461 | error notNil ifTrue:[ |
---|
1462 | self primitiveFailed: error. |
---|
1463 | ^ nil. |
---|
1464 | ]. |
---|
1465 | ^ extents |
---|
1466 | |
---|
1467 | "Created: / 21-12-2013 / 10:42:15 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1468 | "Modified: / 30-12-2013 / 20:00:30 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1469 | ! ! |
---|
1470 | |
---|
1471 | !XftFontDescription methodsFor:'printing & storing'! |
---|
1472 | |
---|
1473 | storeOn:aStream |
---|
1474 | "append a character sequence to the argument, aStream from which the |
---|
1475 | receiver can be reconstructed using readFrom:." |
---|
1476 | |
---|
1477 | aStream nextPutAll:'(XftFontDescription family:'. family storeOn:aStream. |
---|
1478 | aStream nextPutAll:' face:'. face storeOn:aStream. |
---|
1479 | aStream nextPutAll:' style:'. style storeOn:aStream. |
---|
1480 | aStream nextPutAll:' size:'. size storeOn:aStream. |
---|
1481 | aStream nextPutAll:' encoding:'. encoding storeOn:aStream. |
---|
1482 | aStream nextPut:$) |
---|
1483 | |
---|
1484 | " |
---|
1485 | (XftFontDescription family: 'DejaVu Sans' size: 8) storeString |
---|
1486 | " |
---|
1487 | ! ! |
---|
1488 | |
---|
1489 | !XftFontDescription methodsFor:'queries-dimensions'! |
---|
1490 | |
---|
1491 | ascent |
---|
1492 | "return the ascent - the number of pixels above the baseLine." |
---|
1493 | |
---|
1494 | ^ self xftFontGetAscent: fontId |
---|
1495 | |
---|
1496 | "Created: / 21-12-2013 / 01:19:46 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1497 | ! |
---|
1498 | |
---|
1499 | descent |
---|
1500 | "return the descent - the number of pixels below the baseLine." |
---|
1501 | |
---|
1502 | ^ self xftFontGetDescent: fontId |
---|
1503 | |
---|
1504 | "Created: / 21-12-2013 / 01:20:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1505 | ! |
---|
1506 | |
---|
1507 | getFontMetrics |
---|
1508 | |info| |
---|
1509 | |
---|
1510 | info := DeviceWorkstation::DeviceFontMetrics new. |
---|
1511 | info |
---|
1512 | ascent:self ascent |
---|
1513 | descent:self descent |
---|
1514 | maxAscent:self maxAscent |
---|
1515 | maxDescent:self maxDescent |
---|
1516 | minWidth:self maxWidth |
---|
1517 | maxWidth:self maxWidth |
---|
1518 | avgWidth:self maxWidth |
---|
1519 | minCode:self minCode |
---|
1520 | maxCode:self maxCode |
---|
1521 | direction:#LeftToRight. |
---|
1522 | ^ info |
---|
1523 | ! |
---|
1524 | |
---|
1525 | height |
---|
1526 | "return the height - the number of pixels above plus below the baseLine." |
---|
1527 | |
---|
1528 | ^ self xftFontGetHeight: fontId |
---|
1529 | |
---|
1530 | "Created: / 21-12-2013 / 01:20:21 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1531 | ! |
---|
1532 | |
---|
1533 | isFixedWidth |
---|
1534 | "return true, if this is a fixed pitch font (i.e. all characters |
---|
1535 | are of the same width)" |
---|
1536 | |
---|
1537 | ^ false "/ How to check? |
---|
1538 | |
---|
1539 | "Created: / 21-12-2013 / 10:38:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1540 | ! |
---|
1541 | |
---|
1542 | maxAscent |
---|
1543 | "return the fonts maximum-ascent (i.e. the maximum of all characters); |
---|
1544 | That is the number of units (usually pixels) above the baseline." |
---|
1545 | |
---|
1546 | ^ self ascent |
---|
1547 | |
---|
1548 | "Created: / 30-12-2013 / 20:01:01 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1549 | ! |
---|
1550 | |
---|
1551 | maxDescent |
---|
1552 | "return the fonts maximum-descent (i.e. the maximum of all characters); |
---|
1553 | That is the number of units (usually pixels) below the baseline." |
---|
1554 | |
---|
1555 | ^ self descent |
---|
1556 | |
---|
1557 | "Created: / 30-12-2013 / 20:01:08 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1558 | ! |
---|
1559 | |
---|
1560 | maxWidth |
---|
1561 | "return the fonts maximum-width character (i.e. the maximum of all characters); |
---|
1562 | That is a number of units (usually pixels)." |
---|
1563 | |
---|
1564 | ^ self xftFontGetMaxAdvanceWidth: fontId |
---|
1565 | |
---|
1566 | "Created: / 30-12-2013 / 20:02:48 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1567 | ! |
---|
1568 | |
---|
1569 | widthOf:aString from:start to:stop |
---|
1570 | "return the width of a sub string" |
---|
1571 | |
---|
1572 | | extents | |
---|
1573 | |
---|
1574 | (stop < start) ifTrue:[^ 0]. |
---|
1575 | extents := self xftTextExtents: device displayId font: fontId string: aString from: start to: stop. |
---|
1576 | "/ extents --> #(width height x y xOff yOff) |
---|
1577 | ^ extents fifth. |
---|
1578 | |
---|
1579 | "Created: / 21-12-2013 / 10:42:15 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1580 | "Modified: / 29-12-2013 / 21:16:50 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1581 | ! ! |
---|
1582 | |
---|
1583 | !XftFontDescription methodsFor:'release'! |
---|
1584 | |
---|
1585 | releaseDrawIfAssociatedWith: view |
---|
1586 | | drawableId | |
---|
1587 | |
---|
1588 | view isNil ifTrue:[ ^ self ]. |
---|
1589 | drawableId := view id. |
---|
1590 | drawableId isNil ifTrue: [ ^ self ]. |
---|
1591 | %{ |
---|
1592 | #ifdef XFT |
---|
1593 | if ( __INST(sharedDrawId) != nil ) { |
---|
1594 | if (XftDrawDrawable(XFT_DRAW(__INST(sharedDrawId))) == DRAWABLE(drawableId)) { |
---|
1595 | XftDrawDestroy(XFT_DRAW(__INST(sharedDrawId))); |
---|
1596 | __INST(sharedDrawId) = nil; |
---|
1597 | } |
---|
1598 | } |
---|
1599 | RETURN (self); |
---|
1600 | #endif |
---|
1601 | %}. |
---|
1602 | self primitiveFailed |
---|
1603 | |
---|
1604 | "Created: / 12-01-2014 / 19:48:51 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1605 | "Modified: / 12-01-2014 / 22:09:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
---|
1606 | ! |
---|
1607 | |
---|
1608 | releaseFromDevice |
---|
1609 | "I am no longer available on the device" |
---|
1610 | |
---|
1611 | device := nil. |
---|
1612 | fontId := nil. |
---|
1613 | sharedDrawId := nil. |
---|
1614 | closestFont := nil |
---|
1615 | ! ! |
---|
1616 | |
---|
1617 | !XftFontDescription methodsFor:'testing'! |
---|
1618 | |
---|
1619 | isUsed |
---|
1620 | ^ sharedDrawId notNil |
---|
1621 | ! |
---|
1622 | |
---|
1623 | isXftFont |
---|
1624 | ^ true |
---|
1625 | ! ! |
---|
1626 | |
---|
1627 | !XftFontDescription::FCFontListParser class methodsFor:'documentation'! |
---|
1628 | |
---|
1629 | documentation |
---|
1630 | " |
---|
1631 | parses fc-list output to get a list of XftFontDescriptions |
---|
1632 | |
---|
1633 | [author:] |
---|
1634 | cg |
---|
1635 | |
---|
1636 | [instance variables:] |
---|
1637 | |
---|
1638 | [class variables:] |
---|
1639 | |
---|
1640 | [see also:] |
---|
1641 | |
---|
1642 | " |
---|
1643 | ! ! |
---|
1644 | |
---|
1645 | !XftFontDescription::FCFontListParser methodsFor:'api'! |
---|
1646 | |
---|
1647 | listOfAvailableFonts |
---|
1648 | |readEntry list l fcListProg| |
---|
1649 | |
---|
1650 | list := OrderedCollection new. |
---|
1651 | |
---|
1652 | readEntry := |
---|
1653 | [ |
---|
1654 | |key| |
---|
1655 | |
---|
1656 | [l startsWith:'Pattern has'] whileFalse:[ |
---|
1657 | l := pipeStream nextLine. Transcript showCR:l. |
---|
1658 | ]. |
---|
1659 | |
---|
1660 | currentDescription := XftFontDescription new. |
---|
1661 | [ l := pipeStream nextLine. l notEmptyOrNil ] whileTrue:[ |
---|
1662 | "/ Transcript showCR:l. |
---|
1663 | lineStream := l readStream. lineStream skipSeparators. |
---|
1664 | key := lineStream upToSeparator. |
---|
1665 | ( |
---|
1666 | #('family:' 'style:' 'slant:' 'weight:' 'width:' |
---|
1667 | 'pixelsize:' 'spacing:' 'foundry:' 'antialias:' |
---|
1668 | 'file:' 'outline' 'scalable:' 'charset:' 'lang:' |
---|
1669 | 'fontversion:' 'fontformat:' 'decorative:' 'index:' |
---|
1670 | 'outline:' 'familylang:' 'stylelang:' 'fullname:' |
---|
1671 | 'fullnamelang:' 'capability:' 'hash:' 'postscriptname:' |
---|
1672 | ) includes:key |
---|
1673 | ) ifTrue:[ |
---|
1674 | self perform:('fc_',(key allButLast)) asSymbol |
---|
1675 | ] ifFalse:[ |
---|
1676 | Transcript show:'Xft ignored line: '; showCR:l. |
---|
1677 | self breakPoint:#cg. |
---|
1678 | ]. |
---|
1679 | ]. |
---|
1680 | list add:currentDescription |
---|
1681 | ]. |
---|
1682 | |
---|
1683 | fcListProg := #('/usr/bin/fc-list' '/usr/X11/bin/fc-list') detect:[:eachProg| |
---|
1684 | eachProg asFilename isExecutableProgram |
---|
1685 | ] ifNone:[ |
---|
1686 | 'fc-list program not found - no XFT fonts' infoPrintCR. |
---|
1687 | ^ list. |
---|
1688 | ]. |
---|
1689 | |
---|
1690 | pipeStream := PipeStream readingFrom:fcListProg, ' -v'. |
---|
1691 | [ |
---|
1692 | [pipeStream atEnd] whileFalse:[ |
---|
1693 | l := pipeStream nextLine. |
---|
1694 | readEntry value. |
---|
1695 | ] |
---|
1696 | ] ensure:[ |
---|
1697 | pipeStream close |
---|
1698 | ]. |
---|
1699 | ^ list |
---|
1700 | |
---|
1701 | " |
---|
1702 | FCFontListParser new listOfAvailableFonts |
---|
1703 | " |
---|
1704 | ! ! |
---|
1705 | |
---|
1706 | !XftFontDescription::FCFontListParser methodsFor:'font list keywords'! |
---|
1707 | |
---|
1708 | fc_antialias |
---|
1709 | "helper for font listing" |
---|
1710 | |
---|
1711 | currentDescription isAntialiasedFont:(self getBoolean). |
---|
1712 | ! |
---|
1713 | |
---|
1714 | fc_capability |
---|
1715 | "helper for font listing" |
---|
1716 | |
---|
1717 | "currentDescription capability:" (self getString). |
---|
1718 | ! |
---|
1719 | |
---|
1720 | fc_charset |
---|
1721 | "helper for font listing" |
---|
1722 | |
---|
1723 | |page bits l min max minCode maxCode| |
---|
1724 | |
---|
1725 | [ l := pipeStream nextLine. l notEmpty ] whileTrue:[ |
---|
1726 | "/ Transcript show:'->'; showCR:l. |
---|
1727 | (l startsWith:Character tab) ifFalse:[ |
---|
1728 | (l startsWith:'(') ifFalse:[self halt]. |
---|
1729 | currentDescription minCode:minCode. |
---|
1730 | currentDescription maxCode:maxCode. |
---|
1731 | ^ self. |
---|
1732 | ]. |
---|
1733 | |
---|
1734 | lineStream := l readStream. |
---|
1735 | lineStream skipSeparators. |
---|
1736 | page := Integer readFrom:(lineStream upTo:$:) radix:16. |
---|
1737 | lineStream next. |
---|
1738 | bits := 0 to:7 collect:[:i| |
---|
1739 | lineStream skipSeparators. |
---|
1740 | Integer readFrom:(lineStream upToSeparator) radix:16. |
---|
1741 | ]. |
---|
1742 | min := (page * 256 + 0). |
---|
1743 | max := (page * 256 + 255). |
---|
1744 | minCode isNil ifTrue:[ |
---|
1745 | minCode := min. |
---|
1746 | maxCode := max. |
---|
1747 | ] ifFalse:[ |
---|
1748 | minCode := minCode min:min. |
---|
1749 | maxCode := maxCode max:max. |
---|
1750 | ]. |
---|
1751 | ]. |
---|
1752 | "/ currentDescription characterSet:(self getString). |
---|
1753 | currentDescription minCode:minCode. |
---|
1754 | currentDescription maxCode:maxCode. |
---|
1755 | ! |
---|
1756 | |
---|
1757 | fc_decorative |
---|
1758 | "helper for font listing" |
---|
1759 | |
---|
1760 | currentDescription isDecorativeFont:(self getBoolean). |
---|
1761 | ! |
---|
1762 | |
---|
1763 | fc_family |
---|
1764 | "helper for font listing" |
---|
1765 | |
---|
1766 | currentDescription family:(self getString). |
---|
1767 | ! |
---|
1768 | |
---|
1769 | fc_familylang |
---|
1770 | "helper for font listing" |
---|
1771 | |
---|
1772 | "currentDescription familylang:" (self getString). |
---|
1773 | ! |
---|
1774 | |
---|
1775 | fc_file |
---|
1776 | "helper for font listing" |
---|
1777 | |
---|
1778 | currentDescription file:(self getString). |
---|
1779 | ! |
---|
1780 | |
---|
1781 | fc_fontformat |
---|
1782 | "helper for font listing" |
---|
1783 | |
---|
1784 | currentDescription fontFormat:(self getString). |
---|
1785 | ! |
---|
1786 | |
---|
1787 | fc_fontversion |
---|
1788 | "helper for font listing" |
---|
1789 | |
---|
1790 | currentDescription fontVersion:(self getInteger). |
---|
1791 | ! |
---|
1792 | |
---|
1793 | fc_foundry |
---|
1794 | "helper for font listing" |
---|
1795 | |
---|
1796 | currentDescription foundry:(self getString). |
---|
1797 | ! |
---|
1798 | |
---|
1799 | fc_fullname |
---|
1800 | "helper for font listing" |
---|
1801 | |
---|
1802 | "currentDescription fullname:" (self getString). |
---|
1803 | ! |
---|
1804 | |
---|
1805 | fc_fullnamelang |
---|
1806 | "helper for font listing" |
---|
1807 | |
---|
1808 | "currentDescription fullnamelang:" (self getString). |
---|
1809 | ! |
---|
1810 | |
---|
1811 | fc_hash |
---|
1812 | "helper for font listing" |
---|
1813 | |
---|
1814 | "currentDescription hash:" self getString. |
---|
1815 | ! |
---|
1816 | |
---|
1817 | fc_index |
---|
1818 | "helper for font listing" |
---|
1819 | |
---|
1820 | "currentDescription index:" (self getInteger). |
---|
1821 | ! |
---|
1822 | |
---|
1823 | fc_lang |
---|
1824 | "helper for font listing" |
---|
1825 | |
---|
1826 | "/ currentDescription characterSet:(self getString). |
---|
1827 | ! |
---|
1828 | |
---|
1829 | fc_outline |
---|
1830 | "helper for font listing" |
---|
1831 | |
---|
1832 | currentDescription isOutlineFont:(self getBoolean). |
---|
1833 | ! |
---|
1834 | |
---|
1835 | fc_pixelsize |
---|
1836 | "helper for font listing" |
---|
1837 | |
---|
1838 | currentDescription setPixelSize:(self getInteger). |
---|
1839 | currentDescription setSizeUnit:#px. |
---|
1840 | "/ currentDescription setSize:(self getInteger). |
---|
1841 | "/ currentDescription setSizeUnit:#pt. |
---|
1842 | ! |
---|
1843 | |
---|
1844 | fc_postscriptname |
---|
1845 | "helper for font listing" |
---|
1846 | |
---|
1847 | "currentDescription postscriptname:" self getString. |
---|
1848 | ! |
---|
1849 | |
---|
1850 | fc_scalable |
---|
1851 | "helper for font listing" |
---|
1852 | |
---|
1853 | currentDescription isScalableFont:(self getBoolean). |
---|
1854 | ! |
---|
1855 | |
---|
1856 | fc_slant |
---|
1857 | "helper for font listing" |
---|
1858 | |
---|
1859 | currentDescription slant:(self getInteger). |
---|
1860 | ! |
---|
1861 | |
---|
1862 | fc_spacing |
---|
1863 | "helper for font listing" |
---|
1864 | |
---|
1865 | currentDescription spacing:(self getInteger). |
---|
1866 | ! |
---|
1867 | |
---|
1868 | fc_style |
---|
1869 | "helper for font listing" |
---|
1870 | |
---|
1871 | |xftStyle| |
---|
1872 | |
---|
1873 | xftStyle := self getString. |
---|
1874 | (xftStyle includesString:'Bold') ifTrue:[ |
---|
1875 | currentDescription face:'bold'. |
---|
1876 | currentDescription style:'roman'. |
---|
1877 | ^ self. |
---|
1878 | ]. |
---|
1879 | (xftStyle includesString:'Italic') ifTrue:[ |
---|
1880 | currentDescription face:'medium'. |
---|
1881 | currentDescription style:'italic'. |
---|
1882 | ^ self. |
---|
1883 | ]. |
---|
1884 | (xftStyle includesString:'Oblique') ifTrue:[ |
---|
1885 | currentDescription face:'medium'. |
---|
1886 | currentDescription style:'italic'. |
---|
1887 | ^ self. |
---|
1888 | ]. |
---|
1889 | "/ self halt. |
---|
1890 | currentDescription face:'medium'. |
---|
1891 | currentDescription style:'roman'. |
---|
1892 | ! |
---|
1893 | |
---|
1894 | fc_stylelang |
---|
1895 | "helper for font listing" |
---|
1896 | |
---|
1897 | "currentDescription stylelang:" (self getString). |
---|
1898 | ! |
---|
1899 | |
---|
1900 | fc_weight |
---|
1901 | "helper for font listing" |
---|
1902 | |
---|
1903 | currentDescription weight:(self getInteger). |
---|
1904 | ! |
---|
1905 | |
---|
1906 | fc_width |
---|
1907 | "helper for font listing" |
---|
1908 | |
---|
1909 | currentDescription width:(self getInteger). |
---|
1910 | ! ! |
---|
1911 | |
---|
1912 | !XftFontDescription::FCFontListParser methodsFor:'helpers'! |
---|
1913 | |
---|
1914 | getBoolean |
---|
1915 | "helper for font listing" |
---|
1916 | |
---|
1917 | |s| |
---|
1918 | |
---|
1919 | lineStream skipSeparators. |
---|
1920 | s := lineStream nextAlphaNumericWord. |
---|
1921 | ^ s = 'FcTrue'. |
---|
1922 | ! |
---|
1923 | |
---|
1924 | getInteger |
---|
1925 | "helper for font listing" |
---|
1926 | |
---|
1927 | lineStream skipSeparators. |
---|
1928 | ^ Integer readFrom:lineStream. |
---|
1929 | ! |
---|
1930 | |
---|
1931 | getString |
---|
1932 | "helper for font listing" |
---|
1933 | |
---|
1934 | lineStream skipSeparators. |
---|
1935 | lineStream peekFor:$". |
---|
1936 | ^ (lineStream upTo:$"). |
---|
1937 | ! ! |
---|
1938 | |
---|
1939 | !XftFontDescription class methodsFor:'documentation'! |
---|
1940 | |
---|
1941 | version |
---|
1942 | ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.44 2014/04/01 13:26:51 vrany Exp $' |
---|
1943 | ! |
---|
1944 | |
---|
1945 | version_CVS |
---|
1946 | ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.44 2014/04/01 13:26:51 vrany Exp $' |
---|
1947 | ! ! |
---|
1948 | |
---|
1949 | |
---|
1950 | XftFontDescription initialize! |
---|