Text.cpp (pymol-v2.1.0.tar.bz2) | : | Text.cpp (pymol-open-source-2.2.0) | ||
---|---|---|---|---|
skipping to change at line 27 | skipping to change at line 27 | |||
#include"os_python.h" | #include"os_python.h" | |||
#include"MemoryDebug.h" | #include"MemoryDebug.h" | |||
#include"Text.h" | #include"Text.h" | |||
#include"Font.h" | #include"Font.h" | |||
#include"FontGLUT.h" | #include"FontGLUT.h" | |||
#include"FontType.h" | #include"FontType.h" | |||
#include"Color.h" | #include"Color.h" | |||
#include"Vector.h" | #include"Vector.h" | |||
#include"Executive.h" | ||||
#ifdef _PYMOL_FREETYPE | #ifdef _PYMOL_FREETYPE | |||
#include "FontTTF.h" | #include "FontTTF.h" | |||
#include "FontTTF2.h" | #include "FontTTF2.h" | |||
#endif | #endif | |||
#define FONT_NAME_MAX 255 | #define FONT_NAME_MAX 255 | |||
#define TEXT_DEFAULT_SIZE 12.0F | #define TEXT_DEFAULT_SIZE 12.0F | |||
static const float _255 = 255.0F; | static const float _255 = 255.0F; | |||
skipping to change at line 48 | skipping to change at line 49 | |||
typedef struct { | typedef struct { | |||
int Src; | int Src; | |||
int Code; | int Code; | |||
char Name[FONT_NAME_MAX]; | char Name[FONT_NAME_MAX]; | |||
int Mode; | int Mode; | |||
int Style; | int Style; | |||
CFont *Font; | CFont *Font; | |||
} ActiveRec; | } ActiveRec; | |||
#define NFONTS 20 | ||||
struct _CText { | struct _CText { | |||
int NActive; | int NActive; | |||
ActiveRec *Active; | ActiveRec *Active; | |||
float Pos[4]; | float Pos[4]; | |||
float WorldPos[4]; | float WorldPos[4]; | |||
float ScreenWorldOffset[3]; | float ScreenWorldOffset[3]; | |||
float TargetPos[3]; | ||||
float LabelPushPos[3]; | ||||
float LabelPos[3]; | ||||
unsigned char LabelPosIsSet; // 1 for just z, 2 for 3f | ||||
float TextIndentFactor[2]; | ||||
float Color[4]; | float Color[4]; | |||
unsigned char UColor[4]; | unsigned char UColor[4]; | |||
unsigned char OutlineColor[4]; | unsigned char OutlineColor[4]; | |||
int Default_ID; | int Default_ID; | |||
int Flat; | float Height, Width; | |||
float Spacing, Just; | ||||
float LabelBuf[2]; | ||||
int XHRFetched[NFONTS]; | ||||
int XHRFailed[NFONTS]; | ||||
bool Flat, IsPicking; | ||||
}; | }; | |||
static void TextUpdateUColor(CText * I) | static void TextUpdateUColor(CText * I) | |||
{ | { | |||
I->UColor[0] = (unsigned char) (_255 * I->Color[0] + _499); | I->UColor[0] = (unsigned char) (_255 * I->Color[0] + _499); | |||
I->UColor[1] = (unsigned char) (_255 * I->Color[1] + _499); | I->UColor[1] = (unsigned char) (_255 * I->Color[1] + _499); | |||
I->UColor[2] = (unsigned char) (_255 * I->Color[2] + _499); | I->UColor[2] = (unsigned char) (_255 * I->Color[2] + _499); | |||
I->UColor[3] = (unsigned char) (_255 * I->Color[3] + _499); | I->UColor[3] = (unsigned char) (_255 * I->Color[3] + _499); | |||
} | } | |||
void TextSetPosNColor(PyMOLGlobals * G, float *pos, float *color) | void TextSetLabelBkgrdInfo(PyMOLGlobals * G, float label_spacing, float label_ju | |||
st, const float *buff){ | ||||
CText *I = G->Text; | ||||
I->Spacing = label_spacing; | ||||
I->Just = label_just; | ||||
if (buff){ | ||||
I->LabelBuf[0] = buff[0]; | ||||
I->LabelBuf[1] = buff[1]; | ||||
} else { | ||||
I->LabelBuf[0] = I->LabelBuf[1] = .2f; | ||||
} | ||||
} | ||||
void TextSetIsPicking(PyMOLGlobals * G, bool IsPicking) | ||||
{ | ||||
CText *I = G->Text; | ||||
I->IsPicking = IsPicking; | ||||
} | ||||
bool TextGetIsPicking(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->IsPicking; | ||||
} | ||||
void TextSetPosNColor(PyMOLGlobals * G, const float *pos, const float *color) | ||||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
copy3f(pos, I->Pos); | copy3f(pos, I->Pos); | |||
copy3f(color, I->Color); | copy3f(color, I->Color); | |||
I->Flat = false; | I->Flat = false; | |||
I->Pos[3] = 1.0F; | I->Pos[3] = 1.0F; | |||
I->Color[3] = 1.0F; | I->Color[3] = 1.0F; | |||
TextUpdateUColor(I); | TextUpdateUColor(I); | |||
} | } | |||
void TextAdvance(PyMOLGlobals * G, float advance) | void TextAdvance(PyMOLGlobals * G, float advance) | |||
{ | { | |||
G->Text->Pos[0] += advance; | G->Text->Pos[0] += advance; | |||
} | } | |||
void TextSetLabPos(PyMOLGlobals * G, float *pos, LabPosType * labpos, const char *text) | void TextSetLabPos(PyMOLGlobals * G, const float *pos, const LabPosType * labpos , const char *text) | |||
{ | { | |||
if((!labpos) || (!labpos->mode)) | if((!labpos) || (!labpos->mode)) | |||
TextSetPos(G, pos); | TextSetPos(G, pos); | |||
else { | else { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
switch (labpos->mode) { | switch (labpos->mode) { | |||
default: | default: | |||
copy3f(pos, I->Pos); | copy3f(pos, I->Pos); | |||
add3f(labpos->offset, I->Pos, I->Pos); | add3f(labpos->offset, I->Pos, I->Pos); | |||
break; | break; | |||
skipping to change at line 107 | skipping to change at line 145 | |||
} | } | |||
} | } | |||
void TextIndent(PyMOLGlobals * G, float x, float y) | void TextIndent(PyMOLGlobals * G, float x, float y) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
I->Pos[0] -= x; | I->Pos[0] -= x; | |||
I->Pos[1] -= y; | I->Pos[1] -= y; | |||
} | } | |||
void TextSetPos(PyMOLGlobals * G, float *pos) | void TextSetPos(PyMOLGlobals * G, const float *pos) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
copy3f(pos, I->Pos); | copy3f(pos, I->Pos); | |||
I->Pos[3] = 1.0F; | I->Pos[3] = 1.0F; | |||
} | } | |||
void TextSetWorldPos(PyMOLGlobals * G, float *pos) | void TextSetWorldPos(PyMOLGlobals * G, const float *pos) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
copy3f(pos, I->WorldPos); | copy3f(pos, I->WorldPos); | |||
I->WorldPos[3] = 1.0F; | I->WorldPos[3] = 1.0F; | |||
} | } | |||
float *TextGetWorldPos(PyMOLGlobals * G){ | float *TextGetWorldPos(PyMOLGlobals * G){ | |||
CText *I = G->Text; | CText *I = G->Text; | |||
return I->WorldPos; | return I->WorldPos; | |||
} | } | |||
void TextSetScreenWorldOffset(PyMOLGlobals * G, float *pos) | void TextSetLabelPos(PyMOLGlobals * G, const float *pos) | |||
{ | ||||
CText *I = G->Text; | ||||
copy3f(pos, I->LabelPos); | ||||
} | ||||
float *TextGetLabelPos(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return (I->LabelPos); | ||||
} | ||||
void TextSetLabelPosIsSet(PyMOLGlobals * G, unsigned char isSet) | ||||
{ | ||||
CText *I = G->Text; | ||||
I->LabelPosIsSet = isSet; | ||||
} | ||||
unsigned char TextGetLabelPosIsSet(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->LabelPosIsSet; | ||||
} | ||||
void TextSetLabelPushPos(PyMOLGlobals * G, const float *pos) | ||||
{ | ||||
CText *I = G->Text; | ||||
copy3f(pos, I->LabelPushPos); | ||||
} | ||||
float *TextGetLabelPushPos(PyMOLGlobals * G){ | ||||
CText *I = G->Text; | ||||
return I->LabelPushPos; | ||||
} | ||||
void TextSetScreenWorldOffset(PyMOLGlobals * G, const float *pos) | ||||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
I->ScreenWorldOffset[0] = -pos[0]; | I->ScreenWorldOffset[0] = -pos[0]; | |||
I->ScreenWorldOffset[1] = -pos[1]; | I->ScreenWorldOffset[1] = -pos[1]; | |||
I->ScreenWorldOffset[2] = -pos[2]; | I->ScreenWorldOffset[2] = -pos[2]; | |||
} | } | |||
float *TextGetScreenWorldOffset(PyMOLGlobals * G){ | float *TextGetScreenWorldOffset(PyMOLGlobals * G){ | |||
CText *I = G->Text; | CText *I = G->Text; | |||
return I->ScreenWorldOffset; | return I->ScreenWorldOffset; | |||
} | } | |||
void TextSetTargetPos(PyMOLGlobals * G, const float *pos){ | ||||
CText *I = G->Text; | ||||
copy3f(pos, I->TargetPos); | ||||
} | ||||
float *TextGetTargetPos(PyMOLGlobals * G){ | ||||
CText *I = G->Text; | ||||
return I->TargetPos; | ||||
} | ||||
void TextDrawSubStrFast(PyMOLGlobals * G, const char *c, int x, int y, int start , int n ORTHOCGOARG) | void TextDrawSubStrFast(PyMOLGlobals * G, const char *c, int x, int y, int start , int n ORTHOCGOARG) | |||
{ | { | |||
c += start; | c += start; | |||
TextSetPos2i(G, x, y); | TextSetPos2i(G, x, y); | |||
if(n) | if(n) | |||
while(*c) { | while(*c) { | |||
n--; | n--; | |||
TextDrawChar(G, *(c++) ORTHOCGOARGVAR); | TextDrawChar(G, *(c++) ORTHOCGOARGVAR); | |||
if(n <= 0) | if(n <= 0) | |||
skipping to change at line 177 | skipping to change at line 256 | |||
static void TextSetPos3f(PyMOLGlobals * G, float x, float y, float z) | static void TextSetPos3f(PyMOLGlobals * G, float x, float y, float z) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
I->Pos[0] = x; | I->Pos[0] = x; | |||
I->Pos[1] = y; | I->Pos[1] = y; | |||
I->Pos[2] = z; | I->Pos[2] = z; | |||
I->Pos[3] = 1.0F; | I->Pos[3] = 1.0F; | |||
} | } | |||
void TextSetColor(PyMOLGlobals * G, float *color) | void TextSetColor(PyMOLGlobals * G, const float *color) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
copy3f(color, I->Color); | copy3f(color, I->Color); | |||
I->Color[3] = 1.0F; | I->Color[3] = 1.0F; | |||
I->Flat = false; | I->Flat = false; | |||
TextUpdateUColor(I); | TextUpdateUColor(I); | |||
} | } | |||
void TextSetColor3f(PyMOLGlobals * G, float red, float green, float blue) | void TextSetColor3f(PyMOLGlobals * G, float red, float green, float blue) | |||
{ | { | |||
skipping to change at line 201 | skipping to change at line 280 | |||
I->Color[1] = green; | I->Color[1] = green; | |||
I->Color[2] = blue; | I->Color[2] = blue; | |||
I->Color[3] = 1.0F; | I->Color[3] = 1.0F; | |||
TextUpdateUColor(I); | TextUpdateUColor(I); | |||
} | } | |||
void TextSetOutlineColor(PyMOLGlobals * G, int color) | void TextSetOutlineColor(PyMOLGlobals * G, int color) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
if(color >= 0) { | if(color >= 0) { | |||
float *fcolor = ColorGet(G, color); | const float *fcolor = ColorGet(G, color); | |||
I->OutlineColor[0] = (unsigned char) (_255 * fcolor[0]); | I->OutlineColor[0] = (unsigned char) (_255 * fcolor[0]); | |||
I->OutlineColor[1] = (unsigned char) (_255 * fcolor[1]); | I->OutlineColor[1] = (unsigned char) (_255 * fcolor[1]); | |||
I->OutlineColor[2] = (unsigned char) (_255 * fcolor[2]); | I->OutlineColor[2] = (unsigned char) (_255 * fcolor[2]); | |||
I->OutlineColor[3] = 0xFF; | I->OutlineColor[3] = 0xFF; | |||
} else { | } else { | |||
I->OutlineColor[3] = 0; | I->OutlineColor[3] = 0; | |||
} | } | |||
} | } | |||
static const float _inv255 = 1.0F / 255.0F; | static const float _inv255 = 1.0F / 255.0F; | |||
skipping to change at line 231 | skipping to change at line 310 | |||
I->UColor[1] = ((unsigned char) ((index & 0xF0) | 0x8)); | I->UColor[1] = ((unsigned char) ((index & 0xF0) | 0x8)); | |||
I->UColor[2] = ((unsigned char) ((index & 0xF00) >> 4)); | I->UColor[2] = ((unsigned char) ((index & 0xF00) >> 4)); | |||
I->UColor[3] = 0xFF; | I->UColor[3] = 0xFF; | |||
I->Color[0] = I->UColor[0] * _inv255; | I->Color[0] = I->UColor[0] * _inv255; | |||
I->Color[1] = I->UColor[1] * _inv255; | I->Color[1] = I->UColor[1] * _inv255; | |||
I->Color[2] = I->UColor[2] * _inv255; | I->Color[2] = I->UColor[2] * _inv255; | |||
I->Color[3] = 1.0F; | I->Color[3] = 1.0F; | |||
} | } | |||
void TextSetColorFromUColor(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
I->Color[0] = I->UColor[0] * _inv255; | ||||
I->Color[1] = I->UColor[1] * _inv255; | ||||
I->Color[2] = I->UColor[2] * _inv255; | ||||
I->Color[3] = 1.0F; | ||||
} | ||||
float *TextGetPos(PyMOLGlobals * G) | float *TextGetPos(PyMOLGlobals * G) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
return I->Pos; | return I->Pos; | |||
} | } | |||
float TextGetWidth(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->Width; | ||||
} | ||||
float TextGetHeight(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->Height; | ||||
} | ||||
void TextSetIndentFactorX(PyMOLGlobals * G, float factor){ | ||||
CText *I = G->Text; | ||||
I->TextIndentFactor[0] = factor; | ||||
} | ||||
void TextSetIndentFactorY(PyMOLGlobals * G, float factor){ | ||||
CText *I = G->Text; | ||||
I->TextIndentFactor[1] = factor; | ||||
} | ||||
float *TextGetIndentFactor(PyMOLGlobals * G){ | ||||
CText *I = G->Text; | ||||
return I->TextIndentFactor; | ||||
} | ||||
void TextSetWidth(PyMOLGlobals * G, float text_width) | ||||
{ | ||||
CText *I = G->Text; | ||||
I->Width = text_width; | ||||
} | ||||
void TextSetHeight(PyMOLGlobals * G, float text_height) | ||||
{ | ||||
CText *I = G->Text; | ||||
I->Height = text_height; | ||||
} | ||||
float *TextGetColor(PyMOLGlobals * G) | float *TextGetColor(PyMOLGlobals * G) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
return I->Color; | return I->Color; | |||
} | } | |||
unsigned char *TextGetColorUChar4uv(PyMOLGlobals * G){ | ||||
CText *I = G->Text; | ||||
return I->UColor; | ||||
} | ||||
void TextGetColorUChar(PyMOLGlobals * G, unsigned char *red, | void TextGetColorUChar(PyMOLGlobals * G, unsigned char *red, | |||
unsigned char *green, unsigned char *blue, unsigned char *alpha) | unsigned char *green, unsigned char *blue, unsigned char *alpha) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
*red = I->UColor[0]; | *red = I->UColor[0]; | |||
*green = I->UColor[1]; | *green = I->UColor[1]; | |||
*blue = I->UColor[2]; | *blue = I->UColor[2]; | |||
*alpha = I->UColor[3]; | *alpha = I->UColor[3]; | |||
} | } | |||
skipping to change at line 265 | skipping to change at line 396 | |||
unsigned char *green, unsigned char *blue, unsigned cha r *alpha) | unsigned char *green, unsigned char *blue, unsigned cha r *alpha) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
*red = I->OutlineColor[0]; | *red = I->OutlineColor[0]; | |||
*green = I->OutlineColor[1]; | *green = I->OutlineColor[1]; | |||
*blue = I->OutlineColor[2]; | *blue = I->OutlineColor[2]; | |||
*alpha = I->OutlineColor[3]; | *alpha = I->OutlineColor[3]; | |||
} | } | |||
const char *TextRenderOpenGL(PyMOLGlobals * G, RenderInfo * info, int text_id, | const char *TextRenderOpenGL(PyMOLGlobals * G, RenderInfo * info, int text_id, | |||
const char *st, float size, float *rpos, CGO *shaderCGO) | const char *st, float size, float *rpos, | |||
short needSize, short relativeMode, short shouldRender, | ||||
CGO *shaderCGO) | ||||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
CFont *font; | CFont *font; | |||
FontRenderOpenGLFn *fn; | FontRenderOpenGLFn *fn; | |||
if((text_id < 0) || (text_id >= I->NActive)) | if((text_id < 0) || (text_id >= I->NActive)) | |||
text_id = 0; | text_id = 0; | |||
if(st && (*st)) { | if(st && (*st)) { | |||
if((text_id >= 0) && (text_id < I->NActive)) { | if((text_id >= 0) && (text_id < I->NActive)) { | |||
if (I->Active[text_id].Font) { | ||||
font = I->Active[text_id].Font; | font = I->Active[text_id].Font; | |||
if(I->Flat) | if(I->Flat) | |||
fn = font->fRenderOpenGLFlat; | fn = font->fRenderOpenGLFlat; | |||
else | else | |||
fn = font->fRenderOpenGL; | fn = font->fRenderOpenGL; | |||
if(fn) | if(fn) | |||
return fn(info, font, st, size, rpos SHADERCGOARGVAR); | return fn(info, font, st, size, rpos, needSize, relativeMode, shouldRen | |||
der SHADERCGOARGVAR); | ||||
} | ||||
} | } | |||
/* make sure we got to end of string */ | /* make sure we got to end of string */ | |||
if(*st) | if(*st) | |||
while(*(st++)); | while(*(st++)); | |||
} | } | |||
return st; | return st; | |||
} | } | |||
void TextDrawStrAt(PyMOLGlobals * G, const char *st, int x, int y ORTHOCGOARG) | void TextDrawStrAt(PyMOLGlobals * G, const char *st, int x, int y ORTHOCGOARG) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
TextSetPos3f(G, (float) x, (float) y, 0.0F); | TextSetPos3f(G, (float) x, (float) y, 0.0F); | |||
TextRenderOpenGL(G, NULL, I->Default_ID, st, TEXT_DEFAULT_SIZE, NULL ORTHOCGOA RGVAR); | TextRenderOpenGL(G, NULL, I->Default_ID, st, TEXT_DEFAULT_SIZE, NULL, false, 0 , 1 ORTHOCGOARGVAR); | |||
} | } | |||
void TextDrawStr(PyMOLGlobals * G, const char *st ORTHOCGOARG) | void TextDrawStr(PyMOLGlobals * G, const char *st ORTHOCGOARG) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
TextRenderOpenGL(G, NULL, I->Default_ID, st, TEXT_DEFAULT_SIZE, NULL ORTHOCGOA RGVAR); | TextRenderOpenGL(G, NULL, I->Default_ID, st, TEXT_DEFAULT_SIZE, NULL, false, 0 , 1 ORTHOCGOARGVAR); | |||
} | } | |||
void TextDrawChar(PyMOLGlobals * G, char ch ORTHOCGOARG) | void TextDrawChar(PyMOLGlobals * G, char ch ORTHOCGOARG) | |||
{ | { | |||
char st[2] = { 0, 0 }; | char st[2] = { 0, 0 }; | |||
CText *I = G->Text; | CText *I = G->Text; | |||
st[0] = ch; | st[0] = ch; | |||
TextRenderOpenGL(G, NULL, I->Default_ID, st, TEXT_DEFAULT_SIZE, NULL ORTHOCGOA RGVAR); | TextRenderOpenGL(G, NULL, I->Default_ID, st, TEXT_DEFAULT_SIZE, NULL, false, 0 , 1 ORTHOCGOARGVAR); | |||
} | } | |||
const char *TextRenderRay(PyMOLGlobals * G, CRay * ray, int text_id, | const char *TextRenderRay(PyMOLGlobals * G, CRay * ray, int text_id, | |||
const char *st, float size, float *rpos) | const char *st, float size, float *rpos, short needSize, short relativeMode) | |||
{ | { | |||
CText *I = G->Text; | CText *I = G->Text; | |||
CFont *font; | CFont *font; | |||
FontRenderRayFn *fn; | FontRenderRayFn *fn; | |||
if((text_id < 0) || (text_id >= I->NActive)) | if((text_id < 0) || (text_id >= I->NActive)) | |||
text_id = 0; | text_id = 0; | |||
if(st && (*st)) { | if(st && (*st)) { | |||
if((text_id >= 0) && (text_id < I->NActive)) { | if((text_id >= 0) && (text_id < I->NActive)) { | |||
font = I->Active[text_id].Font; | font = I->Active[text_id].Font; | |||
if(size >= 0.0F) | if(size >= 0.0F) | |||
size *= ray->Magnified; | size *= ray->Magnified; | |||
fn = font->fRenderRay; | fn = font->fRenderRay; | |||
if(fn) | if(fn) | |||
return fn(ray, font, st, size, rpos); | return fn(ray, font, st, size, rpos, needSize, relativeMode); | |||
} | } | |||
/* make sure we got to end of string */ | /* make sure we got to end of string */ | |||
if(*st) | if(*st) | |||
while(*(st++)); | while(*(st++)); | |||
} | } | |||
return st; | return st; | |||
} | } | |||
int TextInit(PyMOLGlobals * G) | int TextInit(PyMOLGlobals * G) | |||
{ | { | |||
CText *I = NULL; | CText *I = NULL; | |||
if((I = (G->Text = Calloc(CText, 1)))) { | if((I = (G->Text = Calloc(CText, 1)))) { | |||
int i = 0; | ||||
for (; i < NFONTS; i++) { | ||||
I->XHRFetched[i] = 0; | ||||
I->XHRFailed[i] = 0; | ||||
} | ||||
I->NActive = 0; | I->NActive = 0; | |||
I->Active = VLACalloc(ActiveRec, 10); | I->Active = VLACalloc(ActiveRec, 10); | |||
I->Default_ID = 0; | I->Default_ID = 0; | |||
I->Flat = false; | I->Flat = false; | |||
/* font 0 is old reliable GLUT 8x13 */ | /* font 0 is old reliable GLUT 8x13 */ | |||
VLACheck(I->Active, ActiveRec, I->NActive); | VLACheck(I->Active, ActiveRec, I->NActive); | |||
I->Active[I->NActive].Font = FontGLUTNew(G, cFontGLUT8x13); | I->Active[I->NActive].Font = FontGLUTNew(G, cFontGLUT8x13); | |||
skipping to change at line 611 | skipping to change at line 751 | |||
int a; | int a; | |||
CFont *fp; | CFont *fp; | |||
for(a = 0; a < I->NActive; a++) { | for(a = 0; a < I->NActive; a++) { | |||
fp = I->Active[a].Font; | fp = I->Active[a].Font; | |||
if(fp && fp->fFree) | if(fp && fp->fFree) | |||
fp->fFree(fp); | fp->fFree(fp); | |||
} | } | |||
VLAFreeP(I->Active); | VLAFreeP(I->Active); | |||
FreeP(G->Text); | FreeP(G->Text); | |||
} | } | |||
float TextGetSpacing(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->Spacing; | ||||
} | ||||
float TextGetJustification(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->Just; | ||||
} | ||||
float *TextGetLabelBuffer(PyMOLGlobals * G) | ||||
{ | ||||
CText *I = G->Text; | ||||
return I->LabelBuf; | ||||
} | ||||
/* | ||||
* GUI elements like internal menus or the wizard prompt can handle text | ||||
* color markup in the form "\\RGB" where RGB are three digits (0-9) or | ||||
* "---" to reset the color. | ||||
* | ||||
* Return true if `p` starts with "\\RGB" or "\\---". | ||||
*/ | ||||
bool TextStartsWithColorCode(const char *p) | ||||
{ | ||||
if (p[0] != '\\') { | ||||
return false; | ||||
} | ||||
if (p[1] == '-') { | ||||
return p[2] == '-' && p[3] == '-'; | ||||
} | ||||
return ( | ||||
('0' <= p[1] && p[1] <= '9') && | ||||
('0' <= p[2] && p[2] <= '9') && | ||||
('0' <= p[3] && p[3] <= '9')); | ||||
} | ||||
/* | ||||
* Set text color from "\\RGB" code. | ||||
* | ||||
* "\\---" -> defaultcolor | ||||
* | ||||
* Return false if `p` does not start with a color code. | ||||
*/ | ||||
bool TextSetColorFromCode(PyMOLGlobals * G, | ||||
const char *p, | ||||
const float *defaultcolor) | ||||
{ | ||||
if (!TextStartsWithColorCode(p)) { | ||||
return false; | ||||
} | ||||
if (p[1] == '-') { | ||||
TextSetColor(G, defaultcolor); | ||||
} else { | ||||
TextSetColor3f(G, | ||||
(p[1] - '0') / 9.0F, | ||||
(p[2] - '0') / 9.0F, | ||||
(p[3] - '0') / 9.0F); | ||||
} | ||||
return true; | ||||
} | ||||
End of changes. 25 change blocks. | ||||
15 lines changed or deleted | 157 lines changed or added |