void UtilSortInPlace(PyMOLGlobals *G,void *array,int nItem, unsigned int itemSize, UtilOrderFn *fOrdered) { char *tmp; int *index; int ia; int a; if(nItem>0) { tmp = pymol::malloc<char>((itemSize*nItem)); index = pymol::malloc<int>(nItem+1); ErrChkPtr(G,tmp); ErrChkPtr(G,index); UtilSortIndex(nItem,array,index,fOrdered); for(a=0;a<nItem;a++) index[a]++; /* ^tricky index adjustment to avoid flag array */ for(a=0;a<nItem;a++) { ia = abs(index[a])-1; /* ^ */ if(ia!=a) { if(index[a]>0) /* this record not yet copied, so save copy */ { memcpy(((char*)tmp )+(a*itemSize), ((char*)array)+(a*itemSize), itemSize); index[a] = -index[a]; /* set nega-flag */ } if(index[ia]<0) /* nega-flag, so record is stored in tmp */ memcpy(((char*)array)+(a*itemSize), ((char*)tmp )+(ia*itemSize), itemSize); else { memcpy(((char*)array)+(a*itemSize), ((char*)array)+(ia*itemSize), itemSize); index[ia] = -index[ia]; /* nega-flag: record doesn't need to be backed up */ } } } mfree(tmp); mfree(index); } }
Rep *RepLabelNew(CoordSet * cs, int state) { PyMOLGlobals *G = cs->State.G; ObjectMolecule *obj; int a, a1, vFlag, c1; float *v, *v0, *vc; float *lab_pos; int *l; int label_color; LabPosType *lp = NULL; Pickable *rp = NULL; AtomInfoType *ai; OOAlloc(G, RepLabel); obj = cs->Obj; vFlag = false; if(obj->RepVisCache[cRepLabel]) for(a = 0; a < cs->NIndex; a++) { if(obj->AtomInfo[cs->IdxToAtm[a]].visRep[cRepLabel]) { vFlag = true; break; } } if(!vFlag) { OOFreeP(I); return (NULL); /* skip if no label are visible */ } label_color = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_label_color); RepInit(G, &I->R); obj = cs->Obj; I->R.fRender = (void (*)(struct Rep *, RenderInfo *)) RepLabelRender; I->R.fFree = (void (*)(struct Rep *)) RepLabelFree; I->R.fRecolor = NULL; I->R.obj = (CObject *) obj; I->R.cs = cs; I->R.context.object = (void *) obj; I->R.context.state = state; /* raytracing primitives */ I->L = Alloc(int, cs->NIndex); ErrChkPtr(G, I->L); I->V = (float *) mmalloc(sizeof(float) * cs->NIndex * 9); ErrChkPtr(G, I->V); I->OutlineColor = SettingGet_i(G, cs->Setting, obj->Obj.Setting, cSetting_label_outline_color); lab_pos = SettingGet_3fv(G, cs->Setting, obj->Obj.Setting, cSetting_label_position); if(SettingGet_f(G, cs->Setting, obj->Obj.Setting, cSetting_pickable)) { I->R.P = Alloc(Pickable, cs->NIndex + 1); ErrChkPtr(G, I->R.P); rp = I->R.P + 1; /* skip first record! */ } I->N = 0; v = I->V; l = I->L; for(a = 0; a < cs->NIndex; a++) { a1 = cs->IdxToAtm[a]; ai = obj->AtomInfo + a1; if(cs->LabPos) { lp = cs->LabPos + a; } if(ai->visRep[cRepLabel] && (ai->label)) { int at_label_color; AtomInfoGetSetting_color(G, ai, cSetting_label_color, label_color, &at_label_color); /* float at_label_pos = lab_pos; AtomInfoGetSetting_3fv(G, ai, cSetting_label_position, label_pos, &at_label_pos); */ I->N++; if((at_label_color >= 0) || (at_label_color == cColorFront) || (at_label_color == cColorBack)) c1 = at_label_color; else c1 = *(cs->Color + a); vc = ColorGet(G, c1); /* save new color */ *(v++) = *(vc++); *(v++) = *(vc++); *(v++) = *(vc++); v0 = cs->Coord + 3 * a; *(v++) = *(v0++); *(v++) = *(v0++); *(v++) = *(v0++); if(lp) { switch (lp->mode) { case 1: /* local absolute positioning, global relative */ add3f(lp->offset, v - 3, v - 3); copy3f(lab_pos, v); break; default: copy3f(lab_pos, v); break; } } else { copy3f(lab_pos, v); } v += 3; if(rp) { rp->index = a1; rp->bond = cPickableLabel; /* label indicator */ rp++; } *(l++) = ai->label; } } if(I->N) { I->V = ReallocForSure(I->V, float, (v - I->V)); I->L = ReallocForSure(I->L, int, (l - I->L)); if(rp) { I->R.P = ReallocForSure(I->R.P, Pickable, (rp - I->R.P)); I->R.P[0].index = I->N; /* unnec? */ } } else {