All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Helper.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "Types.h"
6 
7 #define MASKBITS 0x3F
8 #define MASKBYTE 0x80
9 #define MASK2BYTES 0xC0
10 #define MASK3BYTES 0xE0
11 #define MASK4BYTES 0xF0
12 #define MASK5BYTES 0xF8
13 #define MASK6BYTES 0xFC
14 
15 
16 namespace Eegeo
17 {
18  template <typename T>
19  T AlignUp(const T in, u32 align)
20  {
21  T out = in;
22 
23  if(out % align)
24  {
25  out += align - (out % align);
26  }
27 
28  return out;
29  }
30 
31  template <typename T>
32  T AlignDown(const T in, u32 align)
33  {
34  T out = in;
35 
36  if(out % align)
37  {
38  out -= (out % align);
39  }
40 
41  return out;
42  }
43 
44  inline void ConvertColourU32ToFloat(float* floatCol, const u32 colour)
45  {
46  floatCol[0] = ((float)((colour & 0xff000000) >> 24))/255.0f;
47  floatCol[1] = ((float)((colour & 0x00ff0000) >> 16))/255.0f;
48  floatCol[2] = ((float)((colour & 0x0000ff00) >> 8))/255.0f;
49  floatCol[3] = ((float)((colour & 0x000000ff) >> 0))/255.0f;
50  }
51 
52  inline u32 ConvertColourFloatToU32(const float* floatCol)
53  {
54  return (((u32)(floatCol[0] * 255.0f)) << 24) | (((u32)(floatCol[1] * 255.0f)) << 16) | (((u32)(floatCol[2] * 255.0f)) << 8) | (((u32)(floatCol[3] * 255.0f)));
55  }
56 
57  inline u32 MakeRGBAu8(u8 r, u8 g, u8 b, u8 a)
58  {
59  return ((u32)(r) << 0) | ((u32)(g) << 8) | ((u32)(b) << 16) | ((u32)(a) << 24);
60  }
61 
62 
63  inline u32 UTF8ToU16(u16& dst, const char* utf8)
64  {
65  const u8* pBytes = (const u8*)utf8;
66 
67 
68  if((pBytes[0] & MASK3BYTES) == MASK3BYTES)
69  {
70  dst = ((pBytes[0] & 0x0F) << 12) | ((pBytes[1] & MASKBITS) << 6) | (pBytes[2] & MASKBITS);
71  return 3;
72  }
73 
74  else if((pBytes[0] & MASK2BYTES) == MASK2BYTES)
75  {
76  dst = ((pBytes[0] & 0x1F) << 6) | (pBytes[1] & MASKBITS);
77  return 2;
78  }
79 
80  else
81  {
82  dst = pBytes[0];
83  return 1;
84  }
85  }
86 
87  inline u32 U16ToUTF8(char* utf8, u16 src)
88  {
89 
90  if(src < 0x80)
91  {
92  utf8[0] = ((char) src);
93  return 1;
94  }
95 
96  else if(src < 0x800)
97  {
98  utf8[0] = (char)(MASK2BYTES | (src >> 6));
99  utf8[1] = (char)(MASKBYTE | (src & MASKBITS));
100  return 2;
101  }
102 
103  else
104  {
105  utf8[0] = (char)(MASK3BYTES | (src >> 12));
106  utf8[1] = (char)(MASKBYTE | ((src >> 6) & MASKBITS));
107  utf8[2] = (char)(MASKBYTE | (src & MASKBITS));
108  return 3;
109  }
110  }
111 }