version update
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / workarounds.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include "clip.h"
23 #include "mutex.h"
24 #include <math.h>
25 #include "workarounds.h"
26
27 void Workarounds::copy_int(int &a, int &b)
28 {
29         a = b;
30 }
31
32 double Workarounds::divide_double(double a, double b)
33 {
34         return a / b;
35 }
36
37 void Workarounds::copy_double(double *a, double b)
38 {
39         *a = b;
40 }
41
42
43 void Workarounds::clamp(int32_t &x, int32_t y, int32_t z)
44 {
45         if(x < y) x = y;
46         else
47         if(x > z) x = z;
48 }
49
50 void Workarounds::clamp(int64_t &x, int64_t y, int64_t z)
51 {
52         if(x < y) x = y;
53         else
54         if(x > z) x = z;
55 }
56
57 void Workarounds::clamp(float &x, float y, float z)
58 {
59         if(x < y) x = y;
60         else
61         if(x > z) x = z;
62 }
63
64 void Workarounds::clamp(double &x, double y, double z)
65 {
66         if(x < y) x = y;
67         else
68         if(x > z) x = z;
69 }
70
71 float Workarounds::pow(float x, float y)
72 {
73         return powf(x, y);
74 }
75
76 #ifdef HAVE_XFT
77 // not thread safe
78 static Mutex xft_lock("xft_lock");
79
80 Bool xftInit(const char *config)
81 {
82         xft_lock.lock("XftInit");
83         Bool ret = XftInit(config);
84         xft_lock.unlock();
85         return ret;
86 }
87
88 FcBool xftInitFtLibrary(void)
89 {
90         xft_lock.lock("xftInitFtLibrary");
91         FcBool ret = XftInitFtLibrary();
92         xft_lock.unlock();
93         return ret;
94 }
95
96 Bool xftDefaultHasRender(Display *dpy)
97 {
98         xft_lock.lock("xftDefaultHasRender");
99         Bool ret = XftDefaultHasRender(dpy);
100         xft_lock.unlock();
101         return ret;
102 }
103
104 Bool xftDefaultSet(Display *dpy, FcPattern *defaults)
105 {
106         xft_lock.lock("xftDefaultHasRender");
107         Bool ret = XftDefaultSet(dpy, defaults);
108         xft_lock.unlock();
109         return ret;
110 }
111
112 FcBool xftCharExists(Display *dpy, XftFont *pub, FcChar32 ucs4)
113 {
114         xft_lock.lock("xftCharExists");
115         FcBool ret = XftCharExists(dpy, pub, ucs4);
116         xft_lock.unlock();
117         return ret;
118 }
119
120 void xftTextExtents8(Display *dpy, XftFont *pub,
121                 _Xconst FcChar8 *string, int len, XGlyphInfo *extents)
122 {
123         xft_lock.lock("xftTextExtents8");
124         XftTextExtents8(dpy, pub, string, len, extents);
125         xft_lock.unlock();
126 }
127
128 void xftTextExtentsUtf8(Display *dpy, XftFont *pub,
129                 _Xconst FcChar8 *string, int len, XGlyphInfo *extents)
130 {
131         xft_lock.lock("xftTextExtentsUtf8");
132         XftTextExtentsUtf8(dpy, pub, string, len, extents);
133         xft_lock.unlock();
134 }
135
136 void xftTextExtents32(Display *dpy, XftFont *pub,
137                 _Xconst FcChar32 *string, int len, XGlyphInfo *extents)
138 {
139         xft_lock.lock("xftTextExtents32");
140         XftTextExtents32(dpy, pub, string, len, extents);
141         xft_lock.unlock();
142 }
143
144 XftDraw *xftDrawCreate(Display *dpy, Drawable drawable, Visual *visual, Colormap colormap)
145 {
146         xft_lock.lock("xftDrawCreate");
147         XftDraw *ret = XftDrawCreate(dpy, drawable, visual, colormap);
148         xft_lock.unlock();
149         return ret;
150 }
151
152 XftDraw *xftDrawCreateBitmap(Display  *dpy, Pixmap bitmap)
153 {
154         xft_lock.lock("xftDrawCreateBitmap");
155         XftDraw *ret = XftDrawCreateBitmap(dpy, bitmap);
156         xft_lock.unlock();
157         return ret;
158 }
159
160 void xftDrawDestroy(XftDraw *draw)
161 {
162         xft_lock.lock("xftDrawDestroy");
163         XftDrawDestroy(draw);
164         xft_lock.unlock();
165 }
166
167 void xftDrawString32(XftDraw *draw, _Xconst XftColor *color, XftFont *pub,
168                 int x, int y, _Xconst FcChar32 *string, int len)
169 {
170         xft_lock.lock("xftDrawString32");
171         XftDrawString32(draw, color, pub, x, y, string, len);
172         xft_lock.unlock();
173 }
174
175 Bool xftColorAllocValue(Display *dpy, Visual *visual,
176                 Colormap cmap, _Xconst XRenderColor *color, XftColor *result)
177 {
178         xft_lock.lock("xftColorAllocValue");
179         Bool ret = XftColorAllocValue(dpy, visual, cmap, color, result);
180         xft_lock.unlock();
181         return ret;
182 }
183
184 void xftColorFree(Display *dpy, Visual *visual, Colormap cmap, XftColor *color)
185 {
186         xft_lock.lock("xftColorFree");
187         XftColorFree(dpy, visual, cmap, color);
188         xft_lock.unlock();
189 }
190
191 XftFont *xftFontOpenName(Display *dpy, int screen, _Xconst char *name)
192 {
193         xft_lock.lock("xftFontOpenName");
194         XftFont *ret = XftFontOpenName(dpy, screen, name);
195         xft_lock.unlock();
196         return ret;
197 }
198
199 XftFont *xftFontOpenXlfd(Display *dpy, int screen, _Xconst char *xlfd)
200 {
201         xft_lock.lock("xftFontOpenXlfd");
202         XftFont *ret = XftFontOpenXlfd(dpy, screen, xlfd);
203         xft_lock.unlock();
204         return ret;
205 }
206
207 XftFont *xftFontOpenPattern(Display *dpy, FcPattern *pattern)
208 {
209         xft_lock.lock("xftFontOpenPattern");
210         XftFont *ret = XftFontOpenPattern(dpy, pattern);
211         xft_lock.unlock();
212         return ret;
213 }
214
215 void xftFontClose(Display *dpy, XftFont *pub)
216 {
217         xft_lock.lock("xftFontClose");
218         XftFontClose(dpy, pub);
219         xft_lock.unlock();
220 }
221
222
223 static Mutex &ft_lock = xft_lock;
224
225 FT_Error ft_Done_Face(FT_Face face)
226 {
227         ft_lock.lock("ft_Done_Face");
228         FT_Error ret = FT_Done_Face(face);
229         ft_lock.unlock();
230         return ret;
231 }
232
233 FT_Error ft_Done_FreeType(FT_Library library)
234 {
235         ft_lock.lock("ft_Done_FreeType");
236         FT_Error ret = FT_Done_FreeType(library);
237         ft_lock.unlock();
238         return ret;
239 }
240
241 void ft_Done_Glyph(FT_Glyph glyph)
242 {
243         ft_lock.lock("ft_Done_Glyph");
244         FT_Done_Glyph(glyph);
245         ft_lock.unlock();
246 }
247
248 FT_UInt ft_Get_Char_Index(FT_Face face, FT_ULong charcode)
249 {
250         ft_lock.lock("ft_Get_Char_Index");
251         FT_UInt ret = FT_Get_Char_Index(face, charcode);
252         ft_lock.unlock();
253         return ret;
254 }
255
256 FT_Error ft_Get_Glyph(FT_GlyphSlot  slot, FT_Glyph *aglyph)
257 {
258         ft_lock.lock("ft_Get_Glyph");
259         FT_Error ret = FT_Get_Glyph(slot, aglyph);
260         ft_lock.unlock();
261         return ret;
262 }
263
264 FT_Error ft_Get_Kerning(FT_Face face, FT_UInt left_glyph, FT_UInt right_glyph, FT_UInt kern_mode, FT_Vector *akerning)
265 {
266         ft_lock.lock("ft_Get_Kerning");
267         FT_Error ret = FT_Get_Kerning(face, left_glyph, right_glyph, kern_mode, akerning);
268         ft_lock.unlock();
269         return ret;
270 }
271
272 FT_Error ft_Init_FreeType(FT_Library *alibrary)
273 {
274         ft_lock.lock("ft_Init_FreeType");
275         FT_Error ret = FT_Init_FreeType(alibrary);
276         ft_lock.unlock();
277         return ret;
278 }
279
280 FT_Error ft_Load_Char(FT_Face face, FT_ULong char_code, FT_Int32 load_flags)
281 {
282         ft_lock.lock("ft_Load_Char");
283         FT_Error ret = FT_Load_Char(face, char_code, load_flags);
284         ft_lock.unlock();
285         return ret;
286 }
287
288 FT_Error ft_Load_Glyph(FT_Face face, FT_UInt glyph_index, FT_Int32 load_flags)
289 {
290         ft_lock.lock("ft_Load_Glyph");
291         FT_Error ret = FT_Load_Glyph(face, glyph_index, load_flags);
292         ft_lock.unlock();
293         return ret;
294 }
295
296 FT_Error ft_New_Face(FT_Library library, const char *filepathname, FT_Long face_index, FT_Face *aface)
297 {
298         ft_lock.lock("ft_New_Face");
299         FT_Error ret = FT_New_Face(library, filepathname, face_index, aface);
300         ft_lock.unlock();
301         return ret;
302 }
303
304 FT_Error ft_Outline_Done(FT_Library library, FT_Outline *outline)
305 {
306         ft_lock.lock("ft_Outline_Done");
307         FT_Error ret = FT_Outline_Done(library, outline);
308         ft_lock.unlock();
309         return ret;
310 }
311
312 FT_Error ft_Outline_Get_BBox(FT_Outline *outline, FT_BBox *abbox)
313 {
314         ft_lock.lock("ft_Outline_Get_BBox");
315         FT_Error ret = FT_Outline_Get_BBox(outline, abbox);
316         ft_lock.unlock();
317         return ret;
318 }
319
320 FT_Error ft_Outline_Get_Bitmap(FT_Library library, FT_Outline *outline, const FT_Bitmap  *abitmap)
321 {
322         ft_lock.lock("ft_Outline_Get_Bitmap");
323         FT_Error ret = FT_Outline_Get_Bitmap(library, outline, abitmap);
324         ft_lock.unlock();
325         return ret;
326 }
327
328 FT_Error ft_Outline_New(FT_Library library, FT_UInt numPoints, FT_Int numContours, FT_Outline *anoutline)
329 {
330         ft_lock.lock("ft_Outline_New");
331         FT_Error ret = FT_Outline_New(library, numPoints, numContours, anoutline);
332         ft_lock.unlock();
333         return ret;
334 }
335
336 void ft_Outline_Translate(const FT_Outline *outline, FT_Pos xOffset, FT_Pos yOffset)
337 {
338         ft_lock.lock("ft_Outline_Translate");
339         FT_Outline_Translate(outline, xOffset, yOffset);
340         ft_lock.unlock();
341 }
342
343 FT_Error ft_Select_Charmap(FT_Face face, FT_Encoding encoding)
344 {
345         ft_lock.lock("ft_Select_Charmap");
346         FT_Error ret = FT_Select_Charmap(face, encoding);
347         ft_lock.unlock();
348         return ret;
349 }
350 FT_Error ft_Set_Pixel_Sizes(FT_Face face, FT_UInt pixel_width, FT_UInt pixel_height)
351 {
352         ft_lock.lock("ft_Set_Pixel_Sizes");
353         FT_Error ret = FT_Set_Pixel_Sizes(face, pixel_width, pixel_height);
354         ft_lock.unlock();
355         return ret;
356 }
357
358 void ft_Stroker_Done(FT_Stroker stroker)
359 {
360         ft_lock.lock("ft_Stroker_Done");
361         FT_Stroker_Done(stroker);
362         ft_lock.unlock();
363 }
364
365 void ft_Stroker_Export(FT_Stroker stroker, FT_Outline *outline)
366 {
367         ft_lock.lock("ft_Stroker_Export");
368         FT_Stroker_Export(stroker, outline);
369         ft_lock.unlock();
370 }
371
372 FT_Error ft_Stroker_GetCounts(FT_Stroker stroker, FT_UInt *anum_points, FT_UInt *anum_contours)
373 {
374         ft_lock.lock("ft_Stroker_GetCounts");
375         FT_Error ret = FT_Stroker_GetCounts(stroker, anum_points, anum_contours);
376         ft_lock.unlock();
377         return ret;
378 }
379
380 FT_Error ft_Stroker_New(FT_Library library, FT_Stroker  *astroker)
381 {
382         ft_lock.lock("ft_Stroker_New");
383         FT_Error ret = FT_Stroker_New(library, astroker);
384         ft_lock.unlock();
385         return ret;
386 }
387
388 FT_Error ft_Stroker_ParseOutline(FT_Stroker stroker, FT_Outline *outline, FT_Bool opened)
389 {
390         ft_lock.lock("ft_Stroker_ParseOutline");
391         FT_Error ret = FT_Stroker_ParseOutline(stroker, outline, opened);
392         ft_lock.unlock();
393         return ret;
394 }
395
396 void ft_Stroker_Set(FT_Stroker stroker, FT_Fixed radius, FT_Stroker_LineCap line_cap, FT_Stroker_LineJoin line_join, FT_Fixed miter_limit)
397 {
398         ft_lock.lock("ft_Stroker_Set");
399         FT_Stroker_Set(stroker, radius, line_cap, line_join, miter_limit);
400         ft_lock.unlock();
401 }
402
403
404 static Mutex &fc_lock = xft_lock;
405
406 FcBool fcCharSetAddChar(FcCharSet *fcs, FcChar32 ucs4)
407 {
408         fc_lock.lock("fcCharSetAddChar");
409         FcBool ret = FcCharSetAddChar(fcs, ucs4);
410         fc_lock.unlock();
411         return ret;
412 }
413
414 FcCharSet *fcCharSetCreate(void)
415 {
416         fc_lock.lock("fcCharSetCreate");
417         FcCharSet *ret = FcCharSetCreate();
418         fc_lock.unlock();
419         return ret;
420 }
421 void fcCharSetDestroy(FcCharSet *fcs)
422 {
423         fc_lock.lock("fcCharSetDestroy");
424         FcCharSetDestroy(fcs);
425         fc_lock.unlock();
426 }
427
428 FcBool fcCharSetHasChar(const FcCharSet *fcs, FcChar32 ucs4)
429 {
430         fc_lock.lock("fcCharSetHasChar");
431         FcBool ret = FcCharSetHasChar(fcs, ucs4);
432         fc_lock.unlock();
433         return ret;
434 }
435
436 FcBool fcConfigAppFontAddDir(FcConfig *config, const FcChar8 *dir)
437 {
438         fc_lock.lock("fcConfigAppFontAddDir");
439         FcBool ret = FcConfigAppFontAddDir(config, dir);
440         fc_lock.unlock();
441         return ret;
442 }
443
444 FcConfig *fcConfigGetCurrent()
445 {
446         fc_lock.lock("fcConfigGetCurrent");
447         FcConfig *ret = FcConfigGetCurrent();
448         fc_lock.unlock();
449         return ret;
450 }
451
452 FcBool fcConfigSetRescanInterval(FcConfig *config, int rescanInterval)
453 {
454         fc_lock.lock("fcConfigSetRescanInterval");
455         FcBool ret = FcConfigSetRescanInterval(config, rescanInterval);
456         fc_lock.unlock();
457         return ret;
458 }
459
460 FcFontSet *fcFontList(FcConfig *config, FcPattern *p, FcObjectSet *os)
461 {
462         fc_lock.lock("fcFontList");
463         FcFontSet *ret = FcFontList(config, p, os);
464         fc_lock.unlock();
465         return ret;
466 }
467
468 void fcFontSetDestroy(FcFontSet *s)
469 {
470         fc_lock.lock("fcFontSetDestroy");
471         FcFontSetDestroy(s);
472         fc_lock.unlock();
473 }
474
475 FcPattern *fcFreeTypeQueryFace(const FT_Face face, const FcChar8 *file, unsigned int id, FcBlanks *blanks)
476 {
477         fc_lock.lock("fcFreeTypeQueryFace");
478         FcPattern *ret = FcFreeTypeQueryFace(face, file, id, blanks);
479         fc_lock.unlock();
480         return ret;
481 }
482
483 FcBool fcInit(void)
484 {
485         fc_lock.lock("fcInit");
486         FcBool ret = FcInit();
487         fc_lock.unlock();
488         return ret;
489 }
490
491 FcBool fcLangSetAdd(FcLangSet *ls, const FcChar8 *lang)
492 {
493         fc_lock.lock("fcLangSetAdd");
494         FcBool ret = FcLangSetAdd(ls, lang);
495         fc_lock.unlock();
496         return ret;
497 }
498
499 FcLangSet *fcLangSetCreate(void)
500 {
501         fc_lock.lock("fcLangSetCreate");
502         FcLangSet *ret = FcLangSetCreate();
503         fc_lock.unlock();
504         return ret;
505 }
506
507 void fcLangSetDestroy(FcLangSet *ls)
508 {
509         fc_lock.lock("fcLangSetDestroy");
510         FcLangSetDestroy(ls);
511         fc_lock.unlock();
512 }
513
514 FcObjectSet *fcObjectSetBuild(const char *first, ...)
515 {
516         fc_lock.lock("fcObjectSetBuild");
517         va_list va;  va_start(va, first);
518         FcObjectSet *ret = FcObjectSetVaBuild(first, va);
519         va_end(va);
520         fc_lock.unlock();
521         return ret;
522 }
523
524 void fcObjectSetDestroy(FcObjectSet *os)
525 {
526         fc_lock.lock("fcObjectSetDestroy");
527         FcObjectSetDestroy(os);
528         fc_lock.unlock();
529 }
530
531 FcBool fcPatternAddBool(FcPattern *p, const char *object, FcBool b)
532 {
533         fc_lock.lock("fcPatternAddBool");
534         FcBool ret = FcPatternAddBool(p, object, b);
535         fc_lock.unlock();
536         return ret;
537 }
538
539 FcBool fcPatternAddCharSet(FcPattern *p, const char *object, const FcCharSet *c)
540 {
541         fc_lock.lock("fcPatternAddCharSet");
542         FcBool ret = FcPatternAddCharSet(p, object, c);
543         fc_lock.unlock();
544         return ret;
545 }
546
547 FcBool fcPatternAddDouble(FcPattern *p, const char *object, double d)
548 {
549         fc_lock.lock("fcPatternAddDouble");
550         FcBool ret = FcPatternAddDouble(p, object, d);
551         fc_lock.unlock();
552         return ret;
553 }
554
555 FcBool fcPatternAddInteger(FcPattern *p, const char *object, int i)
556 {
557         fc_lock.lock("fcPatternAddInteger");
558         FcBool ret = FcPatternAddInteger(p, object, i);
559         fc_lock.unlock();
560         return ret;
561 }
562
563 FcBool fcPatternAddLangSet(FcPattern *p, const char *object, const FcLangSet *ls)
564 {
565         fc_lock.lock("fcPatternAddLangSet");
566         FcBool ret = FcPatternAddLangSet(p, object, ls);
567         fc_lock.unlock();
568         return ret;
569 }
570
571 FcResult fcPatternGetInteger(const FcPattern *p, const char *object, int n, int *i)
572 {
573         fc_lock.lock("fcPatternGetInteger");
574         FcResult ret = FcPatternGetInteger(p, object, n, i);
575         fc_lock.unlock();
576         return ret;
577 }
578
579 FcResult fcPatternGetDouble (const FcPattern *p, const char *object, int n, double *d)
580 {
581         fc_lock.lock("fcPatternGetDouble");
582         FcResult ret = FcPatternGetDouble(p, object, n, d);
583         fc_lock.unlock();
584         return ret;
585 }
586
587 FcResult fcPatternGetString(const FcPattern *p, const char *object, int n, FcChar8 **s)
588 {
589         fc_lock.lock("fcPatternGetString");
590         FcResult ret = FcPatternGetString(p, object, n, s);
591         fc_lock.unlock();
592         return ret;
593 }
594
595 FcPattern *fcPatternCreate(void)
596 {
597         fc_lock.lock("fcPatternCreate");
598         FcPattern *ret = FcPatternCreate();
599         fc_lock.unlock();
600         return ret;
601 }
602
603 FcBool fcPatternDel(FcPattern *p, const char *object)
604 {
605         fc_lock.lock("fcPatternDel");
606         FcBool ret = FcPatternDel(p, object);
607         fc_lock.unlock();
608         return ret;
609 }
610
611 void fcPatternDestroy(FcPattern *p)
612 {
613         fc_lock.lock("fcPatternDestroy ");
614         FcPatternDestroy(p);
615         fc_lock.unlock();
616 }
617
618 FcPattern *fcPatternDuplicate(const FcPattern *p)
619 {
620         fc_lock.lock("fcPatternDuplicate");
621         FcPattern *ret = FcPatternDuplicate(p);
622         fc_lock.unlock();
623         return ret;
624 }
625
626 FcResult fcPatternGetCharSet(const FcPattern *p, const char *object, int n, FcCharSet **c)
627 {
628         fc_lock.lock("fcPatternGetCharSet");
629         FcResult ret = FcPatternGetCharSet(p, object, n, c);
630         fc_lock.unlock();
631         return ret;
632 }
633
634 #endif