edd23ac1ba6848b326f01a8ae3dfe411e8f345a7
[blender.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 /** \file blender/blenfont/intern/blf_util.c
30  *  \ingroup blf
31  */
32
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37
38 #include "blf_internal.h"
39
40 unsigned int blf_next_p2(unsigned int x)
41 {
42         x -= 1;
43         x |= (x >> 16);
44         x |= (x >> 8);
45         x |= (x >> 4);
46         x |= (x >> 2);
47         x |= (x >> 1);
48         x += 1;
49         return(x);
50 }
51
52 unsigned int blf_hash(unsigned int val)
53 {
54         unsigned int key;
55
56         key= val;
57         key += ~(key << 16);
58         key ^= (key >> 5);
59         key += (key << 3);
60         key ^= (key >> 13);
61         key += ~(key << 9);
62         key ^= (key >> 17);
63         return(key % 257);
64 }
65
66 /*
67  * This function is from Imlib2 library (font_main.c), a
68  * library that does image file loading and saving as well
69  * as rendering, manipulation, arbitrary polygon support, etc.
70  *
71  * Copyright (C) 2000 Carsten Haitzler and various contributors
72  * The original name: imlib_font_utf8_get_next
73  * more info here: http://docs.enlightenment.org/api/imlib2/html/
74  */
75 int blf_utf8_next(unsigned char *buf, unsigned int *iindex)
76 {
77         /* Reads UTF8 bytes from 'buf', starting at 'index' and
78          * returns the code point of the next valid code point.
79          * 'index' is updated ready for the next call.
80          *
81          * Returns 0 to indicate an error (e.g. invalid UTF8)
82          */
83         int index= *iindex, len, r;
84         unsigned char d, d2, d3, d4;
85
86         d= buf[index++];
87         if (!d)
88                 return(0);
89
90         while (buf[index] && ((buf[index] & 0xc0) == 0x80))
91                 index++;
92
93         len= index - *iindex;
94         if (len == 1)
95                 r= d;
96         else if (len == 2) {
97                 /* 2 byte */
98                 d2= buf[*iindex + 1];
99                 r= d & 0x1f; /* copy lower 5 */
100                 r <<= 6;
101                 r |= (d2 & 0x3f); /* copy lower 6 */
102         }
103         else if (len == 3) {
104                 /* 3 byte */
105                 d2= buf[*iindex + 1];
106                 d3= buf[*iindex + 2];
107                 r= d & 0x0f; /* copy lower 4 */
108                 r <<= 6;
109                 r |= (d2 & 0x3f);
110                 r <<= 6;
111                 r |= (d3 & 0x3f);
112         }
113         else {
114                 /* 4 byte */
115                 d2= buf[*iindex + 1];
116                 d3= buf[*iindex + 2];
117                 d4= buf[*iindex + 3];
118                 r= d & 0x0f; /* copy lower 4 */
119                 r <<= 6;
120                 r |= (d2 & 0x3f);
121                 r <<= 6;
122                 r |= (d3 & 0x3f);
123                 r <<= 6;
124                 r |= (d4 & 0x3f);
125         }
126         *iindex= index;
127         return(r);
128 }