319a837bbb68c7b0f420188f8e275375c47149a7
[blender-staging.git] / source / blender / blenfont / intern / blf_util.c
1 /**
2  * $Id:
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (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 Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #include "BIF_gl.h"
34
35
36 unsigned int blf_next_p2(unsigned int x)
37 {
38         x -= 1;
39         x |= (x >> 16);
40         x |= (x >> 8);
41         x |= (x >> 4);
42         x |= (x >> 2);
43         x |= (x >> 1);
44         x += 1;
45         return(x);
46 }
47
48 unsigned int blf_hash(unsigned int val)
49 {
50         unsigned int key;
51
52         key= val;
53         key += ~(key << 16);
54         key ^= (key >> 5);
55         key += (key << 3);
56         key ^= (key >> 13);
57         key += ~(key << 9);
58         key ^= (key >> 17);
59         return(key % 257);
60 }
61
62 /*
63  * This function is from Imlib2 library (font_main.c), a
64  * library that does image file loading and saving as well
65  * as rendering, manipulation, arbitrary polygon support, etc.
66  *
67  * Copyright (C) 2000 Carsten Haitzler and various contributors
68  * The original name: imlib_font_utf8_get_next
69  * more info here: http://docs.enlightenment.org/api/imlib2/html/
70  */
71 int blf_utf8_next(unsigned char *buf, int *iindex)
72 {
73         /* Reads UTF8 bytes from 'buf', starting at 'index' and
74          * returns the code point of the next valid code point.
75          * 'index' is updated ready for the next call.
76          *
77          * Returns 0 to indicate an error (e.g. invalid UTF8)
78          */
79         int index= *iindex, len, r;
80         unsigned char d, d2, d3, d4;
81
82         d= buf[index++];
83         if (!d)
84                 return(0);
85
86         while (buf[index] && ((buf[index] & 0xc0) == 0x80))
87                 index++;
88
89         len= index - *iindex;
90         if (len == 1)
91                 r= d;
92         else if (len == 2) {
93                 /* 2 byte */
94                 d2= buf[*iindex + 1];
95                 r= d & 0x1f; /* copy lower 5 */
96                 r <<= 6;
97                 r |= (d2 & 0x3f); /* copy lower 6 */
98         }
99         else if (len == 3) {
100                 /* 3 byte */
101                 d2= buf[*iindex + 1];
102                 d3= buf[*iindex + 2];
103                 r= d & 0x0f; /* copy lower 4 */
104                 r <<= 6;
105                 r |= (d2 & 0x3f);
106                 r <<= 6;
107                 r |= (d3 & 0x3f);
108         }
109         else {
110                 /* 4 byte */
111                 d2= buf[*iindex + 1];
112                 d3= buf[*iindex + 2];
113                 d4= buf[*iindex + 3];
114                 r= d & 0x0f; /* copy lower 4 */
115                 r <<= 6;
116                 r |= (d2 & 0x3f);
117                 r <<= 6;
118                 r |= (d3 & 0x3f);
119                 r <<= 6;
120                 r |= (d4 & 0x3f);
121         }
122         *iindex= index;
123         return(r);
124 }