| 1 | 
– | 
/* Copyright (c) 1997 Silicon Graphics, Inc. */ | 
| 2 | 
– | 
 | 
| 1 | 
  | 
#ifndef lint | 
| 2 | 
< | 
static char SCCSid[] = "$SunId$ SGI"; | 
| 2 | 
> | 
static const char       RCSid[] = "$Id$"; | 
| 3 | 
  | 
#endif | 
| 6 | 
– | 
 | 
| 4 | 
  | 
/* | 
| 5 | 
  | 
 * Quadtree driver support routines. | 
| 6 | 
  | 
 */ | 
| 7 | 
  | 
 | 
| 8 | 
+ | 
#include <string.h> | 
| 9 | 
+ | 
 | 
| 10 | 
  | 
#include "standard.h" | 
| 11 | 
  | 
#include "rhd_qtree.h" | 
| 12 | 
  | 
                                /* quantity of leaves to free at a time */ | 
| 15 | 
  | 
#endif | 
| 16 | 
  | 
                                /* maximum allowed angle difference (deg.) */ | 
| 17 | 
  | 
#ifndef MAXANG | 
| 18 | 
< | 
#define MAXANG          20. | 
| 18 | 
> | 
#define MAXANG          20 | 
| 19 | 
  | 
#endif | 
| 20 | 
+ | 
#if MAXANG>0 | 
| 21 | 
+ | 
#define MAXDIFF2        ( MAXANG*MAXANG * (PI*PI/180./180.)) | 
| 22 | 
+ | 
#endif | 
| 23 | 
  | 
 | 
| 22 | 
– | 
#define MAXDIFF2        (PI*PI/180./180.* MAXANG*MAXANG ) | 
| 23 | 
– | 
 | 
| 24 | 
  | 
#define abs(i)          ((i) < 0 ? -(i) : (i)) | 
| 25 | 
  | 
 | 
| 26 | 
  | 
RTREE   qtrunk;                 /* our quadtree trunk */ | 
| 28 | 
  | 
int     qtMinNodesiz = 2;       /* minimum node dimension (pixels) */ | 
| 29 | 
  | 
struct rleaves  qtL;            /* our pile of leaves */ | 
| 30 | 
  | 
 | 
| 31 | 
+ | 
int     rayqleft = 0;           /* rays left to queue before flush */ | 
| 32 | 
+ | 
 | 
| 33 | 
+ | 
static int32    falleaves;      /* our list of fallen leaves */ | 
| 34 | 
+ | 
 | 
| 35 | 
+ | 
#define composted(li)   (qtL.bl <= qtL.tl ? \ | 
| 36 | 
+ | 
                                        ((li) < qtL.bl || (li) >= qtL.tl) : \ | 
| 37 | 
+ | 
                                        ((li) < qtL.bl && (li) >= qtL.tl)) | 
| 38 | 
+ | 
 | 
| 39 | 
  | 
#define TBUNDLESIZ      409     /* number of twigs in a bundle */ | 
| 40 | 
  | 
 | 
| 41 | 
  | 
static RTREE    **twigbundle;   /* free twig blocks (NULL term.) */ | 
| 42 | 
  | 
static int      nexttwig;       /* next free twig */ | 
| 43 | 
  | 
 | 
| 36 | 
– | 
#define ungetleaf(li)   (qtL.tl=(li))   /* dangerous if used improperly */ | 
| 44 | 
  | 
 | 
| 38 | 
– | 
 | 
| 45 | 
  | 
static RTREE * | 
| 46 | 
  | 
newtwig()                       /* allocate a twig */ | 
| 47 | 
  | 
{ | 
| 55 | 
  | 
        } | 
| 56 | 
  | 
        bi = nexttwig / TBUNDLESIZ; | 
| 57 | 
  | 
        if (twigbundle[bi] == NULL) {   /* new block */ | 
| 58 | 
< | 
                twigbundle = (RTREE **)realloc((char *)twigbundle, | 
| 58 | 
> | 
                twigbundle = (RTREE **)realloc((void *)twigbundle, | 
| 59 | 
  | 
                                        (bi+2)*sizeof(RTREE *)); | 
| 60 | 
  | 
                if (twigbundle == NULL) | 
| 61 | 
  | 
                        goto memerr; | 
| 83 | 
  | 
        nexttwig = 0; | 
| 84 | 
  | 
        if (!really) {          /* just clear allocated blocks */ | 
| 85 | 
  | 
                while (i--) | 
| 86 | 
< | 
                        bzero((char *)twigbundle[i], TBUNDLESIZ*sizeof(RTREE)); | 
| 86 | 
> | 
                        memset((char *)twigbundle[i], '\0', TBUNDLESIZ*sizeof(RTREE)); | 
| 87 | 
  | 
                return; | 
| 88 | 
  | 
        } | 
| 89 | 
  | 
                                /* else "really" means free up memory */ | 
| 90 | 
  | 
        for (i = 0; twigbundle[i] != NULL; i++) | 
| 91 | 
< | 
                free((char *)twigbundle[i]); | 
| 92 | 
< | 
        free((char *)twigbundle); | 
| 91 | 
> | 
                free((void *)twigbundle[i]); | 
| 92 | 
> | 
        free((void *)twigbundle); | 
| 93 | 
  | 
        twigbundle = NULL; | 
| 94 | 
  | 
} | 
| 95 | 
  | 
 | 
| 96 | 
  | 
 | 
| 97 | 
< | 
static int | 
| 92 | 
< | 
newleaf()                       /* allocate a leaf from our pile */ | 
| 93 | 
< | 
{ | 
| 94 | 
< | 
        int     li; | 
| 95 | 
< | 
         | 
| 96 | 
< | 
        li = qtL.tl++; | 
| 97 | 
< | 
        if (qtL.tl >= qtL.nl)   /* get next leaf in ring */ | 
| 98 | 
< | 
                qtL.tl = 0; | 
| 99 | 
< | 
        if (qtL.tl == qtL.bl)   /* need to shake some free */ | 
| 100 | 
< | 
                qtCompost(LFREEPCT); | 
| 101 | 
< | 
        return(li); | 
| 102 | 
< | 
} | 
| 103 | 
< | 
 | 
| 104 | 
< | 
 | 
| 105 | 
< | 
#define LEAFSIZ         (3*sizeof(float)+sizeof(int4)+\ | 
| 97 | 
> | 
#define LEAFSIZ         (3*sizeof(float)+sizeof(int32)+\ | 
| 98 | 
  | 
                        sizeof(TMbright)+6*sizeof(BYTE)) | 
| 99 | 
  | 
 | 
| 100 | 
  | 
int | 
| 121 | 
  | 
                return(0); | 
| 122 | 
  | 
                                /* assign larger alignment types earlier */ | 
| 123 | 
  | 
        qtL.wp = (float (*)[3])qtL.base; | 
| 124 | 
< | 
        qtL.wd = (int4 *)(qtL.wp + n); | 
| 124 | 
> | 
        qtL.wd = (int32 *)(qtL.wp + n); | 
| 125 | 
  | 
        qtL.brt = (TMbright *)(qtL.wd + n); | 
| 126 | 
  | 
        qtL.chr = (BYTE (*)[3])(qtL.brt + n); | 
| 127 | 
  | 
        qtL.rgb = (BYTE (*)[3])(qtL.chr + n); | 
| 128 | 
  | 
        qtL.nl = n; | 
| 129 | 
  | 
        qtL.tml = qtL.bl = qtL.tl = 0; | 
| 130 | 
+ | 
        falleaves = -1; | 
| 131 | 
  | 
        return(n); | 
| 132 | 
  | 
} | 
| 133 | 
  | 
 | 
| 158 | 
  | 
                                tp->flgs &= ~BRF(i); | 
| 159 | 
  | 
                } else if (tp->flgs & LFF(i)) { | 
| 160 | 
  | 
                        li = tp->k[i].li; | 
| 161 | 
< | 
                        if (qtL.bl < qtL.tl ? | 
| 169 | 
< | 
                                (li < qtL.bl || li >= qtL.tl) : | 
| 170 | 
< | 
                                (li < qtL.bl && li >= qtL.tl)) | 
| 161 | 
> | 
                        if (composted(li)) | 
| 162 | 
  | 
                                tp->flgs &= ~LFF(i); | 
| 163 | 
  | 
                } | 
| 164 | 
  | 
} | 
| 168 | 
  | 
qtCompost(pct)                  /* free up some leaves */ | 
| 169 | 
  | 
int     pct; | 
| 170 | 
  | 
{ | 
| 171 | 
+ | 
        register int32  *fl; | 
| 172 | 
  | 
        int     nused, nclear, nmapped; | 
| 181 | 
– | 
 | 
| 173 | 
  | 
                                /* figure out how many leaves to clear */ | 
| 174 | 
  | 
        nclear = qtL.nl * pct / 100; | 
| 175 | 
  | 
        nused = qtL.tl - qtL.bl; | 
| 180 | 
  | 
        if (nclear >= nused) {  /* clear them all */ | 
| 181 | 
  | 
                qtFreeTree(0); | 
| 182 | 
  | 
                qtL.tml = qtL.bl = qtL.tl = 0; | 
| 183 | 
+ | 
                falleaves = -1; | 
| 184 | 
  | 
                return(nused); | 
| 185 | 
  | 
        } | 
| 186 | 
  | 
                                /* else clear leaves from bottom */ | 
| 189 | 
  | 
        qtL.bl += nclear; | 
| 190 | 
  | 
        if (qtL.bl >= qtL.nl) qtL.bl -= qtL.nl; | 
| 191 | 
  | 
        if (nmapped <= nclear) qtL.tml = qtL.bl; | 
| 192 | 
< | 
        shaketree(&qtrunk); | 
| 192 | 
> | 
        shaketree(&qtrunk);     /* dereference composted leaves */ | 
| 193 | 
> | 
        for (fl = &falleaves; *fl >= 0; fl = qtL.wd + *fl) | 
| 194 | 
> | 
                while (composted(*fl)) | 
| 195 | 
> | 
                        if ((*fl = qtL.wd[*fl]) < 0) | 
| 196 | 
> | 
                                return(nclear); | 
| 197 | 
  | 
        return(nclear); | 
| 198 | 
  | 
} | 
| 199 | 
  | 
 | 
| 200 | 
  | 
 | 
| 205 | 
– | 
#define DCSCALE         11585.2         /* (1<<13)*sqrt(2) */ | 
| 206 | 
– | 
#define FXNEG           01 | 
| 207 | 
– | 
#define FYNEG           02 | 
| 208 | 
– | 
#define FZNEG           04 | 
| 209 | 
– | 
#define FXACT           010 | 
| 210 | 
– | 
#define FZACT           020 | 
| 211 | 
– | 
#define F1SFT           5 | 
| 212 | 
– | 
#define F2SFT           18 | 
| 213 | 
– | 
#define FMASK           0x1fff | 
| 214 | 
– | 
 | 
| 215 | 
– | 
static int4 | 
| 216 | 
– | 
encodedir(dv)           /* encode a normalized direction vector */ | 
| 217 | 
– | 
FVECT   dv; | 
| 218 | 
– | 
{ | 
| 219 | 
– | 
        register int4   dc = 0; | 
| 220 | 
– | 
        int     cd[3], cm; | 
| 221 | 
– | 
        register int    i; | 
| 222 | 
– | 
 | 
| 223 | 
– | 
        for (i = 0; i < 3; i++) | 
| 224 | 
– | 
                if (dv[i] < 0.) { | 
| 225 | 
– | 
                        cd[i] = dv[i] * -DCSCALE; | 
| 226 | 
– | 
                        dc |= 1<<i; | 
| 227 | 
– | 
                } else | 
| 228 | 
– | 
                        cd[i] = dv[i] * DCSCALE; | 
| 229 | 
– | 
        if (cd[0] <= cd[1]) { | 
| 230 | 
– | 
                dc |= FXACT | cd[0] << F1SFT; | 
| 231 | 
– | 
                cm = cd[1]; | 
| 232 | 
– | 
        } else { | 
| 233 | 
– | 
                dc |= cd[1] << F1SFT; | 
| 234 | 
– | 
                cm = cd[0]; | 
| 235 | 
– | 
        } | 
| 236 | 
– | 
        if (cd[2] <= cm) | 
| 237 | 
– | 
                dc |= FZACT | cd[2] << F2SFT; | 
| 238 | 
– | 
        else | 
| 239 | 
– | 
                dc |= cm << F2SFT; | 
| 240 | 
– | 
        return(dc); | 
| 241 | 
– | 
} | 
| 242 | 
– | 
 | 
| 243 | 
– | 
 | 
| 244 | 
– | 
static | 
| 245 | 
– | 
decodedir(dv, dc)       /* decode a normalized direction vector */ | 
| 246 | 
– | 
FVECT   dv;     /* returned */ | 
| 247 | 
– | 
register int4   dc; | 
| 248 | 
– | 
{ | 
| 249 | 
– | 
        double  d1, d2, der; | 
| 250 | 
– | 
 | 
| 251 | 
– | 
        d1 = ((dc>>F1SFT & FMASK)+.5)/DCSCALE; | 
| 252 | 
– | 
        d2 = ((dc>>F2SFT & FMASK)+.5)/DCSCALE; | 
| 253 | 
– | 
        der = sqrt(1. - d1*d1 - d2*d2); | 
| 254 | 
– | 
        if (dc & FXACT) { | 
| 255 | 
– | 
                dv[0] = d1; | 
| 256 | 
– | 
                if (dc & FZACT) { dv[1] = der; dv[2] = d2; } | 
| 257 | 
– | 
                else { dv[1] = d2; dv[2] = der; } | 
| 258 | 
– | 
        } else { | 
| 259 | 
– | 
                dv[1] = d1; | 
| 260 | 
– | 
                if (dc & FZACT) { dv[0] = der; dv[2] = d2; } | 
| 261 | 
– | 
                else { dv[0] = d2; dv[2] = der; } | 
| 262 | 
– | 
        } | 
| 263 | 
– | 
        if (dc & FXNEG) dv[0] = -dv[0]; | 
| 264 | 
– | 
        if (dc & FYNEG) dv[1] = -dv[1]; | 
| 265 | 
– | 
        if (dc & FZNEG) dv[2] = -dv[2]; | 
| 266 | 
– | 
} | 
| 267 | 
– | 
 | 
| 268 | 
– | 
 | 
| 269 | 
– | 
static double | 
| 270 | 
– | 
dir2diff(dc1, dc2)              /* relative radians^2 between directions */ | 
| 271 | 
– | 
int4    dc1, dc2; | 
| 272 | 
– | 
{ | 
| 273 | 
– | 
        FVECT   v1, v2; | 
| 274 | 
– | 
 | 
| 275 | 
– | 
        decodedir(v1, dc1); | 
| 276 | 
– | 
        decodedir(v2, dc2); | 
| 277 | 
– | 
 | 
| 278 | 
– | 
        return(2. - 2.*DOT(v1,v2)); | 
| 279 | 
– | 
} | 
| 280 | 
– | 
 | 
| 281 | 
– | 
 | 
| 282 | 
– | 
static double | 
| 283 | 
– | 
fdir2diff(dc1, v2)              /* relative radians^2 between directions */ | 
| 284 | 
– | 
int4    dc1; | 
| 285 | 
– | 
register FVECT  v2; | 
| 286 | 
– | 
{ | 
| 287 | 
– | 
        FVECT   v1; | 
| 288 | 
– | 
 | 
| 289 | 
– | 
        decodedir(v1, dc1); | 
| 290 | 
– | 
 | 
| 291 | 
– | 
        return(2. - 2.*DOT(v1,v2)); | 
| 292 | 
– | 
} | 
| 293 | 
– | 
 | 
| 294 | 
– | 
 | 
| 201 | 
  | 
int | 
| 202 | 
  | 
qtFindLeaf(x, y)                /* find closest leaf to (x,y) */ | 
| 203 | 
  | 
int     x, y; | 
| 236 | 
  | 
 | 
| 237 | 
  | 
 | 
| 238 | 
  | 
static | 
| 239 | 
< | 
addleaf(li)                     /* add a leaf to our tree */ | 
| 240 | 
< | 
int     li; | 
| 239 | 
> | 
putleaf(li, drop)               /* put a leaf in our tree */ | 
| 240 | 
> | 
register int    li; | 
| 241 | 
> | 
int     drop; | 
| 242 | 
  | 
{ | 
| 243 | 
  | 
        register RTREE  *tp = &qtrunk; | 
| 244 | 
  | 
        int     x0=0, y0=0, x1=odev.hres, y1=odev.vres; | 
| 245 | 
< | 
        int     lo = -1; | 
| 245 | 
> | 
        register int    lo = -1; | 
| 246 | 
  | 
        double  d2; | 
| 247 | 
  | 
        int     x, y, mx, my; | 
| 248 | 
  | 
        double  z; | 
| 249 | 
  | 
        FVECT   ip, wp, vd; | 
| 250 | 
  | 
        register int    q; | 
| 251 | 
+ | 
                                        /* check for dead leaf */ | 
| 252 | 
+ | 
        if (!qtL.chr[li][1] && !(qtL.chr[li][0] | qtL.chr[li][2])) | 
| 253 | 
+ | 
                return(0); | 
| 254 | 
  | 
                                        /* compute leaf location in view */ | 
| 255 | 
  | 
        VCOPY(wp, qtL.wp[li]); | 
| 256 | 
  | 
        viewloc(ip, &odev.v, wp); | 
| 257 | 
  | 
        if (ip[2] <= 0. || ip[0] < 0. || ip[0] >= 1. | 
| 258 | 
  | 
                        || ip[1] < 0. || ip[1] >= 1.) | 
| 259 | 
< | 
                return(0);                      /* behind or outside view */ | 
| 259 | 
> | 
                goto dropit;                    /* behind or outside view */ | 
| 260 | 
  | 
#ifdef DEBUG | 
| 261 | 
  | 
        if (odev.v.type == VT_PAR | odev.v.vfore > FTINY) | 
| 262 | 
< | 
                error(INTERNAL, "bad view assumption in addleaf"); | 
| 262 | 
> | 
                error(INTERNAL, "bad view assumption in putleaf"); | 
| 263 | 
  | 
#endif | 
| 264 | 
  | 
        for (q = 0; q < 3; q++) | 
| 265 | 
  | 
                vd[q] = (wp[q] - odev.v.vp[q])/ip[2]; | 
| 266 | 
  | 
        d2 = fdir2diff(qtL.wd[li], vd); | 
| 267 | 
+ | 
#ifdef MAXDIFF2 | 
| 268 | 
  | 
        if (d2 > MAXDIFF2) | 
| 269 | 
< | 
                return(0);                      /* leaf dir. too far off */ | 
| 269 | 
> | 
                goto dropit;                    /* leaf dir. too far off */ | 
| 270 | 
> | 
#endif | 
| 271 | 
  | 
        x = ip[0] * odev.hres; | 
| 272 | 
  | 
        y = ip[1] * odev.vres; | 
| 273 | 
  | 
        z = ip[2]; | 
| 288 | 
  | 
                if (!(tp->flgs & LFF(q))) {     /* found stem for leaf */ | 
| 289 | 
  | 
                        tp->k[q].li = li; | 
| 290 | 
  | 
                        tp->flgs |= CHLFF(q); | 
| 291 | 
< | 
                        break; | 
| 291 | 
> | 
                        return(1); | 
| 292 | 
  | 
                }        | 
| 293 | 
  | 
                if (lo != tp->k[q].li) {        /* check old leaf */ | 
| 294 | 
  | 
                        lo = tp->k[q].li; | 
| 298 | 
  | 
                                                /* is node minimum size? */ | 
| 299 | 
  | 
                if (y1-y0 <= qtMinNodesiz || x1-x0 <= qtMinNodesiz) { | 
| 300 | 
  | 
                        if (z > (1.+qtDepthEps)*ip[2]) | 
| 301 | 
< | 
                                return(0);              /* old one closer */ | 
| 301 | 
> | 
                                break;                  /* old one closer */ | 
| 302 | 
  | 
                        if (z >= (1.-qtDepthEps)*ip[2] && | 
| 303 | 
  | 
                                        fdir2diff(qtL.wd[lo], vd) < d2) | 
| 304 | 
< | 
                                return(0);              /* old one better */ | 
| 305 | 
< | 
                        tp->k[q].li = li;               /* else new one is */ | 
| 304 | 
> | 
                                break;                  /* old one better */ | 
| 305 | 
> | 
                        tp->k[q].li = li;               /* attach new */ | 
| 306 | 
  | 
                        tp->flgs |= CHF(q); | 
| 307 | 
+ | 
                        li = lo;                        /* drop old... */ | 
| 308 | 
  | 
                        break; | 
| 309 | 
  | 
                } | 
| 310 | 
  | 
                tp->flgs &= ~LFF(q);            /* else grow tree */ | 
| 318 | 
  | 
                tp->flgs = CH_ANY|LFF(q);       /* all new */ | 
| 319 | 
  | 
                tp->k[q].li = lo; | 
| 320 | 
  | 
        } | 
| 321 | 
< | 
        return(1);              /* done */ | 
| 321 | 
> | 
dropit: | 
| 322 | 
> | 
        if (drop) { | 
| 323 | 
> | 
                if (li+1 == (qtL.tl ? qtL.tl : qtL.nl)) | 
| 324 | 
> | 
                        qtL.tl = li;            /* special case */ | 
| 325 | 
> | 
                else { | 
| 326 | 
> | 
                        qtL.chr[li][0] = qtL.chr[li][1] = qtL.chr[li][2] = 0; | 
| 327 | 
> | 
                        qtL.wd[li] = falleaves; | 
| 328 | 
> | 
                        falleaves = li; | 
| 329 | 
> | 
                } | 
| 330 | 
> | 
        } | 
| 331 | 
> | 
        return(li == lo); | 
| 332 | 
  | 
} | 
| 333 | 
  | 
 | 
| 334 | 
  | 
 | 
| 335 | 
< | 
dev_value(c, p, v)              /* add a pixel value to our quadtree */ | 
| 335 | 
> | 
dev_value(c, d, p)              /* add a pixel value to our quadtree */ | 
| 336 | 
  | 
COLR    c; | 
| 337 | 
< | 
FVECT   p, v; | 
| 337 | 
> | 
FVECT   d, p; | 
| 338 | 
  | 
{ | 
| 339 | 
  | 
        register int    li; | 
| 340 | 
< | 
 | 
| 341 | 
< | 
        li = newleaf(); | 
| 342 | 
< | 
        VCOPY(qtL.wp[li], p); | 
| 343 | 
< | 
        qtL.wd[li] = encodedir(v); | 
| 344 | 
< | 
        tmCvColrs(&qtL.brt[li], qtL.chr[li], c, 1); | 
| 345 | 
< | 
        if (!addleaf(li)) | 
| 346 | 
< | 
                ungetleaf(li); | 
| 340 | 
> | 
        int     mapit; | 
| 341 | 
> | 
                                /* grab a leaf */ | 
| 342 | 
> | 
        if (!imm_mode && falleaves >= 0) {      /* check for fallen leaves */ | 
| 343 | 
> | 
                li = falleaves; | 
| 344 | 
> | 
                falleaves = qtL.wd[li]; | 
| 345 | 
> | 
                mapit = qtL.tml <= qtL.tl ? | 
| 346 | 
> | 
                                (li < qtL.tml || li >= qtL.tl) : | 
| 347 | 
> | 
                                (li < qtL.tml && li >= qtL.tl) ; | 
| 348 | 
> | 
        } else {                                /* else allocate new one */ | 
| 349 | 
> | 
                li = qtL.tl++; | 
| 350 | 
> | 
                if (qtL.tl >= qtL.nl)           /* next leaf in ring */ | 
| 351 | 
> | 
                        qtL.tl = 0; | 
| 352 | 
> | 
                if (qtL.tl == qtL.bl)           /* need to shake some free */ | 
| 353 | 
> | 
                        qtCompost(LFREEPCT); | 
| 354 | 
> | 
                mapit = 0;                      /* we'll map it later */ | 
| 355 | 
> | 
        } | 
| 356 | 
> | 
        if (p == NULL) | 
| 357 | 
> | 
                VSUM(qtL.wp[li], odev.v.vp, d, FHUGE); | 
| 358 | 
> | 
        else | 
| 359 | 
> | 
                VCOPY(qtL.wp[li], p); | 
| 360 | 
> | 
        qtL.wd[li] = encodedir(d); | 
| 361 | 
> | 
        tmCvColrs(&qtL.brt[li], qtL.chr[li], (COLR *)c, 1); | 
| 362 | 
> | 
        if (putleaf(li, 1)) { | 
| 363 | 
> | 
                if (mapit) | 
| 364 | 
> | 
                        tmMapPixels((BYTE *)(qtL.rgb+li), qtL.brt+li, | 
| 365 | 
> | 
                                        (BYTE *)(qtL.chr+li), 1); | 
| 366 | 
> | 
                if (--rayqleft == 0) | 
| 367 | 
> | 
                        dev_flush();            /* flush output */ | 
| 368 | 
> | 
        } | 
| 369 | 
  | 
} | 
| 370 | 
  | 
 | 
| 371 | 
  | 
 | 
| 378 | 
  | 
        qtFreeTree(0);                  /* blow the old tree away */ | 
| 379 | 
  | 
                                        /* regrow it in new place */ | 
| 380 | 
  | 
        for (i = qtL.bl; i != qtL.tl; ) { | 
| 381 | 
< | 
                addleaf(i); | 
| 381 | 
> | 
                putleaf(i, 0); | 
| 382 | 
  | 
                if (++i >= qtL.nl) i = 0; | 
| 383 | 
  | 
        } | 
| 384 | 
  | 
} | 
| 413 | 
  | 
                if (tmComputeMapping(0., 0., 0.) != TM_E_OK) | 
| 414 | 
  | 
                        return(0); | 
| 415 | 
  | 
        } | 
| 416 | 
< | 
        if (tmMapPixels(qtL.rgb+aorg, qtL.brt+aorg, | 
| 417 | 
< | 
                        qtL.chr+aorg, alen) != TM_E_OK) | 
| 416 | 
> | 
        if (tmMapPixels((BYTE *)(qtL.rgb+aorg), qtL.brt+aorg, | 
| 417 | 
> | 
                        (BYTE *)(qtL.chr+aorg), alen) != TM_E_OK) | 
| 418 | 
  | 
                return(0); | 
| 419 | 
  | 
        if (blen > 0) | 
| 420 | 
< | 
                tmMapPixels(qtL.rgb+borg, qtL.brt+borg, | 
| 421 | 
< | 
                                qtL.chr+borg, blen); | 
| 420 | 
> | 
                tmMapPixels((BYTE *)(qtL.rgb+borg), qtL.brt+borg, | 
| 421 | 
> | 
                                (BYTE *)(qtL.chr+borg), blen); | 
| 422 | 
  | 
        qtL.tml = qtL.tl; | 
| 423 | 
  | 
        return(1); | 
| 424 | 
  | 
} |