191 |
|
double |
192 |
|
io_getohm(int ndx, void *p) |
193 |
|
{ |
194 |
+ |
static void *last_p = NULL; |
195 |
|
static int last_li = -1; |
196 |
|
static double last_ohm; |
197 |
|
ANGLE_BASIS *ab = (ANGLE_BASIS *)p; |
202 |
|
return -1.; |
203 |
|
for (li = 0; ndx >= ab->lat[li].nphis; li++) |
204 |
|
ndx -= ab->lat[li].nphis; |
205 |
< |
if (li == last_li) /* cached latitude? */ |
205 |
> |
if ((p == last_p) & (li == last_li)) /* cached latitude? */ |
206 |
|
return last_ohm; |
207 |
+ |
last_p = p; |
208 |
|
last_li = li; |
209 |
|
theta = M_PI/180. * ab->lat[li].tmin; |
210 |
|
theta1 = M_PI/180. * ab->lat[li+1].tmin; |
296 |
|
{ |
297 |
|
C_COLOR cxy; |
298 |
|
|
299 |
< |
coef[0] = mBSDF_value(dp, i, o); |
299 |
> |
coef[0] = mBSDF_value(dp, o, i); |
300 |
|
if (dp->chroma == NULL) |
301 |
|
return 1; /* grayscale */ |
302 |
|
|
303 |
< |
c_decodeChroma(&cxy, dp->chroma[o*dp->ninc + i]); |
303 |
> |
c_decodeChroma(&cxy, mBSDF_chroma(dp,o,i)); |
304 |
|
c_toSharpRGB(&cxy, coef[0], coef); |
305 |
|
coef[0] *= mtx_RGB_coef[0]; |
306 |
|
coef[1] *= mtx_RGB_coef[1]; |
383 |
|
for (i = dp->ninc; i--; ) { |
384 |
|
double hemi = .0; |
385 |
|
for (o = dp->nout; o--; ) |
386 |
< |
hemi += ohma[o] * mBSDF_value(dp, i, o); |
386 |
> |
hemi += ohma[o] * mBSDF_value(dp, o, i); |
387 |
|
if (hemi > df->maxHemi) |
388 |
|
df->maxHemi = hemi; |
389 |
|
} |
519 |
|
if (rowinc) { |
520 |
|
int r = i/dp->nout; |
521 |
|
int c = i - r*dp->nout; |
522 |
< |
mBSDF_value(dp,r,c) = val; |
522 |
> |
mBSDF_value(dp,c,r) = val; |
523 |
|
} else |
524 |
|
dp->bsdf[i] = val; |
525 |
|
sdata = sdnext; |
624 |
|
coef[c] = (coef[c] - min_coef[c]) / |
625 |
|
mtx_RGB_coef[c]; |
626 |
|
if (c_fromSharpRGB(coef, &cxy) > 1e-5) |
627 |
< |
sm->chroma[o*sm->ninc + i] = c_encodeChroma(&cxy); |
628 |
< |
mBSDF_value(sm,i,o) -= ymin; |
627 |
> |
mBSDF_chroma(sm,o,i) = c_encodeChroma(&cxy); |
628 |
> |
mBSDF_value(sm,o,i) -= ymin; |
629 |
|
} |
630 |
|
/* return colored minimum */ |
631 |
|
for (i = 3; i--; ) |
649 |
|
/* subtract minimum value */ |
650 |
|
dv->cieY = subtract_min(&dv->spec, (SDMat *)df->comp[0].dist); |
651 |
|
df->maxHemi -= dv->cieY; /* adjust maximum hemispherical */ |
652 |
< |
/* make sure everything is set */ |
653 |
< |
c_ccvt(&dv->spec, C_CSXY+C_CSSPEC); |
652 |
> |
|
653 |
> |
c_ccvt(&dv->spec, C_CSXY); /* make sure (x,y) is set */ |
654 |
|
return df; |
655 |
|
} |
656 |
|
|
805 |
|
cmtab[0] = .0; |
806 |
|
for (o = 0; o < cd->calen; o++) { |
807 |
|
if (rev) |
808 |
< |
cmtab[o+1] = mBSDF_value(dp, o, cd->indx) * |
808 |
> |
cmtab[o+1] = mBSDF_value(dp, cd->indx, o) * |
809 |
|
(*dp->ib_ohm)(o, dp->ib_priv); |
810 |
|
else |
811 |
< |
cmtab[o+1] = mBSDF_value(dp, cd->indx, o) * |
811 |
> |
cmtab[o+1] = mBSDF_value(dp, o, cd->indx) * |
812 |
|
(*dp->ob_ohm)(o, dp->ob_priv); |
813 |
|
cmtab[o+1] += cmtab[o]; |
814 |
|
} |
851 |
|
reverse = 1; |
852 |
|
} |
853 |
|
cdlast = NULL; /* check for it in cache list */ |
854 |
+ |
/* PLACE MUTEX LOCK HERE FOR THREAD-SAFE */ |
855 |
|
for (cd = (SDMatCDst *)sdc->cdList; cd != NULL; |
856 |
|
cdlast = cd, cd = cd->next) |
857 |
|
if (cd->indx == myCD.indx && (cd->calen == myCD.calen) & |
875 |
|
cd->next = (SDMatCDst *)sdc->cdList; |
876 |
|
sdc->cdList = (SDCDst *)cd; |
877 |
|
} |
878 |
+ |
/* END MUTEX LOCK */ |
879 |
|
return (SDCDst *)cd; /* ready to go */ |
880 |
|
} |
881 |
|
|
908 |
|
} |
909 |
|
|
910 |
|
/* Fixed resolution BSDF methods */ |
911 |
< |
SDFunc SDhandleMtx = { |
911 |
> |
const SDFunc SDhandleMtx = { |
912 |
|
&SDgetMtxBSDF, |
913 |
|
&SDqueryMtxProjSA, |
914 |
|
&SDgetMtxCDist, |