1#ifndef NOTCURSES_BASE64
2#define NOTCURSES_BASE64
11 if(b64 >=
'A' && b64 <=
'Z'){
13 }
else if(b64 >=
'a' && b64 <=
'z'){
14 return b64 -
'a' + 26;
15 }
else if(b64 >=
'0' && b64 <=
'9'){
16 return b64 -
'0' + 52;
25static unsigned const char b64subs[] =
26 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
37base64_rgba3(
const uint32_t pixels[
static 3],
size_t pcount,
38 char b64[
static 17],
bool wipe[
static 3], uint32_t transcolor){
39 uint32_t pixel = pixels[0];
40 unsigned r = ncpixel_r(pixel);
41 unsigned g = ncpixel_g(pixel);
42 unsigned b = ncpixel_b(pixel);
45 unsigned a = ncpixel_a(pixel);
46 if(wipe[0] || rgba_trans_p(pixel, transcolor)){
49 b64[0] = b64subs[(
r & 0xfc) >> 2];
50 b64[1] = b64subs[(
r & 0x3 << 4) | ((g & 0xf0) >> 4)];
51 b64[2] = b64subs[((g & 0xf) << 2) | ((b & 0xc0) >> 6)];
52 b64[3] = b64subs[b & 0x3f];
53 b64[4] = b64subs[(a & 0xfc) >> 2];
55 b64[5] = b64subs[(a & 0x3) << 4];
61 b64[5] = (a & 0x3) << 4;
66 a = wipe[1] ? 0 : rgba_trans_p(pixel, transcolor) ? 0 : 255;
67 b64[5] = b64subs[b64[5] | ((
r & 0xf0) >> 4)];
68 b64[6] = b64subs[((
r & 0xf) << 2) | ((g & 0xc0) >> 6u)];
69 b64[7] = b64subs[g & 0x3f];
70 b64[8] = b64subs[(b & 0xfc) >> 2];
71 b64[9] = b64subs[((b & 0x3) << 4) | ((a & 0xf0) >> 4)];
73 b64[10] = b64subs[(a & 0xf) << 2];
78 b64[10] = (a & 0xf) << 2;
83 a = wipe[2] ? 0 : rgba_trans_p(pixel, transcolor) ? 0 : 255;
84 b64[10] = b64subs[b64[10] | ((
r & 0xc0) >> 6)];
85 b64[11] = b64subs[
r & 0x3f];
86 b64[12] = b64subs[(g & 0xfc) >> 2];
87 b64[13] = b64subs[((g & 0x3) << 4) | ((b & 0xf0) >> 4)];
88 b64[14] = b64subs[((b & 0xf) << 2) | ((a & 0xc0) >> 6)];
89 b64[15] = b64subs[a & 0x3f];
95base64x3(
const unsigned char* src,
char* b64){
96 uint8_t a = src[0] >> 2u;
97 uint8_t b = ((src[0] & 0x3u) << 4u) + ((src[1] & 0xf0u) >> 4u);
98 uint8_t
c = ((src[1] & 0x0fu) << 2u) + ((src[2] & 0xc0u) >> 6u);
99 uint8_t d = src[2] & 0x3f;
108base64final(
const unsigned char* src,
char* b64,
size_t b){
112 uint8_t s0 = src[0] >> 2u;
113 uint8_t s1 = ((src[0] & 0x3u) << 4u) + ((src[1] & 0xf0u) >> 4u);
114 uint8_t s2 = ((src[1] & 0x0fu) << 2u);
115 b64[0] = b64subs[s0];
116 b64[1] = b64subs[s1];
117 b64[2] = b64subs[s2];
120 uint8_t s0 = src[0] >> 2u;
121 uint8_t s1 = (src[0] & 0x3u) << 4u;
122 b64[0] = b64subs[s0];
123 b64[1] = b64subs[s1];