FontGLUT.cpp (pymol-v1.8.6.0.tar.bz2) | : | FontGLUT.cpp (pymol-v2.1.0.tar.bz2) | ||
---|---|---|---|---|
skipping to change at line 57 | skipping to change at line 57 | |||
static void FontGLUTRestore(CFontGLUT * I) | static void FontGLUTRestore(CFontGLUT * I) | |||
{ | { | |||
glPixelStorei(GL_UNPACK_SWAP_BYTES, I->swapbytes); | glPixelStorei(GL_UNPACK_SWAP_BYTES, I->swapbytes); | |||
glPixelStorei(GL_UNPACK_LSB_FIRST, I->lsbfirst); | glPixelStorei(GL_UNPACK_LSB_FIRST, I->lsbfirst); | |||
glPixelStorei(GL_UNPACK_ROW_LENGTH, I->rowlength); | glPixelStorei(GL_UNPACK_ROW_LENGTH, I->rowlength); | |||
glPixelStorei(GL_UNPACK_SKIP_ROWS, I->skiprows); | glPixelStorei(GL_UNPACK_SKIP_ROWS, I->skiprows); | |||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, I->skippixels); | glPixelStorei(GL_UNPACK_SKIP_PIXELS, I->skippixels); | |||
glPixelStorei(GL_UNPACK_ALIGNMENT, I->alignment); | glPixelStorei(GL_UNPACK_ALIGNMENT, I->alignment); | |||
} | } | |||
/* | ||||
* check if masked `c` equals `value` | ||||
*/ | ||||
static inline bool masked_byte_equals(char c, char mask, char value) { | ||||
return (c & mask) == value; | ||||
} | ||||
static inline bool byte_check_10xxxxxx(char c) { | ||||
return masked_byte_equals(c, | ||||
0xc0 /* mask 0b11000000 */, | ||||
0x80 /* value 0b10000000 */); | ||||
} | ||||
/* | ||||
* Read the next unicode point from a UTF-8 string and advance the string | ||||
* pointer. If decoding fails, set `error` to true. If `error` is already | ||||
* true, don't attempt to decode and return the next byte value as-is. | ||||
* | ||||
* Keep it simple and assume narrow build (up to 3 bytes). | ||||
*/ | ||||
static unsigned int next_utf8_character(const char * &st, bool &error) { | ||||
unsigned int c = st[0]; | ||||
if (!error) { | ||||
// Byte 1: | ||||
// 0b0xxxxxxx -> 1 byte | ||||
// 0b110xxxxx -> 2 byte | ||||
// 0b1110xxxx -> 3 byte (max unicode value 0xFFFF) | ||||
// 0b11110xxx -> 4 byte (would need wide build) | ||||
if (masked_byte_equals(c, 0xe0 /* 0b11100000 */, 0xc0 /* 0b11000000 */)) { | ||||
if (byte_check_10xxxxxx(st[1])) { | ||||
c &= 0x1f /* 0b00011111 */; | ||||
c = (c << 6) | (st[1] & 0x3f) /* 0b00111111 */; | ||||
st += 1; | ||||
} else { | ||||
error = true; | ||||
} | ||||
} else if (masked_byte_equals(c, 0xf0 /* 0b11110000 */, 0xe0 /* 0b11100000 * | ||||
/)) { | ||||
if (byte_check_10xxxxxx(st[1]) && byte_check_10xxxxxx(st[2])) { | ||||
c &= 0x0f /* 0b00001111 */; | ||||
c = (c << 6) | (st[1] & 0x3f) /* 0b00111111 */; | ||||
c = (c << 6) | (st[2] & 0x3f) /* 0b00111111 */; | ||||
st += 2; | ||||
} else { | ||||
error = true; | ||||
} | ||||
} | ||||
} | ||||
st += 1; | ||||
return c; | ||||
} | ||||
static const char *FontGLUTRenderOpenGL(RenderInfo * info, CFontGLUT * I, const char *st, float size, | static const char *FontGLUTRenderOpenGL(RenderInfo * info, CFontGLUT * I, const char *st, float size, | |||
float *rpos SHADERCGOARG) | float *rpos SHADERCGOARG) | |||
{ | { | |||
PyMOLGlobals *G = I->Font.G; | PyMOLGlobals *G = I->Font.G; | |||
if(G->ValidContext) { | if(G->ValidContext) { | |||
int c; | int c; | |||
FontGLUTBitmapFontRec *font_info = I->glutFont; | FontGLUTBitmapFontRec *font_info = I->glutFont; | |||
int first, last; | int first, last; | |||
FontGLUTBitmapCharRec const *ch; | FontGLUTBitmapCharRec const *ch; | |||
int textured = true && SHADERCGOARGV; | int textured = true && SHADERCGOARGV; | |||
int pushed = OrthoGetPushed(G); | int pushed = OrthoGetPushed(G); | |||
int sampling = 1; | int sampling = 1; | |||
const float _0 = 0.0F, _1 = 1.0F, _m1 = -1.0F; | const float _0 = 0.0F, _1 = 1.0F, _m1 = -1.0F; | |||
float x_indent = 0.0F, y_indent = 0.0F, z_indent = 0.0F; | float x_indent = 0.0F, y_indent = 0.0F, z_indent = 0.0F; | |||
if(info) | if(info) | |||
sampling = info->sampling; | sampling = info->sampling; | |||
sampling = DIP2PIXEL(sampling); | ||||
if(st && (*st)) { | if(st && (*st)) { | |||
float v_scale = SceneGetScreenVertexScale(G, NULL); | float v_scale = SceneGetScreenVertexScale(G, NULL); | |||
first = font_info->first; | first = font_info->first; | |||
last = first + font_info->num_chars; | last = first + font_info->num_chars; | |||
if(rpos) { | if(rpos) { | |||
if(rpos[0] < _1) { /* we need to measure the string width before st arting to draw */ | if(rpos[0] < _1) { /* we need to measure the string width before st arting to draw */ | |||
float factor = rpos[0] / 2.0F - 0.5F; | float factor = rpos[0] / 2.0F - 0.5F; | |||
const char *sst = st; | const char *sst = st; | |||
if(factor < _m1) | if(factor < _m1) | |||
factor = _m1; | factor = _m1; | |||
if(factor > _0) | if(factor > _0) | |||
factor = _0; | factor = _0; | |||
while((c = *(sst++))) { | bool utf8_error = false; | |||
if((c >= first) && (c < last)) { | while((c = next_utf8_character(sst, utf8_error))) { | |||
if(c < first || c >= last) { | ||||
c = '?'; | ||||
} | ||||
{ | ||||
ch = font_info->ch[c - first]; | ch = font_info->ch[c - first]; | |||
if(ch) { | if(ch) { | |||
x_indent -= factor * ch->advance; | x_indent -= factor * ch->advance; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
if(rpos[0] < _m1) { | if(rpos[0] < _m1) { | |||
x_indent -= (rpos[0] + _1) / v_scale; | x_indent -= (rpos[0] + _1) / v_scale; | |||
} else if(rpos[0] > _1) { | } else if(rpos[0] > _1) { | |||
skipping to change at line 190 | skipping to change at line 250 | |||
if(!textured) { | if(!textured) { | |||
glColor3fv(TextGetColor(G)); | glColor3fv(TextGetColor(G)); | |||
glRasterPos4fv(TextGetPos(G)); | glRasterPos4fv(TextGetPos(G)); | |||
FontGLUTSave(I); | FontGLUTSave(I); | |||
} | } | |||
if(textured) | if(textured) | |||
CharacterRenderOpenGLPrime(G, info); | CharacterRenderOpenGLPrime(G, info); | |||
while((c = *(st++))) { | ||||
if((c >= first) && (c < last)) { | bool utf8_error = false; | |||
while((c = next_utf8_character(st, utf8_error))) { | ||||
if(c < first || c >= last) { | ||||
c = '?'; | ||||
} | ||||
{ | ||||
ch = font_info->ch[c - first]; | ch = font_info->ch[c - first]; | |||
if(ch) { | if(ch) { | |||
if(!textured) { | if(!textured) { | |||
#ifndef PURE_OPENGL_ES_2 | #ifndef PURE_OPENGL_ES_2 | |||
glBitmap(ch->width, ch->height, | glBitmap(ch->width, ch->height, | |||
ch->xorig, ch->yorig, ch->advance, 0, ch->bitmap); | ch->xorig, ch->yorig, ch->advance, 0, ch->bitmap); | |||
#endif | #endif | |||
TextAdvance(G, ch->advance); | TextAdvance(G, ch->advance); | |||
} else { | } else { | |||
End of changes. 4 change blocks. | ||||
4 lines changed or deleted | 70 lines changed or added |