/** * $Id: * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * The Original Code is Copyright (C) 2009 Blender Foundation. * All rights reserved. * * * Contributor(s): Blender Foundation * * ***** END GPL LICENSE BLOCK ***** */ #include #include #include unsigned int blf_next_p2(unsigned int x) { x -= 1; x |= (x >> 16); x |= (x >> 8); x |= (x >> 4); x |= (x >> 2); x |= (x >> 1); x += 1; return(x); } unsigned int blf_hash(unsigned int val) { unsigned int key; key= val; key += ~(key << 16); key ^= (key >> 5); key += (key << 3); key ^= (key >> 13); key += ~(key << 9); key ^= (key >> 17); return(key % 257); } /* * This function is from Imlib2 library (font_main.c), a * library that does image file loading and saving as well * as rendering, manipulation, arbitrary polygon support, etc. * * Copyright (C) 2000 Carsten Haitzler and various contributors * The original name: imlib_font_utf8_get_next * more info here: http://docs.enlightenment.org/api/imlib2/html/ */ int blf_utf8_next(unsigned char *buf, int *iindex) { /* Reads UTF8 bytes from 'buf', starting at 'index' and * returns the code point of the next valid code point. * 'index' is updated ready for the next call. * * Returns 0 to indicate an error (e.g. invalid UTF8) */ int index= *iindex, r; unsigned char d= buf[index++], d2, d3, d4; if (!d) return(0); if (d < 0x80) { *iindex= index; return(d); } if ((d & 0xe0) == 0xc0) { /* 2 byte */ d2= buf[index++]; if ((d2 & 0xc0) != 0x80) return(0); r= d & 0x1f; /* copy lower 5 */ r <<= 6; r |= (d2 & 0x3f); /* copy lower 6 */ } else if ((d & 0xf0) == 0xe0) { /* 3 byte */ d2= buf[index++]; d3= buf[index++]; if ((d2 & 0xc0) != 0x80 || (d3 & 0xc0) != 0x80) return(0); r= d & 0x0f; /* copy lower 4 */ r <<= 6; r |= (d2 & 0x3f); r <<= 6; r |= (d3 & 0x3f); } else { /* 4 byte */ d2= buf[index++]; d3= buf[index++]; d4= buf[index++]; if ((d2 & 0xc0) != 0x80 || (d3 & 0xc0) != 0x80 || (d4 & 0xc0) != 0x80) return(0); r= d & 0x0f; /* copy lower 4 */ r <<= 6; r |= (d2 & 0x3f); r <<= 6; r |= (d3 & 0x3f); r <<= 6; r |= (d4 & 0x3f); } *iindex= index; return(r); }