Home » Archimedes archive » Archimedes World » AW-1996-06-Disc 1.adf » !AcornAns_AcornAns » !Scape2/c/main
!Scape2/c/main
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1996-06-Disc 1.adf » !AcornAns_AcornAns |
Filename: | !Scape2/c/main |
Read OK: | ✔ |
File size: | 7617 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <time.h> #include <math.h> #include "wimpt.h" #include "werr.h" #include "bbc.h" #include "os.h" #include "flex.h" #include "sprite.h" #include "akbd.h" #include "swis.h" #define one (1<<16) typedef enum {multi, nonmulti} monitor; monitor monitortype; int linesep; typedef enum { left=136, right, down, up } scrolldir; typedef struct { int re; int im; } complex; int N; int limit; void *data = 0; int tilt=one/3; /*in range 0 to one*/ int range; int sealevel; int powscale; int linscale; int orient, scrollx, scrolly; int screen=0; char *imname = "scape"; sprite_area *sa32=0; int dz; int lx,ly,lz; int vx,vy,vz; int hx,hy,hz; sprite_area *ditharea=0; char lut[32768]; unsigned int pal256def[256]; unsigned int elevation[256]; unsigned int sea[256]; unsigned int sky[256]; unsigned int slope[256]; int blend = 0; int fog = 0; int ka_land=(int)(0.05*one); int kd_land=(int)(0.75*one); int ks_land=(int)(0.45*one); int ka_sea=(int)(0.10*one); int kd_sea=(int)(0.85*one); int ks_sea=(int)(0.50*one); BOOL save32 = TRUE; BOOL save8 = TRUE; typedef struct { signed char er; signed char eg; signed char eb; signed char byte4; /*reminder that struct will be word sized*/ } compact_dither_error; BOOL gen_256withnopalette(flex_ptr sa, char *name); extern void g256wnp_internal(int x, int y, char *dp, char *sp, compact_dither_error *de, char *lut, unsigned int *pal256def); extern int rbbcinc(int r, int k); extern int div_frac16(int number, int divisor); extern int mul_frac16(int x, int a); extern int mul_frac16c(int x, int a); extern int sqrt_frac16(unsigned int x); extern int gauss16(void); extern void sgauss16(int seed); extern int cos16(int a); extern int sin16(int a); extern int exp16(int a); extern int ln16(int a); extern int pow16(int a, int b); extern int acs16(int a); extern int asn16(int a); /************************************** fourier transform functions ****************************************/ BOOL invfft_2d(complex *data, int limit) { int i, j; int n = 1<<limit; complex t1, *d1, *d1e, *d2; int k, l; int loop; int rotangle, angle; int cos, sin; if (limit<3 || limit>32) return FALSE; for (i=j=0; j<n; i=rbbcinc(i, limit), j++) if (i>j) { for (d1=data+(i<<limit), d2=data+(j<<limit), d1e=d1+n; d1<d1e;) { t1 = *d1; *d1++ = *d2; *d2++ = t1; } } rotangle = -2*one; for (k=loop=1; loop<=limit; loop++, k<<=1, rotangle/=2) { for (angle=0, sin=0, cos=one, i=1; i<=k; i++, angle+=rotangle, sin=sin16(angle), cos=cos16(angle)) { for (j=i-1; j<n; j+=k<<1) { l = j+k; for (d1=data+(l<<limit), d2=data+(j<<limit), d1e=d1+n; d1<d1e;) { t1.re = (mul_frac16c(d1->re, cos)-mul_frac16c(d1->im, sin)); t1.im = (mul_frac16c(d1->re, sin)+mul_frac16c(d1->im, cos)); d1->re = d2->re-t1.re; d1++->im = d2->im-t1.im; d2->re += t1.re; d2++->im += t1.im; } } } } for (i=j=0; j<n; i=rbbcinc(i, limit), j++) if (i>j) { for (d1=data+i, d2=data+j, d1e=d1+n*n; d1<d1e; d1+=n, d2+=n) { t1 = *d1; *d1 = *d2; *d2 = t1; } } rotangle = -2*one; for (k=loop=1; loop<=limit; loop++, k<<=1, rotangle/=2) { for (angle=0, sin=0, cos=one, i=1; i<=k; i++, angle+=rotangle, sin=sin16(angle), cos=cos16(angle)) { for (j=i-1; j<n; j+=k<<1) { l = j+k; for (d1=data+l, d2=data+j, d1e=d1+n*n; d1<d1e; d1+=n, d2+=n) { t1.re = (mul_frac16c(d1->re, cos)-mul_frac16c(d1->im, sin)); t1.im = (mul_frac16c(d1->re, sin)+mul_frac16c(d1->im, cos)); d1->re = d2->re-t1.re; d1->im = d2->im-t1.im; d2->re += t1.re; d2->im += t1.im; } } } } return TRUE; } /*********************************** data generation/manipulation functions *******************************/ /*The following assigns values to 2d data array with suitable properties.*/ /*It does however do so by scanning the array in a non-obvious order. This has been chosen so that if n is increased by doubling, then those random values used for the last grid will be now written to the low frequency quadrant of the new grid (if same seed used), suitably re filtered. This should have effect of giving a degree of continuity to the change in n, since former frequencies are carried over to the low frequencies of the higher res grid. */ BOOL assign_ft(complex *data, int limit, double dim, int seed) { int n=1<<limit; int i, ic, j, i2, j2, k, l; complex *d1, *d2, *d; int phase, rad; int im, re; int mbpobt; srand(-seed); sgauss16(-seed); mbpobt = (int)(-(4-dim)*one); data->re = data->im = 0; for (i=1; i<=n/2; i++) { j2 = i2 = i*i; k = n-i; d1 = data+i*n; d2 = data+k*n; for (j=0; j<=i; j++) { l = j==0 ? 0 : n-j; phase = rand()>>13; rad = mul_frac16(pow16(sqrt_frac16((i2+j*j)*(one/4))*2, mbpobt), gauss16()); re = mul_frac16c(rad, cos16(phase)); im = mul_frac16c(rad, sin16(phase)); d = d1+j; d->re = re; d->im = im; d = d2+l; d->re = re; d->im = -im; } j = i; l = n-j; d1 = data+j; d2 = data+l; for (ic=i-1; ic>=0; ic--) { k = ic==0 ? 0 : n-ic; phase = rand()>>13; rad = mul_frac16(pow16(sqrt_frac16((ic*ic+j2)*(one/4))*2, mbpobt), gauss16()); re = mul_frac16c(rad, cos16(phase)); im = mul_frac16c(rad, sin16(phase)); d = d1+ic*n; d->re = re; d->im = im; d = d2+k*n; d->re = re; d->im = -im; } if (i<n/2) { ic = n-i; k = i; d1 = data+ic*n; d2 = data+k*n; for (j=1; j<=i; j++) { l = n-j; phase = rand()>>13; rad = mul_frac16(pow16(sqrt_frac16((i2+j*j)*(one/4))*2, mbpobt), gauss16()); re = mul_frac16c(rad, cos16(phase)); im = mul_frac16c(rad, sin16(phase)); d = d1+j; d->re = re; d->im = im; d = d2+l; d->re = re; d->im = -im; } j=i; l = n-j; d1 = data+j; d2 = data+l; for (ic++; ic<n; ic++) { k = n-ic; phase = rand()>>13; rad = mul_frac16(pow16(sqrt_frac16((k*k+j2)*(one/4))*2, mbpobt), gauss16()); re = mul_frac16c(rad, cos16(phase)); im = mul_frac16c(rad, sin16(phase)); d = d1+ic*n; d->re = re; d->im = im; d = d2+k*n; d->re = re; d->im = -im; } } } (data+n*n/2)->im = (data+n/2)->im = (data+n*(n+1)/2)->im = 0; return TRUE; } /*convert a height as stored in compacted data to height of scape*/ /*nb stored data holds raw height in high 16 bits and modified version in low 16 bits - see normalise_and_compact below*/ int mutewet(unsigned int v) { v = (v<<16)>>16; return (signed int)v<sealevel ? sealevel : v; } /*convert a height as stored in compacted data to height of scape ignoring sea level*/ /*nb stored data holds raw height in high 16 bits and modified version in low 16 bits - see normalise_and_compact below*/ int mutedry(unsigned int v) { return (v<<16)>>16; } BOOL normalise_and_compact(void **data, int limit) { int n=1<<limit; int min=1<<30; int max=-min; int scale, v, sv; complex *d1, *d1e; unsigned int *d2; for (d1=*data, d1e=d1+n*n; d1<d1e; d1++) { if (d1->re<min) min=d1->re; if (d1->re>max) max=d1->re; } scale = div_frac16(one, max-min); for (d2=*data, d1=*data, d1e=d1+n*n; d1<d1e; d1++, d2++) { v = mul_frac16(d1->re-min, scale); if (v>=one) v=one-1; if (v<0) v=0; sv = pow16(v, powscale); if (linscale!=one) sv = mul_frac16c(sv, linscale); if (sv>=one) sv=one-1; if (sv<0) sv=0; *d2 = sv+(v<<16); } /*NB We work with data both before a special scaling and after; the above stores each - raw data in the high 16 bits of each word, and scaled data in the low 16 bits; it is the low 16 bits which are used for graphing purposes after applying a comparison with sealevel.*/ /*Transmuted is stored to save repeated transmuting during graphing, while original is stored to permit resetting of transmuted after altering a transmute parameter like powscale without need to regen all data direct from the relatively slow fft algo. [This isn't exploited in this prog but will be in desktop vsn].*/ return flex_extend((flex_ptr)data, n*n*sizeof(int)); } BOOL remute(unsigned int *data, int limit) { int n=1<<limit; unsigned int *d1, *d1e; unsigned int v; int sv; for (d1=data, d1e=d1+n*n; d1<d1e; d1++) { v = *d1 >> 16; sv = pow16(v, powscale); if (linscale!=one) sv = mul_frac16c(sv, linscale); if (sv>=one) sv=one-1; if (sv<0) sv=0; *d1 = sv+(v<<16); } return TRUE; } BOOL clip_ft(complex *data, int limit, int rl) { int n=1<<limit; int i, j; int rh=n-rl; for (i=0; i<n; i++) for (j=0; j<n; j++, data++) if (i>rl && i<rh || j>rl && j<rh) data->re=data->im=0; return TRUE; } BOOL scroll(int *data, int limit, scrolldir key, int offset) { int n=1<<limit; int i, j; int *p, *p1, *p2; int buf[512]; int si=offset<<(9-limit); switch (key) { case left: scrollx += orient==0 ? -si : (orient==2 ? si : 0); scrolly += orient==1 ? -si : (orient==3 ? si : 0); break; case right: scrollx += orient==2 ? -si : (orient==0 ? si : 0); scrolly += orient==3 ? -si : (orient==1 ? si : 0); offset=n-offset; key=left; break; case down: scrollx += orient==3 ? -si : (orient==1 ? si : 0); scrolly += orient==0 ? -si : (orient==2 ? si : 0); break; case up: scrollx += orient==1 ? -si : (orient==3 ? si : 0); scrolly += orient==2 ? -si : (orient==0 ? si : 0); offset=n-offset; key=down; break; } scrollx &= 511; scrolly &= 511; offset &= n-1; if (key==left) { for (i=0, p=data; i<n; i++, p+=n) { for (j=n-offset, p1=p+j, p2=buf; j<n; j++, p1++, p2++) *p2=*p1; for (j=n-offset-1, p1=p+j, p2=p+j+offset; j>=0; j--, p1--, p2--) *p2=*p1; for (j=0, p1=buf, p2=p; j<offset; j++, p1++, p2++) *p2=*p1; } } else { for (j=0, p=data; j<n; j++, p++) { for (i=n-offset, p1=p+i*n, p2=buf; i<n; i++, p1+=n, p2++) *p2=*p1; for (i=n-offset-1, p1=p+i*n, p2=p+(i+offset)*n; i>=0; i--, p1-=n, p2-=n) *p2=*p1; for (i=0, p1=buf, p2=p; i<offset; i++, p1++, p2+=n) *p2=*p1; } } return TRUE; } BOOL rotate(int *data, int limit, BOOL cw) { int n=1<<limit; int i, j; int k = n-1; int l = n/2; int *q1, *q2, *q3, *q4; int t; if (cw) { orient++; for (i=0, q1=data, q2=data+n*k, q3=data+(n+1)*k, q4=data+k; i<l; i++, q1+=l, q2+=l*n+1, q3-=l, q4-=l*n+1) for (j=0; j<l; j++, q1++, q2-=n, q3--, q4+=n) { t=*q1; *q1=*q4; *q4=*q3; *q3=*q2; *q2=t; } } else { orient--; for (i=0, q1=data, q2=data+n*k, q3=data+(n+1)*k, q4=data+k; i<l; i++, q1+=l, q2+=l*n+1, q3-=l, q4-=l*n+1) for (j=0; j<l; j++, q1++, q2-=n, q3--, q4+=n) { t=*q1; *q1=*q2; *q2=*q3; *q3=*q4; *q4=t; } } orient &= 3; return TRUE; } /*********************************** colour rendering functions ********************************************/ void calc_verticalbounds(unsigned int *data, int limit, int *y_low, int *y_height) { int n=1<<limit; int i, j, d, l, h, hr; int cos = cos16(tilt); int sin = sin16(tilt); for (j=0, l=65535, h=0; j<n; j++) { d = mutewet(data[j]); if (d<l) l=d; if (d>h) h=d; } l = mul_frac16c(l, cos)*3/256; h = mul_frac16c(h, cos)*3/256; for (i=1; i<n; i++) { for (j=0, hr=0; j<n; j++) { d = mutewet(data[j+n*i]); if (d>hr) hr=d; } hr = (mul_frac16c(hr, cos)+mul_frac16c(i<<(16-limit), sin))*3/256; if (hr>h) h=hr; } *y_low = l; *y_height = 1 + ( (h-l) >> (10-limit) ) + mul_frac16c(5*n/32, cos); } BOOL create_image32(int x, int y) { int areasize, spritesize, imagesize; sprite_header *sph; if (sa32) flex_free((flex_ptr)&sa32); imagesize = x*y*4; spritesize = sizeof(sprite_header)+imagesize; areasize = sizeof(sprite_area)+spritesize; if (!flex_alloc((flex_ptr)&sa32, areasize)) return FALSE; sa32->size = areasize; sa32->number = 1; sa32->sproff = 16; sa32->freeoff = areasize; sph = (sprite_header *)(sa32+1); sph->next = spritesize; memset(sph->name, 0, 12); strcpy(sph->name, imname); sph->width = x-1; sph->height = y-1; sph->lbit = 0; sph->rbit = 31; sph->image = sizeof(sprite_header); sph->mask = sizeof(sprite_header); sph->mode = 1 | (90<<1) | (90<<14) | (6<<27); return TRUE; } BOOL discard_image32(void) { if (sa32) flex_free((flex_ptr)&sa32); return TRUE; } unsigned int calc_colour(unsigned int *data, int limit, int i, int j, int *crp, int *cgp, int *cbp) { int n=1<<limit; int nx,ny,nz,r,p; int z; int in=0; int incl; int cr, cg, cb; unsigned int colour; int hasl = mutedry(data[i+j*n])-sealevel; /*height above sea level*/ z=mutewet(data[i+j*n]); nx=z-mutewet(data[((i+1)&(n-1))+j*n]); ny=mutewet(data[i+((j-1)&(n-1))*n])-z; r = sqrt_frac16(nx*nx+ny*ny+dz*dz)>>8; nx = div_frac16(nx, r); ny = div_frac16(ny, r); nz = div_frac16(dz, r); /*surface normal calculated*/ r = mul_frac16c(nx,vx)+mul_frac16c(ny,vy)+mul_frac16c(nz,vz); if (r>=0) { /*if surface visible . . .*/ in += hasl>=0 ? ka_land : ka_sea; /*add in ambient term*/ r = mul_frac16c(nx,lx)+mul_frac16c(ny,ly)+mul_frac16c(nz,lz); if (r>=0) { /*and if light striking surface . . .*/ in += mul_frac16c(r, hasl>=0 ? kd_land : kd_sea); /*add diffuse term*/ r = mul_frac16c(nx,hx)+mul_frac16c(ny,hy)+mul_frac16c(nz,hz); p = mul_frac16c(r,r); p = mul_frac16c(p,p); /*(^4, for ^3 use r,p instead of p,p)*/ in += mul_frac16c(p, hasl>=0 ? ks_land : ks_sea); /*finally add specular term*/ } } /*reflected light intensity calculated*/ if (hasl>=0) { colour = elevation[hasl/256]; cr = (one-blend)*(colour & 255); cg = (one-blend)*((colour>>8) & 255); cb = (one-blend)*((colour>>16) & 255); incl = nz/256; /*(or try asn16(nz) instead of nz - though prob not worth extra computation)*/ if (incl<0) incl=0; if (incl>255) incl=255; colour = slope[incl]; cr += blend*(colour & 255); cg += blend*((colour>>8) & 255); cb += blend*((colour>>16) & 255); cr /= one; cg /= one; cb /= one; } else { colour = sea[-hasl/256]; cr = colour & 255; cg = (colour>>8) & 255; cb = (colour>>16) & 255; } /*intrinsic surface colour calculated*/ cr = (cr*in)/256; cg = (cg*in)/256; cb = (cb*in)/256; /*visible surface colour calculated*/ if (fog!=0) { r = pow16(mul_frac16c((int)(0.96*one), one-(z-sealevel)), fog); if (r<0) r=0; if (r>65535) r=65535; cr = mul_frac16c(cr, one-r); cg = mul_frac16c(cg, one-r); cb = mul_frac16c(cb, one-r); colour = sky[0]; cr += mul_frac16c((colour&255)<<8, r); cg += mul_frac16c(colour&(255<<8), r); cb += mul_frac16c((colour>>8)&(255<<8), r); /*mixing with fog completed*/ } if (cr<0) cr=0; if (cg<0) cg=0; if (cb<0) cb=0; if (cr>65535) cr=65535; if (cg>65535) cg=65535; if (cb>65535) cb=65535; *crp = cr; *cgp = cg; *cbp = cb; return (cr>>8)+(cg&(255<<8))+((cb>>8)<<16); } BOOL render_image32(unsigned int *data, int limit, int yl, int xm, int ym) { int n=1<<limit; int i,j; int horizon; int p,p0,p1; int cos = cos16(tilt); int sin = sin16(tilt); int lastr, lastg, lastb, newr, newg, newb; BOOL lastvalid; sprite_header *sph = (sprite_header *)((char *)sa32+sa32->sproff); int *intens = (int *)((char *)sph+sph->image); int deltar, deltag, deltab; int r; int light_incl, light_bear; unsigned int colour; int cr,cg,cb; int x,y; int *d, *de; int *horizon_buffer=0; if (horizon_buffer=malloc(n*sizeof(int)), horizon_buffer==0) return FALSE; for (d=intens, de=d+xm*ym; d<de; d++) *d=0x00000000; dz = 65536/(n-1); vx = 0; vy = -cos; vz = sin; light_incl = (int)(0.50*one); light_bear = (int)(1.50*one); r = cos16(light_incl); lx = mul_frac16c(cos16(light_bear), r); ly = mul_frac16c(sin16(light_bear),-r); lz = sin16(light_incl); hx = (lx+vx)/2; hy = (ly+vy)/2; hz = (lz+vz)/2; r = sqrt_frac16(mul_frac16c(hx,hx)+mul_frac16c(hy,hy)+mul_frac16c(hz,hz)); hx = div_frac16(hx, r); hy = div_frac16(hy, r); hz = div_frac16(hz, r); for (i=0; i<n; i++) { p0 = ( (mul_frac16c(mutewet(data[i]), cos)+mul_frac16c(0<<(16-limit), sin))*3/256 - yl) >> (10-limit); colour = calc_colour(data, limit, i, 0, &cr, &cg, &cb); lastr = cr; lastg = cg; lastb = cb; lastvalid=TRUE; if (p0>=0 && p0<ym) intens[i+xm*(ym-1-p0)] = colour; horizon = p0; for (j=1; j<n; j++) { p1 = ( (mul_frac16c(mutewet(data[i+j*n]), cos)+mul_frac16c(j<<(16-limit), sin))*3/256 - yl) >> (10-limit); if (p1>horizon) { colour = calc_colour(data, limit, i, j, &cr, &cg, &cb); newr = cr; newg = cg; newb = cb; if (p1>=0 && p1<ym) intens[i+xm*(ym-1-p1)] = colour; p = p1-1; if (p>horizon) { if (!lastvalid) colour = calc_colour(data, limit, i, j-1, &lastr, &lastg, &lastb); deltar = (lastr-newr)/(p0-p1); deltag = (lastg-newg)/(p0-p1); deltab = (lastb-newb)/(p0-p1); while (p>horizon) { cr-=deltar; cg-=deltag; cb-=deltab; if (p>=0 && p<ym) intens[i+xm*(ym-1-p)] = (cr>>8)+(cg&(255<<8))+((cb>>8)<<16); p-=1; } } horizon = p1; lastr=newr; lastg=newg; lastb=newb; lastvalid = TRUE; } else { lastvalid=FALSE; } p0=p1; } horizon_buffer[i] = horizon; } p = ( (mul_frac16c(sealevel, cos)+sin)*3/256 - yl ) >> (10-limit); /*this comes from the parallel projection calc performed above - it lets sky colour be set relative to the natural horizon*/ for (i=0; i<n; i++) for (j=horizon_buffer[i]+1; j<ym; j++) { x = (i<<(16-limit))-one/2; y = (j-p)<<(16-limit); r = y/256 + (x*x)/(one*2048); if (r<0) r=0; if (r>255) r=255; intens[i+xm*(ym-1-j)] = sky[r]; } free(horizon_buffer); return TRUE; } BOOL dump_image32(unsigned int *data, int limit, char *filename) { int yl, y; int n=1<<limit; BOOL retcode=TRUE; int x=n; char buf[256]; calc_verticalbounds(data, limit, &yl, &y); if (!create_image32(x, y)) return FALSE; if (!render_image32(data, limit, yl, x, y)) { discard_image32(); return FALSE; } if (save32) { if (sprite_area_save(sa32, filename)) retcode=FALSE; } if (save8) { if (ditharea) flex_free((flex_ptr)&ditharea); if (!flex_alloc((flex_ptr)&ditharea, sizeof(sprite_area))) { werr(0, "ditharea init failed"); retcode=FALSE; } else { sprite_area_initialise(ditharea, flex_size((flex_ptr)&ditharea)); if (gen_256withnopalette((flex_ptr)&sa32, imname)) { strcat(strcpy(buf, filename), "d"); if (sprite_area_save(ditharea, buf)) retcode=FALSE; } else retcode = FALSE; flex_free((flex_ptr)&ditharea); } } discard_image32(); return retcode; } /******************************** dithering ********************************/ BOOL gen_256withnopalette(flex_ptr sa, char *name) { int newsize; os_error *e; compact_dither_error *de; int x, y; sprite_id si; sprite_header *sh, *dh; char *sp, *dp; unsigned int modeword, type, xres, yres; int sprsize, extra; si.tag = sprite_id_name; si.s.name = name; if (wimpt_complain(sprite_select_rp((sprite_area *)*sa, &si, (sprite_ptr *)&sh))) return FALSE; modeword = sh->mode; type = modeword>>27; xres = (modeword>> 1)&0x1fff; yres = (modeword>>14)&0x1fff; if (type!=6) { werr(0, "Sprite is not new type 6 (32bpp) - I only understand these!"); return FALSE; } x = 1+sh->width; y = sh->height + 1; sprsize = sizeof(sprite_header)+y*((x+3)&~3); extra = sprsize - (ditharea->size - ditharea->freeoff); if (extra>0) { newsize = ditharea->size + extra; if (!flex_extend((flex_ptr)&ditharea, newsize)) { werr(0, "No room for destination sprite"); return FALSE; } ditharea->size = newsize; /*above flex will likely have invalidated sh, so recalc*/ if (wimpt_complain(sprite_select_rp((sprite_area *)*sa, &si, (sprite_ptr *)&sh))) return FALSE; } de = malloc(x*sizeof(compact_dither_error)); if (de==0) { werr(0, "No room for dither error line buffer"); return FALSE; } e=sprite_create_rp(ditharea, name, sprite_nopalette, x, y, xres==2*yres ? 15 : 28, (sprite_ptr *)&dh); if (e) { free(de); wimpt_complain(e); return FALSE; } dp = (char *)dh + dh->image; sp = (char *)sh + sh->image; g256wnp_internal(x, y, dp, sp, de, lut, pal256def); free(de); return TRUE; } /****************************** initialisation ******************************/ BOOL load_palette(char *name, unsigned int *pal) { os_filestr f; int i; char pt[1536], *p; char buf[1024]; sprintf(buf, "<Scape2$Dir>.resources.%s", name); f.action=255; f.name=buf; f.loadaddr=(int)pt; f.execaddr=0; if (wimpt_complain(os_file(&f))) return FALSE; if (f.start!=1536) { /*f.start is r4, here holding file length*/ werr(0, "Internal: resources.%s file corrupted - should be 1536 bytes long", name); return FALSE; } for (i=0, p=pt; i<256; i++, p+=6) pal[i]=p[3]+(p[4]<<8)+(p[5]<<16); return TRUE; } /*--- Initialise the program, returning TRUE if it was all OK. ---*/ static BOOL initialise(int argc, char *argv[]) { os_filestr f; int i; if (argc>=2) { i=atoi(argv[1]); save32 = i&1 ? TRUE : FALSE; save8 = i&2 ? TRUE : FALSE; } f.action=255; f.name="<Scape2$Dir>.resources.lut"; f.loadaddr=(int)lut; f.execaddr=0; if (wimpt_complain(os_file(&f))) return FALSE; if (f.start!=32768) { /*f.start is r4, here holding file length*/ werr(0, "Internal: resources.lut file corrupted - should be 32768 bytes long"); return FALSE; } f.action=255; f.name="<Scape2$Dir>.resources.pal256def"; f.loadaddr=(int)pal256def; f.execaddr=0; if (wimpt_complain(os_file(&f))) return FALSE; if (f.start!=1024) { /*f.start is r4, here holding file length*/ werr(0, "Internal: resources.pal256def file corrupted - should be 1024 bytes long"); return FALSE; } if (!load_palette("elevation", elevation)) return FALSE; if (!load_palette("sea", sea)) return FALSE; if (!load_palette("sky", sky)) return FALSE; if (!load_palette("slope", slope)) return FALSE; /* All went ok */ return TRUE; } /***************************************** main functions **************************************************/ BOOL graph(unsigned int *data, int limit) { int n=1<<limit; int i, j, k; int pl, pr; int vl, vr, v, v2; int horizon[1026]; int horizon2[1026]; int cos = cos16(tilt); int sin = sin16(tilt); int image_yl=1024; int image_yh=0; for (i=0; i<1026; i++) { horizon[i]=0; horizon2[i]=1024; } bbc_origin(640,0); for (i=0; i<n; i++) { for (j=1, pl=-512, vl = mutewet(data[0+n*i]); j<n; j++, pl=pr, vl=vr) { for (pr=pl+(1024>>limit), vr=mutewet(data[j+n*i]), k=pl, v=vl; k<pr; k+=2, v+=(vr-vl)>>(9-limit)) { v2 = (mul_frac16c(v, cos)+mul_frac16c(i<<(16-limit), sin))*3/256; if (i==0) horizon2[k+512]=v2; if (horizon[k+512]<v2) { bbc_gcol(0, 4+6*i/n); bbc_plot(69, k, v2); horizon[k+512]=v2; } else if (horizon2[k+512]>v2) { bbc_gcol(0, 10+6*i/n); bbc_plot(69, k, v2); horizon2[k+512]=v2; } } } v2 = (mul_frac16c(vr, cos)+mul_frac16c(i<<(16-limit), sin))*3/256; if (i==0) horizon2[k+512]=v2; if (horizon[k+512]<v2) { bbc_gcol(0, 4+6*i/n); bbc_plot(69, k, v2); horizon[k+512]=v2; } else if (horizon2[k+512]>v2) { bbc_gcol(0, 10+6*i/n); bbc_plot(69, k, v2); horizon2[k+512]=v2; } } for (i=0; i<1026; i++) { if (horizon[i] >image_yh) image_yh=horizon[i]; if (horizon2[i]<image_yl) image_yl=horizon2[i]; } bbc_move(-512, image_yl); bbc_move(512, image_yh); bbc_plot(189, -512, 512+(image_yl-image_yh)/2); return TRUE; } monitor read_monitor_type(void) { int r2; os_swi3r(6, 161,133,0, 0,0,&r2); if ((r2/4 & 3) == 1) return multi; else return nonmulti; } int main(int argc, char *argv[]) { int seed, i; char key; double dim=2.2; double d; char buf[1024]; int torient, tscrollx, tscrolly; monitortype = read_monitor_type(); flex_init(); if (!initialise(argc, argv)) return 0; for (;;) { bbc_mode(monitortype==multi ? 20 : 12); printf("Please select which landscape to construct (any integer) "); scanf("%i", &seed); do { printf("Please enter scape resolution (suggest 7...9, though 3...9 permissible) "); scanf("%i", &limit); } while (limit<3 || limit>9); N = 1<<limit; do { printf("Please enter scape dimension (suggest 2.15, 2-3 permissible) "); scanf("%Lf", &dim); } while (dim<2 || dim>3); do { printf("Please enter frequency range (suggest 1, 0-1 permissible) "); scanf("%Lf", &d); } while (d<0 || d>1); range = (int)(0.5+d*(double)(int)(N/2)); if (range<0) range=0; if (range>N/2) range=N/2; do { printf("Please enter sea-level (suggest 0, 0-1 permissible) "); scanf("%Lf", &d); } while (d<0 || d>1); sealevel = (int)(d*one); do { printf("Please enter power scaling law (suggest 1, or 0.3-3.0, though >= 0 permissible) "); scanf("%Lf", &d); } while (d<0); powscale = (int)(d*one); do { printf("Please enter linear scaling factor (suggest 1, 0-1 permissible) "); scanf("%Lf", &d); } while (d<0 || d>1); linscale = (int)(d*one); do { printf("Please enter orientation (suggest 0, 0...3 permissible) "); scanf("%i", &torient); } while (torient<0 || torient>3); do { printf("Please enter x scroll value (suggest 0, 0...511 permissible) "); scanf("%i", &tscrollx); } while (tscrollx<0 || tscrollx>=512); do { printf("Please enter y scroll value (suggest 0, 0...511 permissible) "); scanf("%i", &tscrolly); } while (tscrolly<0 || tscrolly>=512); do { printf("Please enter viewing angle (suggest 0.3, or 0.3-0.7, though 0-1 permissible) "); scanf("%Lf", &d); } while (d<0 || d>1); tilt = (int)(d*one); do { printf("Please enter earth rendering factor (suggest 0, 0.5 or 1, 0-1 permissible) "); scanf("%Lf", &d); } while (d<0 || d>1); blend = (int)(d*one); do { printf("Please enter fog level (suggest 0-0.5, 0-1 permissible) "); scanf("%Lf", &d); } while (d<0 || d>1); fog = d<0.001 ? 0 : (int)(one/d); if (!flex_alloc((flex_ptr)&data, N*N*sizeof(complex))) werr(1, "Insufficient memory"); /*note, further flex calls may shift data, so be careful with ptrs into data*/ bbc_mode(monitortype==multi ? 20 : 12); bbc_vduq(28,72,31,79,0); bbc_palette(1, 16, 51,51,51); bbc_palette(2, 16, 255,255,255); bbc_palette(0, 16, 192,192,192); for (i=0; i<6; i++) { bbc_palette( 4+i, 16, 32+20*i,136+7*i,32+20*i); bbc_palette(10+i, 16, 128+8*i,96+12*i,64+16*i); } linesep = monitortype==multi ? 20 : 40; printf("\nPlease wait ...\n"); assign_ft(data, limit, dim, seed); if (range<N/2) clip_ft(data, limit, range); invfft_2d(data, limit); if (!normalise_and_compact(&data, limit)) werr(1, "Can't compact data"); orient=scrollx=scrolly=0; tscrollx>>=9-limit; tscrolly>>=9-limit; if (tscrollx>0) scroll(data, limit, right, tscrollx); if (tscrollx<0) scroll(data, limit, left, -tscrollx); if (tscrolly>0) scroll(data, limit, up, tscrolly); if (tscrolly<0) scroll(data, limit, down, -tscrolly); switch (torient) { case 1: rotate(data, limit, TRUE); break; case 2: rotate(data, limit, TRUE); rotate(data, limit, TRUE); break; case 3: rotate(data, limit, FALSE); break; } do { bbc_clg(); graph(data, limit); bbc_vduq(28,0,31,7,0); printf(" scape\n%7i\n\n res\n%7i\n\n dim\n%7.2f\n\n range\n%7.2f\n\n sea\n%7.2f\n\n pscale\n%7.2f\n\n lscale\n%7.2f\n\n orient\n%7i\n\n x\n%7i\n\n y\n%7i\n\n tilt\n%7.2f", seed, limit, dim, (int)range/(double)(int)(N/2), (int)sealevel/65536.0, (int)powscale/65536.0, (int)linscale/65536.0, orient, scrollx, scrolly, (int)tilt/65536.0); bbc_vduq(28,72,31,79,0); bbc_cls(); printf("\n\n\n\n\n\n\n\nPress a key ...\n\n"); printf("[ '<'\n or\n '>'\n to\nrotate\n scape\n\ncursors\n (+\x8b)\n to\nscroll\n scape\n\n copy\n to\n save\n image\n\n\x8b copy\n to\n save\ncolour\n image\n ]\n"); do { os_cli("fx 15 1"); bbc_cursor(0); os_swi2(OS_Byte,4,1); key = bbc_get(); os_swi2(OS_Byte,4,0); if (key==135) { screen+=1; sprintf(buf, "<Scape2$Dir>.^.Image%02i", screen); if (akbd_pollsh()) { dump_image32(data, limit, buf); } else { wimpt_complain(sprite_screensave(buf, TRUE)); } } } while (key==135); if (key==44 || key==46) rotate(data, limit, key==46); if (key==136 || key==137 || key==138 || key==139) { i=limit-2; if (akbd_pollsh()) i-=2; if (i<0) i=0; scroll(data, limit, key, 1<<i); } } while (key==44 || key==46 || key==136 || key==137 || key==138 || key==139); flex_free((flex_ptr)&data); bbc_cls(); } return 0; }
00000000 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e |#include <stdio.| 00000010 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 |h>.#include <std| 00000020 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 |lib.h>.#include | 00000030 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c |<stdarg.h>.#incl| 00000040 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 |ude <string.h>.#| 00000050 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e |include <time.h>| 00000060 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e |.#include <math.| 00000070 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 22 77 69 |h>..#include "wi| 00000080 6d 70 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 |mpt.h".#include | 00000090 22 77 65 72 72 2e 68 22 0a 23 69 6e 63 6c 75 64 |"werr.h".#includ| 000000a0 65 20 22 62 62 63 2e 68 22 0a 23 69 6e 63 6c 75 |e "bbc.h".#inclu| 000000b0 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 |de "os.h".#inclu| 000000c0 64 65 20 22 66 6c 65 78 2e 68 22 0a 23 69 6e 63 |de "flex.h".#inc| 000000d0 6c 75 64 65 20 22 73 70 72 69 74 65 2e 68 22 0a |lude "sprite.h".| 000000e0 23 69 6e 63 6c 75 64 65 20 22 61 6b 62 64 2e 68 |#include "akbd.h| 000000f0 22 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 77 69 |"..#include "swi| 00000100 73 2e 68 22 0a 23 64 65 66 69 6e 65 20 6f 6e 65 |s.h".#define one| 00000110 20 28 31 3c 3c 31 36 29 0a 0a 74 79 70 65 64 65 | (1<<16)..typede| 00000120 66 20 65 6e 75 6d 20 7b 6d 75 6c 74 69 2c 20 6e |f enum {multi, n| 00000130 6f 6e 6d 75 6c 74 69 7d 20 6d 6f 6e 69 74 6f 72 |onmulti} monitor| 00000140 3b 0a 6d 6f 6e 69 74 6f 72 20 6d 6f 6e 69 74 6f |;.monitor monito| 00000150 72 74 79 70 65 3b 0a 69 6e 74 20 6c 69 6e 65 73 |rtype;.int lines| 00000160 65 70 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 |ep;..typedef enu| 00000170 6d 20 7b 0a 20 20 6c 65 66 74 3d 31 33 36 2c 0a |m {. left=136,.| 00000180 20 20 72 69 67 68 74 2c 0a 20 20 64 6f 77 6e 2c | right,. down,| 00000190 0a 20 20 75 70 0a 7d 20 73 63 72 6f 6c 6c 64 69 |. up.} scrolldi| 000001a0 72 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 |r;..typedef stru| 000001b0 63 74 20 7b 0a 20 20 69 6e 74 20 72 65 3b 0a 20 |ct {. int re;. | 000001c0 20 69 6e 74 20 69 6d 3b 0a 7d 20 63 6f 6d 70 6c | int im;.} compl| 000001d0 65 78 3b 0a 0a 69 6e 74 20 4e 3b 0a 69 6e 74 20 |ex;..int N;.int | 000001e0 6c 69 6d 69 74 3b 0a 76 6f 69 64 20 2a 64 61 74 |limit;.void *dat| 000001f0 61 20 3d 20 30 3b 0a 69 6e 74 20 74 69 6c 74 3d |a = 0;.int tilt=| 00000200 6f 6e 65 2f 33 3b 20 2f 2a 69 6e 20 72 61 6e 67 |one/3; /*in rang| 00000210 65 20 30 20 74 6f 20 6f 6e 65 2a 2f 0a 69 6e 74 |e 0 to one*/.int| 00000220 20 72 61 6e 67 65 3b 0a 69 6e 74 20 73 65 61 6c | range;.int seal| 00000230 65 76 65 6c 3b 0a 69 6e 74 20 70 6f 77 73 63 61 |evel;.int powsca| 00000240 6c 65 3b 0a 69 6e 74 20 6c 69 6e 73 63 61 6c 65 |le;.int linscale| 00000250 3b 0a 69 6e 74 20 6f 72 69 65 6e 74 2c 20 73 63 |;.int orient, sc| 00000260 72 6f 6c 6c 78 2c 20 73 63 72 6f 6c 6c 79 3b 0a |rollx, scrolly;.| 00000270 0a 69 6e 74 20 73 63 72 65 65 6e 3d 30 3b 0a 0a |.int screen=0;..| 00000280 63 68 61 72 20 2a 69 6d 6e 61 6d 65 20 3d 20 22 |char *imname = "| 00000290 73 63 61 70 65 22 3b 0a 73 70 72 69 74 65 5f 61 |scape";.sprite_a| 000002a0 72 65 61 20 2a 73 61 33 32 3d 30 3b 0a 69 6e 74 |rea *sa32=0;.int| 000002b0 20 64 7a 3b 0a 69 6e 74 20 6c 78 2c 6c 79 2c 6c | dz;.int lx,ly,l| 000002c0 7a 3b 0a 69 6e 74 20 76 78 2c 76 79 2c 76 7a 3b |z;.int vx,vy,vz;| 000002d0 0a 69 6e 74 20 68 78 2c 68 79 2c 68 7a 3b 0a 0a |.int hx,hy,hz;..| 000002e0 73 70 72 69 74 65 5f 61 72 65 61 20 2a 64 69 74 |sprite_area *dit| 000002f0 68 61 72 65 61 3d 30 3b 0a 63 68 61 72 20 6c 75 |harea=0;.char lu| 00000300 74 5b 33 32 37 36 38 5d 3b 0a 75 6e 73 69 67 6e |t[32768];.unsign| 00000310 65 64 20 69 6e 74 20 70 61 6c 32 35 36 64 65 66 |ed int pal256def| 00000320 5b 32 35 36 5d 3b 0a 75 6e 73 69 67 6e 65 64 20 |[256];.unsigned | 00000330 69 6e 74 20 65 6c 65 76 61 74 69 6f 6e 5b 32 35 |int elevation[25| 00000340 36 5d 3b 0a 75 6e 73 69 67 6e 65 64 20 69 6e 74 |6];.unsigned int| 00000350 20 73 65 61 5b 32 35 36 5d 3b 0a 75 6e 73 69 67 | sea[256];.unsig| 00000360 6e 65 64 20 69 6e 74 20 73 6b 79 5b 32 35 36 5d |ned int sky[256]| 00000370 3b 0a 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 |;.unsigned int s| 00000380 6c 6f 70 65 5b 32 35 36 5d 3b 0a 69 6e 74 20 62 |lope[256];.int b| 00000390 6c 65 6e 64 20 3d 20 30 3b 0a 69 6e 74 20 66 6f |lend = 0;.int fo| 000003a0 67 20 3d 20 30 3b 0a 69 6e 74 20 6b 61 5f 6c 61 |g = 0;.int ka_la| 000003b0 6e 64 3d 28 69 6e 74 29 28 30 2e 30 35 2a 6f 6e |nd=(int)(0.05*on| 000003c0 65 29 3b 0a 69 6e 74 20 6b 64 5f 6c 61 6e 64 3d |e);.int kd_land=| 000003d0 28 69 6e 74 29 28 30 2e 37 35 2a 6f 6e 65 29 3b |(int)(0.75*one);| 000003e0 0a 69 6e 74 20 6b 73 5f 6c 61 6e 64 3d 28 69 6e |.int ks_land=(in| 000003f0 74 29 28 30 2e 34 35 2a 6f 6e 65 29 3b 0a 69 6e |t)(0.45*one);.in| 00000400 74 20 6b 61 5f 73 65 61 3d 28 69 6e 74 29 28 30 |t ka_sea=(int)(0| 00000410 2e 31 30 2a 6f 6e 65 29 3b 0a 69 6e 74 20 6b 64 |.10*one);.int kd| 00000420 5f 73 65 61 3d 28 69 6e 74 29 28 30 2e 38 35 2a |_sea=(int)(0.85*| 00000430 6f 6e 65 29 3b 0a 69 6e 74 20 6b 73 5f 73 65 61 |one);.int ks_sea| 00000440 3d 28 69 6e 74 29 28 30 2e 35 30 2a 6f 6e 65 29 |=(int)(0.50*one)| 00000450 3b 0a 0a 42 4f 4f 4c 20 73 61 76 65 33 32 20 3d |;..BOOL save32 =| 00000460 20 54 52 55 45 3b 0a 42 4f 4f 4c 20 73 61 76 65 | TRUE;.BOOL save| 00000470 38 20 3d 20 54 52 55 45 3b 0a 74 79 70 65 64 65 |8 = TRUE;.typede| 00000480 66 20 73 74 72 75 63 74 20 7b 0a 20 20 73 69 67 |f struct {. sig| 00000490 6e 65 64 20 63 68 61 72 20 65 72 3b 0a 20 20 73 |ned char er;. s| 000004a0 69 67 6e 65 64 20 63 68 61 72 20 65 67 3b 0a 20 |igned char eg;. | 000004b0 20 73 69 67 6e 65 64 20 63 68 61 72 20 65 62 3b | signed char eb;| 000004c0 0a 20 20 73 69 67 6e 65 64 20 63 68 61 72 20 62 |. signed char b| 000004d0 79 74 65 34 3b 20 20 2f 2a 72 65 6d 69 6e 64 65 |yte4; /*reminde| 000004e0 72 20 74 68 61 74 20 73 74 72 75 63 74 20 77 69 |r that struct wi| 000004f0 6c 6c 20 62 65 20 77 6f 72 64 20 73 69 7a 65 64 |ll be word sized| 00000500 2a 2f 0a 7d 20 63 6f 6d 70 61 63 74 5f 64 69 74 |*/.} compact_dit| 00000510 68 65 72 5f 65 72 72 6f 72 3b 0a 0a 42 4f 4f 4c |her_error;..BOOL| 00000520 20 67 65 6e 5f 32 35 36 77 69 74 68 6e 6f 70 61 | gen_256withnopa| 00000530 6c 65 74 74 65 28 66 6c 65 78 5f 70 74 72 20 73 |lette(flex_ptr s| 00000540 61 2c 20 63 68 61 72 20 2a 6e 61 6d 65 29 3b 0a |a, char *name);.| 00000550 65 78 74 65 72 6e 20 76 6f 69 64 20 67 32 35 36 |extern void g256| 00000560 77 6e 70 5f 69 6e 74 65 72 6e 61 6c 28 69 6e 74 |wnp_internal(int| 00000570 20 78 2c 20 69 6e 74 20 79 2c 20 63 68 61 72 20 | x, int y, char | 00000580 2a 64 70 2c 20 63 68 61 72 20 2a 73 70 2c 20 63 |*dp, char *sp, c| 00000590 6f 6d 70 61 63 74 5f 64 69 74 68 65 72 5f 65 72 |ompact_dither_er| 000005a0 72 6f 72 20 2a 64 65 2c 20 63 68 61 72 20 2a 6c |ror *de, char *l| 000005b0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 |ut,. | 000005c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | | 000005d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 | unsigned int *p| 000005e0 61 6c 32 35 36 64 65 66 29 3b 0a 0a 65 78 74 65 |al256def);..exte| 000005f0 72 6e 20 69 6e 74 20 72 62 62 63 69 6e 63 28 69 |rn int rbbcinc(i| 00000600 6e 74 20 72 2c 20 69 6e 74 20 6b 29 3b 0a 65 78 |nt r, int k);.ex| 00000610 74 65 72 6e 20 69 6e 74 20 64 69 76 5f 66 72 61 |tern int div_fra| 00000620 63 31 36 28 69 6e 74 20 6e 75 6d 62 65 72 2c 20 |c16(int number, | 00000630 69 6e 74 20 64 69 76 69 73 6f 72 29 3b 0a 65 78 |int divisor);.ex| 00000640 74 65 72 6e 20 69 6e 74 20 6d 75 6c 5f 66 72 61 |tern int mul_fra| 00000650 63 31 36 28 69 6e 74 20 78 2c 20 69 6e 74 20 61 |c16(int x, int a| 00000660 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 6d 75 |);.extern int mu| 00000670 6c 5f 66 72 61 63 31 36 63 28 69 6e 74 20 78 2c |l_frac16c(int x,| 00000680 20 69 6e 74 20 61 29 3b 0a 65 78 74 65 72 6e 20 | int a);.extern | 00000690 69 6e 74 20 73 71 72 74 5f 66 72 61 63 31 36 28 |int sqrt_frac16(| 000006a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 29 3b |unsigned int x);| 000006b0 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 61 75 73 |.extern int gaus| 000006c0 73 31 36 28 76 6f 69 64 29 3b 0a 65 78 74 65 72 |s16(void);.exter| 000006d0 6e 20 76 6f 69 64 20 73 67 61 75 73 73 31 36 28 |n void sgauss16(| 000006e0 69 6e 74 20 73 65 65 64 29 3b 0a 65 78 74 65 72 |int seed);.exter| 000006f0 6e 20 69 6e 74 20 63 6f 73 31 36 28 69 6e 74 20 |n int cos16(int | 00000700 61 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 |a);.extern int s| 00000710 69 6e 31 36 28 69 6e 74 20 61 29 3b 0a 65 78 74 |in16(int a);.ext| 00000720 65 72 6e 20 69 6e 74 20 65 78 70 31 36 28 69 6e |ern int exp16(in| 00000730 74 20 61 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 |t a);.extern int| 00000740 20 6c 6e 31 36 28 69 6e 74 20 61 29 3b 0a 65 78 | ln16(int a);.ex| 00000750 74 65 72 6e 20 69 6e 74 20 70 6f 77 31 36 28 69 |tern int pow16(i| 00000760 6e 74 20 61 2c 20 69 6e 74 20 62 29 3b 0a 65 78 |nt a, int b);.ex| 00000770 74 65 72 6e 20 69 6e 74 20 61 63 73 31 36 28 69 |tern int acs16(i| 00000780 6e 74 20 61 29 3b 0a 65 78 74 65 72 6e 20 69 6e |nt a);.extern in| 00000790 74 20 61 73 6e 31 36 28 69 6e 74 20 61 29 3b 0a |t asn16(int a);.| 000007a0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |./**************| 000007b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 000007c0 2a 2a 2a 2a 2a 2a 2a 2a 20 66 6f 75 72 69 65 72 |******** fourier| 000007d0 20 74 72 61 6e 73 66 6f 72 6d 20 66 75 6e 63 74 | transform funct| 000007e0 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |ions ***********| 000007f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00000800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a |*************/..| 00000810 42 4f 4f 4c 20 69 6e 76 66 66 74 5f 32 64 28 63 |BOOL invfft_2d(c| 00000820 6f 6d 70 6c 65 78 20 2a 64 61 74 61 2c 20 69 6e |omplex *data, in| 00000830 74 20 6c 69 6d 69 74 29 0a 7b 0a 20 20 69 6e 74 |t limit).{. int| 00000840 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 20 3d | i, j;. int n =| 00000850 20 31 3c 3c 6c 69 6d 69 74 3b 0a 20 20 63 6f 6d | 1<<limit;. com| 00000860 70 6c 65 78 20 74 31 2c 20 2a 64 31 2c 20 2a 64 |plex t1, *d1, *d| 00000870 31 65 2c 20 2a 64 32 3b 0a 20 20 69 6e 74 20 6b |1e, *d2;. int k| 00000880 2c 20 6c 3b 0a 20 20 69 6e 74 20 6c 6f 6f 70 3b |, l;. int loop;| 00000890 0a 20 20 69 6e 74 20 72 6f 74 61 6e 67 6c 65 2c |. int rotangle,| 000008a0 20 61 6e 67 6c 65 3b 0a 20 20 69 6e 74 20 63 6f | angle;. int co| 000008b0 73 2c 20 73 69 6e 3b 0a 20 20 69 66 20 28 6c 69 |s, sin;. if (li| 000008c0 6d 69 74 3c 33 20 7c 7c 20 6c 69 6d 69 74 3e 33 |mit<3 || limit>3| 000008d0 32 29 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b |2) return FALSE;| 000008e0 0a 0a 20 20 66 6f 72 20 28 69 3d 6a 3d 30 3b 20 |.. for (i=j=0; | 000008f0 6a 3c 6e 3b 20 69 3d 72 62 62 63 69 6e 63 28 69 |j<n; i=rbbcinc(i| 00000900 2c 20 6c 69 6d 69 74 29 2c 20 6a 2b 2b 29 20 69 |, limit), j++) i| 00000910 66 20 28 69 3e 6a 29 20 7b 0a 20 20 20 20 66 6f |f (i>j) {. fo| 00000920 72 20 28 64 31 3d 64 61 74 61 2b 28 69 3c 3c 6c |r (d1=data+(i<<l| 00000930 69 6d 69 74 29 2c 20 64 32 3d 64 61 74 61 2b 28 |imit), d2=data+(| 00000940 6a 3c 3c 6c 69 6d 69 74 29 2c 20 64 31 65 3d 64 |j<<limit), d1e=d| 00000950 31 2b 6e 3b 20 64 31 3c 64 31 65 3b 29 20 7b 0a |1+n; d1<d1e;) {.| 00000960 20 20 20 20 20 20 74 31 20 3d 20 2a 64 31 3b 0a | t1 = *d1;.| 00000970 20 20 20 20 20 20 2a 64 31 2b 2b 20 3d 20 2a 64 | *d1++ = *d| 00000980 32 3b 0a 20 20 20 20 20 20 2a 64 32 2b 2b 20 3d |2;. *d2++ =| 00000990 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 | t1;. }. }. | 000009a0 20 72 6f 74 61 6e 67 6c 65 20 3d 20 2d 32 2a 6f | rotangle = -2*o| 000009b0 6e 65 3b 0a 20 20 66 6f 72 20 28 6b 3d 6c 6f 6f |ne;. for (k=loo| 000009c0 70 3d 31 3b 20 6c 6f 6f 70 3c 3d 6c 69 6d 69 74 |p=1; loop<=limit| 000009d0 3b 20 6c 6f 6f 70 2b 2b 2c 20 6b 3c 3c 3d 31 2c |; loop++, k<<=1,| 000009e0 20 72 6f 74 61 6e 67 6c 65 2f 3d 32 29 20 7b 0a | rotangle/=2) {.| 000009f0 20 20 20 20 66 6f 72 20 28 61 6e 67 6c 65 3d 30 | for (angle=0| 00000a00 2c 20 73 69 6e 3d 30 2c 20 63 6f 73 3d 6f 6e 65 |, sin=0, cos=one| 00000a10 2c 20 69 3d 31 3b 20 69 3c 3d 6b 3b 20 69 2b 2b |, i=1; i<=k; i++| 00000a20 2c 20 61 6e 67 6c 65 2b 3d 72 6f 74 61 6e 67 6c |, angle+=rotangl| 00000a30 65 2c 20 73 69 6e 3d 73 69 6e 31 36 28 61 6e 67 |e, sin=sin16(ang| 00000a40 6c 65 29 2c 20 63 6f 73 3d 63 6f 73 31 36 28 61 |le), cos=cos16(a| 00000a50 6e 67 6c 65 29 29 20 7b 0a 20 20 20 20 20 20 66 |ngle)) {. f| 00000a60 6f 72 20 28 6a 3d 69 2d 31 3b 20 6a 3c 6e 3b 20 |or (j=i-1; j<n; | 00000a70 6a 2b 3d 6b 3c 3c 31 29 20 7b 0a 20 20 20 20 20 |j+=k<<1) {. | 00000a80 20 20 20 6c 20 3d 20 6a 2b 6b 3b 0a 20 20 20 20 | l = j+k;. | 00000a90 20 20 20 20 66 6f 72 20 28 64 31 3d 64 61 74 61 | for (d1=data| 00000aa0 2b 28 6c 3c 3c 6c 69 6d 69 74 29 2c 20 64 32 3d |+(l<<limit), d2=| 00000ab0 64 61 74 61 2b 28 6a 3c 3c 6c 69 6d 69 74 29 2c |data+(j<<limit),| 00000ac0 20 64 31 65 3d 64 31 2b 6e 3b 20 64 31 3c 64 31 | d1e=d1+n; d1<d1| 00000ad0 65 3b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 |e;) {. | 00000ae0 74 31 2e 72 65 20 3d 20 28 6d 75 6c 5f 66 72 61 |t1.re = (mul_fra| 00000af0 63 31 36 63 28 64 31 2d 3e 72 65 2c 20 63 6f 73 |c16c(d1->re, cos| 00000b00 29 2d 6d 75 6c 5f 66 72 61 63 31 36 63 28 64 31 |)-mul_frac16c(d1| 00000b10 2d 3e 69 6d 2c 20 73 69 6e 29 29 3b 0a 20 20 20 |->im, sin));. | 00000b20 20 20 20 20 20 20 20 74 31 2e 69 6d 20 3d 20 28 | t1.im = (| 00000b30 6d 75 6c 5f 66 72 61 63 31 36 63 28 64 31 2d 3e |mul_frac16c(d1->| 00000b40 72 65 2c 20 73 69 6e 29 2b 6d 75 6c 5f 66 72 61 |re, sin)+mul_fra| 00000b50 63 31 36 63 28 64 31 2d 3e 69 6d 2c 20 63 6f 73 |c16c(d1->im, cos| 00000b60 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 31 |));. d1| 00000b70 2d 3e 72 65 20 20 20 20 3d 20 64 32 2d 3e 72 65 |->re = d2->re| 00000b80 2d 74 31 2e 72 65 3b 0a 20 20 20 20 20 20 20 20 |-t1.re;. | 00000b90 20 20 64 31 2b 2b 2d 3e 69 6d 20 20 3d 20 64 32 | d1++->im = d2| 00000ba0 2d 3e 69 6d 2d 74 31 2e 69 6d 3b 0a 20 20 20 20 |->im-t1.im;. | 00000bb0 20 20 20 20 20 20 64 32 2d 3e 72 65 20 20 20 2b | d2->re +| 00000bc0 3d 20 74 31 2e 72 65 3b 0a 20 20 20 20 20 20 20 |= t1.re;. | 00000bd0 20 20 20 64 32 2b 2b 2d 3e 69 6d 20 2b 3d 20 74 | d2++->im += t| 00000be0 31 2e 69 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a |1.im;. }.| 00000bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 | }. }. | 00000c00 7d 0a 0a 20 20 66 6f 72 20 28 69 3d 6a 3d 30 3b |}.. for (i=j=0;| 00000c10 20 6a 3c 6e 3b 20 69 3d 72 62 62 63 69 6e 63 28 | j<n; i=rbbcinc(| 00000c20 69 2c 20 6c 69 6d 69 74 29 2c 20 6a 2b 2b 29 20 |i, limit), j++) | 00000c30 69 66 20 28 69 3e 6a 29 20 7b 0a 20 20 20 20 66 |if (i>j) {. f| 00000c40 6f 72 20 28 64 31 3d 64 61 74 61 2b 69 2c 20 64 |or (d1=data+i, d| 00000c50 32 3d 64 61 74 61 2b 6a 2c 20 64 31 65 3d 64 31 |2=data+j, d1e=d1| 00000c60 2b 6e 2a 6e 3b 20 64 31 3c 64 31 65 3b 20 64 31 |+n*n; d1<d1e; d1| 00000c70 2b 3d 6e 2c 20 64 32 2b 3d 6e 29 20 7b 0a 20 20 |+=n, d2+=n) {. | 00000c80 20 20 20 20 74 31 20 3d 20 2a 64 31 3b 0a 20 20 | t1 = *d1;. | 00000c90 20 20 20 20 2a 64 31 20 3d 20 2a 64 32 3b 0a 20 | *d1 = *d2;. | 00000ca0 20 20 20 20 20 2a 64 32 20 3d 20 74 31 3b 0a 20 | *d2 = t1;. | 00000cb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 6f 74 61 6e | }. }. rotan| 00000cc0 67 6c 65 20 3d 20 2d 32 2a 6f 6e 65 3b 0a 20 20 |gle = -2*one;. | 00000cd0 66 6f 72 20 28 6b 3d 6c 6f 6f 70 3d 31 3b 20 6c |for (k=loop=1; l| 00000ce0 6f 6f 70 3c 3d 6c 69 6d 69 74 3b 20 6c 6f 6f 70 |oop<=limit; loop| 00000cf0 2b 2b 2c 20 6b 3c 3c 3d 31 2c 20 72 6f 74 61 6e |++, k<<=1, rotan| 00000d00 67 6c 65 2f 3d 32 29 20 7b 0a 20 20 20 20 66 6f |gle/=2) {. fo| 00000d10 72 20 28 61 6e 67 6c 65 3d 30 2c 20 73 69 6e 3d |r (angle=0, sin=| 00000d20 30 2c 20 63 6f 73 3d 6f 6e 65 2c 20 69 3d 31 3b |0, cos=one, i=1;| 00000d30 20 69 3c 3d 6b 3b 20 69 2b 2b 2c 20 61 6e 67 6c | i<=k; i++, angl| 00000d40 65 2b 3d 72 6f 74 61 6e 67 6c 65 2c 20 73 69 6e |e+=rotangle, sin| 00000d50 3d 73 69 6e 31 36 28 61 6e 67 6c 65 29 2c 20 63 |=sin16(angle), c| 00000d60 6f 73 3d 63 6f 73 31 36 28 61 6e 67 6c 65 29 29 |os=cos16(angle))| 00000d70 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 28 6a 3d | {. for (j=| 00000d80 69 2d 31 3b 20 6a 3c 6e 3b 20 6a 2b 3d 6b 3c 3c |i-1; j<n; j+=k<<| 00000d90 31 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 20 3d |1) {. l =| 00000da0 20 6a 2b 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f | j+k;. fo| 00000db0 72 20 28 64 31 3d 64 61 74 61 2b 6c 2c 20 64 32 |r (d1=data+l, d2| 00000dc0 3d 64 61 74 61 2b 6a 2c 20 64 31 65 3d 64 31 2b |=data+j, d1e=d1+| 00000dd0 6e 2a 6e 3b 20 64 31 3c 64 31 65 3b 20 64 31 2b |n*n; d1<d1e; d1+| 00000de0 3d 6e 2c 20 64 32 2b 3d 6e 29 20 7b 0a 20 20 20 |=n, d2+=n) {. | 00000df0 20 20 20 20 20 20 20 74 31 2e 72 65 20 3d 20 28 | t1.re = (| 00000e00 6d 75 6c 5f 66 72 61 63 31 36 63 28 64 31 2d 3e |mul_frac16c(d1->| 00000e10 72 65 2c 20 63 6f 73 29 2d 6d 75 6c 5f 66 72 61 |re, cos)-mul_fra| 00000e20 63 31 36 63 28 64 31 2d 3e 69 6d 2c 20 73 69 6e |c16c(d1->im, sin| 00000e30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 31 |));. t1| 00000e40 2e 69 6d 20 3d 20 28 6d 75 6c 5f 66 72 61 63 31 |.im = (mul_frac1| 00000e50 36 63 28 64 31 2d 3e 72 65 2c 20 73 69 6e 29 2b |6c(d1->re, sin)+| 00000e60 6d 75 6c 5f 66 72 61 63 31 36 63 28 64 31 2d 3e |mul_frac16c(d1->| 00000e70 69 6d 2c 20 63 6f 73 29 29 3b 0a 20 20 20 20 20 |im, cos));. | 00000e80 20 20 20 20 20 64 31 2d 3e 72 65 20 20 3d 20 64 | d1->re = d| 00000e90 32 2d 3e 72 65 2d 74 31 2e 72 65 3b 0a 20 20 20 |2->re-t1.re;. | 00000ea0 20 20 20 20 20 20 20 64 31 2d 3e 69 6d 20 20 3d | d1->im =| 00000eb0 20 64 32 2d 3e 69 6d 2d 74 31 2e 69 6d 3b 0a 20 | d2->im-t1.im;. | 00000ec0 20 20 20 20 20 20 20 20 20 64 32 2d 3e 72 65 20 | d2->re | 00000ed0 2b 3d 20 74 31 2e 72 65 3b 0a 20 20 20 20 20 20 |+= t1.re;. | 00000ee0 20 20 20 20 64 32 2d 3e 69 6d 20 2b 3d 20 74 31 | d2->im += t1| 00000ef0 2e 69 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 |.im;. }. | 00000f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d | }. }. }| 00000f10 0a 0a 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b |.. return TRUE;| 00000f20 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |.}../***********| 00000f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00000f40 2a 2a 2a 2a 2a 2a 2a 2a 20 64 61 74 61 20 67 65 |******** data ge| 00000f50 6e 65 72 61 74 69 6f 6e 2f 6d 61 6e 69 70 75 6c |neration/manipul| 00000f60 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 |ation functions | 00000f70 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a | ***************| 00000f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00000f90 2f 0a 0a 2f 2a 54 68 65 20 66 6f 6c 6c 6f 77 69 |/../*The followi| 00000fa0 6e 67 20 61 73 73 69 67 6e 73 20 76 61 6c 75 65 |ng assigns value| 00000fb0 73 20 74 6f 20 32 64 20 64 61 74 61 20 61 72 72 |s to 2d data arr| 00000fc0 61 79 20 77 69 74 68 20 73 75 69 74 61 62 6c 65 |ay with suitable| 00000fd0 20 70 72 6f 70 65 72 74 69 65 73 2e 2a 2f 0a 2f | properties.*/./| 00000fe0 2a 49 74 20 64 6f 65 73 20 68 6f 77 65 76 65 72 |*It does however| 00000ff0 20 64 6f 20 73 6f 20 62 79 20 73 63 61 6e 6e 69 | do so by scanni| 00001000 6e 67 20 74 68 65 20 61 72 72 61 79 20 69 6e 20 |ng the array in | 00001010 61 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20 6f 72 |a non-obvious or| 00001020 64 65 72 2e 0a 20 20 54 68 69 73 20 68 61 73 20 |der.. This has | 00001030 62 65 65 6e 20 63 68 6f 73 65 6e 20 73 6f 20 74 |been chosen so t| 00001040 68 61 74 20 69 66 20 6e 20 69 73 20 69 6e 63 72 |hat if n is incr| 00001050 65 61 73 65 64 20 62 79 20 64 6f 75 62 6c 69 6e |eased by doublin| 00001060 67 2c 20 74 68 65 6e 20 74 68 6f 73 65 20 72 61 |g, then those ra| 00001070 6e 64 6f 6d 20 76 61 6c 75 65 73 20 75 73 65 64 |ndom values used| 00001080 20 66 6f 72 20 74 68 65 0a 20 20 6c 61 73 74 20 | for the. last | 00001090 67 72 69 64 20 77 69 6c 6c 20 62 65 20 6e 6f 77 |grid will be now| 000010a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 | written to the | 000010b0 6c 6f 77 20 66 72 65 71 75 65 6e 63 79 20 71 75 |low frequency qu| 000010c0 61 64 72 61 6e 74 20 6f 66 20 74 68 65 20 6e 65 |adrant of the ne| 000010d0 77 20 67 72 69 64 20 28 69 66 20 73 61 6d 65 20 |w grid (if same | 000010e0 73 65 65 64 20 75 73 65 64 29 2c 0a 20 20 73 75 |seed used),. su| 000010f0 69 74 61 62 6c 79 20 72 65 20 66 69 6c 74 65 72 |itably re filter| 00001100 65 64 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 |ed. This should | 00001110 68 61 76 65 20 65 66 66 65 63 74 20 6f 66 20 67 |have effect of g| 00001120 69 76 69 6e 67 20 61 20 64 65 67 72 65 65 20 6f |iving a degree o| 00001130 66 20 63 6f 6e 74 69 6e 75 69 74 79 20 74 6f 20 |f continuity to | 00001140 74 68 65 20 63 68 61 6e 67 65 20 69 6e 20 6e 2c |the change in n,| 00001150 0a 20 20 73 69 6e 63 65 20 66 6f 72 6d 65 72 20 |. since former | 00001160 66 72 65 71 75 65 6e 63 69 65 73 20 61 72 65 20 |frequencies are | 00001170 63 61 72 72 69 65 64 20 6f 76 65 72 20 74 6f 20 |carried over to | 00001180 74 68 65 20 6c 6f 77 20 66 72 65 71 75 65 6e 63 |the low frequenc| 00001190 69 65 73 20 6f 66 20 74 68 65 20 68 69 67 68 65 |ies of the highe| 000011a0 72 20 72 65 73 20 67 72 69 64 2e 0a 2a 2f 0a 42 |r res grid..*/.B| 000011b0 4f 4f 4c 20 61 73 73 69 67 6e 5f 66 74 28 63 6f |OOL assign_ft(co| 000011c0 6d 70 6c 65 78 20 2a 64 61 74 61 2c 20 69 6e 74 |mplex *data, int| 000011d0 20 6c 69 6d 69 74 2c 20 64 6f 75 62 6c 65 20 64 | limit, double d| 000011e0 69 6d 2c 20 69 6e 74 20 73 65 65 64 29 0a 7b 0a |im, int seed).{.| 000011f0 20 20 69 6e 74 20 6e 3d 31 3c 3c 6c 69 6d 69 74 | int n=1<<limit| 00001200 3b 0a 20 20 69 6e 74 20 69 2c 20 69 63 2c 20 6a |;. int i, ic, j| 00001210 2c 20 69 32 2c 20 6a 32 2c 20 6b 2c 20 6c 3b 0a |, i2, j2, k, l;.| 00001220 20 20 63 6f 6d 70 6c 65 78 20 2a 64 31 2c 20 2a | complex *d1, *| 00001230 64 32 2c 20 2a 64 3b 0a 20 20 69 6e 74 20 70 68 |d2, *d;. int ph| 00001240 61 73 65 2c 20 72 61 64 3b 0a 20 20 69 6e 74 20 |ase, rad;. int | 00001250 69 6d 2c 20 72 65 3b 0a 20 20 69 6e 74 20 6d 62 |im, re;. int mb| 00001260 70 6f 62 74 3b 0a 0a 20 20 73 72 61 6e 64 28 2d |pobt;.. srand(-| 00001270 73 65 65 64 29 3b 0a 20 20 73 67 61 75 73 73 31 |seed);. sgauss1| 00001280 36 28 2d 73 65 65 64 29 3b 0a 0a 20 20 6d 62 70 |6(-seed);.. mbp| 00001290 6f 62 74 20 3d 20 28 69 6e 74 29 28 2d 28 34 2d |obt = (int)(-(4-| 000012a0 64 69 6d 29 2a 6f 6e 65 29 3b 0a 20 20 64 61 74 |dim)*one);. dat| 000012b0 61 2d 3e 72 65 20 3d 20 64 61 74 61 2d 3e 69 6d |a->re = data->im| 000012c0 20 3d 20 30 3b 0a 20 20 66 6f 72 20 28 69 3d 31 | = 0;. for (i=1| 000012d0 3b 20 69 3c 3d 6e 2f 32 3b 20 69 2b 2b 29 20 7b |; i<=n/2; i++) {| 000012e0 0a 20 20 20 20 6a 32 20 3d 20 69 32 20 3d 20 69 |. j2 = i2 = i| 000012f0 2a 69 3b 0a 20 20 20 20 6b 20 20 3d 20 6e 2d 69 |*i;. k = n-i| 00001300 3b 0a 20 20 20 20 64 31 20 3d 20 64 61 74 61 2b |;. d1 = data+| 00001310 69 2a 6e 3b 0a 20 20 20 20 64 32 20 3d 20 64 61 |i*n;. d2 = da| 00001320 74 61 2b 6b 2a 6e 3b 0a 20 20 20 20 66 6f 72 20 |ta+k*n;. for | 00001330 28 6a 3d 30 3b 20 6a 3c 3d 69 3b 20 6a 2b 2b 29 |(j=0; j<=i; j++)| 00001340 20 7b 0a 20 20 20 20 20 20 6c 20 3d 20 6a 3d 3d | {. l = j==| 00001350 30 20 3f 20 30 20 3a 20 6e 2d 6a 3b 0a 20 20 20 |0 ? 0 : n-j;. | 00001360 20 20 20 70 68 61 73 65 20 3d 20 72 61 6e 64 28 | phase = rand(| 00001370 29 3e 3e 31 33 3b 0a 20 20 20 20 20 20 72 61 64 |)>>13;. rad| 00001380 20 3d 20 6d 75 6c 5f 66 72 61 63 31 36 28 70 6f | = mul_frac16(po| 00001390 77 31 36 28 73 71 72 74 5f 66 72 61 63 31 36 28 |w16(sqrt_frac16(| 000013a0 28 69 32 2b 6a 2a 6a 29 2a 28 6f 6e 65 2f 34 29 |(i2+j*j)*(one/4)| 000013b0 29 2a 32 2c 20 6d 62 70 6f 62 74 29 2c 20 67 61 |)*2, mbpobt), ga| 000013c0 75 73 73 31 36 28 29 29 3b 0a 20 20 20 20 20 20 |uss16());. | 000013d0 72 65 20 3d 20 6d 75 6c 5f 66 72 61 63 31 36 63 |re = mul_frac16c| 000013e0 28 72 61 64 2c 20 63 6f 73 31 36 28 70 68 61 73 |(rad, cos16(phas| 000013f0 65 29 29 3b 0a 20 20 20 20 20 20 69 6d 20 3d 20 |e));. im = | 00001400 6d 75 6c 5f 66 72 61 63 31 36 63 28 72 61 64 2c |mul_frac16c(rad,| 00001410 20 73 69 6e 31 36 28 70 68 61 73 65 29 29 3b 0a | sin16(phase));.| 00001420 20 20 20 20 20 20 64 20 3d 20 64 31 2b 6a 3b 0a | d = d1+j;.| 00001430 20 20 20 20 20 20 64 2d 3e 72 65 20 3d 20 72 65 | d->re = re| 00001440 3b 0a 20 20 20 20 20 20 64 2d 3e 69 6d 20 3d 20 |;. d->im = | 00001450 69 6d 3b 0a 20 20 20 20 20 20 64 20 3d 20 64 32 |im;. d = d2| 00001460 2b 6c 3b 0a 20 20 20 20 20 20 64 2d 3e 72 65 20 |+l;. d->re | 00001470 3d 20 72 65 3b 0a 20 20 20 20 20 20 64 2d 3e 69 |= re;. d->i| 00001480 6d 20 3d 20 2d 69 6d 3b 0a 20 20 20 20 7d 0a 20 |m = -im;. }. | 00001490 20 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 6c 20 | j = i;. l | 000014a0 3d 20 6e 2d 6a 3b 0a 20 20 20 20 64 31 20 3d 20 |= n-j;. d1 = | 000014b0 64 61 74 61 2b 6a 3b 0a 20 20 20 20 64 32 20 3d |data+j;. d2 =| 000014c0 20 64 61 74 61 2b 6c 3b 0a 20 20 20 20 66 6f 72 | data+l;. for| 000014d0 20 28 69 63 3d 69 2d 31 3b 20 69 63 3e 3d 30 3b | (ic=i-1; ic>=0;| 000014e0 20 69 63 2d 2d 29 20 7b 0a 20 20 20 20 20 20 6b | ic--) {. k| 000014f0 20 3d 20 69 63 3d 3d 30 20 3f 20 30 20 3a 20 6e | = ic==0 ? 0 : n| 00001500 2d 69 63 3b 0a 20 20 20 20 20 20 70 68 61 73 65 |-ic;. phase| 00001510 20 3d 20 72 61 6e 64 28 29 3e 3e 31 33 3b 0a 20 | = rand()>>13;. | 00001520 20 20 20 20 20 72 61 64 20 3d 20 6d 75 6c 5f 66 | rad = mul_f| 00001530 72 61 63 31 36 28 70 6f 77 31 36 28 73 71 72 74 |rac16(pow16(sqrt| 00001540 5f 66 72 61 63 31 36 28 28 69 63 2a 69 63 2b 6a |_frac16((ic*ic+j| 00001550 32 29 2a 28 6f 6e 65 2f 34 29 29 2a 32 2c 20 6d |2)*(one/4))*2, m| 00001560 62 70 6f 62 74 29 2c 20 67 61 75 73 73 31 36 28 |bpobt), gauss16(| 00001570 29 29 3b 0a 20 20 20 20 20 20 72 65 20 3d 20 6d |));. re = m| 00001580 75 6c 5f 66 72 61 63 31 36 63 28 72 61 64 2c 20 |ul_frac16c(rad, | 00001590 63 6f 73 31 36 28 70 68 61 73 65 29 29 3b 0a 20 |cos16(phase));. | 000015a0 20 20 20 20 20 69 6d 20 3d 20 6d 75 6c 5f 66 72 | im = mul_fr| 000015b0 61 63 31 36 63 28 72 61 64 2c 20 73 69 6e 31 36 |ac16c(rad, sin16| 000015c0 28 70 68 61 73 65 29 29 3b 0a 20 20 20 20 20 20 |(phase));. | 000015d0 64 20 3d 20 64 31 2b 69 63 2a 6e 3b 0a 20 20 20 |d = d1+ic*n;. | 000015e0 20 20 20 64 2d 3e 72 65 20 3d 20 72 65 3b 0a 20 | d->re = re;. | 000015f0 20 20 20 20 20 64 2d 3e 69 6d 20 3d 20 69 6d 3b | d->im = im;| 00001600 0a 20 20 20 20 20 20 64 20 3d 20 64 32 2b 6b 2a |. d = d2+k*| 00001610 6e 3b 0a 20 20 20 20 20 20 64 2d 3e 72 65 20 3d |n;. d->re =| 00001620 20 72 65 3b 0a 20 20 20 20 20 20 64 2d 3e 69 6d | re;. d->im| 00001630 20 3d 20 2d 69 6d 3b 0a 20 20 20 20 7d 0a 20 20 | = -im;. }. | 00001640 20 20 69 66 20 28 69 3c 6e 2f 32 29 20 7b 0a 20 | if (i<n/2) {. | 00001650 20 20 20 20 20 69 63 20 3d 20 6e 2d 69 3b 0a 20 | ic = n-i;. | 00001660 20 20 20 20 20 6b 20 3d 20 69 3b 0a 20 20 20 20 | k = i;. | 00001670 20 20 64 31 20 3d 20 64 61 74 61 2b 69 63 2a 6e | d1 = data+ic*n| 00001680 3b 0a 20 20 20 20 20 20 64 32 20 3d 20 64 61 74 |;. d2 = dat| 00001690 61 2b 6b 2a 6e 3b 0a 20 20 20 20 20 20 66 6f 72 |a+k*n;. for| 000016a0 20 28 6a 3d 31 3b 20 6a 3c 3d 69 3b 20 6a 2b 2b | (j=1; j<=i; j++| 000016b0 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 20 3d 20 |) {. l = | 000016c0 6e 2d 6a 3b 0a 20 20 20 20 20 20 20 20 70 68 61 |n-j;. pha| 000016d0 73 65 20 3d 20 72 61 6e 64 28 29 3e 3e 31 33 3b |se = rand()>>13;| 000016e0 0a 20 20 20 20 20 20 20 20 72 61 64 20 3d 20 6d |. rad = m| 000016f0 75 6c 5f 66 72 61 63 31 36 28 70 6f 77 31 36 28 |ul_frac16(pow16(| 00001700 73 71 72 74 5f 66 72 61 63 31 36 28 28 69 32 2b |sqrt_frac16((i2+| 00001710 6a 2a 6a 29 2a 28 6f 6e 65 2f 34 29 29 2a 32 2c |j*j)*(one/4))*2,| 00001720 20 6d 62 70 6f 62 74 29 2c 20 67 61 75 73 73 31 | mbpobt), gauss1| 00001730 36 28 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 |6());. re| 00001740 20 3d 20 6d 75 6c 5f 66 72 61 63 31 36 63 28 72 | = mul_frac16c(r| 00001750 61 64 2c 20 63 6f 73 31 36 28 70 68 61 73 65 29 |ad, cos16(phase)| 00001760 29 3b 0a 20 20 20 20 20 20 20 20 69 6d 20 3d 20 |);. im = | 00001770 6d 75 6c 5f 66 72 61 63 31 36 63 28 72 61 64 2c |mul_frac16c(rad,| 00001780 20 73 69 6e 31 36 28 70 68 61 73 65 29 29 3b 0a | sin16(phase));.| 00001790 20 20 20 20 20 20 20 20 64 20 3d 20 64 31 2b 6a | d = d1+j| 000017a0 3b 0a 20 20 20 20 20 20 20 20 64 2d 3e 72 65 20 |;. d->re | 000017b0 3d 20 72 65 3b 0a 20 20 20 20 20 20 20 20 64 2d |= re;. d-| 000017c0 3e 69 6d 20 3d 20 69 6d 3b 0a 20 20 20 20 20 20 |>im = im;. | 000017d0 20 20 64 20 3d 20 64 32 2b 6c 3b 0a 20 20 20 20 | d = d2+l;. | 000017e0 20 20 20 20 64 2d 3e 72 65 20 3d 20 72 65 3b 0a | d->re = re;.| 000017f0 20 20 20 20 20 20 20 20 64 2d 3e 69 6d 20 3d 20 | d->im = | 00001800 2d 69 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 |-im;. }. | 00001810 20 20 20 6a 3d 69 3b 0a 20 20 20 20 20 20 6c 20 | j=i;. l | 00001820 3d 20 6e 2d 6a 3b 0a 20 20 20 20 20 20 64 31 20 |= n-j;. d1 | 00001830 3d 20 64 61 74 61 2b 6a 3b 0a 20 20 20 20 20 20 |= data+j;. | 00001840 64 32 20 3d 20 64 61 74 61 2b 6c 3b 0a 20 20 20 |d2 = data+l;. | 00001850 20 20 20 66 6f 72 20 28 69 63 2b 2b 3b 20 69 63 | for (ic++; ic| 00001860 3c 6e 3b 20 69 63 2b 2b 29 20 7b 0a 20 20 20 20 |<n; ic++) {. | 00001870 20 20 20 20 6b 20 3d 20 6e 2d 69 63 3b 0a 20 20 | k = n-ic;. | 00001880 20 20 20 20 20 20 70 68 61 73 65 20 3d 20 72 61 | phase = ra| 00001890 6e 64 28 29 3e 3e 31 33 3b 0a 20 20 20 20 20 20 |nd()>>13;. | 000018a0 20 20 72 61 64 20 3d 20 6d 75 6c 5f 66 72 61 63 | rad = mul_frac| 000018b0 31 36 28 70 6f 77 31 36 28 73 71 72 74 5f 66 72 |16(pow16(sqrt_fr| 000018c0 61 63 31 36 28 28 6b 2a 6b 2b 6a 32 29 2a 28 6f |ac16((k*k+j2)*(o| 000018d0 6e 65 2f 34 29 29 2a 32 2c 20 6d 62 70 6f 62 74 |ne/4))*2, mbpobt| 000018e0 29 2c 20 67 61 75 73 73 31 36 28 29 29 3b 0a 20 |), gauss16());. | 000018f0 20 20 20 20 20 20 20 72 65 20 3d 20 6d 75 6c 5f | re = mul_| 00001900 66 72 61 63 31 36 63 28 72 61 64 2c 20 63 6f 73 |frac16c(rad, cos| 00001910 31 36 28 70 68 61 73 65 29 29 3b 0a 20 20 20 20 |16(phase));. | 00001920 20 20 20 20 69 6d 20 3d 20 6d 75 6c 5f 66 72 61 | im = mul_fra| 00001930 63 31 36 63 28 72 61 64 2c 20 73 69 6e 31 36 28 |c16c(rad, sin16(| 00001940 70 68 61 73 65 29 29 3b 0a 20 20 20 20 20 20 20 |phase));. | 00001950 20 64 20 3d 20 64 31 2b 69 63 2a 6e 3b 0a 20 20 | d = d1+ic*n;. | 00001960 20 20 20 20 20 20 64 2d 3e 72 65 20 3d 20 72 65 | d->re = re| 00001970 3b 0a 20 20 20 20 20 20 20 20 64 2d 3e 69 6d 20 |;. d->im | 00001980 3d 20 69 6d 3b 0a 20 20 20 20 20 20 20 20 64 20 |= im;. d | 00001990 3d 20 64 32 2b 6b 2a 6e 3b 0a 20 20 20 20 20 20 |= d2+k*n;. | 000019a0 20 20 64 2d 3e 72 65 20 3d 20 72 65 3b 0a 20 20 | d->re = re;. | 000019b0 20 20 20 20 20 20 64 2d 3e 69 6d 20 3d 20 2d 69 | d->im = -i| 000019c0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d |m;. }. }| 000019d0 0a 20 20 7d 0a 20 20 28 64 61 74 61 2b 6e 2a 6e |. }. (data+n*n| 000019e0 2f 32 29 2d 3e 69 6d 20 3d 20 28 64 61 74 61 2b |/2)->im = (data+| 000019f0 6e 2f 32 29 2d 3e 69 6d 20 3d 20 28 64 61 74 61 |n/2)->im = (data| 00001a00 2b 6e 2a 28 6e 2b 31 29 2f 32 29 2d 3e 69 6d 20 |+n*(n+1)/2)->im | 00001a10 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 |= 0;.. return T| 00001a20 52 55 45 3b 0a 7d 0a 0a 2f 2a 63 6f 6e 76 65 72 |RUE;.}../*conver| 00001a30 74 20 61 20 68 65 69 67 68 74 20 61 73 20 73 74 |t a height as st| 00001a40 6f 72 65 64 20 69 6e 20 63 6f 6d 70 61 63 74 65 |ored in compacte| 00001a50 64 20 64 61 74 61 20 74 6f 20 68 65 69 67 68 74 |d data to height| 00001a60 20 6f 66 20 73 63 61 70 65 2a 2f 0a 2f 2a 6e 62 | of scape*/./*nb| 00001a70 20 73 74 6f 72 65 64 20 64 61 74 61 20 68 6f 6c | stored data hol| 00001a80 64 73 20 72 61 77 20 68 65 69 67 68 74 20 69 6e |ds raw height in| 00001a90 20 68 69 67 68 20 31 36 20 62 69 74 73 20 61 6e | high 16 bits an| 00001aa0 64 20 6d 6f 64 69 66 69 65 64 20 76 65 72 73 69 |d modified versi| 00001ab0 6f 6e 20 69 6e 20 6c 6f 77 20 31 36 20 62 69 74 |on in low 16 bit| 00001ac0 73 20 2d 20 73 65 65 20 6e 6f 72 6d 61 6c 69 73 |s - see normalis| 00001ad0 65 5f 61 6e 64 5f 63 6f 6d 70 61 63 74 20 62 65 |e_and_compact be| 00001ae0 6c 6f 77 2a 2f 0a 69 6e 74 20 6d 75 74 65 77 65 |low*/.int mutewe| 00001af0 74 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 |t(unsigned int v| 00001b00 29 0a 7b 0a 20 20 76 20 3d 20 28 76 3c 3c 31 36 |).{. v = (v<<16| 00001b10 29 3e 3e 31 36 3b 0a 20 20 72 65 74 75 72 6e 20 |)>>16;. return | 00001b20 28 73 69 67 6e 65 64 20 69 6e 74 29 76 3c 73 65 |(signed int)v<se| 00001b30 61 6c 65 76 65 6c 20 3f 20 73 65 61 6c 65 76 65 |alevel ? sealeve| 00001b40 6c 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 63 6f 6e 76 |l : v;.}../*conv| 00001b50 65 72 74 20 61 20 68 65 69 67 68 74 20 61 73 20 |ert a height as | 00001b60 73 74 6f 72 65 64 20 69 6e 20 63 6f 6d 70 61 63 |stored in compac| 00001b70 74 65 64 20 64 61 74 61 20 74 6f 20 68 65 69 67 |ted data to heig| 00001b80 68 74 20 6f 66 20 73 63 61 70 65 20 69 67 6e 6f |ht of scape igno| 00001b90 72 69 6e 67 20 73 65 61 20 6c 65 76 65 6c 2a 2f |ring sea level*/| 00001ba0 0a 2f 2a 6e 62 20 73 74 6f 72 65 64 20 64 61 74 |./*nb stored dat| 00001bb0 61 20 68 6f 6c 64 73 20 72 61 77 20 68 65 69 67 |a holds raw heig| 00001bc0 68 74 20 69 6e 20 68 69 67 68 20 31 36 20 62 69 |ht in high 16 bi| 00001bd0 74 73 20 61 6e 64 20 6d 6f 64 69 66 69 65 64 20 |ts and modified | 00001be0 76 65 72 73 69 6f 6e 20 69 6e 20 6c 6f 77 20 31 |version in low 1| 00001bf0 36 20 62 69 74 73 20 2d 20 73 65 65 20 6e 6f 72 |6 bits - see nor| 00001c00 6d 61 6c 69 73 65 5f 61 6e 64 5f 63 6f 6d 70 61 |malise_and_compa| 00001c10 63 74 20 62 65 6c 6f 77 2a 2f 0a 69 6e 74 20 6d |ct below*/.int m| 00001c20 75 74 65 64 72 79 28 75 6e 73 69 67 6e 65 64 20 |utedry(unsigned | 00001c30 69 6e 74 20 76 29 0a 7b 0a 20 20 72 65 74 75 72 |int v).{. retur| 00001c40 6e 20 28 76 3c 3c 31 36 29 3e 3e 31 36 3b 0a 7d |n (v<<16)>>16;.}| 00001c50 0a 0a 42 4f 4f 4c 20 6e 6f 72 6d 61 6c 69 73 65 |..BOOL normalise| 00001c60 5f 61 6e 64 5f 63 6f 6d 70 61 63 74 28 76 6f 69 |_and_compact(voi| 00001c70 64 20 2a 2a 64 61 74 61 2c 20 69 6e 74 20 6c 69 |d **data, int li| 00001c80 6d 69 74 29 0a 7b 0a 20 20 69 6e 74 20 6e 3d 31 |mit).{. int n=1| 00001c90 3c 3c 6c 69 6d 69 74 3b 0a 20 20 69 6e 74 20 6d |<<limit;. int m| 00001ca0 69 6e 3d 31 3c 3c 33 30 3b 0a 20 20 69 6e 74 20 |in=1<<30;. int | 00001cb0 6d 61 78 3d 2d 6d 69 6e 3b 0a 20 20 69 6e 74 20 |max=-min;. int | 00001cc0 73 63 61 6c 65 2c 20 76 2c 20 73 76 3b 0a 20 20 |scale, v, sv;. | 00001cd0 63 6f 6d 70 6c 65 78 20 2a 64 31 2c 20 2a 64 31 |complex *d1, *d1| 00001ce0 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e |e;. unsigned in| 00001cf0 74 20 2a 64 32 3b 0a 0a 20 20 66 6f 72 20 28 64 |t *d2;.. for (d| 00001d00 31 3d 2a 64 61 74 61 2c 20 64 31 65 3d 64 31 2b |1=*data, d1e=d1+| 00001d10 6e 2a 6e 3b 20 64 31 3c 64 31 65 3b 20 64 31 2b |n*n; d1<d1e; d1+| 00001d20 2b 29 20 7b 0a 20 20 20 20 69 66 20 28 64 31 2d |+) {. if (d1-| 00001d30 3e 72 65 3c 6d 69 6e 29 20 6d 69 6e 3d 64 31 2d |>re<min) min=d1-| 00001d40 3e 72 65 3b 0a 20 20 20 20 69 66 20 28 64 31 2d |>re;. if (d1-| 00001d50 3e 72 65 3e 6d 61 78 29 20 6d 61 78 3d 64 31 2d |>re>max) max=d1-| 00001d60 3e 72 65 3b 0a 20 20 7d 0a 20 20 73 63 61 6c 65 |>re;. }. scale| 00001d70 20 3d 20 64 69 76 5f 66 72 61 63 31 36 28 6f 6e | = div_frac16(on| 00001d80 65 2c 20 6d 61 78 2d 6d 69 6e 29 3b 0a 20 20 66 |e, max-min);. f| 00001d90 6f 72 20 28 64 32 3d 2a 64 61 74 61 2c 20 64 31 |or (d2=*data, d1| 00001da0 3d 2a 64 61 74 61 2c 20 64 31 65 3d 64 31 2b 6e |=*data, d1e=d1+n| 00001db0 2a 6e 3b 20 64 31 3c 64 31 65 3b 20 64 31 2b 2b |*n; d1<d1e; d1++| 00001dc0 2c 20 64 32 2b 2b 29 20 7b 0a 20 20 20 20 76 20 |, d2++) {. v | 00001dd0 3d 20 6d 75 6c 5f 66 72 61 63 31 36 28 64 31 2d |= mul_frac16(d1-| 00001de0 3e 72 65 2d 6d 69 6e 2c 20 73 63 61 6c 65 29 3b |>re-min, scale);| 00001df0 0a 20 20 20 20 69 66 20 28 76 3e 3d 6f 6e 65 29 |. if (v>=one)| 00001e00 20 76 3d 6f 6e 65 2d 31 3b 0a 20 20 20 20 69 66 | v=one-1;. if| 00001e10 20 28 76 3c 30 29 20 20 20 20 76 3d 30 3b 0a 20 | (v<0) v=0;. | 00001e20 20 20 20 73 76 20 3d 20 70 6f 77 31 36 28 76 2c | sv = pow16(v,| 00001e30 20 70 6f 77 73 63 61 6c 65 29 3b 0a 20 20 20 20 | powscale);. | 00001e40 69 66 20 28 6c 69 6e 73 63 61 6c 65 21 3d 6f 6e |if (linscale!=on| 00001e50 65 29 20 73 76 20 3d 20 6d 75 6c 5f 66 72 61 63 |e) sv = mul_frac| 00001e60 31 36 63 28 73 76 2c 20 6c 69 6e 73 63 61 6c 65 |16c(sv, linscale| 00001e70 29 3b 0a 20 20 20 20 69 66 20 28 73 76 3e 3d 6f |);. if (sv>=o| 00001e80 6e 65 29 20 73 76 3d 6f 6e 65 2d 31 3b 0a 20 20 |ne) sv=one-1;. | 00001e90 20 20 69 66 20 28 73 76 3c 30 29 20 20 20 20 73 | if (sv<0) s| 00001ea0 76 3d 30 3b 0a 20 20 20 20 2a 64 32 20 3d 20 73 |v=0;. *d2 = s| 00001eb0 76 2b 28 76 3c 3c 31 36 29 3b 0a 20 20 7d 0a 20 |v+(v<<16);. }. | 00001ec0 20 2f 2a 4e 42 20 57 65 20 77 6f 72 6b 20 77 69 | /*NB We work wi| 00001ed0 74 68 20 64 61 74 61 20 62 6f 74 68 20 62 65 66 |th data both bef| 00001ee0 6f 72 65 20 61 20 73 70 65 63 69 61 6c 20 73 63 |ore a special sc| 00001ef0 61 6c 69 6e 67 20 61 6e 64 20 61 66 74 65 72 3b |aling and after;| 00001f00 20 74 68 65 20 61 62 6f 76 65 20 73 74 6f 72 65 | the above store| 00001f10 73 20 65 61 63 68 20 2d 20 72 61 77 20 64 61 74 |s each - raw dat| 00001f20 61 20 69 6e 0a 20 20 20 20 74 68 65 20 68 69 67 |a in. the hig| 00001f30 68 20 31 36 20 62 69 74 73 20 6f 66 20 65 61 63 |h 16 bits of eac| 00001f40 68 20 77 6f 72 64 2c 20 61 6e 64 20 73 63 61 6c |h word, and scal| 00001f50 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 20 6c |ed data in the l| 00001f60 6f 77 20 31 36 20 62 69 74 73 3b 20 69 74 20 69 |ow 16 bits; it i| 00001f70 73 20 74 68 65 20 6c 6f 77 20 31 36 20 62 69 74 |s the low 16 bit| 00001f80 73 20 77 68 69 63 68 20 61 72 65 0a 20 20 20 20 |s which are. | 00001f90 75 73 65 64 20 66 6f 72 20 67 72 61 70 68 69 6e |used for graphin| 00001fa0 67 20 70 75 72 70 6f 73 65 73 20 61 66 74 65 72 |g purposes after| 00001fb0 20 61 70 70 6c 79 69 6e 67 20 61 20 63 6f 6d 70 | applying a comp| 00001fc0 61 72 69 73 6f 6e 20 77 69 74 68 20 73 65 61 6c |arison with seal| 00001fd0 65 76 65 6c 2e 2a 2f 0a 20 20 2f 2a 54 72 61 6e |evel.*/. /*Tran| 00001fe0 73 6d 75 74 65 64 20 69 73 20 73 74 6f 72 65 64 |smuted is stored| 00001ff0 20 74 6f 20 73 61 76 65 20 72 65 70 65 61 74 65 | to save repeate| 00002000 64 20 74 72 61 6e 73 6d 75 74 69 6e 67 20 64 75 |d transmuting du| 00002010 72 69 6e 67 20 67 72 61 70 68 69 6e 67 2c 20 77 |ring graphing, w| 00002020 68 69 6c 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 |hile original is| 00002030 20 73 74 6f 72 65 64 20 74 6f 20 70 65 72 6d 69 | stored to permi| 00002040 74 0a 20 20 20 20 72 65 73 65 74 74 69 6e 67 20 |t. resetting | 00002050 6f 66 20 74 72 61 6e 73 6d 75 74 65 64 20 61 66 |of transmuted af| 00002060 74 65 72 20 61 6c 74 65 72 69 6e 67 20 61 20 74 |ter altering a t| 00002070 72 61 6e 73 6d 75 74 65 20 70 61 72 61 6d 65 74 |ransmute paramet| 00002080 65 72 20 6c 69 6b 65 20 70 6f 77 73 63 61 6c 65 |er like powscale| 00002090 20 77 69 74 68 6f 75 74 20 6e 65 65 64 20 74 6f | without need to| 000020a0 20 72 65 67 65 6e 20 61 6c 6c 0a 20 20 20 20 64 | regen all. d| 000020b0 61 74 61 20 64 69 72 65 63 74 20 66 72 6f 6d 20 |ata direct from | 000020c0 74 68 65 20 72 65 6c 61 74 69 76 65 6c 79 20 73 |the relatively s| 000020d0 6c 6f 77 20 66 66 74 20 61 6c 67 6f 2e 0a 20 20 |low fft algo.. | 000020e0 20 20 5b 54 68 69 73 20 69 73 6e 27 74 20 65 78 | [This isn't ex| 000020f0 70 6c 6f 69 74 65 64 20 69 6e 20 74 68 69 73 20 |ploited in this | 00002100 70 72 6f 67 20 62 75 74 20 77 69 6c 6c 20 62 65 |prog but will be| 00002110 20 69 6e 20 64 65 73 6b 74 6f 70 20 76 73 6e 5d | in desktop vsn]| 00002120 2e 2a 2f 0a 20 20 72 65 74 75 72 6e 20 66 6c 65 |.*/. return fle| 00002130 78 5f 65 78 74 65 6e 64 28 28 66 6c 65 78 5f 70 |x_extend((flex_p| 00002140 74 72 29 64 61 74 61 2c 20 6e 2a 6e 2a 73 69 7a |tr)data, n*n*siz| 00002150 65 6f 66 28 69 6e 74 29 29 3b 0a 7d 0a 0a 42 4f |eof(int));.}..BO| 00002160 4f 4c 20 72 65 6d 75 74 65 28 75 6e 73 69 67 6e |OL remute(unsign| 00002170 65 64 20 69 6e 74 20 2a 64 61 74 61 2c 20 69 6e |ed int *data, in| 00002180 74 20 6c 69 6d 69 74 29 0a 7b 0a 20 20 69 6e 74 |t limit).{. int| 00002190 20 6e 3d 31 3c 3c 6c 69 6d 69 74 3b 0a 20 20 75 | n=1<<limit;. u| 000021a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 64 31 2c |nsigned int *d1,| 000021b0 20 2a 64 31 65 3b 0a 20 20 75 6e 73 69 67 6e 65 | *d1e;. unsigne| 000021c0 64 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 73 |d int v;. int s| 000021d0 76 3b 0a 20 20 66 6f 72 20 28 64 31 3d 64 61 74 |v;. for (d1=dat| 000021e0 61 2c 20 64 31 65 3d 64 31 2b 6e 2a 6e 3b 20 64 |a, d1e=d1+n*n; d| 000021f0 31 3c 64 31 65 3b 20 64 31 2b 2b 29 20 7b 0a 20 |1<d1e; d1++) {. | 00002200 20 20 20 76 20 3d 20 2a 64 31 20 3e 3e 20 31 36 | v = *d1 >> 16| 00002210 3b 0a 20 20 20 20 73 76 20 3d 20 70 6f 77 31 36 |;. sv = pow16| 00002220 28 76 2c 20 70 6f 77 73 63 61 6c 65 29 3b 0a 20 |(v, powscale);. | 00002230 20 20 20 69 66 20 28 6c 69 6e 73 63 61 6c 65 21 | if (linscale!| 00002240 3d 6f 6e 65 29 20 73 76 20 3d 20 6d 75 6c 5f 66 |=one) sv = mul_f| 00002250 72 61 63 31 36 63 28 73 76 2c 20 6c 69 6e 73 63 |rac16c(sv, linsc| 00002260 61 6c 65 29 3b 0a 20 20 20 20 69 66 20 28 73 76 |ale);. if (sv| 00002270 3e 3d 6f 6e 65 29 20 73 76 3d 6f 6e 65 2d 31 3b |>=one) sv=one-1;| 00002280 0a 20 20 20 20 69 66 20 28 73 76 3c 30 29 20 20 |. if (sv<0) | 00002290 20 20 73 76 3d 30 3b 0a 20 20 20 20 2a 64 31 20 | sv=0;. *d1 | 000022a0 3d 20 73 76 2b 28 76 3c 3c 31 36 29 3b 0a 20 20 |= sv+(v<<16);. | 000022b0 7d 0a 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b |}. return TRUE;| 000022c0 0a 7d 0a 0a 42 4f 4f 4c 20 63 6c 69 70 5f 66 74 |.}..BOOL clip_ft| 000022d0 28 63 6f 6d 70 6c 65 78 20 2a 64 61 74 61 2c 20 |(complex *data, | 000022e0 69 6e 74 20 6c 69 6d 69 74 2c 20 69 6e 74 20 72 |int limit, int r| 000022f0 6c 29 0a 7b 0a 20 20 69 6e 74 20 6e 3d 31 3c 3c |l).{. int n=1<<| 00002300 6c 69 6d 69 74 3b 0a 20 20 69 6e 74 20 69 2c 20 |limit;. int i, | 00002310 6a 3b 0a 20 20 69 6e 74 20 72 68 3d 6e 2d 72 6c |j;. int rh=n-rl| 00002320 3b 0a 0a 20 20 66 6f 72 20 28 69 3d 30 3b 20 69 |;.. for (i=0; i| 00002330 3c 6e 3b 20 69 2b 2b 29 0a 20 20 20 20 66 6f 72 |<n; i++). for| 00002340 20 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c | (j=0; j<n; j++,| 00002350 20 64 61 74 61 2b 2b 29 0a 20 20 20 20 20 20 69 | data++). i| 00002360 66 20 28 69 3e 72 6c 20 26 26 20 69 3c 72 68 20 |f (i>rl && i<rh | 00002370 7c 7c 20 6a 3e 72 6c 20 26 26 20 6a 3c 72 68 29 ||| j>rl && j<rh)| 00002380 20 64 61 74 61 2d 3e 72 65 3d 64 61 74 61 2d 3e | data->re=data->| 00002390 69 6d 3d 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 |im=0;.. return | 000023a0 54 52 55 45 3b 0a 7d 0a 0a 42 4f 4f 4c 20 73 63 |TRUE;.}..BOOL sc| 000023b0 72 6f 6c 6c 28 69 6e 74 20 2a 64 61 74 61 2c 20 |roll(int *data, | 000023c0 69 6e 74 20 6c 69 6d 69 74 2c 20 73 63 72 6f 6c |int limit, scrol| 000023d0 6c 64 69 72 20 6b 65 79 2c 20 69 6e 74 20 6f 66 |ldir key, int of| 000023e0 66 73 65 74 29 0a 7b 0a 20 20 69 6e 74 20 6e 3d |fset).{. int n=| 000023f0 31 3c 3c 6c 69 6d 69 74 3b 0a 20 20 69 6e 74 20 |1<<limit;. int | 00002400 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 2a 70 2c 20 |i, j;. int *p, | 00002410 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 69 6e 74 20 |*p1, *p2;. int | 00002420 62 75 66 5b 35 31 32 5d 3b 0a 20 20 69 6e 74 20 |buf[512];. int | 00002430 73 69 3d 6f 66 66 73 65 74 3c 3c 28 39 2d 6c 69 |si=offset<<(9-li| 00002440 6d 69 74 29 3b 0a 0a 20 20 73 77 69 74 63 68 20 |mit);.. switch | 00002450 28 6b 65 79 29 20 7b 0a 20 20 20 20 63 61 73 65 |(key) {. case| 00002460 20 6c 65 66 74 3a 0a 20 20 20 20 20 20 73 63 72 | left:. scr| 00002470 6f 6c 6c 78 20 2b 3d 20 6f 72 69 65 6e 74 3d 3d |ollx += orient==| 00002480 30 20 3f 20 2d 73 69 20 3a 20 28 6f 72 69 65 6e |0 ? -si : (orien| 00002490 74 3d 3d 32 20 3f 20 73 69 20 3a 20 30 29 3b 0a |t==2 ? si : 0);.| 000024a0 20 20 20 20 20 20 73 63 72 6f 6c 6c 79 20 2b 3d | scrolly +=| 000024b0 20 6f 72 69 65 6e 74 3d 3d 31 20 3f 20 2d 73 69 | orient==1 ? -si| 000024c0 20 3a 20 28 6f 72 69 65 6e 74 3d 3d 33 20 3f 20 | : (orient==3 ? | 000024d0 73 69 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 62 |si : 0);. b| 000024e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 72 |reak;. case r| 000024f0 69 67 68 74 3a 0a 20 20 20 20 20 20 73 63 72 6f |ight:. scro| 00002500 6c 6c 78 20 2b 3d 20 6f 72 69 65 6e 74 3d 3d 32 |llx += orient==2| 00002510 20 3f 20 2d 73 69 20 3a 20 28 6f 72 69 65 6e 74 | ? -si : (orient| 00002520 3d 3d 30 20 3f 20 73 69 20 3a 20 30 29 3b 0a 20 |==0 ? si : 0);. | 00002530 20 20 20 20 20 73 63 72 6f 6c 6c 79 20 2b 3d 20 | scrolly += | 00002540 6f 72 69 65 6e 74 3d 3d 33 20 3f 20 2d 73 69 20 |orient==3 ? -si | 00002550 3a 20 28 6f 72 69 65 6e 74 3d 3d 31 20 3f 20 73 |: (orient==1 ? s| 00002560 69 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 6f 66 |i : 0);. of| 00002570 66 73 65 74 3d 6e 2d 6f 66 66 73 65 74 3b 0a 20 |fset=n-offset;. | 00002580 20 20 20 20 20 6b 65 79 3d 6c 65 66 74 3b 0a 20 | key=left;. | 00002590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 | break;. | 000025a0 63 61 73 65 20 64 6f 77 6e 3a 0a 20 20 20 20 20 |case down:. | 000025b0 20 73 63 72 6f 6c 6c 78 20 2b 3d 20 6f 72 69 65 | scrollx += orie| 000025c0 6e 74 3d 3d 33 20 3f 20 2d 73 69 20 3a 20 28 6f |nt==3 ? -si : (o| 000025d0 72 69 65 6e 74 3d 3d 31 20 3f 20 73 69 20 3a 20 |rient==1 ? si : | 000025e0 30 29 3b 0a 20 20 20 20 20 20 73 63 72 6f 6c 6c |0);. scroll| 000025f0 79 20 2b 3d 20 6f 72 69 65 6e 74 3d 3d 30 20 3f |y += orient==0 ?| 00002600 20 2d 73 69 20 3a 20 28 6f 72 69 65 6e 74 3d 3d | -si : (orient==| 00002610 32 20 3f 20 73 69 20 3a 20 30 29 3b 0a 20 20 20 |2 ? si : 0);. | 00002620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 | break;. ca| 00002630 73 65 20 75 70 3a 0a 20 20 20 20 20 20 73 63 72 |se up:. scr| 00002640 6f 6c 6c 78 20 2b 3d 20 6f 72 69 65 6e 74 3d 3d |ollx += orient==| 00002650 31 20 3f 20 2d 73 69 20 3a 20 28 6f 72 69 65 6e |1 ? -si : (orien| 00002660 74 3d 3d 33 20 3f 20 73 69 20 3a 20 30 29 3b 0a |t==3 ? si : 0);.| 00002670 20 20 20 20 20 20 73 63 72 6f 6c 6c 79 20 2b 3d | scrolly +=| 00002680 20 6f 72 69 65 6e 74 3d 3d 32 20 3f 20 2d 73 69 | orient==2 ? -si| 00002690 20 3a 20 28 6f 72 69 65 6e 74 3d 3d 30 20 3f 20 | : (orient==0 ? | 000026a0 73 69 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 6f |si : 0);. o| 000026b0 66 66 73 65 74 3d 6e 2d 6f 66 66 73 65 74 3b 0a |ffset=n-offset;.| 000026c0 20 20 20 20 20 20 6b 65 79 3d 64 6f 77 6e 3b 0a | key=down;.| 000026d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d | break;. }| 000026e0 0a 20 20 73 63 72 6f 6c 6c 78 20 26 3d 20 35 31 |. scrollx &= 51| 000026f0 31 3b 0a 20 20 73 63 72 6f 6c 6c 79 20 26 3d 20 |1;. scrolly &= | 00002700 35 31 31 3b 0a 20 20 6f 66 66 73 65 74 20 20 26 |511;. offset &| 00002710 3d 20 6e 2d 31 3b 0a 0a 20 20 69 66 20 28 6b 65 |= n-1;.. if (ke| 00002720 79 3d 3d 6c 65 66 74 29 20 7b 0a 20 20 20 20 66 |y==left) {. f| 00002730 6f 72 20 28 69 3d 30 2c 20 70 3d 64 61 74 61 3b |or (i=0, p=data;| 00002740 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 2b 3d 6e 29 | i<n; i++, p+=n)| 00002750 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 28 6a 3d | {. for (j=| 00002760 6e 2d 6f 66 66 73 65 74 2c 20 70 31 3d 70 2b 6a |n-offset, p1=p+j| 00002770 2c 20 70 32 3d 62 75 66 3b 20 6a 3c 6e 3b 20 6a |, p2=buf; j<n; j| 00002780 2b 2b 2c 20 70 31 2b 2b 2c 20 70 32 2b 2b 29 20 |++, p1++, p2++) | 00002790 2a 70 32 3d 2a 70 31 3b 0a 20 20 20 20 20 20 66 |*p2=*p1;. f| 000027a0 6f 72 20 28 6a 3d 6e 2d 6f 66 66 73 65 74 2d 31 |or (j=n-offset-1| 000027b0 2c 20 70 31 3d 70 2b 6a 2c 20 70 32 3d 70 2b 6a |, p1=p+j, p2=p+j| 000027c0 2b 6f 66 66 73 65 74 3b 20 6a 3e 3d 30 3b 20 6a |+offset; j>=0; j| 000027d0 2d 2d 2c 20 70 31 2d 2d 2c 20 70 32 2d 2d 29 20 |--, p1--, p2--) | 000027e0 2a 70 32 3d 2a 70 31 3b 0a 20 20 20 20 20 20 66 |*p2=*p1;. f| 000027f0 6f 72 20 28 6a 3d 30 2c 20 70 31 3d 62 75 66 2c |or (j=0, p1=buf,| 00002800 20 70 32 3d 70 3b 20 6a 3c 6f 66 66 73 65 74 3b | p2=p; j<offset;| 00002810 20 6a 2b 2b 2c 20 70 31 2b 2b 2c 20 70 32 2b 2b | j++, p1++, p2++| 00002820 29 20 2a 70 32 3d 2a 70 31 3b 0a 20 20 20 20 7d |) *p2=*p1;. }| 00002830 0a 20 20 7d 0a 20 20 65 6c 73 65 20 7b 0a 20 20 |. }. else {. | 00002840 20 20 66 6f 72 20 28 6a 3d 30 2c 20 70 3d 64 61 | for (j=0, p=da| 00002850 74 61 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 2b |ta; j<n; j++, p+| 00002860 2b 29 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 28 |+) {. for (| 00002870 69 3d 6e 2d 6f 66 66 73 65 74 2c 20 70 31 3d 70 |i=n-offset, p1=p| 00002880 2b 69 2a 6e 2c 20 70 32 3d 62 75 66 3b 20 69 3c |+i*n, p2=buf; i<| 00002890 6e 3b 20 69 2b 2b 2c 20 70 31 2b 3d 6e 2c 20 70 |n; i++, p1+=n, p| 000028a0 32 2b 2b 29 20 2a 70 32 3d 2a 70 31 3b 0a 20 20 |2++) *p2=*p1;. | 000028b0 20 20 20 20 66 6f 72 20 28 69 3d 6e 2d 6f 66 66 | for (i=n-off| 000028c0 73 65 74 2d 31 2c 20 70 31 3d 70 2b 69 2a 6e 2c |set-1, p1=p+i*n,| 000028d0 20 70 32 3d 70 2b 28 69 2b 6f 66 66 73 65 74 29 | p2=p+(i+offset)| 000028e0 2a 6e 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 |*n; i>=0; i--, p| 000028f0 31 2d 3d 6e 2c 20 70 32 2d 3d 6e 29 20 2a 70 32 |1-=n, p2-=n) *p2| 00002900 3d 2a 70 31 3b 0a 20 20 20 20 20 20 66 6f 72 20 |=*p1;. for | 00002910 28 69 3d 30 2c 20 70 31 3d 62 75 66 2c 20 70 32 |(i=0, p1=buf, p2| 00002920 3d 70 3b 20 69 3c 6f 66 66 73 65 74 3b 20 69 2b |=p; i<offset; i+| 00002930 2b 2c 20 70 31 2b 2b 2c 20 70 32 2b 3d 6e 29 20 |+, p1++, p2+=n) | 00002940 2a 70 32 3d 2a 70 31 3b 0a 20 20 20 20 7d 0a 20 |*p2=*p1;. }. | 00002950 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 52 55 | }.. return TRU| 00002960 45 3b 0a 7d 0a 0a 42 4f 4f 4c 20 72 6f 74 61 74 |E;.}..BOOL rotat| 00002970 65 28 69 6e 74 20 2a 64 61 74 61 2c 20 69 6e 74 |e(int *data, int| 00002980 20 6c 69 6d 69 74 2c 20 42 4f 4f 4c 20 63 77 29 | limit, BOOL cw)| 00002990 0a 7b 0a 20 20 69 6e 74 20 6e 3d 31 3c 3c 6c 69 |.{. int n=1<<li| 000029a0 6d 69 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b |mit;. int i, j;| 000029b0 0a 20 20 69 6e 74 20 6b 20 3d 20 6e 2d 31 3b 0a |. int k = n-1;.| 000029c0 20 20 69 6e 74 20 6c 20 3d 20 6e 2f 32 3b 0a 20 | int l = n/2;. | 000029d0 20 69 6e 74 20 2a 71 31 2c 20 2a 71 32 2c 20 2a | int *q1, *q2, *| 000029e0 71 33 2c 20 2a 71 34 3b 0a 20 20 69 6e 74 20 74 |q3, *q4;. int t| 000029f0 3b 0a 0a 20 20 69 66 20 28 63 77 29 20 7b 0a 20 |;.. if (cw) {. | 00002a00 20 20 20 6f 72 69 65 6e 74 2b 2b 3b 0a 20 20 20 | orient++;. | 00002a10 20 66 6f 72 20 28 69 3d 30 2c 20 71 31 3d 64 61 | for (i=0, q1=da| 00002a20 74 61 2c 20 71 32 3d 64 61 74 61 2b 6e 2a 6b 2c |ta, q2=data+n*k,| 00002a30 20 71 33 3d 64 61 74 61 2b 28 6e 2b 31 29 2a 6b | q3=data+(n+1)*k| 00002a40 2c 20 71 34 3d 64 61 74 61 2b 6b 3b 20 69 3c 6c |, q4=data+k; i<l| 00002a50 3b 0a 20 20 09 09 09 20 20 20 69 2b 2b 2c 20 71 |;. ... i++, q| 00002a60 31 2b 3d 6c 2c 20 71 32 2b 3d 6c 2a 6e 2b 31 2c |1+=l, q2+=l*n+1,| 00002a70 20 71 33 2d 3d 6c 2c 20 71 34 2d 3d 6c 2a 6e 2b | q3-=l, q4-=l*n+| 00002a80 31 29 0a 20 20 20 20 20 20 66 6f 72 20 28 6a 3d |1). for (j=| 00002a90 30 3b 20 6a 3c 6c 3b 20 6a 2b 2b 2c 20 71 31 2b |0; j<l; j++, q1+| 00002aa0 2b 2c 20 71 32 2d 3d 6e 2c 20 71 33 2d 2d 2c 20 |+, q2-=n, q3--, | 00002ab0 71 34 2b 3d 6e 29 20 7b 0a 20 20 20 20 20 20 20 |q4+=n) {. | 00002ac0 20 74 3d 2a 71 31 3b 0a 20 20 20 20 20 20 20 20 | t=*q1;. | 00002ad0 2a 71 31 3d 2a 71 34 3b 0a 20 20 20 20 20 20 20 |*q1=*q4;. | 00002ae0 20 2a 71 34 3d 2a 71 33 3b 0a 20 20 20 20 20 20 | *q4=*q3;. | 00002af0 20 20 2a 71 33 3d 2a 71 32 3b 0a 20 20 20 20 20 | *q3=*q2;. | 00002b00 20 20 20 2a 71 32 3d 74 3b 0a 20 20 20 20 20 20 | *q2=t;. | 00002b10 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 7b 0a 20 |}. }. else {. | 00002b20 20 20 20 6f 72 69 65 6e 74 2d 2d 3b 0a 20 20 20 | orient--;. | 00002b30 20 66 6f 72 20 28 69 3d 30 2c 20 71 31 3d 64 61 | for (i=0, q1=da| 00002b40 74 61 2c 20 71 32 3d 64 61 74 61 2b 6e 2a 6b 2c |ta, q2=data+n*k,| 00002b50 20 71 33 3d 64 61 74 61 2b 28 6e 2b 31 29 2a 6b | q3=data+(n+1)*k| 00002b60 2c 20 71 34 3d 64 61 74 61 2b 6b 3b 20 69 3c 6c |, q4=data+k; i<l| 00002b70 3b 0a 20 20 09 09 09 20 20 20 69 2b 2b 2c 20 71 |;. ... i++, q| 00002b80 31 2b 3d 6c 2c 20 71 32 2b 3d 6c 2a 6e 2b 31 2c |1+=l, q2+=l*n+1,| 00002b90 20 71 33 2d 3d 6c 2c 20 71 34 2d 3d 6c 2a 6e 2b | q3-=l, q4-=l*n+| 00002ba0 31 29 0a 20 20 20 20 20 20 66 6f 72 20 28 6a 3d |1). for (j=| 00002bb0 30 3b 20 6a 3c 6c 3b 20 6a 2b 2b 2c 20 71 31 2b |0; j<l; j++, q1+| 00002bc0 2b 2c 20 71 32 2d 3d 6e 2c 20 71 33 2d 2d 2c 20 |+, q2-=n, q3--, | 00002bd0 71 34 2b 3d 6e 29 20 7b 0a 20 20 20 20 20 20 20 |q4+=n) {. | 00002be0 20 74 3d 2a 71 31 3b 0a 20 20 20 20 20 20 20 20 | t=*q1;. | 00002bf0 2a 71 31 3d 2a 71 32 3b 0a 20 20 20 20 20 20 20 |*q1=*q2;. | 00002c00 20 2a 71 32 3d 2a 71 33 3b 0a 20 20 20 20 20 20 | *q2=*q3;. | 00002c10 20 20 2a 71 33 3d 2a 71 34 3b 0a 20 20 20 20 20 | *q3=*q4;. | 00002c20 20 20 20 2a 71 34 3d 74 3b 0a 20 20 20 20 20 20 | *q4=t;. | 00002c30 7d 0a 20 20 7d 0a 20 20 6f 72 69 65 6e 74 20 26 |}. }. orient &| 00002c40 3d 20 33 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 |= 3;.. return T| 00002c50 52 55 45 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a |RUE;.}../*******| 00002c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00002c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 63 6f 6c |************ col| 00002c80 6f 75 72 20 72 65 6e 64 65 72 69 6e 67 20 66 75 |our rendering fu| 00002c90 6e 63 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a |nctions ********| 00002ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| * 00002cc0 2a 2a 2a 2a 2f 0a 0a 76 6f 69 64 20 63 61 6c 63 |****/..void calc| 00002cd0 5f 76 65 72 74 69 63 61 6c 62 6f 75 6e 64 73 28 |_verticalbounds(| 00002ce0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 64 61 |unsigned int *da| 00002cf0 74 61 2c 20 69 6e 74 20 6c 69 6d 69 74 2c 20 69 |ta, int limit, i| 00002d00 6e 74 20 2a 79 5f 6c 6f 77 2c 20 69 6e 74 20 2a |nt *y_low, int *| 00002d10 79 5f 68 65 69 67 68 74 29 0a 7b 0a 20 20 69 6e |y_height).{. in| 00002d20 74 20 6e 3d 31 3c 3c 6c 69 6d 69 74 3b 0a 20 20 |t n=1<<limit;. | 00002d30 69 6e 74 20 69 2c 20 6a 2c 20 64 2c 20 6c 2c 20 |int i, j, d, l, | 00002d40 68 2c 20 68 72 3b 0a 20 20 69 6e 74 20 63 6f 73 |h, hr;. int cos| 00002d50 20 3d 20 63 6f 73 31 36 28 74 69 6c 74 29 3b 0a | = cos16(tilt);.| 00002d60 20 20 69 6e 74 20 73 69 6e 20 3d 20 73 69 6e 31 | int sin = sin1| 00002d70 36 28 74 69 6c 74 29 3b 0a 0a 20 20 66 6f 72 20 |6(tilt);.. for | 00002d80 28 6a 3d 30 2c 20 6c 3d 36 35 35 33 35 2c 20 68 |(j=0, l=65535, h| 00002d90 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 20 7b 0a |=0; j<n; j++) {.| 00002da0 20 20 20 20 64 20 3d 20 6d 75 74 65 77 65 74 28 | d = mutewet(| 00002db0 64 61 74 61 5b 6a 5d 29 3b 0a 20 20 20 20 69 66 |data[j]);. if| 00002dc0 20 28 64 3c 6c 29 20 6c 3d 64 3b 0a 20 20 20 20 | (d<l) l=d;. | 00002dd0 69 66 20 28 64 3e 68 29 20 68 3d 64 3b 0a 20 20 |if (d>h) h=d;. | 00002de0 7d 0a 20 20 6c 20 3d 20 6d 75 6c 5f 66 72 61 63 |}. l = mul_frac| 00002df0 31 36 63 28 6c 2c 20 63 6f 73 29 2a 33 2f 32 35 |16c(l, cos)*3/25| 00002e00 36 3b 0a 20 20 68 20 3d 20 6d 75 6c 5f 66 72 61 |6;. h = mul_fra| 00002e10 63 31 36 63 28 68 2c 20 63 6f 73 29 2a 33 2f 32 |c16c(h, cos)*3/2| 00002e20 35 36 3b 0a 20 20 66 6f 72 20 28 69 3d 31 3b 20 |56;. for (i=1; | 00002e30 69 3c 6e 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 |i<n; i++) {. | 00002e40 66 6f 72 20 28 6a 3d 30 2c 20 68 72 3d 30 3b 20 |for (j=0, hr=0; | 00002e50 6a 3c 6e 3b 20 6a 2b 2b 29 20 7b 0a 20 20 20 20 |j<n; j++) {. | 00002e60 20 20 64 20 3d 20 6d 75 74 65 77 65 74 28 64 61 | d = mutewet(da| 00002e70 74 61 5b 6a 2b 6e 2a 69 5d 29 3b 0a 20 20 20 20 |ta[j+n*i]);. | 00002e80 20 20 69 66 20 28 64 3e 68 72 29 20 68 72 3d 64 | if (d>hr) hr=d| 00002e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 72 20 3d |;. }. hr =| 00002ea0 20 28 6d 75 6c 5f 66 72 61 63 31 36 63 28 68 72 | (mul_frac16c(hr| 00002eb0 2c 20 63 6f 73 29 2b 6d 75 6c 5f 66 72 61 63 31 |, cos)+mul_frac1| 00002ec0 36 63 28 69 3c 3c 28 31 36 2d 6c 69 6d 69 74 29 |6c(i<<(16-limit)| 00002ed0 2c 20 73 69 6e 29 29 2a 33 2f 32 35 36 3b 0a 20 |, sin))*3/256;. | 00002ee0 20 20 20 69 66 20 28 68 72 3e 68 29 20 68 3d 68 | if (hr>h) h=h| 00002ef0 72 3b 0a 20 20 7d 0a 0a 20 20 2a 79 5f 6c 6f 77 |r;. }.. *y_low| 00002f00 09 3d 20 6c 3b 0a 20 20 2a 79 5f 68 65 69 67 68 |.= l;. *y_heigh| 00002f10 74 09 3d 20 31 20 2b 20 28 20 28 68 2d 6c 29 20 |t.= 1 + ( (h-l) | 00002f20 3e 3e 20 28 31 30 2d 6c 69 6d 69 74 29 20 29 20 |>> (10-limit) ) | 00002f30 2b 20 6d 75 6c 5f 66 72 61 63 31 36 63 28 35 2a |+ mul_frac16c(5*| 00002f40 6e 2f 33 32 2c 20 63 6f 73 29 3b 0a 7d 0a 0a 42 |n/32, cos);.}..B| 00002f50 4f 4f 4c 20 63 72 65 61 74 65 5f 69 6d 61 67 65 |OOL create_image| 00002f60 33 32 28 69 6e 74 20 78 2c 20 69 6e 74 20 79 29 |32(int x, int y)| 00002f70 0a 7b 0a 20 20 69 6e 74 20 61 72 65 61 73 69 7a |.{. int areasiz| 00002f80 65 2c 20 73 70 72 69 74 65 73 69 7a 65 2c 20 69 |e, spritesize, i| 00002f90 6d 61 67 65 73 69 7a 65 3b 0a 20 20 73 70 72 69 |magesize;. spri| 00002fa0 74 65 5f 68 65 61 64 65 72 20 2a 73 70 68 3b 0a |te_header *sph;.| 00002fb0 0a 20 20 69 66 20 28 73 61 33 32 29 20 66 6c 65 |. if (sa32) fle| 00002fc0 78 5f 66 72 65 65 28 28 66 6c 65 78 5f 70 74 72 |x_free((flex_ptr| 00002fd0 29 26 73 61 33 32 29 3b 0a 20 20 69 6d 61 67 65 |)&sa32);. image| 00002fe0 73 69 7a 65 09 3d 20 78 2a 79 2a 34 3b 0a 20 20 |size.= x*y*4;. | 00002ff0 73 70 72 69 74 65 73 69 7a 65 09 3d 20 73 69 7a |spritesize.= siz| 00003000 65 6f 66 28 73 70 72 69 74 65 5f 68 65 61 64 65 |eof(sprite_heade| 00003010 72 29 2b 69 6d 61 67 65 73 69 7a 65 3b 0a 20 20 |r)+imagesize;. | 00003020 61 72 65 61 73 69 7a 65 09 3d 20 73 69 7a 65 6f |areasize.= sizeo| 00003030 66 28 73 70 72 69 74 65 5f 61 72 65 61 29 2b 73 |f(sprite_area)+s| 00003040 70 72 69 74 65 73 69 7a 65 3b 0a 20 20 69 66 20 |pritesize;. if | 00003050 28 21 66 6c 65 78 5f 61 6c 6c 6f 63 28 28 66 6c |(!flex_alloc((fl| 00003060 65 78 5f 70 74 72 29 26 73 61 33 32 2c 20 61 72 |ex_ptr)&sa32, ar| 00003070 65 61 73 69 7a 65 29 29 20 72 65 74 75 72 6e 20 |easize)) return | 00003080 46 41 4c 53 45 3b 0a 20 20 73 61 33 32 2d 3e 73 |FALSE;. sa32->s| 00003090 69 7a 65 09 3d 20 61 72 65 61 73 69 7a 65 3b 0a |ize.= areasize;.| 000030a0 20 20 73 61 33 32 2d 3e 6e 75 6d 62 65 72 09 3d | sa32->number.=| 000030b0 20 31 3b 0a 20 20 73 61 33 32 2d 3e 73 70 72 6f | 1;. sa32->spro| 000030c0 66 66 09 3d 20 31 36 3b 0a 20 20 73 61 33 32 2d |ff.= 16;. sa32-| 000030d0 3e 66 72 65 65 6f 66 66 09 3d 20 61 72 65 61 73 |>freeoff.= areas| 000030e0 69 7a 65 3b 0a 20 20 73 70 68 09 09 3d 20 28 73 |ize;. sph..= (s| 000030f0 70 72 69 74 65 5f 68 65 61 64 65 72 20 2a 29 28 |prite_header *)(| 00003100 73 61 33 32 2b 31 29 3b 0a 20 20 73 70 68 2d 3e |sa32+1);. sph->| 00003110 6e 65 78 74 09 3d 20 73 70 72 69 74 65 73 69 7a |next.= spritesiz| 00003120 65 3b 0a 20 20 6d 65 6d 73 65 74 28 73 70 68 2d |e;. memset(sph-| 00003130 3e 6e 61 6d 65 2c 20 30 2c 20 31 32 29 3b 0a 20 |>name, 0, 12);. | 00003140 20 73 74 72 63 70 79 28 73 70 68 2d 3e 6e 61 6d | strcpy(sph->nam| 00003150 65 2c 20 69 6d 6e 61 6d 65 29 3b 0a 20 20 73 70 |e, imname);. sp| 00003160 68 2d 3e 77 69 64 74 68 09 3d 20 78 2d 31 3b 0a |h->width.= x-1;.| 00003170 20 20 73 70 68 2d 3e 68 65 69 67 68 74 09 3d 20 | sph->height.= | 00003180 79 2d 31 3b 0a 20 20 73 70 68 2d 3e 6c 62 69 74 |y-1;. sph->lbit| 00003190 09 3d 20 30 3b 0a 20 20 73 70 68 2d 3e 72 62 69 |.= 0;. sph->rbi| 000031a0 74 09 3d 20 33 31 3b 0a 20 20 73 70 68 2d 3e 69 |t.= 31;. sph->i| 000031b0 6d 61 67 65 09 3d 20 73 69 7a 65 6f 66 28 73 70 |mage.= sizeof(sp| 000031c0 72 69 74 65 5f 68 65 61 64 65 72 29 3b 0a 20 20 |rite_header);. | 000031d0 73 70 68 2d 3e 6d 61 73 6b 09 3d 20 73 69 7a 65 |sph->mask.= size| 000031e0 6f 66 28 73 70 72 69 74 65 5f 68 65 61 64 65 72 |of(sprite_header| 000031f0 29 3b 0a 20 20 73 70 68 2d 3e 6d 6f 64 65 09 3d |);. sph->mode.=| 00003200 20 31 20 7c 20 28 39 30 3c 3c 31 29 20 7c 20 28 | 1 | (90<<1) | (| 00003210 39 30 3c 3c 31 34 29 20 7c 20 28 36 3c 3c 32 37 |90<<14) | (6<<27| 00003220 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 52 55 |);.. return TRU| 00003230 45 3b 0a 7d 0a 0a 42 4f 4f 4c 20 64 69 73 63 61 |E;.}..BOOL disca| 00003240 72 64 5f 69 6d 61 67 65 33 32 28 76 6f 69 64 29 |rd_image32(void)| 00003250 0a 7b 0a 20 20 69 66 20 28 73 61 33 32 29 20 66 |.{. if (sa32) f| 00003260 6c 65 78 5f 66 72 65 65 28 28 66 6c 65 78 5f 70 |lex_free((flex_p| 00003270 74 72 29 26 73 61 33 32 29 3b 0a 20 20 72 65 74 |tr)&sa32);. ret| 00003280 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 75 6e 73 |urn TRUE;.}..uns| 00003290 69 67 6e 65 64 20 69 6e 74 20 63 61 6c 63 5f 63 |igned int calc_c| 000032a0 6f 6c 6f 75 72 28 75 6e 73 69 67 6e 65 64 20 69 |olour(unsigned i| 000032b0 6e 74 20 2a 64 61 74 61 2c 20 69 6e 74 20 6c 69 |nt *data, int li| 000032c0 6d 69 74 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 |mit, int i, int | 000032d0 6a 2c 20 69 6e 74 20 2a 63 72 70 2c 20 69 6e 74 |j, int *crp, int| 000032e0 20 2a 63 67 70 2c 20 69 6e 74 20 2a 63 62 70 29 | *cgp, int *cbp)| 000032f0 0a 7b 0a 20 20 69 6e 74 20 6e 3d 31 3c 3c 6c 69 |.{. int n=1<<li| 00003300 6d 69 74 3b 0a 20 20 69 6e 74 20 6e 78 2c 6e 79 |mit;. int nx,ny| 00003310 2c 6e 7a 2c 72 2c 70 3b 0a 20 20 69 6e 74 20 7a |,nz,r,p;. int z| 00003320 3b 0a 20 20 69 6e 74 20 69 6e 3d 30 3b 0a 20 20 |;. int in=0;. | 00003330 69 6e 74 20 69 6e 63 6c 3b 0a 20 20 69 6e 74 20 |int incl;. int | 00003340 63 72 2c 20 63 67 2c 20 63 62 3b 0a 20 20 75 6e |cr, cg, cb;. un| 00003350 73 69 67 6e 65 64 20 69 6e 74 20 63 6f 6c 6f 75 |signed int colou| 00003360 72 3b 0a 20 20 69 6e 74 20 68 61 73 6c 20 3d 20 |r;. int hasl = | 00003370 6d 75 74 65 64 72 79 28 64 61 74 61 5b 69 2b 6a |mutedry(data[i+j| 00003380 2a 6e 5d 29 2d 73 65 61 6c 65 76 65 6c 3b 09 09 |*n])-sealevel;..| 00003390 2f 2a 68 65 69 67 68 74 20 61 62 6f 76 65 20 73 |/*height above s| 000033a0 65 61 20 6c 65 76 65 6c 2a 2f 0a 0a 20 20 7a 3d |ea level*/.. z=| 000033b0 6d 75 74 65 77 65 74 28 64 61 74 61 5b 69 2b 6a |mutewet(data[i+j| 000033c0 2a 6e 5d 29 3b 0a 20 20 6e 78 3d 7a 2d 6d 75 74 |*n]);. nx=z-mut| 000033d0 65 77 65 74 28 64 61 74 61 5b 28 28 69 2b 31 29 |ewet(data[((i+1)| 000033e0 26 28 6e 2d 31 29 29 2b 6a 2a 6e 5d 29 3b 0a 20 |&(n-1))+j*n]);. | 000033f0 20 6e 79 3d 6d 75 74 65 77 65 74 28 64 61 74 61 | ny=mutewet(data| 00003400 5b 69 2b 28 28 6a 2d 31 29 26 28 6e 2d 31 29 29 |[i+((j-1)&(n-1))| 00003410 2a 6e 5d 29 2d 7a 3b 0a 20 20 72 20 3d 20 73 71 |*n])-z;. r = sq| 00003420 72 74 5f 66 72 61 63 31 36 28 6e 78 2a 6e 78 2b |rt_frac16(nx*nx+| 00003430 6e 79 2a 6e 79 2b 64 7a 2a 64 7a 29 3e 3e 38 3b |ny*ny+dz*dz)>>8;| 00003440 0a 20 20 6e 78 20 3d 20 64 69 76 5f 66 72 61 63 |. nx = div_frac| 00003450 31 36 28 6e 78 2c 20 72 29 3b 0a 20 20 6e 79 20 |16(nx, r);. ny | 00003460 3d 20 64 69 76 5f 66 72 61 63 31 36 28 6e 79 2c |= div_frac16(ny,| 00003470 20 72 29 3b 0a 20 20 6e 7a 20 3d 20 64 69 76 5f | r);. nz = div_| 00003480 66 72 61 63 31 36 28 64 7a 2c 20 72 29 3b 09 09 |frac16(dz, r);..| 00003490 09 09 2f 2a 73 75 72 66 61 63 65 20 6e 6f 72 6d |../*surface norm| 000034a0 61 6c 20 63 61 6c 63 75 6c 61 74 65 64 2a 2f 0a |al calculated*/.| 000034b0 0a 20 20 72 20 3d 20 6d 75 6c 5f 66 72 61 63 31 |. r = mul_frac1| 000034c0 36 63 28 6e 78 2c 76 78 29 2b 6d 75 6c 5f 66 72 |6c(nx,vx)+mul_fr| 000034d0 61 63 31 36 63 28 6e 79 2c 76 79 29 2b 6d 75 6c |ac16c(ny,vy)+mul| 000034e0 5f 66 72 61 63 31 36 63 28 6e 7a 2c 76 7a 29 3b |_frac16c(nz,vz);| 000034f0 0a 20 20 69 66 20 28 72 3e 3d 30 29 20 7b 09 09 |. if (r>=0) {..| 00003500 09 09 09 09 2f 2a 69 66 20 73 75 72 66 61 63 65 |..../*if surface| 00003510 20 76 69 73 69 62 6c 65 20 2e 20 2e 20 2e 2a 2f | visible . . .*/| 00003520 0a 20 20 20 20 69 6e 20 2b 3d 20 68 61 73 6c 3e |. in += hasl>| 00003530 3d 30 20 3f 20 6b 61 5f 6c 61 6e 64 20 3a 20 6b |=0 ? ka_land : k| 00003540 61 5f 73 65 61 3b 09 09 09 2f 2a 61 64 64 20 69 |a_sea;.../*add i| 00003550 6e 20 61 6d 62 69 65 6e 74 20 74 65 72 6d 2a 2f |n ambient term*/| 00003560 0a 20 20 20 20 72 20 3d 20 6d 75 6c 5f 66 72 61 |. r = mul_fra| 00003570 63 31 36 63 28 6e 78 2c 6c 78 29 2b 6d 75 6c 5f |c16c(nx,lx)+mul_| 00003580 66 72 61 63 31 36 63 28 6e 79 2c 6c 79 29 2b 6d |frac16c(ny,ly)+m| 00003590 75 6c 5f 66 72 61 63 31 36 63 28 6e 7a 2c 6c 7a |ul_frac16c(nz,lz| 000035a0 29 3b 0a 20 20 20 20 69 66 20 28 72 3e 3d 30 29 |);. if (r>=0)| 000035b0 20 7b 09 09 09 09 09 09 2f 2a 61 6e 64 20 69 66 | {....../*and if| 000035c0 20 6c 69 67 68 74 20 73 74 72 69 6b 69 6e 67 20 | light striking | 000035d0 73 75 72 66 61 63 65 20 2e 20 2e 20 2e 2a 2f 0a |surface . . .*/.| 000035e0 20 20 20 20 20 20 69 6e 20 2b 3d 20 6d 75 6c 5f | in += mul_| 000035f0 66 72 61 63 31 36 63 28 72 2c 20 68 61 73 6c 3e |frac16c(r, hasl>| 00003600 3d 30 20 3f 20 6b 64 5f 6c 61 6e 64 20 3a 20 6b |=0 ? kd_land : k| 00003610 64 5f 73 65 61 29 3b 09 2f 2a 61 64 64 20 64 69 |d_sea);./*add di| 00003620 66 66 75 73 65 20 74 65 72 6d 2a 2f 0a 20 20 20 |ffuse term*/. | 00003630 20 20 20 72 20 3d 20 6d 75 6c 5f 66 72 61 63 31 | r = mul_frac1| 00003640 36 63 28 6e 78 2c 68 78 29 2b 6d 75 6c 5f 66 72 |6c(nx,hx)+mul_fr| 00003650 61 63 31 36 63 28 6e 79 2c 68 79 29 2b 6d 75 6c |ac16c(ny,hy)+mul| 00003660 5f 66 72 61 63 31 36 63 28 6e 7a 2c 68 7a 29 3b |_frac16c(nz,hz);| 00003670 0a 20 20 20 20 20 20 70 20 3d 20 6d 75 6c 5f 66 |. p = mul_f| 00003680 72 61 63 31 36 63 28 72 2c 72 29 3b 0a 20 20 20 |rac16c(r,r);. | 00003690 20 20 20 70 20 3d 20 6d 75 6c 5f 66 72 61 63 31 | p = mul_frac1| 000036a0 36 63 28 70 2c 70 29 3b 09 09 09 09 2f 2a 28 5e |6c(p,p);..../*(^| 000036b0 34 2c 20 66 6f 72 20 5e 33 20 75 73 65 20 72 2c |4, for ^3 use r,| 000036c0 70 20 69 6e 73 74 65 61 64 20 6f 66 20 70 2c 70 |p instead of p,p| 000036d0 29 2a 2f 0a 20 20 20 20 20 20 69 6e 20 2b 3d 20 |)*/. in += | 000036e0 6d 75 6c 5f 66 72 61 63 31 36 63 28 70 2c 20 68 |mul_frac16c(p, h| 000036f0 61 73 6c 3e 3d 30 20 3f 20 6b 73 5f 6c 61 6e 64 |asl>=0 ? ks_land| 00003700 20 3a 20 6b 73 5f 73 65 61 29 3b 09 2f 2a 66 69 | : ks_sea);./*fi| 00003710 6e 61 6c 6c 79 20 61 64 64 20 73 70 65 63 75 6c |nally add specul| 00003720 61 72 20 74 65 72 6d 2a 2f 0a 20 20 20 20 7d 0a |ar term*/. }.| 00003730 20 20 7d 09 09 09 09 09 09 09 2f 2a 72 65 66 6c | }......./*refl| 00003740 65 63 74 65 64 20 6c 69 67 68 74 20 69 6e 74 65 |ected light inte| 00003750 6e 73 69 74 79 20 63 61 6c 63 75 6c 61 74 65 64 |nsity calculated| 00003760 2a 2f 0a 0a 20 20 69 66 20 28 68 61 73 6c 3e 3d |*/.. if (hasl>=| 00003770 30 29 20 7b 0a 20 20 20 20 63 6f 6c 6f 75 72 20 |0) {. colour | 00003780 3d 20 65 6c 65 76 61 74 69 6f 6e 5b 68 61 73 6c |= elevation[hasl| 00003790 2f 32 35 36 5d 3b 0a 20 20 20 20 63 72 20 3d 20 |/256];. cr = | 000037a0 28 6f 6e 65 2d 62 6c 65 6e 64 29 2a 28 63 6f 6c |(one-blend)*(col| 000037b0 6f 75 72 20 26 20 32 35 35 29 3b 0a 20 20 20 20 |our & 255);. | 000037c0 63 67 20 3d 20 28 6f 6e 65 2d 62 6c 65 6e 64 29 |cg = (one-blend)| 000037d0 2a 28 28 63 6f 6c 6f 75 72 3e 3e 38 29 20 26 20 |*((colour>>8) & | 000037e0 32 35 35 29 3b 0a 20 20 20 20 63 62 20 3d 20 28 |255);. cb = (| 000037f0 6f 6e 65 2d 62 6c 65 6e 64 29 2a 28 28 63 6f 6c |one-blend)*((col| 00003800 6f 75 72 3e 3e 31 36 29 20 26 20 32 35 35 29 3b |our>>16) & 255);| 00003810 0a 20 20 20 20 69 6e 63 6c 20 3d 20 6e 7a 2f 32 |. incl = nz/2| 00003820 35 36 3b 09 09 09 09 09 2f 2a 28 6f 72 20 74 72 |56;...../*(or tr| 00003830 79 20 61 73 6e 31 36 28 6e 7a 29 20 69 6e 73 74 |y asn16(nz) inst| 00003840 65 61 64 20 6f 66 20 6e 7a 20 2d 20 74 68 6f 75 |ead of nz - thou| 00003850 67 68 20 70 72 6f 62 20 6e 6f 74 20 77 6f 72 74 |gh prob not wort| 00003860 68 20 65 78 74 72 61 20 63 6f 6d 70 75 74 61 74 |h extra computat| 00003870 69 6f 6e 29 2a 2f 0a 20 20 20 20 69 66 20 28 69 |ion)*/. if (i| 00003880 6e 63 6c 3c 30 29 20 20 20 69 6e 63 6c 3d 30 3b |ncl<0) incl=0;| 00003890 0a 20 20 20 20 69 66 20 28 69 6e 63 6c 3e 32 35 |. if (incl>25| 000038a0 35 29 20 69 6e 63 6c 3d 32 35 35 3b 0a 20 20 20 |5) incl=255;. | 000038b0 20 63 6f 6c 6f 75 72 20 3d 20 73 6c 6f 70 65 5b | colour = slope[| 000038c0 69 6e 63 6c 5d 3b 0a 20 20 20 20 63 72 20 2b 3d |incl];. cr +=| 000038d0 20 62 6c 65 6e 64 2a 28 63 6f 6c 6f 75 72 20 26 | blend*(colour &| 000038e0 20 32 35 35 29 3b 0a 20 20 20 20 63 67 20 2b 3d | 255);. cg +=| 000038f0 20 62 6c 65 6e 64 2a 28 28 63 6f 6c 6f 75 72 3e | blend*((colour>| 00003900 3e 38 29 20 26 20 32 35 35 29 3b 0a 20 20 20 20 |>8) & 255);. | 00003910 63 62 20 2b 3d 20 62 6c 65 6e 64 2a 28 28 63 6f |cb += blend*((co| 00003920 6c 6f 75 72 3e 3e 31 36 29 20 26 20 32 35 35 29 |lour>>16) & 255)| 00003930 3b 0a 20 20 20 20 63 72 20 2f 3d 20 6f 6e 65 3b |;. cr /= one;| 00003940 0a 20 20 20 20 63 67 20 2f 3d 20 6f 6e 65 3b 0a |. cg /= one;.| 00003950 20 20 20 20 63 62 20 2f 3d 20 6f 6e 65 3b 0a 20 | cb /= one;. | 00003960 20 7d 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 | }. else {. | 00003970 63 6f 6c 6f 75 72 20 3d 20 73 65 61 5b 2d 68 61 |colour = sea[-ha| 00003980 73 6c 2f 32 35 36 5d 3b 0a 20 20 20 20 63 72 20 |sl/256];. cr | 00003990 3d 20 63 6f 6c 6f 75 72 20 26 20 32 35 35 3b 0a |= colour & 255;.| 000039a0 20 20 20 20 63 67 20 3d 20 28 63 6f 6c 6f 75 72 | cg = (colour| 000039b0 3e 3e 38 29 20 26 20 32 35 35 3b 0a 20 20 20 20 |>>8) & 255;. | 000039c0 63 62 20 3d 20 28 63 6f 6c 6f 75 72 3e 3e 31 36 |cb = (colour>>16| 000039d0 29 20 26 20 32 35 35 3b 0a 20 20 7d 09 09 09 09 |) & 255;. }....| 000039e0 09 09 09 2f 2a 69 6e 74 72 69 6e 73 69 63 20 73 |.../*intrinsic s| 000039f0 75 72 66 61 63 65 20 63 6f 6c 6f 75 72 20 63 61 |urface colour ca| 00003a00 6c 63 75 6c 61 74 65 64 2a 2f 0a 0a 20 20 63 72 |lculated*/.. cr| 00003a10 20 3d 20 28 63 72 2a 69 6e 29 2f 32 35 36 3b 0a | = (cr*in)/256;.| 00003a20 20 20 63 67 20 3d 20 28 63 67 2a 69 6e 29 2f 32 | cg = (cg*in)/2| 00003a30 35 36 3b 0a 20 20 63 62 20 3d 20 28 63 62 2a 69 |56;. cb = (cb*i| 00003a40 6e 29 2f 32 35 36 3b 09 09 09 09 09 2f 2a 76 69 |n)/256;...../*vi| 00003a50 73 69 62 6c 65 20 73 75 72 66 61 63 65 20 63 6f |sible surface co| 00003a60 6c 6f 75 72 20 63 61 6c 63 75 6c 61 74 65 64 2a |lour calculated*| 00003a70 2f 0a 0a 20 20 69 66 20 28 66 6f 67 21 3d 30 29 |/.. if (fog!=0)| 00003a80 20 7b 0a 20 20 20 20 72 20 3d 20 70 6f 77 31 36 | {. r = pow16| 00003a90 28 6d 75 6c 5f 66 72 61 63 31 36 63 28 28 69 6e |(mul_frac16c((in| 00003aa0 74 29 28 30 2e 39 36 2a 6f 6e 65 29 2c 20 6f 6e |t)(0.96*one), on| 00003ab0 65 2d 28 7a 2d 73 65 61 6c 65 76 65 6c 29 29 2c |e-(z-sealevel)),| 00003ac0 20 66 6f 67 29 3b 0a 20 20 20 20 69 66 20 28 72 | fog);. if (r| 00003ad0 3c 30 29 20 72 3d 30 3b 0a 20 20 20 20 69 66 20 |<0) r=0;. if | 00003ae0 28 72 3e 36 35 35 33 35 29 20 72 3d 36 35 35 33 |(r>65535) r=6553| 00003af0 35 3b 0a 20 20 20 20 63 72 20 3d 20 6d 75 6c 5f |5;. cr = mul_| 00003b00 66 72 61 63 31 36 63 28 63 72 2c 20 6f 6e 65 2d |frac16c(cr, one-| 00003b10 72 29 3b 0a 20 20 20 20 63 67 20 3d 20 6d 75 6c |r);. cg = mul| 00003b20 5f 66 72 61 63 31 36 63 28 63 67 2c 20 6f 6e 65 |_frac16c(cg, one| 00003b30 2d 72 29 3b 0a 20 20 20 20 63 62 20 3d 20 6d 75 |-r);. cb = mu| 00003b40 6c 5f 66 72 61 63 31 36 63 28 63 62 2c 20 6f 6e |l_frac16c(cb, on| 00003b50 65 2d 72 29 3b 0a 20 20 20 20 63 6f 6c 6f 75 72 |e-r);. colour| 00003b60 20 3d 20 73 6b 79 5b 30 5d 3b 0a 20 20 20 20 63 | = sky[0];. c| 00003b70 72 20 2b 3d 20 6d 75 6c 5f 66 72 61 63 31 36 63 |r += mul_frac16c| 00003b80 28 28 63 6f 6c 6f 75 72 26 32 35 35 29 3c 3c 38 |((colour&255)<<8| 00003b90 2c 20 72 29 3b 0a 20 20 20 20 63 67 20 2b 3d 20 |, r);. cg += | 00003ba0 6d 75 6c 5f 66 72 61 63 31 36 63 28 63 6f 6c 6f |mul_frac16c(colo| 00003bb0 75 72 26 28 32 35 35 3c 3c 38 29 2c 20 72 29 3b |ur&(255<<8), r);| 00003bc0 0a 20 20 20 20 63 62 20 2b 3d 20 6d 75 6c 5f 66 |. cb += mul_f| 00003bd0 72 61 63 31 36 63 28 28 63 6f 6c 6f 75 72 3e 3e |rac16c((colour>>| 00003be0 38 29 26 28 32 35 35 3c 3c 38 29 2c 20 72 29 3b |8)&(255<<8), r);| 00003bf0 09 09 2f 2a 6d 69 78 69 6e 67 20 77 69 74 68 20 |../*mixing with | 00003c00 66 6f 67 20 63 6f 6d 70 6c 65 74 65 64 2a 2f 0a |fog completed*/.| 00003c10 20 20 7d 0a 0a 20 20 69 66 20 28 63 72 3c 30 29 | }.. if (cr<0)| 00003c20 20 63 72 3d 30 3b 0a 20 20 69 66 20 28 63 67 3c | cr=0;. if (cg<| 00003c30 30 29 20 63 67 3d 30 3b 0a 20 20 69 66 20 28 63 |0) cg=0;. if (c| 00003c40 62 3c 30 29 20 63 62 3d 30 3b 0a 20 20 69 66 20 |b<0) cb=0;. if | 00003c50 28 63 72 3e 36 35 35 33 35 29 20 63 72 3d 36 35 |(cr>65535) cr=65| 00003c60 35 33 35 3b 0a 20 20 69 66 20 28 63 67 3e 36 35 |535;. if (cg>65| 00003c70 35 33 35 29 20 63 67 3d 36 35 35 33 35 3b 0a 20 |535) cg=65535;. | 00003c80 20 69 66 20 28 63 62 3e 36 35 35 33 35 29 20 63 | if (cb>65535) c| 00003c90 62 3d 36 35 35 33 35 3b 0a 0a 20 20 2a 63 72 70 |b=65535;.. *crp| 00003ca0 20 3d 20 63 72 3b 0a 20 20 2a 63 67 70 20 3d 20 | = cr;. *cgp = | 00003cb0 63 67 3b 0a 20 20 2a 63 62 70 20 3d 20 63 62 3b |cg;. *cbp = cb;| 00003cc0 0a 20 20 72 65 74 75 72 6e 20 28 63 72 3e 3e 38 |. return (cr>>8| 00003cd0 29 2b 28 63 67 26 28 32 35 35 3c 3c 38 29 29 2b |)+(cg&(255<<8))+| 00003ce0 28 28 63 62 3e 3e 38 29 3c 3c 31 36 29 3b 0a 7d |((cb>>8)<<16);.}| 00003cf0 0a 0a 42 4f 4f 4c 20 72 65 6e 64 65 72 5f 69 6d |..BOOL render_im| 00003d00 61 67 65 33 32 28 75 6e 73 69 67 6e 65 64 20 69 |age32(unsigned i| 00003d10 6e 74 20 2a 64 61 74 61 2c 20 69 6e 74 20 6c 69 |nt *data, int li| 00003d20 6d 69 74 2c 20 69 6e 74 20 79 6c 2c 20 69 6e 74 |mit, int yl, int| 00003d30 20 78 6d 2c 20 69 6e 74 20 79 6d 29 0a 7b 0a 20 | xm, int ym).{. | 00003d40 20 69 6e 74 20 6e 3d 31 3c 3c 6c 69 6d 69 74 3b | int n=1<<limit;| 00003d50 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 69 6e |. int i,j;. in| 00003d60 74 20 68 6f 72 69 7a 6f 6e 3b 0a 20 20 69 6e 74 |t horizon;. int| 00003d70 20 70 2c 70 30 2c 70 31 3b 0a 20 20 69 6e 74 20 | p,p0,p1;. int | 00003d80 63 6f 73 20 3d 20 63 6f 73 31 36 28 74 69 6c 74 |cos = cos16(tilt| 00003d90 29 3b 0a 20 20 69 6e 74 20 73 69 6e 20 3d 20 73 |);. int sin = s| 00003da0 69 6e 31 36 28 74 69 6c 74 29 3b 0a 20 20 69 6e |in16(tilt);. in| 00003db0 74 20 6c 61 73 74 72 2c 20 6c 61 73 74 67 2c 20 |t lastr, lastg, | 00003dc0 6c 61 73 74 62 2c 20 6e 65 77 72 2c 20 6e 65 77 |lastb, newr, new| 00003dd0 67 2c 20 6e 65 77 62 3b 0a 20 20 42 4f 4f 4c 20 |g, newb;. BOOL | 00003de0 6c 61 73 74 76 61 6c 69 64 3b 0a 20 20 73 70 72 |lastvalid;. spr| 00003df0 69 74 65 5f 68 65 61 64 65 72 20 2a 73 70 68 20 |ite_header *sph | 00003e00 3d 20 28 73 70 72 69 74 65 5f 68 65 61 64 65 72 |= (sprite_header| 00003e10 20 2a 29 28 28 63 68 61 72 20 2a 29 73 61 33 32 | *)((char *)sa32| 00003e20 2b 73 61 33 32 2d 3e 73 70 72 6f 66 66 29 3b 0a |+sa32->sproff);.| 00003e30 20 20 69 6e 74 20 2a 69 6e 74 65 6e 73 20 3d 20 | int *intens = | 00003e40 28 69 6e 74 20 2a 29 28 28 63 68 61 72 20 2a 29 |(int *)((char *)| 00003e50 73 70 68 2b 73 70 68 2d 3e 69 6d 61 67 65 29 3b |sph+sph->image);| 00003e60 0a 20 20 69 6e 74 20 64 65 6c 74 61 72 2c 20 64 |. int deltar, d| 00003e70 65 6c 74 61 67 2c 20 64 65 6c 74 61 62 3b 0a 20 |eltag, deltab;. | 00003e80 20 69 6e 74 20 72 3b 0a 20 20 69 6e 74 20 6c 69 | int r;. int li| 00003e90 67 68 74 5f 69 6e 63 6c 2c 20 6c 69 67 68 74 5f |ght_incl, light_| 00003ea0 62 65 61 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 |bear;. unsigned| 00003eb0 20 69 6e 74 20 63 6f 6c 6f 75 72 3b 0a 20 20 69 | int colour;. i| 00003ec0 6e 74 20 63 72 2c 63 67 2c 63 62 3b 0a 20 20 69 |nt cr,cg,cb;. i| 00003ed0 6e 74 20 78 2c 79 3b 0a 20 20 69 6e 74 20 2a 64 |nt x,y;. int *d| 00003ee0 2c 20 2a 64 65 3b 0a 20 20 69 6e 74 20 2a 68 6f |, *de;. int *ho| 00003ef0 72 69 7a 6f 6e 5f 62 75 66 66 65 72 3d 30 3b 0a |rizon_buffer=0;.| 00003f00 20 20 69 66 20 28 68 6f 72 69 7a 6f 6e 5f 62 75 | if (horizon_bu| 00003f10 66 66 65 72 3d 6d 61 6c 6c 6f 63 28 6e 2a 73 69 |ffer=malloc(n*si| 00003f20 7a 65 6f 66 28 69 6e 74 29 29 2c 20 68 6f 72 69 |zeof(int)), hori| 00003f30 7a 6f 6e 5f 62 75 66 66 65 72 3d 3d 30 29 20 72 |zon_buffer==0) r| 00003f40 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 0a 20 20 |eturn FALSE;.. | 00003f50 66 6f 72 20 28 64 3d 69 6e 74 65 6e 73 2c 20 64 |for (d=intens, d| 00003f60 65 3d 64 2b 78 6d 2a 79 6d 3b 20 64 3c 64 65 3b |e=d+xm*ym; d<de;| 00003f70 20 64 2b 2b 29 20 2a 64 3d 30 78 30 30 30 30 30 | d++) *d=0x00000| 00003f80 30 30 30 3b 0a 0a 20 20 64 7a 20 3d 20 36 35 35 |000;.. dz = 655| 00003f90 33 36 2f 28 6e 2d 31 29 3b 0a 20 20 76 78 20 3d |36/(n-1);. vx =| 00003fa0 20 30 3b 0a 20 20 76 79 20 3d 20 2d 63 6f 73 3b | 0;. vy = -cos;| 00003fb0 0a 20 20 76 7a 20 3d 20 73 69 6e 3b 0a 20 20 6c |. vz = sin;. l| 00003fc0 69 67 68 74 5f 69 6e 63 6c 20 3d 20 28 69 6e 74 |ight_incl = (int| 00003fd0 29 28 30 2e 35 30 2a 6f 6e 65 29 3b 0a 20 20 6c |)(0.50*one);. l| 00003fe0 69 67 68 74 5f 62 65 61 72 20 3d 20 28 69 6e 74 |ight_bear = (int| 00003ff0 29 28 31 2e 35 30 2a 6f 6e 65 29 3b 0a 20 20 72 |)(1.50*one);. r| 00004000 20 3d 20 63 6f 73 31 36 28 6c 69 67 68 74 5f 69 | = cos16(light_i| 00004010 6e 63 6c 29 3b 0a 20 20 6c 78 20 3d 20 6d 75 6c |ncl);. lx = mul| 00004020 5f 66 72 61 63 31 36 63 28 63 6f 73 31 36 28 6c |_frac16c(cos16(l| 00004030 69 67 68 74 5f 62 65 61 72 29 2c 20 72 29 3b 0a |ight_bear), r);.| 00004040 20 20 6c 79 20 3d 20 6d 75 6c 5f 66 72 61 63 31 | ly = mul_frac1| 00004050 36 63 28 73 69 6e 31 36 28 6c 69 67 68 74 5f 62 |6c(sin16(light_b| 00004060 65 61 72 29 2c 2d 72 29 3b 0a 20 20 6c 7a 20 3d |ear),-r);. lz =| 00004070 20 73 69 6e 31 36 28 6c 69 67 68 74 5f 69 6e 63 | sin16(light_inc| 00004080 6c 29 3b 0a 20 20 68 78 20 3d 20 28 6c 78 2b 76 |l);. hx = (lx+v| 00004090 78 29 2f 32 3b 0a 20 20 68 79 20 3d 20 28 6c 79 |x)/2;. hy = (ly| 000040a0 2b 76 79 29 2f 32 3b 0a 20 20 68 7a 20 3d 20 28 |+vy)/2;. hz = (| 000040b0 6c 7a 2b 76 7a 29 2f 32 3b 0a 20 20 72 20 3d 20 |lz+vz)/2;. r = | 000040c0 73 71 72 74 5f 66 72 61 63 31 36 28 6d 75 6c 5f |sqrt_frac16(mul_| 000040d0 66 72 61 63 31 36 63 28 68 78 2c 68 78 29 2b 6d |frac16c(hx,hx)+m| 000040e0 75 6c 5f 66 72 61 63 31 36 63 28 68 79 2c 68 79 |ul_frac16c(hy,hy| 000040f0 29 2b 6d 75 6c 5f 66 72 61 63 31 36 63 28 68 7a |)+mul_frac16c(hz| 00004100 2c 68 7a 29 29 3b 0a 20 20 68 78 20 3d 20 64 69 |,hz));. hx = di| 00004110 76 5f 66 72 61 63 31 36 28 68 78 2c 20 72 29 3b |v_frac16(hx, r);| 00004120 0a 20 20 68 79 20 3d 20 64 69 76 5f 66 72 61 63 |. hy = div_frac| 00004130 31 36 28 68 79 2c 20 72 29 3b 0a 20 20 68 7a 20 |16(hy, r);. hz | 00004140 3d 20 64 69 76 5f 66 72 61 63 31 36 28 68 7a 2c |= div_frac16(hz,| 00004150 20 72 29 3b 0a 0a 20 20 66 6f 72 20 28 69 3d 30 | r);.. for (i=0| 00004160 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 7b 0a 20 20 |; i<n; i++) {. | 00004170 20 20 70 30 20 3d 20 28 20 28 6d 75 6c 5f 66 72 | p0 = ( (mul_fr| 00004180 61 63 31 36 63 28 6d 75 74 65 77 65 74 28 64 61 |ac16c(mutewet(da| 00004190 74 61 5b 69 5d 29 2c 20 63 6f 73 29 2b 6d 75 6c |ta[i]), cos)+mul| 000041a0 5f 66 72 61 63 31 36 63 28 30 3c 3c 28 31 36 2d |_frac16c(0<<(16-| 000041b0 6c 69 6d 69 74 29 2c 20 73 69 6e 29 29 2a 33 2f |limit), sin))*3/| 000041c0 32 35 36 20 2d 20 79 6c 29 20 3e 3e 20 28 31 30 |256 - yl) >> (10| 000041d0 2d 6c 69 6d 69 74 29 3b 0a 20 20 20 20 63 6f 6c |-limit);. col| 000041e0 6f 75 72 20 3d 20 63 61 6c 63 5f 63 6f 6c 6f 75 |our = calc_colou| 000041f0 72 28 64 61 74 61 2c 20 6c 69 6d 69 74 2c 20 69 |r(data, limit, i| 00004200 2c 20 30 2c 20 26 63 72 2c 20 26 63 67 2c 20 26 |, 0, &cr, &cg, &| 00004210 63 62 29 3b 0a 20 20 20 20 6c 61 73 74 72 20 3d |cb);. lastr =| 00004220 20 63 72 3b 0a 20 20 20 20 6c 61 73 74 67 20 3d | cr;. lastg =| 00004230 20 63 67 3b 0a 20 20 20 20 6c 61 73 74 62 20 3d | cg;. lastb =| 00004240 20 63 62 3b 0a 20 20 20 20 6c 61 73 74 76 61 6c | cb;. lastval| 00004250 69 64 3d 54 52 55 45 3b 0a 20 20 20 20 69 66 20 |id=TRUE;. if | 00004260 28 70 30 3e 3d 30 20 26 26 20 70 30 3c 79 6d 29 |(p0>=0 && p0<ym)| 00004270 20 69 6e 74 65 6e 73 5b 69 2b 78 6d 2a 28 79 6d | intens[i+xm*(ym| 00004280 2d 31 2d 70 30 29 5d 20 3d 20 63 6f 6c 6f 75 72 |-1-p0)] = colour| 00004290 3b 0a 20 20 20 20 68 6f 72 69 7a 6f 6e 20 3d 20 |;. horizon = | 000042a0 70 30 3b 0a 20 20 20 20 66 6f 72 20 28 6a 3d 31 |p0;. for (j=1| 000042b0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 20 7b 0a 20 20 |; j<n; j++) {. | 000042c0 20 20 20 20 70 31 20 3d 20 28 20 28 6d 75 6c 5f | p1 = ( (mul_| 000042d0 66 72 61 63 31 36 63 28 6d 75 74 65 77 65 74 28 |frac16c(mutewet(| 000042e0 64 61 74 61 5b 69 2b 6a 2a 6e 5d 29 2c 20 63 6f |data[i+j*n]), co| 000042f0 73 29 2b 6d 75 6c 5f 66 72 61 63 31 36 63 28 6a |s)+mul_frac16c(j| 00004300 3c 3c 28 31 36 2d 6c 69 6d 69 74 29 2c 20 73 69 |<<(16-limit), si| 00004310 6e 29 29 2a 33 2f 32 35 36 20 2d 20 79 6c 29 20 |n))*3/256 - yl) | 00004320 3e 3e 20 28 31 30 2d 6c 69 6d 69 74 29 3b 0a 20 |>> (10-limit);. | 00004330 20 20 20 20 20 69 66 20 28 70 31 3e 68 6f 72 69 | if (p1>hori| 00004340 7a 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 63 |zon) {. c| 00004350 6f 6c 6f 75 72 20 3d 20 63 61 6c 63 5f 63 6f 6c |olour = calc_col| 00004360 6f 75 72 28 64 61 74 61 2c 20 6c 69 6d 69 74 2c |our(data, limit,| 00004370 20 69 2c 20 6a 2c 20 26 63 72 2c 20 26 63 67 2c | i, j, &cr, &cg,| 00004380 20 26 63 62 29 3b 0a 20 20 20 20 20 20 20 20 6e | &cb);. n| 00004390 65 77 72 20 3d 20 63 72 3b 0a 20 20 20 20 20 20 |ewr = cr;. | 000043a0 20 20 6e 65 77 67 20 3d 20 63 67 3b 0a 20 20 20 | newg = cg;. | 000043b0 20 20 20 20 20 6e 65 77 62 20 3d 20 63 62 3b 0a | newb = cb;.| 000043c0 20 20 20 20 20 20 20 20 69 66 20 28 70 31 3e 3d | if (p1>=| 000043d0 30 20 26 26 20 70 31 3c 79 6d 29 20 69 6e 74 65 |0 && p1<ym) inte| 000043e0 6e 73 5b 69 2b 78 6d 2a 28 79 6d 2d 31 2d 70 31 |ns[i+xm*(ym-1-p1| 000043f0 29 5d 20 3d 20 63 6f 6c 6f 75 72 3b 0a 20 20 20 |)] = colour;. | 00004400 20 20 20 20 20 70 20 3d 20 70 31 2d 31 3b 0a 20 | p = p1-1;. | 00004410 20 20 20 20 20 20 20 69 66 20 28 70 3e 68 6f 72 | if (p>hor| 00004420 69 7a 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 |izon) {. | 00004430 20 20 69 66 20 28 21 6c 61 73 74 76 61 6c 69 64 | if (!lastvalid| 00004440 29 20 63 6f 6c 6f 75 72 20 3d 20 63 61 6c 63 5f |) colour = calc_| 00004450 63 6f 6c 6f 75 72 28 64 61 74 61 2c 20 6c 69 6d |colour(data, lim| 00004460 69 74 2c 20 69 2c 20 6a 2d 31 2c 20 26 6c 61 73 |it, i, j-1, &las| 00004470 74 72 2c 20 26 6c 61 73 74 67 2c 20 26 6c 61 73 |tr, &lastg, &las| 00004480 74 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 |tb);. d| 00004490 65 6c 74 61 72 20 3d 20 28 6c 61 73 74 72 2d 6e |eltar = (lastr-n| 000044a0 65 77 72 29 2f 28 70 30 2d 70 31 29 3b 0a 20 20 |ewr)/(p0-p1);. | 000044b0 20 20 20 20 20 20 20 20 64 65 6c 74 61 67 20 3d | deltag =| 000044c0 20 28 6c 61 73 74 67 2d 6e 65 77 67 29 2f 28 70 | (lastg-newg)/(p| 000044d0 30 2d 70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 |0-p1);. | 000044e0 20 64 65 6c 74 61 62 20 3d 20 28 6c 61 73 74 62 | deltab = (lastb| 000044f0 2d 6e 65 77 62 29 2f 28 70 30 2d 70 31 29 3b 0a |-newb)/(p0-p1);.| 00004500 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 | while | 00004510 28 70 3e 68 6f 72 69 7a 6f 6e 29 20 7b 0a 20 20 |(p>horizon) {. | 00004520 20 20 20 20 20 20 20 20 20 20 63 72 2d 3d 64 65 | cr-=de| 00004530 6c 74 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 |ltar;. | 00004540 20 20 63 67 2d 3d 64 65 6c 74 61 67 3b 0a 20 20 | cg-=deltag;. | 00004550 20 20 20 20 20 20 20 20 20 20 63 62 2d 3d 64 65 | cb-=de| 00004560 6c 74 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 |ltab;. | 00004570 20 20 69 66 20 28 70 3e 3d 30 20 26 26 20 70 3c | if (p>=0 && p<| 00004580 79 6d 29 20 69 6e 74 65 6e 73 5b 69 2b 78 6d 2a |ym) intens[i+xm*| 00004590 28 79 6d 2d 31 2d 70 29 5d 20 3d 20 28 63 72 3e |(ym-1-p)] = (cr>| 000045a0 3e 38 29 2b 28 63 67 26 28 32 35 35 3c 3c 38 29 |>8)+(cg&(255<<8)| 000045b0 29 2b 28 28 63 62 3e 3e 38 29 3c 3c 31 36 29 3b |)+((cb>>8)<<16);| 000045c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3d |. p-=| 000045d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 |1;. }. | 000045e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 | }. | 000045f0 20 68 6f 72 69 7a 6f 6e 20 3d 20 70 31 3b 0a 20 | horizon = p1;. | 00004600 20 20 20 20 20 20 20 6c 61 73 74 72 3d 6e 65 77 | lastr=new| 00004610 72 3b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 67 |r;. lastg| 00004620 3d 6e 65 77 67 3b 0a 20 20 20 20 20 20 20 20 6c |=newg;. l| 00004630 61 73 74 62 3d 6e 65 77 62 3b 0a 20 20 20 20 20 |astb=newb;. | 00004640 20 20 20 6c 61 73 74 76 61 6c 69 64 20 3d 20 54 | lastvalid = T| 00004650 52 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 |RUE;. }. | 00004660 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 | else {. | 00004670 20 20 6c 61 73 74 76 61 6c 69 64 3d 46 41 4c 53 | lastvalid=FALS| 00004680 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 |E;. }. | 00004690 20 70 30 3d 70 31 3b 0a 20 20 20 20 7d 0a 20 20 | p0=p1;. }. | 000046a0 20 20 68 6f 72 69 7a 6f 6e 5f 62 75 66 66 65 72 | horizon_buffer| 000046b0 5b 69 5d 20 3d 20 68 6f 72 69 7a 6f 6e 3b 0a 20 |[i] = horizon;. | 000046c0 20 7d 0a 0a 20 20 70 20 3d 20 28 20 28 6d 75 6c | }.. p = ( (mul| 000046d0 5f 66 72 61 63 31 36 63 28 73 65 61 6c 65 76 65 |_frac16c(sealeve| 000046e0 6c 2c 20 63 6f 73 29 2b 73 69 6e 29 2a 33 2f 32 |l, cos)+sin)*3/2| 000046f0 35 36 20 2d 20 79 6c 20 29 20 3e 3e 20 28 31 30 |56 - yl ) >> (10| 00004700 2d 6c 69 6d 69 74 29 3b 20 2f 2a 74 68 69 73 20 |-limit); /*this | 00004710 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 |comes from the p| 00004720 61 72 61 6c 6c 65 6c 20 70 72 6f 6a 65 63 74 69 |arallel projecti| 00004730 6f 6e 20 63 61 6c 63 20 70 65 72 66 6f 72 6d 65 |on calc performe| 00004740 64 20 61 62 6f 76 65 20 2d 20 69 74 20 6c 65 74 |d above - it let| 00004750 73 20 73 6b 79 20 63 6f 6c 6f 75 72 20 62 65 20 |s sky colour be | 00004760 73 65 74 20 72 65 6c 61 74 69 76 65 20 74 6f 20 |set relative to | 00004770 74 68 65 20 6e 61 74 75 72 61 6c 20 68 6f 72 69 |the natural hori| 00004780 7a 6f 6e 2a 2f 0a 20 20 66 6f 72 20 28 69 3d 30 |zon*/. for (i=0| 00004790 3b 20 69 3c 6e 3b 20 69 2b 2b 29 0a 20 20 20 20 |; i<n; i++). | 000047a0 66 6f 72 20 28 6a 3d 68 6f 72 69 7a 6f 6e 5f 62 |for (j=horizon_b| 000047b0 75 66 66 65 72 5b 69 5d 2b 31 3b 20 6a 3c 79 6d |uffer[i]+1; j<ym| 000047c0 3b 20 6a 2b 2b 29 20 7b 0a 20 20 20 20 20 20 78 |; j++) {. x| 000047d0 20 3d 20 28 69 3c 3c 28 31 36 2d 6c 69 6d 69 74 | = (i<<(16-limit| 000047e0 29 29 2d 6f 6e 65 2f 32 3b 0a 20 20 20 20 20 20 |))-one/2;. | 000047f0 79 20 3d 20 20 28 6a 2d 70 29 3c 3c 28 31 36 2d |y = (j-p)<<(16-| 00004800 6c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 20 |limit);. r | 00004810 3d 20 79 2f 32 35 36 20 2b 20 28 78 2a 78 29 2f |= y/256 + (x*x)/| 00004820 28 6f 6e 65 2a 32 30 34 38 29 3b 0a 20 20 20 20 |(one*2048);. | 00004830 20 20 69 66 20 28 72 3c 30 29 20 72 3d 30 3b 0a | if (r<0) r=0;.| 00004840 20 20 20 20 20 20 69 66 20 28 72 3e 32 35 35 29 | if (r>255)| 00004850 20 72 3d 32 35 35 3b 0a 20 20 20 20 20 20 69 6e | r=255;. in| 00004860 74 65 6e 73 5b 69 2b 78 6d 2a 28 79 6d 2d 31 2d |tens[i+xm*(ym-1-| 00004870 6a 29 5d 20 3d 20 73 6b 79 5b 72 5d 3b 0a 20 20 |j)] = sky[r];. | 00004880 20 20 7d 0a 0a 20 20 66 72 65 65 28 68 6f 72 69 | }.. free(hori| 00004890 7a 6f 6e 5f 62 75 66 66 65 72 29 3b 0a 20 20 72 |zon_buffer);. r| 000048a0 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 42 |eturn TRUE;.}..B| 000048b0 4f 4f 4c 20 64 75 6d 70 5f 69 6d 61 67 65 33 32 |OOL dump_image32| 000048c0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 64 |(unsigned int *d| 000048d0 61 74 61 2c 20 69 6e 74 20 6c 69 6d 69 74 2c 20 |ata, int limit, | 000048e0 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a |char *filename).| 000048f0 7b 0a 20 20 69 6e 74 20 79 6c 2c 20 79 3b 0a 20 |{. int yl, y;. | 00004900 20 69 6e 74 20 6e 3d 31 3c 3c 6c 69 6d 69 74 3b | int n=1<<limit;| 00004910 0a 20 20 42 4f 4f 4c 20 72 65 74 63 6f 64 65 3d |. BOOL retcode=| 00004920 54 52 55 45 3b 0a 20 20 69 6e 74 20 78 3d 6e 3b |TRUE;. int x=n;| 00004930 0a 20 20 63 68 61 72 20 62 75 66 5b 32 35 36 5d |. char buf[256]| 00004940 3b 0a 0a 20 20 63 61 6c 63 5f 76 65 72 74 69 63 |;.. calc_vertic| 00004950 61 6c 62 6f 75 6e 64 73 28 64 61 74 61 2c 20 6c |albounds(data, l| 00004960 69 6d 69 74 2c 20 26 79 6c 2c 20 26 79 29 3b 0a |imit, &yl, &y);.| 00004970 0a 20 20 69 66 20 28 21 63 72 65 61 74 65 5f 69 |. if (!create_i| 00004980 6d 61 67 65 33 32 28 78 2c 20 79 29 29 20 72 65 |mage32(x, y)) re| 00004990 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 69 66 |turn FALSE;. if| 000049a0 20 28 21 72 65 6e 64 65 72 5f 69 6d 61 67 65 33 | (!render_image3| 000049b0 32 28 64 61 74 61 2c 20 6c 69 6d 69 74 2c 20 79 |2(data, limit, y| 000049c0 6c 2c 20 78 2c 20 79 29 29 20 7b 0a 20 20 20 20 |l, x, y)) {. | 000049d0 64 69 73 63 61 72 64 5f 69 6d 61 67 65 33 32 28 |discard_image32(| 000049e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 |);. return FA| 000049f0 4c 53 45 3b 0a 20 20 7d 0a 20 20 69 66 20 28 73 |LSE;. }. if (s| 00004a00 61 76 65 33 32 29 20 7b 0a 20 20 20 20 69 66 20 |ave32) {. if | 00004a10 28 73 70 72 69 74 65 5f 61 72 65 61 5f 73 61 76 |(sprite_area_sav| 00004a20 65 28 73 61 33 32 2c 20 66 69 6c 65 6e 61 6d 65 |e(sa32, filename| 00004a30 29 29 20 72 65 74 63 6f 64 65 3d 46 41 4c 53 45 |)) retcode=FALSE| 00004a40 3b 0a 20 20 7d 0a 20 20 69 66 20 28 73 61 76 65 |;. }. if (save| 00004a50 38 29 20 7b 0a 20 20 20 20 69 66 20 28 64 69 74 |8) {. if (dit| 00004a60 68 61 72 65 61 29 20 66 6c 65 78 5f 66 72 65 65 |harea) flex_free| 00004a70 28 28 66 6c 65 78 5f 70 74 72 29 26 64 69 74 68 |((flex_ptr)&dith| 00004a80 61 72 65 61 29 3b 0a 20 20 20 20 69 66 20 28 21 |area);. if (!| 00004a90 66 6c 65 78 5f 61 6c 6c 6f 63 28 28 66 6c 65 78 |flex_alloc((flex| 00004aa0 5f 70 74 72 29 26 64 69 74 68 61 72 65 61 2c 20 |_ptr)&ditharea, | 00004ab0 73 69 7a 65 6f 66 28 73 70 72 69 74 65 5f 61 72 |sizeof(sprite_ar| 00004ac0 65 61 29 29 29 20 7b 0a 20 20 20 20 20 20 77 65 |ea))) {. we| 00004ad0 72 72 28 30 2c 20 22 64 69 74 68 61 72 65 61 20 |rr(0, "ditharea | 00004ae0 69 6e 69 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 |init failed");. | 00004af0 20 20 20 20 20 72 65 74 63 6f 64 65 3d 46 41 4c | retcode=FAL| 00004b00 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c |SE;. }. el| 00004b10 73 65 20 7b 0a 20 20 20 20 20 20 73 70 72 69 74 |se {. sprit| 00004b20 65 5f 61 72 65 61 5f 69 6e 69 74 69 61 6c 69 73 |e_area_initialis| 00004b30 65 28 64 69 74 68 61 72 65 61 2c 20 66 6c 65 78 |e(ditharea, flex| 00004b40 5f 73 69 7a 65 28 28 66 6c 65 78 5f 70 74 72 29 |_size((flex_ptr)| 00004b50 26 64 69 74 68 61 72 65 61 29 29 3b 0a 20 20 20 |&ditharea));. | 00004b60 20 20 20 69 66 20 28 67 65 6e 5f 32 35 36 77 69 | if (gen_256wi| 00004b70 74 68 6e 6f 70 61 6c 65 74 74 65 28 28 66 6c 65 |thnopalette((fle| 00004b80 78 5f 70 74 72 29 26 73 61 33 32 2c 20 69 6d 6e |x_ptr)&sa32, imn| 00004b90 61 6d 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 |ame)) {. | 00004ba0 73 74 72 63 61 74 28 73 74 72 63 70 79 28 62 75 |strcat(strcpy(bu| 00004bb0 66 2c 20 66 69 6c 65 6e 61 6d 65 29 2c 20 22 64 |f, filename), "d| 00004bc0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 |");. if (| 00004bd0 73 70 72 69 74 65 5f 61 72 65 61 5f 73 61 76 65 |sprite_area_save| 00004be0 28 64 69 74 68 61 72 65 61 2c 20 62 75 66 29 29 |(ditharea, buf))| 00004bf0 20 72 65 74 63 6f 64 65 3d 46 41 4c 53 45 3b 0a | retcode=FALSE;.| 00004c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c | }. el| 00004c10 73 65 20 72 65 74 63 6f 64 65 20 3d 20 46 41 4c |se retcode = FAL| 00004c20 53 45 3b 0a 20 20 20 20 20 20 66 6c 65 78 5f 66 |SE;. flex_f| 00004c30 72 65 65 28 28 66 6c 65 78 5f 70 74 72 29 26 64 |ree((flex_ptr)&d| 00004c40 69 74 68 61 72 65 61 29 3b 0a 20 20 20 20 7d 0a |itharea);. }.| 00004c50 20 20 7d 0a 20 20 64 69 73 63 61 72 64 5f 69 6d | }. discard_im| 00004c60 61 67 65 33 32 28 29 3b 0a 0a 20 20 72 65 74 75 |age32();.. retu| 00004c70 72 6e 20 72 65 74 63 6f 64 65 3b 0a 7d 0a 0a 2f |rn retcode;.}../| 00004c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| * 00004ca0 20 64 69 74 68 65 72 69 6e 67 20 2a 2a 2a 2a 2a | dithering *****| 00004cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00004cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 42 4f |***********/..BO| 00004cd0 4f 4c 20 67 65 6e 5f 32 35 36 77 69 74 68 6e 6f |OL gen_256withno| 00004ce0 70 61 6c 65 74 74 65 28 66 6c 65 78 5f 70 74 72 |palette(flex_ptr| 00004cf0 20 73 61 2c 20 63 68 61 72 20 2a 6e 61 6d 65 29 | sa, char *name)| 00004d00 0a 7b 0a 20 20 69 6e 74 20 6e 65 77 73 69 7a 65 |.{. int newsize| 00004d10 3b 0a 20 20 6f 73 5f 65 72 72 6f 72 20 2a 65 3b |;. os_error *e;| 00004d20 0a 20 20 63 6f 6d 70 61 63 74 5f 64 69 74 68 65 |. compact_dithe| 00004d30 72 5f 65 72 72 6f 72 20 2a 64 65 3b 0a 20 20 69 |r_error *de;. i| 00004d40 6e 74 20 78 2c 20 79 3b 0a 20 20 73 70 72 69 74 |nt x, y;. sprit| 00004d50 65 5f 69 64 20 73 69 3b 0a 20 20 73 70 72 69 74 |e_id si;. sprit| 00004d60 65 5f 68 65 61 64 65 72 20 2a 73 68 2c 20 2a 64 |e_header *sh, *d| 00004d70 68 3b 0a 20 20 63 68 61 72 20 2a 73 70 2c 20 2a |h;. char *sp, *| 00004d80 64 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 |dp;. unsigned i| 00004d90 6e 74 20 6d 6f 64 65 77 6f 72 64 2c 20 74 79 70 |nt modeword, typ| 00004da0 65 2c 20 78 72 65 73 2c 20 79 72 65 73 3b 0a 20 |e, xres, yres;. | 00004db0 20 69 6e 74 20 73 70 72 73 69 7a 65 2c 20 65 78 | int sprsize, ex| 00004dc0 74 72 61 3b 0a 0a 20 20 73 69 2e 74 61 67 20 3d |tra;.. si.tag =| 00004dd0 20 73 70 72 69 74 65 5f 69 64 5f 6e 61 6d 65 3b | sprite_id_name;| 00004de0 0a 20 20 73 69 2e 73 2e 6e 61 6d 65 20 3d 20 6e |. si.s.name = n| 00004df0 61 6d 65 3b 0a 20 20 69 66 20 28 77 69 6d 70 74 |ame;. if (wimpt| 00004e00 5f 63 6f 6d 70 6c 61 69 6e 28 73 70 72 69 74 65 |_complain(sprite| 00004e10 5f 73 65 6c 65 63 74 5f 72 70 28 28 73 70 72 69 |_select_rp((spri| 00004e20 74 65 5f 61 72 65 61 20 2a 29 2a 73 61 2c 20 26 |te_area *)*sa, &| 00004e30 73 69 2c 20 28 73 70 72 69 74 65 5f 70 74 72 20 |si, (sprite_ptr | 00004e40 2a 29 26 73 68 29 29 29 20 72 65 74 75 72 6e 20 |*)&sh))) return | 00004e50 46 41 4c 53 45 3b 0a 20 20 6d 6f 64 65 77 6f 72 |FALSE;. modewor| 00004e60 64 20 3d 20 73 68 2d 3e 6d 6f 64 65 3b 0a 20 20 |d = sh->mode;. | 00004e70 74 79 70 65 20 3d 20 6d 6f 64 65 77 6f 72 64 3e |type = modeword>| 00004e80 3e 32 37 3b 0a 20 20 78 72 65 73 20 3d 20 28 6d |>27;. xres = (m| 00004e90 6f 64 65 77 6f 72 64 3e 3e 20 31 29 26 30 78 31 |odeword>> 1)&0x1| 00004ea0 66 66 66 3b 0a 20 20 79 72 65 73 20 3d 20 28 6d |fff;. yres = (m| 00004eb0 6f 64 65 77 6f 72 64 3e 3e 31 34 29 26 30 78 31 |odeword>>14)&0x1| 00004ec0 66 66 66 3b 0a 0a 20 20 69 66 20 28 74 79 70 65 |fff;.. if (type| 00004ed0 21 3d 36 29 20 7b 0a 20 20 20 20 77 65 72 72 28 |!=6) {. werr(| 00004ee0 30 2c 20 22 53 70 72 69 74 65 20 69 73 20 6e 6f |0, "Sprite is no| 00004ef0 74 20 6e 65 77 20 74 79 70 65 20 36 20 28 33 32 |t new type 6 (32| 00004f00 62 70 70 29 20 2d 20 49 20 6f 6e 6c 79 20 75 6e |bpp) - I only un| 00004f10 64 65 72 73 74 61 6e 64 20 74 68 65 73 65 21 22 |derstand these!"| 00004f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 |);. return FA| 00004f30 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 78 20 3d 20 |LSE;. }.. x = | 00004f40 31 2b 73 68 2d 3e 77 69 64 74 68 3b 0a 20 20 79 |1+sh->width;. y| 00004f50 20 3d 20 73 68 2d 3e 68 65 69 67 68 74 20 2b 20 | = sh->height + | 00004f60 31 3b 0a 20 20 73 70 72 73 69 7a 65 20 3d 20 73 |1;. sprsize = s| 00004f70 69 7a 65 6f 66 28 73 70 72 69 74 65 5f 68 65 61 |izeof(sprite_hea| 00004f80 64 65 72 29 2b 79 2a 28 28 78 2b 33 29 26 7e 33 |der)+y*((x+3)&~3| 00004f90 29 3b 0a 0a 20 20 65 78 74 72 61 20 3d 20 73 70 |);.. extra = sp| 00004fa0 72 73 69 7a 65 20 2d 20 28 64 69 74 68 61 72 65 |rsize - (dithare| 00004fb0 61 2d 3e 73 69 7a 65 20 2d 20 64 69 74 68 61 72 |a->size - dithar| 00004fc0 65 61 2d 3e 66 72 65 65 6f 66 66 29 3b 0a 20 20 |ea->freeoff);. | 00004fd0 69 66 20 28 65 78 74 72 61 3e 30 29 20 7b 0a 20 |if (extra>0) {. | 00004fe0 20 20 20 6e 65 77 73 69 7a 65 20 3d 20 64 69 74 | newsize = dit| 00004ff0 68 61 72 65 61 2d 3e 73 69 7a 65 20 2b 20 65 78 |harea->size + ex| 00005000 74 72 61 3b 0a 20 20 20 20 69 66 20 28 21 66 6c |tra;. if (!fl| 00005010 65 78 5f 65 78 74 65 6e 64 28 28 66 6c 65 78 5f |ex_extend((flex_| 00005020 70 74 72 29 26 64 69 74 68 61 72 65 61 2c 20 6e |ptr)&ditharea, n| 00005030 65 77 73 69 7a 65 29 29 20 7b 0a 20 20 20 20 20 |ewsize)) {. | 00005040 20 77 65 72 72 28 30 2c 20 22 4e 6f 20 72 6f 6f | werr(0, "No roo| 00005050 6d 20 66 6f 72 20 64 65 73 74 69 6e 61 74 69 6f |m for destinatio| 00005060 6e 20 73 70 72 69 74 65 22 29 3b 0a 20 20 20 20 |n sprite");. | 00005070 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a | return FALSE;.| 00005080 20 20 20 20 7d 0a 20 20 20 20 64 69 74 68 61 72 | }. dithar| 00005090 65 61 2d 3e 73 69 7a 65 20 3d 20 6e 65 77 73 69 |ea->size = newsi| 000050a0 7a 65 3b 0a 20 20 20 20 2f 2a 61 62 6f 76 65 20 |ze;. /*above | 000050b0 66 6c 65 78 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 |flex will likely| 000050c0 20 68 61 76 65 20 69 6e 76 61 6c 69 64 61 74 65 | have invalidate| 000050d0 64 20 73 68 2c 20 73 6f 20 72 65 63 61 6c 63 2a |d sh, so recalc*| 000050e0 2f 0a 20 20 20 20 69 66 20 28 77 69 6d 70 74 5f |/. if (wimpt_| 000050f0 63 6f 6d 70 6c 61 69 6e 28 73 70 72 69 74 65 5f |complain(sprite_| 00005100 73 65 6c 65 63 74 5f 72 70 28 28 73 70 72 69 74 |select_rp((sprit| 00005110 65 5f 61 72 65 61 20 2a 29 2a 73 61 2c 20 26 73 |e_area *)*sa, &s| 00005120 69 2c 20 28 73 70 72 69 74 65 5f 70 74 72 20 2a |i, (sprite_ptr *| 00005130 29 26 73 68 29 29 29 20 72 65 74 75 72 6e 20 46 |)&sh))) return F| 00005140 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 64 65 20 |ALSE;. }.. de | 00005150 3d 20 6d 61 6c 6c 6f 63 28 78 2a 73 69 7a 65 6f |= malloc(x*sizeo| 00005160 66 28 63 6f 6d 70 61 63 74 5f 64 69 74 68 65 72 |f(compact_dither| 00005170 5f 65 72 72 6f 72 29 29 3b 0a 20 20 69 66 20 28 |_error));. if (| 00005180 64 65 3d 3d 30 29 20 7b 0a 20 20 20 20 77 65 72 |de==0) {. wer| 00005190 72 28 30 2c 20 22 4e 6f 20 72 6f 6f 6d 20 66 6f |r(0, "No room fo| 000051a0 72 20 64 69 74 68 65 72 20 65 72 72 6f 72 20 6c |r dither error l| 000051b0 69 6e 65 20 62 75 66 66 65 72 22 29 3b 0a 20 20 |ine buffer");. | 000051c0 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a | return FALSE;.| 000051d0 20 20 7d 0a 0a 20 20 65 3d 73 70 72 69 74 65 5f | }.. e=sprite_| 000051e0 63 72 65 61 74 65 5f 72 70 28 64 69 74 68 61 72 |create_rp(dithar| 000051f0 65 61 2c 20 6e 61 6d 65 2c 20 73 70 72 69 74 65 |ea, name, sprite| 00005200 5f 6e 6f 70 61 6c 65 74 74 65 2c 20 78 2c 20 79 |_nopalette, x, y| 00005210 2c 20 78 72 65 73 3d 3d 32 2a 79 72 65 73 20 3f |, xres==2*yres ?| 00005220 20 31 35 20 3a 20 32 38 2c 20 28 73 70 72 69 74 | 15 : 28, (sprit| 00005230 65 5f 70 74 72 20 2a 29 26 64 68 29 3b 0a 20 20 |e_ptr *)&dh);. | 00005240 69 66 20 28 65 29 20 7b 0a 20 20 20 20 66 72 65 |if (e) {. fre| 00005250 65 28 64 65 29 3b 0a 20 20 20 20 77 69 6d 70 74 |e(de);. wimpt| 00005260 5f 63 6f 6d 70 6c 61 69 6e 28 65 29 3b 0a 20 20 |_complain(e);. | 00005270 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a | return FALSE;.| 00005280 20 20 7d 0a 20 20 64 70 20 3d 20 28 63 68 61 72 | }. dp = (char| 00005290 20 2a 29 64 68 20 2b 20 64 68 2d 3e 69 6d 61 67 | *)dh + dh->imag| 000052a0 65 3b 0a 20 20 73 70 20 3d 20 28 63 68 61 72 20 |e;. sp = (char | 000052b0 2a 29 73 68 20 2b 20 73 68 2d 3e 69 6d 61 67 65 |*)sh + sh->image| 000052c0 3b 0a 0a 20 20 67 32 35 36 77 6e 70 5f 69 6e 74 |;.. g256wnp_int| 000052d0 65 72 6e 61 6c 28 78 2c 20 79 2c 20 64 70 2c 20 |ernal(x, y, dp, | 000052e0 73 70 2c 20 64 65 2c 20 6c 75 74 2c 20 70 61 6c |sp, de, lut, pal| 000052f0 32 35 36 64 65 66 29 3b 0a 0a 20 20 66 72 65 65 |256def);.. free| 00005300 28 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 |(de);. return T| 00005310 52 55 45 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a |RUE;.}../*******| 00005320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00005330 2a 2a 2a 2a 2a 2a 2a 20 69 6e 69 74 69 61 6c 69 |******* initiali| 00005340 73 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a |sation *********| 00005350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| 00005360 2a 2a 2a 2a 2a 2f 0a 0a 42 4f 4f 4c 20 6c 6f 61 |*****/..BOOL loa| 00005370 64 5f 70 61 6c 65 74 74 65 28 63 68 61 72 20 2a |d_palette(char *| 00005380 6e 61 6d 65 2c 20 75 6e 73 69 67 6e 65 64 20 69 |name, unsigned i| 00005390 6e 74 20 2a 70 61 6c 29 0a 7b 0a 20 20 6f 73 5f |nt *pal).{. os_| 000053a0 66 69 6c 65 73 74 72 20 66 3b 0a 20 20 69 6e 74 |filestr f;. int| 000053b0 20 69 3b 0a 20 20 63 68 61 72 20 70 74 5b 31 35 | i;. char pt[15| 000053c0 33 36 5d 2c 20 2a 70 3b 0a 20 20 63 68 61 72 20 |36], *p;. char | 000053d0 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 70 72 |buf[1024];. spr| 000053e0 69 6e 74 66 28 62 75 66 2c 20 22 3c 53 63 61 70 |intf(buf, "<Scap| 000053f0 65 32 24 44 69 72 3e 2e 72 65 73 6f 75 72 63 65 |e2$Dir>.resource| 00005400 73 2e 25 73 22 2c 20 6e 61 6d 65 29 3b 0a 20 20 |s.%s", name);. | 00005410 66 2e 61 63 74 69 6f 6e 3d 32 35 35 3b 0a 20 20 |f.action=255;. | 00005420 66 2e 6e 61 6d 65 3d 62 75 66 3b 0a 20 20 66 2e |f.name=buf;. f.| 00005430 6c 6f 61 64 61 64 64 72 3d 28 69 6e 74 29 70 74 |loadaddr=(int)pt| 00005440 3b 0a 20 20 66 2e 65 78 65 63 61 64 64 72 3d 30 |;. f.execaddr=0| 00005450 3b 0a 20 20 69 66 20 28 77 69 6d 70 74 5f 63 6f |;. if (wimpt_co| 00005460 6d 70 6c 61 69 6e 28 6f 73 5f 66 69 6c 65 28 26 |mplain(os_file(&| 00005470 66 29 29 29 20 72 65 74 75 72 6e 20 46 41 4c 53 |f))) return FALS| 00005480 45 3b 0a 20 20 69 66 20 28 66 2e 73 74 61 72 74 |E;. if (f.start| 00005490 21 3d 31 35 33 36 29 20 7b 20 2f 2a 66 2e 73 74 |!=1536) { /*f.st| 000054a0 61 72 74 20 69 73 20 72 34 2c 20 68 65 72 65 20 |art is r4, here | 000054b0 68 6f 6c 64 69 6e 67 20 66 69 6c 65 20 6c 65 6e |holding file len| 000054c0 67 74 68 2a 2f 0a 20 20 20 20 77 65 72 72 28 30 |gth*/. werr(0| 000054d0 2c 20 22 49 6e 74 65 72 6e 61 6c 3a 20 72 65 73 |, "Internal: res| 000054e0 6f 75 72 63 65 73 2e 25 73 20 66 69 6c 65 20 63 |ources.%s file c| 000054f0 6f 72 72 75 70 74 65 64 20 2d 20 73 68 6f 75 6c |orrupted - shoul| 00005500 64 20 62 65 20 31 35 33 36 20 62 79 74 65 73 20 |d be 1536 bytes | 00005510 6c 6f 6e 67 22 2c 20 6e 61 6d 65 29 3b 0a 20 20 |long", name);. | 00005520 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a | return FALSE;.| 00005530 20 20 7d 0a 20 20 66 6f 72 20 28 69 3d 30 2c 20 | }. for (i=0, | 00005540 70 3d 70 74 3b 20 69 3c 32 35 36 3b 20 69 2b 2b |p=pt; i<256; i++| 00005550 2c 20 70 2b 3d 36 29 20 70 61 6c 5b 69 5d 3d 70 |, p+=6) pal[i]=p| 00005560 5b 33 5d 2b 28 70 5b 34 5d 3c 3c 38 29 2b 28 70 |[3]+(p[4]<<8)+(p| 00005570 5b 35 5d 3c 3c 31 36 29 3b 0a 20 20 72 65 74 75 |[5]<<16);. retu| 00005580 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 2d 2d |rn TRUE;.}../*--| 00005590 2d 20 49 6e 69 74 69 61 6c 69 73 65 20 74 68 65 |- Initialise the| 000055a0 20 70 72 6f 67 72 61 6d 2c 20 72 65 74 75 72 6e | program, return| 000055b0 69 6e 67 20 54 52 55 45 20 69 66 20 69 74 20 77 |ing TRUE if it w| 000055c0 61 73 20 61 6c 6c 20 4f 4b 2e 20 2d 2d 2d 2a 2f |as all OK. ---*/| 000055d0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 69 6e 69 |.static BOOL ini| 000055e0 74 69 61 6c 69 73 65 28 69 6e 74 20 61 72 67 63 |tialise(int argc| 000055f0 2c 20 63 68 61 72 20 2a 61 72 67 76 5b 5d 29 0a |, char *argv[]).| 00005600 7b 0a 20 20 6f 73 5f 66 69 6c 65 73 74 72 20 66 |{. os_filestr f| 00005610 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 |;. int i;.. if| 00005620 20 28 61 72 67 63 3e 3d 32 29 20 7b 0a 20 20 20 | (argc>=2) {. | 00005630 20 69 3d 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 | i=atoi(argv[1])| 00005640 3b 0a 20 20 20 20 73 61 76 65 33 32 20 3d 20 69 |;. save32 = i| 00005650 26 31 20 3f 20 54 52 55 45 20 3a 20 46 41 4c 53 |&1 ? TRUE : FALS| 00005660 45 3b 0a 20 20 20 20 73 61 76 65 38 20 20 3d 20 |E;. save8 = | 00005670 69 26 32 20 3f 20 54 52 55 45 20 3a 20 46 41 4c |i&2 ? TRUE : FAL| 00005680 53 45 3b 0a 20 20 7d 0a 0a 20 20 66 2e 61 63 74 |SE;. }.. f.act| 00005690 69 6f 6e 3d 32 35 35 3b 0a 20 20 66 2e 6e 61 6d |ion=255;. f.nam| 000056a0 65 3d 22 3c 53 63 61 70 65 32 24 44 69 72 3e 2e |e="<Scape2$Dir>.| 000056b0 72 65 73 6f 75 72 63 65 73 2e 6c 75 74 22 3b 0a |resources.lut";.| 000056c0 20 20 66 2e 6c 6f 61 64 61 64 64 72 3d 28 69 6e | f.loadaddr=(in| 000056d0 74 29 6c 75 74 3b 0a 20 20 66 2e 65 78 65 63 61 |t)lut;. f.execa| 000056e0 64 64 72 3d 30 3b 0a 20 20 69 66 20 28 77 69 6d |ddr=0;. if (wim| 000056f0 70 74 5f 63 6f 6d 70 6c 61 69 6e 28 6f 73 5f 66 |pt_complain(os_f| 00005700 69 6c 65 28 26 66 29 29 29 20 72 65 74 75 72 6e |ile(&f))) return| 00005710 20 46 41 4c 53 45 3b 0a 20 20 69 66 20 28 66 2e | FALSE;. if (f.| 00005720 73 74 61 72 74 21 3d 33 32 37 36 38 29 20 7b 20 |start!=32768) { | 00005730 2f 2a 66 2e 73 74 61 72 74 20 69 73 20 72 34 2c |/*f.start is r4,| 00005740 20 68 65 72 65 20 68 6f 6c 64 69 6e 67 20 66 69 | here holding fi| 00005750 6c 65 20 6c 65 6e 67 74 68 2a 2f 0a 20 20 20 20 |le length*/. | 00005760 77 65 72 72 28 30 2c 20 22 49 6e 74 65 72 6e 61 |werr(0, "Interna| 00005770 6c 3a 20 72 65 73 6f 75 72 63 65 73 2e 6c 75 74 |l: resources.lut| 00005780 20 66 69 6c 65 20 63 6f 72 72 75 70 74 65 64 20 | file corrupted | 00005790 2d 20 73 68 6f 75 6c 64 20 62 65 20 33 32 37 36 |- should be 3276| 000057a0 38 20 62 79 74 65 73 20 6c 6f 6e 67 22 29 3b 0a |8 bytes long");.| 000057b0 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 | return FALSE| 000057c0 3b 0a 20 20 7d 0a 0a 20 20 66 2e 61 63 74 69 6f |;. }.. f.actio| 000057d0 6e 3d 32 35 35 3b 0a 20 20 66 2e 6e 61 6d 65 3d |n=255;. f.name=| 000057e0 22 3c 53 63 61 70 65 32 24 44 69 72 3e 2e 72 65 |"<Scape2$Dir>.re| 000057f0 73 6f 75 72 63 65 73 2e 70 61 6c 32 35 36 64 65 |sources.pal256de| 00005800 66 22 3b 0a 20 20 66 2e 6c 6f 61 64 61 64 64 72 |f";. f.loadaddr| 00005810 3d 28 69 6e 74 29 70 61 6c 32 35 36 64 65 66 3b |=(int)pal256def;| 00005820 0a 20 20 66 2e 65 78 65 63 61 64 64 72 3d 30 3b |. f.execaddr=0;| 00005830 0a 20 20 69 66 20 28 77 69 6d 70 74 5f 63 6f 6d |. if (wimpt_com| 00005840 70 6c 61 69 6e 28 6f 73 5f 66 69 6c 65 28 26 66 |plain(os_file(&f| 00005850 29 29 29 20 72 65 74 75 72 6e 20 46 41 4c 53 45 |))) return FALSE| 00005860 3b 0a 20 20 69 66 20 28 66 2e 73 74 61 72 74 21 |;. if (f.start!| 00005870 3d 31 30 32 34 29 20 7b 20 2f 2a 66 2e 73 74 61 |=1024) { /*f.sta| 00005880 72 74 20 69 73 20 72 34 2c 20 68 65 72 65 20 68 |rt is r4, here h| 00005890 6f 6c 64 69 6e 67 20 66 69 6c 65 20 6c 65 6e 67 |olding file leng| 000058a0 74 68 2a 2f 0a 20 20 20 20 77 65 72 72 28 30 2c |th*/. werr(0,| 000058b0 20 22 49 6e 74 65 72 6e 61 6c 3a 20 72 65 73 6f | "Internal: reso| 000058c0 75 72 63 65 73 2e 70 61 6c 32 35 36 64 65 66 20 |urces.pal256def | 000058d0 66 69 6c 65 20 63 6f 72 72 75 70 74 65 64 20 2d |file corrupted -| 000058e0 20 73 68 6f 75 6c 64 20 62 65 20 31 30 32 34 20 | should be 1024 | 000058f0 62 79 74 65 73 20 6c 6f 6e 67 22 29 3b 0a 20 20 |bytes long");. | 00005900 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a | return FALSE;.| 00005910 20 20 7d 0a 0a 20 20 69 66 20 28 21 6c 6f 61 64 | }.. if (!load| 00005920 5f 70 61 6c 65 74 74 65 28 22 65 6c 65 76 61 74 |_palette("elevat| 00005930 69 6f 6e 22 2c 20 65 6c 65 76 61 74 69 6f 6e 29 |ion", elevation)| 00005940 29 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a |) return FALSE;.| 00005950 20 20 69 66 20 28 21 6c 6f 61 64 5f 70 61 6c 65 | if (!load_pale| 00005960 74 74 65 28 22 73 65 61 22 2c 20 73 65 61 29 29 |tte("sea", sea))| 00005970 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 | return FALSE;. | 00005980 20 69 66 20 28 21 6c 6f 61 64 5f 70 61 6c 65 74 | if (!load_palet| 00005990 74 65 28 22 73 6b 79 22 2c 20 73 6b 79 29 29 20 |te("sky", sky)) | 000059a0 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 |return FALSE;. | 000059b0 69 66 20 28 21 6c 6f 61 64 5f 70 61 6c 65 74 74 |if (!load_palett| 000059c0 65 28 22 73 6c 6f 70 65 22 2c 20 73 6c 6f 70 65 |e("slope", slope| 000059d0 29 29 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b |)) return FALSE;| 000059e0 0a 0a 20 20 2f 2a 20 41 6c 6c 20 77 65 6e 74 20 |.. /* All went | 000059f0 6f 6b 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 |ok */. return T| 00005a00 52 55 45 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a |RUE;.}../*******| 00005a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| * 00005a30 2a 2a 20 6d 61 69 6e 20 66 75 6e 63 74 69 6f 6e |** main function| 00005a40 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |s **************| 00005a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a |****************| * 00005a70 2a 2a 2a 2a 2f 0a 0a 42 4f 4f 4c 20 67 72 61 70 |****/..BOOL grap| 00005a80 68 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a |h(unsigned int *| 00005a90 64 61 74 61 2c 20 69 6e 74 20 6c 69 6d 69 74 29 |data, int limit)| 00005aa0 0a 7b 0a 20 20 69 6e 74 20 6e 3d 31 3c 3c 6c 69 |.{. int n=1<<li| 00005ab0 6d 69 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c |mit;. int i, j,| 00005ac0 20 6b 3b 0a 20 20 69 6e 74 20 70 6c 2c 20 70 72 | k;. int pl, pr| 00005ad0 3b 0a 20 20 69 6e 74 20 76 6c 2c 20 76 72 2c 20 |;. int vl, vr, | 00005ae0 76 2c 20 76 32 3b 0a 20 20 69 6e 74 20 68 6f 72 |v, v2;. int hor| 00005af0 69 7a 6f 6e 5b 31 30 32 36 5d 3b 0a 20 20 69 6e |izon[1026];. in| 00005b00 74 20 68 6f 72 69 7a 6f 6e 32 5b 31 30 32 36 5d |t horizon2[1026]| 00005b10 3b 0a 20 20 69 6e 74 20 63 6f 73 20 3d 20 63 6f |;. int cos = co| 00005b20 73 31 36 28 74 69 6c 74 29 3b 0a 20 20 69 6e 74 |s16(tilt);. int| 00005b30 20 73 69 6e 20 3d 20 73 69 6e 31 36 28 74 69 6c | sin = sin16(til| 00005b40 74 29 3b 0a 20 20 69 6e 74 20 69 6d 61 67 65 5f |t);. int image_| 00005b50 79 6c 3d 31 30 32 34 3b 0a 20 20 69 6e 74 20 69 |yl=1024;. int i| 00005b60 6d 61 67 65 5f 79 68 3d 30 3b 0a 0a 20 20 66 6f |mage_yh=0;.. fo| 00005b70 72 20 28 69 3d 30 3b 20 69 3c 31 30 32 36 3b 20 |r (i=0; i<1026; | 00005b80 69 2b 2b 29 20 7b 0a 20 20 20 20 68 6f 72 69 7a |i++) {. horiz| 00005b90 6f 6e 5b 69 5d 3d 30 3b 0a 20 20 20 20 68 6f 72 |on[i]=0;. hor| 00005ba0 69 7a 6f 6e 32 5b 69 5d 3d 31 30 32 34 3b 0a 20 |izon2[i]=1024;. | 00005bb0 20 7d 0a 20 20 62 62 63 5f 6f 72 69 67 69 6e 28 | }. bbc_origin(| 00005bc0 36 34 30 2c 30 29 3b 0a 20 20 66 6f 72 20 28 69 |640,0);. for (i| 00005bd0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 7b 0a |=0; i<n; i++) {.| 00005be0 20 20 20 20 66 6f 72 20 28 6a 3d 31 2c 20 70 6c | for (j=1, pl| 00005bf0 3d 2d 35 31 32 2c 20 76 6c 20 3d 20 6d 75 74 65 |=-512, vl = mute| 00005c00 77 65 74 28 64 61 74 61 5b 30 2b 6e 2a 69 5d 29 |wet(data[0+n*i])| 00005c10 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 6c 3d 70 |; j<n; j++, pl=p| 00005c20 72 2c 20 76 6c 3d 76 72 29 20 7b 0a 20 20 20 20 |r, vl=vr) {. | 00005c30 20 20 66 6f 72 20 28 70 72 3d 70 6c 2b 28 31 30 | for (pr=pl+(10| 00005c40 32 34 3e 3e 6c 69 6d 69 74 29 2c 20 76 72 3d 6d |24>>limit), vr=m| 00005c50 75 74 65 77 65 74 28 64 61 74 61 5b 6a 2b 6e 2a |utewet(data[j+n*| 00005c60 69 5d 29 2c 20 6b 3d 70 6c 2c 20 76 3d 76 6c 3b |i]), k=pl, v=vl;| 00005c70 20 6b 3c 70 72 3b 20 6b 2b 3d 32 2c 20 76 2b 3d | k<pr; k+=2, v+=| 00005c80 28 76 72 2d 76 6c 29 3e 3e 28 39 2d 6c 69 6d 69 |(vr-vl)>>(9-limi| 00005c90 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20 76 32 |t)) {. v2| 00005ca0 20 3d 20 28 6d 75 6c 5f 66 72 61 63 31 36 63 28 | = (mul_frac16c(| 00005cb0 76 2c 20 63 6f 73 29 2b 6d 75 6c 5f 66 72 61 63 |v, cos)+mul_frac| 00005cc0 31 36 63 28 69 3c 3c 28 31 36 2d 6c 69 6d 69 74 |16c(i<<(16-limit| 00005cd0 29 2c 20 73 69 6e 29 29 2a 33 2f 32 35 36 3b 0a |), sin))*3/256;.| 00005ce0 20 20 20 20 20 20 20 20 69 66 20 28 69 3d 3d 30 | if (i==0| 00005cf0 29 20 68 6f 72 69 7a 6f 6e 32 5b 6b 2b 35 31 32 |) horizon2[k+512| 00005d00 5d 3d 76 32 3b 0a 20 20 20 20 20 20 20 20 69 66 |]=v2;. if| 00005d10 20 28 68 6f 72 69 7a 6f 6e 5b 6b 2b 35 31 32 5d | (horizon[k+512]| 00005d20 3c 76 32 29 20 7b 0a 20 20 20 20 20 20 20 20 20 |<v2) {. | 00005d30 20 62 62 63 5f 67 63 6f 6c 28 30 2c 20 34 2b 36 | bbc_gcol(0, 4+6| 00005d40 2a 69 2f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 |*i/n);. | 00005d50 20 62 62 63 5f 70 6c 6f 74 28 36 39 2c 20 6b 2c | bbc_plot(69, k,| 00005d60 20 76 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 | v2);. | 00005d70 68 6f 72 69 7a 6f 6e 5b 6b 2b 35 31 32 5d 3d 76 |horizon[k+512]=v| 00005d80 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 |2;. }. | 00005d90 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 68 6f | else if (ho| 00005da0 72 69 7a 6f 6e 32 5b 6b 2b 35 31 32 5d 3e 76 32 |rizon2[k+512]>v2| 00005db0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62 62 |) {. bb| 00005dc0 63 5f 67 63 6f 6c 28 30 2c 20 31 30 2b 36 2a 69 |c_gcol(0, 10+6*i| 00005dd0 2f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 |/n);. b| 00005de0 62 63 5f 70 6c 6f 74 28 36 39 2c 20 6b 2c 20 76 |bc_plot(69, k, v| 00005df0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 68 6f |2);. ho| 00005e00 72 69 7a 6f 6e 32 5b 6b 2b 35 31 32 5d 3d 76 32 |rizon2[k+512]=v2| 00005e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 |;. }. | 00005e20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 76 32 | }. }. v2| 00005e30 20 3d 20 28 6d 75 6c 5f 66 72 61 63 31 36 63 28 | = (mul_frac16c(| 00005e40 76 72 2c 20 63 6f 73 29 2b 6d 75 6c 5f 66 72 61 |vr, cos)+mul_fra| 00005e50 63 31 36 63 28 69 3c 3c 28 31 36 2d 6c 69 6d 69 |c16c(i<<(16-limi| 00005e60 74 29 2c 20 73 69 6e 29 29 2a 33 2f 32 35 36 3b |t), sin))*3/256;| 00005e70 0a 20 20 20 20 69 66 20 28 69 3d 3d 30 29 20 68 |. if (i==0) h| 00005e80 6f 72 69 7a 6f 6e 32 5b 6b 2b 35 31 32 5d 3d 76 |orizon2[k+512]=v| 00005e90 32 3b 0a 20 20 20 20 69 66 20 28 68 6f 72 69 7a |2;. if (horiz| 00005ea0 6f 6e 5b 6b 2b 35 31 32 5d 3c 76 32 29 20 7b 0a |on[k+512]<v2) {.| 00005eb0 20 20 20 20 20 20 62 62 63 5f 67 63 6f 6c 28 30 | bbc_gcol(0| 00005ec0 2c 20 34 2b 36 2a 69 2f 6e 29 3b 0a 20 20 20 20 |, 4+6*i/n);. | 00005ed0 20 20 62 62 63 5f 70 6c 6f 74 28 36 39 2c 20 6b | bbc_plot(69, k| 00005ee0 2c 20 76 32 29 3b 0a 20 20 20 20 20 20 68 6f 72 |, v2);. hor| 00005ef0 69 7a 6f 6e 5b 6b 2b 35 31 32 5d 3d 76 32 3b 0a |izon[k+512]=v2;.| 00005f00 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 | }. else i| 00005f10 66 20 28 68 6f 72 69 7a 6f 6e 32 5b 6b 2b 35 31 |f (horizon2[k+51| 00005f20 32 5d 3e 76 32 29 20 7b 0a 20 20 20 20 20 20 62 |2]>v2) {. b| 00005f30 62 63 5f 67 63 6f 6c 28 30 2c 20 31 30 2b 36 2a |bc_gcol(0, 10+6*| 00005f40 69 2f 6e 29 3b 0a 20 20 20 20 20 20 62 62 63 5f |i/n);. bbc_| 00005f50 70 6c 6f 74 28 36 39 2c 20 6b 2c 20 76 32 29 3b |plot(69, k, v2);| 00005f60 0a 20 20 20 20 20 20 68 6f 72 69 7a 6f 6e 32 5b |. horizon2[| 00005f70 6b 2b 35 31 32 5d 3d 76 32 3b 0a 20 20 20 20 7d |k+512]=v2;. }| 00005f80 0a 20 20 7d 0a 20 20 66 6f 72 20 28 69 3d 30 3b |. }. for (i=0;| 00005f90 20 69 3c 31 30 32 36 3b 20 69 2b 2b 29 20 7b 0a | i<1026; i++) {.| 00005fa0 20 20 20 20 69 66 20 28 68 6f 72 69 7a 6f 6e 5b | if (horizon[| 00005fb0 69 5d 20 3e 69 6d 61 67 65 5f 79 68 29 20 69 6d |i] >image_yh) im| 00005fc0 61 67 65 5f 79 68 3d 68 6f 72 69 7a 6f 6e 5b 69 |age_yh=horizon[i| 00005fd0 5d 3b 0a 20 20 20 20 69 66 20 28 68 6f 72 69 7a |];. if (horiz| 00005fe0 6f 6e 32 5b 69 5d 3c 69 6d 61 67 65 5f 79 6c 29 |on2[i]<image_yl)| 00005ff0 20 69 6d 61 67 65 5f 79 6c 3d 68 6f 72 69 7a 6f | image_yl=horizo| 00006000 6e 32 5b 69 5d 3b 0a 20 20 7d 0a 20 20 62 62 63 |n2[i];. }. bbc| 00006010 5f 6d 6f 76 65 28 2d 35 31 32 2c 20 69 6d 61 67 |_move(-512, imag| 00006020 65 5f 79 6c 29 3b 0a 20 20 62 62 63 5f 6d 6f 76 |e_yl);. bbc_mov| 00006030 65 28 35 31 32 2c 20 69 6d 61 67 65 5f 79 68 29 |e(512, image_yh)| 00006040 3b 0a 20 20 62 62 63 5f 70 6c 6f 74 28 31 38 39 |;. bbc_plot(189| 00006050 2c 20 2d 35 31 32 2c 20 35 31 32 2b 28 69 6d 61 |, -512, 512+(ima| 00006060 67 65 5f 79 6c 2d 69 6d 61 67 65 5f 79 68 29 2f |ge_yl-image_yh)/| 00006070 32 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 52 |2);.. return TR| 00006080 55 45 3b 0a 7d 0a 0a 6d 6f 6e 69 74 6f 72 20 72 |UE;.}..monitor r| 00006090 65 61 64 5f 6d 6f 6e 69 74 6f 72 5f 74 79 70 65 |ead_monitor_type| 000060a0 28 76 6f 69 64 29 0a 7b 0a 20 20 69 6e 74 20 72 |(void).{. int r| 000060b0 32 3b 0a 20 20 6f 73 5f 73 77 69 33 72 28 36 2c |2;. os_swi3r(6,| 000060c0 20 31 36 31 2c 31 33 33 2c 30 2c 20 30 2c 30 2c | 161,133,0, 0,0,| 000060d0 26 72 32 29 3b 0a 20 20 69 66 20 28 28 72 32 2f |&r2);. if ((r2/| 000060e0 34 20 26 20 33 29 20 3d 3d 20 31 29 20 72 65 74 |4 & 3) == 1) ret| 000060f0 75 72 6e 20 6d 75 6c 74 69 3b 0a 20 20 65 6c 73 |urn multi;. els| 00006100 65 20 72 65 74 75 72 6e 20 6e 6f 6e 6d 75 6c 74 |e return nonmult| 00006110 69 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 |i;.}..int main(i| 00006120 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 61 |nt argc, char *a| 00006130 72 67 76 5b 5d 29 0a 7b 0a 20 20 69 6e 74 20 73 |rgv[]).{. int s| 00006140 65 65 64 2c 20 69 3b 0a 20 20 63 68 61 72 20 6b |eed, i;. char k| 00006150 65 79 3b 0a 20 20 64 6f 75 62 6c 65 20 64 69 6d |ey;. double dim| 00006160 3d 32 2e 32 3b 0a 20 20 64 6f 75 62 6c 65 20 64 |=2.2;. double d| 00006170 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 32 |;. char buf[102| 00006180 34 5d 3b 0a 20 20 69 6e 74 20 74 6f 72 69 65 6e |4];. int torien| 00006190 74 2c 20 74 73 63 72 6f 6c 6c 78 2c 20 74 73 63 |t, tscrollx, tsc| 000061a0 72 6f 6c 6c 79 3b 0a 20 20 6d 6f 6e 69 74 6f 72 |rolly;. monitor| 000061b0 74 79 70 65 20 3d 20 72 65 61 64 5f 6d 6f 6e 69 |type = read_moni| 000061c0 74 6f 72 5f 74 79 70 65 28 29 3b 0a 20 20 66 6c |tor_type();. fl| 000061d0 65 78 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 69 66 |ex_init();.. if| 000061e0 20 28 21 69 6e 69 74 69 61 6c 69 73 65 28 61 72 | (!initialise(ar| 000061f0 67 63 2c 20 61 72 67 76 29 29 20 72 65 74 75 72 |gc, argv)) retur| 00006200 6e 20 30 3b 0a 0a 20 20 66 6f 72 20 28 3b 3b 29 |n 0;.. for (;;)| 00006210 20 7b 0a 0a 20 20 20 20 62 62 63 5f 6d 6f 64 65 | {.. bbc_mode| 00006220 28 6d 6f 6e 69 74 6f 72 74 79 70 65 3d 3d 6d 75 |(monitortype==mu| 00006230 6c 74 69 20 3f 20 32 30 20 3a 20 31 32 29 3b 0a |lti ? 20 : 12);.| 00006240 20 20 20 20 70 72 69 6e 74 66 28 22 50 6c 65 61 | printf("Plea| 00006250 73 65 20 73 65 6c 65 63 74 20 77 68 69 63 68 20 |se select which | 00006260 6c 61 6e 64 73 63 61 70 65 20 74 6f 20 63 6f 6e |landscape to con| 00006270 73 74 72 75 63 74 20 28 61 6e 79 20 69 6e 74 65 |struct (any inte| 00006280 67 65 72 29 20 22 29 3b 0a 20 20 20 20 73 63 61 |ger) ");. sca| 00006290 6e 66 28 22 25 69 22 2c 20 26 73 65 65 64 29 3b |nf("%i", &seed);| 000062a0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 |. do {. | 000062b0 70 72 69 6e 74 66 28 22 50 6c 65 61 73 65 20 65 |printf("Please e| 000062c0 6e 74 65 72 20 73 63 61 70 65 20 72 65 73 6f 6c |nter scape resol| 000062d0 75 74 69 6f 6e 20 28 73 75 67 67 65 73 74 20 37 |ution (suggest 7| 000062e0 2e 2e 2e 39 2c 20 74 68 6f 75 67 68 20 33 2e 2e |...9, though 3..| 000062f0 2e 39 20 70 65 72 6d 69 73 73 69 62 6c 65 29 20 |.9 permissible) | 00006300 22 29 3b 0a 20 20 20 20 20 20 73 63 61 6e 66 28 |");. scanf(| 00006310 22 25 69 22 2c 20 26 6c 69 6d 69 74 29 3b 0a 20 |"%i", &limit);. | 00006320 20 20 20 7d 20 77 68 69 6c 65 20 28 6c 69 6d 69 | } while (limi| 00006330 74 3c 33 20 7c 7c 20 6c 69 6d 69 74 3e 39 29 3b |t<3 || limit>9);| 00006340 0a 20 20 20 20 4e 20 3d 20 31 3c 3c 6c 69 6d 69 |. N = 1<<limi| 00006350 74 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 |t;. do {. | 00006360 20 20 70 72 69 6e 74 66 28 22 50 6c 65 61 73 65 | printf("Please| 00006370 20 65 6e 74 65 72 20 73 63 61 70 65 20 64 69 6d | enter scape dim| 00006380 65 6e 73 69 6f 6e 20 28 73 75 67 67 65 73 74 20 |ension (suggest | 00006390 32 2e 31 35 2c 20 32 2d 33 20 70 65 72 6d 69 73 |2.15, 2-3 permis| 000063a0 73 69 62 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 |sible) ");. | 000063b0 20 73 63 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 | scanf("%Lf", &d| 000063c0 69 6d 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 |im);. } while| 000063d0 20 28 64 69 6d 3c 32 20 7c 7c 20 64 69 6d 3e 33 | (dim<2 || dim>3| 000063e0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 |);. do {. | 000063f0 20 20 70 72 69 6e 74 66 28 22 50 6c 65 61 73 65 | printf("Please| 00006400 20 65 6e 74 65 72 20 66 72 65 71 75 65 6e 63 79 | enter frequency| 00006410 20 72 61 6e 67 65 20 28 73 75 67 67 65 73 74 20 | range (suggest | 00006420 31 2c 20 30 2d 31 20 70 65 72 6d 69 73 73 69 62 |1, 0-1 permissib| 00006430 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 20 73 63 |le) ");. sc| 00006440 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 29 3b 0a |anf("%Lf", &d);.| 00006450 20 20 20 20 7d 20 77 68 69 6c 65 20 28 64 3c 30 | } while (d<0| 00006460 20 7c 7c 20 64 3e 31 29 3b 0a 20 20 20 20 72 61 | || d>1);. ra| 00006470 6e 67 65 20 3d 20 28 69 6e 74 29 28 30 2e 35 2b |nge = (int)(0.5+| 00006480 64 2a 28 64 6f 75 62 6c 65 29 28 69 6e 74 29 28 |d*(double)(int)(| 00006490 4e 2f 32 29 29 3b 0a 20 20 20 20 69 66 20 28 72 |N/2));. if (r| 000064a0 61 6e 67 65 3c 30 29 20 72 61 6e 67 65 3d 30 3b |ange<0) range=0;| 000064b0 0a 20 20 20 20 69 66 20 28 72 61 6e 67 65 3e 4e |. if (range>N| 000064c0 2f 32 29 20 72 61 6e 67 65 3d 4e 2f 32 3b 0a 20 |/2) range=N/2;. | 000064d0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 72 | do {. pr| 000064e0 69 6e 74 66 28 22 50 6c 65 61 73 65 20 65 6e 74 |intf("Please ent| 000064f0 65 72 20 73 65 61 2d 6c 65 76 65 6c 20 28 73 75 |er sea-level (su| 00006500 67 67 65 73 74 20 30 2c 20 30 2d 31 20 70 65 72 |ggest 0, 0-1 per| 00006510 6d 69 73 73 69 62 6c 65 29 20 22 29 3b 0a 20 20 |missible) ");. | 00006520 20 20 20 20 73 63 61 6e 66 28 22 25 4c 66 22 2c | scanf("%Lf",| 00006530 20 26 64 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c | &d);. } whil| 00006540 65 20 28 64 3c 30 20 7c 7c 20 64 3e 31 29 3b 0a |e (d<0 || d>1);.| 00006550 20 20 20 20 73 65 61 6c 65 76 65 6c 20 3d 20 28 | sealevel = (| 00006560 69 6e 74 29 28 64 2a 6f 6e 65 29 3b 0a 20 20 20 |int)(d*one);. | 00006570 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 72 69 6e | do {. prin| 00006580 74 66 28 22 50 6c 65 61 73 65 20 65 6e 74 65 72 |tf("Please enter| 00006590 20 70 6f 77 65 72 20 73 63 61 6c 69 6e 67 20 6c | power scaling l| 000065a0 61 77 20 28 73 75 67 67 65 73 74 20 31 2c 20 6f |aw (suggest 1, o| 000065b0 72 20 30 2e 33 2d 33 2e 30 2c 20 74 68 6f 75 67 |r 0.3-3.0, thoug| 000065c0 68 20 3e 3d 20 30 20 70 65 72 6d 69 73 73 69 62 |h >= 0 permissib| 000065d0 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 20 73 63 |le) ");. sc| 000065e0 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 29 3b 0a |anf("%Lf", &d);.| 000065f0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 64 3c 30 | } while (d<0| 00006600 29 3b 0a 20 20 20 20 70 6f 77 73 63 61 6c 65 20 |);. powscale | 00006610 3d 20 28 69 6e 74 29 28 64 2a 6f 6e 65 29 3b 0a |= (int)(d*one);.| 00006620 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 | do {. p| 00006630 72 69 6e 74 66 28 22 50 6c 65 61 73 65 20 65 6e |rintf("Please en| 00006640 74 65 72 20 6c 69 6e 65 61 72 20 73 63 61 6c 69 |ter linear scali| 00006650 6e 67 20 66 61 63 74 6f 72 20 28 73 75 67 67 65 |ng factor (sugge| 00006660 73 74 20 31 2c 20 30 2d 31 20 70 65 72 6d 69 73 |st 1, 0-1 permis| 00006670 73 69 62 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 |sible) ");. | 00006680 20 73 63 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 | scanf("%Lf", &d| 00006690 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 |);. } while (| 000066a0 64 3c 30 20 7c 7c 20 64 3e 31 29 3b 0a 20 20 20 |d<0 || d>1);. | 000066b0 20 6c 69 6e 73 63 61 6c 65 20 3d 20 28 69 6e 74 | linscale = (int| 000066c0 29 28 64 2a 6f 6e 65 29 3b 0a 20 20 20 20 64 6f |)(d*one);. do| 000066d0 20 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 | {. printf(| 000066e0 22 50 6c 65 61 73 65 20 65 6e 74 65 72 20 6f 72 |"Please enter or| 000066f0 69 65 6e 74 61 74 69 6f 6e 20 28 73 75 67 67 65 |ientation (sugge| 00006700 73 74 20 30 2c 20 30 2e 2e 2e 33 20 70 65 72 6d |st 0, 0...3 perm| 00006710 69 73 73 69 62 6c 65 29 20 22 29 3b 0a 20 20 20 |issible) ");. | 00006720 20 20 20 73 63 61 6e 66 28 22 25 69 22 2c 20 26 | scanf("%i", &| 00006730 74 6f 72 69 65 6e 74 29 3b 0a 20 20 20 20 7d 20 |torient);. } | 00006740 77 68 69 6c 65 20 28 74 6f 72 69 65 6e 74 3c 30 |while (torient<0| 00006750 20 7c 7c 20 74 6f 72 69 65 6e 74 3e 33 29 3b 0a | || torient>3);.| 00006760 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 | do {. p| 00006770 72 69 6e 74 66 28 22 50 6c 65 61 73 65 20 65 6e |rintf("Please en| 00006780 74 65 72 20 78 20 73 63 72 6f 6c 6c 20 76 61 6c |ter x scroll val| 00006790 75 65 20 28 73 75 67 67 65 73 74 20 30 2c 20 30 |ue (suggest 0, 0| 000067a0 2e 2e 2e 35 31 31 20 70 65 72 6d 69 73 73 69 62 |...511 permissib| 000067b0 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 20 73 63 |le) ");. sc| 000067c0 61 6e 66 28 22 25 69 22 2c 20 26 74 73 63 72 6f |anf("%i", &tscro| 000067d0 6c 6c 78 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c |llx);. } whil| 000067e0 65 20 28 74 73 63 72 6f 6c 6c 78 3c 30 20 7c 7c |e (tscrollx<0 ||| 000067f0 20 74 73 63 72 6f 6c 6c 78 3e 3d 35 31 32 29 3b | tscrollx>=512);| 00006800 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 |. do {. | 00006810 70 72 69 6e 74 66 28 22 50 6c 65 61 73 65 20 65 |printf("Please e| 00006820 6e 74 65 72 20 79 20 73 63 72 6f 6c 6c 20 76 61 |nter y scroll va| 00006830 6c 75 65 20 28 73 75 67 67 65 73 74 20 30 2c 20 |lue (suggest 0, | 00006840 30 2e 2e 2e 35 31 31 20 70 65 72 6d 69 73 73 69 |0...511 permissi| 00006850 62 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 20 73 |ble) ");. s| 00006860 63 61 6e 66 28 22 25 69 22 2c 20 26 74 73 63 72 |canf("%i", &tscr| 00006870 6f 6c 6c 79 29 3b 0a 20 20 20 20 7d 20 77 68 69 |olly);. } whi| 00006880 6c 65 20 28 74 73 63 72 6f 6c 6c 79 3c 30 20 7c |le (tscrolly<0 || 00006890 7c 20 74 73 63 72 6f 6c 6c 79 3e 3d 35 31 32 29 || tscrolly>=512)| 000068a0 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 |;. do {. | 000068b0 20 70 72 69 6e 74 66 28 22 50 6c 65 61 73 65 20 | printf("Please | 000068c0 65 6e 74 65 72 20 76 69 65 77 69 6e 67 20 61 6e |enter viewing an| 000068d0 67 6c 65 20 28 73 75 67 67 65 73 74 20 30 2e 33 |gle (suggest 0.3| 000068e0 2c 20 6f 72 20 30 2e 33 2d 30 2e 37 2c 20 74 68 |, or 0.3-0.7, th| 000068f0 6f 75 67 68 20 30 2d 31 20 70 65 72 6d 69 73 73 |ough 0-1 permiss| 00006900 69 62 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 20 |ible) ");. | 00006910 73 63 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 29 |scanf("%Lf", &d)| 00006920 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 64 |;. } while (d| 00006930 3c 30 20 7c 7c 20 64 3e 31 29 3b 0a 20 20 20 20 |<0 || d>1);. | 00006940 74 69 6c 74 20 3d 20 28 69 6e 74 29 28 64 2a 6f |tilt = (int)(d*o| 00006950 6e 65 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 |ne);. do {. | 00006960 20 20 20 20 70 72 69 6e 74 66 28 22 50 6c 65 61 | printf("Plea| 00006970 73 65 20 65 6e 74 65 72 20 65 61 72 74 68 20 72 |se enter earth r| 00006980 65 6e 64 65 72 69 6e 67 20 66 61 63 74 6f 72 20 |endering factor | 00006990 28 73 75 67 67 65 73 74 20 30 2c 20 30 2e 35 20 |(suggest 0, 0.5 | 000069a0 6f 72 20 31 2c 20 30 2d 31 20 70 65 72 6d 69 73 |or 1, 0-1 permis| 000069b0 73 69 62 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 |sible) ");. | 000069c0 20 73 63 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 | scanf("%Lf", &d| 000069d0 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 |);. } while (| 000069e0 64 3c 30 20 7c 7c 20 64 3e 31 29 3b 0a 20 20 20 |d<0 || d>1);. | 000069f0 20 62 6c 65 6e 64 20 3d 20 28 69 6e 74 29 28 64 | blend = (int)(d| 00006a00 2a 6f 6e 65 29 3b 0a 20 20 20 20 64 6f 20 7b 0a |*one);. do {.| 00006a10 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 50 6c | printf("Pl| 00006a20 65 61 73 65 20 65 6e 74 65 72 20 66 6f 67 20 6c |ease enter fog l| 00006a30 65 76 65 6c 20 28 73 75 67 67 65 73 74 20 30 2d |evel (suggest 0-| 00006a40 30 2e 35 2c 20 30 2d 31 20 70 65 72 6d 69 73 73 |0.5, 0-1 permiss| 00006a50 69 62 6c 65 29 20 22 29 3b 0a 20 20 20 20 20 20 |ible) ");. | 00006a60 73 63 61 6e 66 28 22 25 4c 66 22 2c 20 26 64 29 |scanf("%Lf", &d)| 00006a70 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 64 |;. } while (d| 00006a80 3c 30 20 7c 7c 20 64 3e 31 29 3b 0a 20 20 20 20 |<0 || d>1);. | 00006a90 66 6f 67 20 3d 20 64 3c 30 2e 30 30 31 20 3f 20 |fog = d<0.001 ? | 00006aa0 30 20 3a 20 28 69 6e 74 29 28 6f 6e 65 2f 64 29 |0 : (int)(one/d)| 00006ab0 3b 0a 0a 20 20 20 20 69 66 20 28 21 66 6c 65 78 |;.. if (!flex| 00006ac0 5f 61 6c 6c 6f 63 28 28 66 6c 65 78 5f 70 74 72 |_alloc((flex_ptr| 00006ad0 29 26 64 61 74 61 2c 20 4e 2a 4e 2a 73 69 7a 65 |)&data, N*N*size| 00006ae0 6f 66 28 63 6f 6d 70 6c 65 78 29 29 29 20 77 65 |of(complex))) we| 00006af0 72 72 28 31 2c 20 22 49 6e 73 75 66 66 69 63 69 |rr(1, "Insuffici| 00006b00 65 6e 74 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 |ent memory");. | 00006b10 20 20 2f 2a 6e 6f 74 65 2c 20 66 75 72 74 68 65 | /*note, furthe| 00006b20 72 20 66 6c 65 78 20 63 61 6c 6c 73 20 6d 61 79 |r flex calls may| 00006b30 20 73 68 69 66 74 20 64 61 74 61 2c 20 73 6f 20 | shift data, so | 00006b40 62 65 20 63 61 72 65 66 75 6c 20 77 69 74 68 20 |be careful with | 00006b50 70 74 72 73 20 69 6e 74 6f 20 64 61 74 61 2a 2f |ptrs into data*/| 00006b60 0a 20 20 20 20 62 62 63 5f 6d 6f 64 65 28 6d 6f |. bbc_mode(mo| 00006b70 6e 69 74 6f 72 74 79 70 65 3d 3d 6d 75 6c 74 69 |nitortype==multi| 00006b80 20 3f 20 32 30 20 3a 20 31 32 29 3b 0a 20 20 20 | ? 20 : 12);. | 00006b90 20 62 62 63 5f 76 64 75 71 28 32 38 2c 37 32 2c | bbc_vduq(28,72,| 00006ba0 33 31 2c 37 39 2c 30 29 3b 0a 20 20 20 20 62 62 |31,79,0);. bb| 00006bb0 63 5f 70 61 6c 65 74 74 65 28 31 2c 20 31 36 2c |c_palette(1, 16,| 00006bc0 20 35 31 2c 35 31 2c 35 31 29 3b 0a 20 20 20 20 | 51,51,51);. | 00006bd0 62 62 63 5f 70 61 6c 65 74 74 65 28 32 2c 20 31 |bbc_palette(2, 1| 00006be0 36 2c 20 32 35 35 2c 32 35 35 2c 32 35 35 29 3b |6, 255,255,255);| 00006bf0 0a 20 20 20 20 62 62 63 5f 70 61 6c 65 74 74 65 |. bbc_palette| 00006c00 28 30 2c 20 31 36 2c 20 31 39 32 2c 31 39 32 2c |(0, 16, 192,192,| 00006c10 31 39 32 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 |192);. for (i| 00006c20 3d 30 3b 20 69 3c 36 3b 20 69 2b 2b 29 20 7b 0a |=0; i<6; i++) {.| 00006c30 20 20 20 20 20 20 62 62 63 5f 70 61 6c 65 74 74 | bbc_palett| 00006c40 65 28 20 34 2b 69 2c 20 31 36 2c 20 33 32 2b 32 |e( 4+i, 16, 32+2| 00006c50 30 2a 69 2c 31 33 36 2b 37 2a 69 2c 33 32 2b 32 |0*i,136+7*i,32+2| 00006c60 30 2a 69 29 3b 0a 20 20 20 20 20 20 62 62 63 5f |0*i);. bbc_| 00006c70 70 61 6c 65 74 74 65 28 31 30 2b 69 2c 20 31 36 |palette(10+i, 16| 00006c80 2c 20 31 32 38 2b 38 2a 69 2c 39 36 2b 31 32 2a |, 128+8*i,96+12*| 00006c90 69 2c 36 34 2b 31 36 2a 69 29 3b 0a 20 20 20 20 |i,64+16*i);. | 00006ca0 7d 0a 20 20 20 20 6c 69 6e 65 73 65 70 20 3d 20 |}. linesep = | 00006cb0 6d 6f 6e 69 74 6f 72 74 79 70 65 3d 3d 6d 75 6c |monitortype==mul| 00006cc0 74 69 20 3f 20 32 30 20 3a 20 34 30 3b 0a 20 20 |ti ? 20 : 40;. | 00006cd0 20 20 70 72 69 6e 74 66 28 22 5c 6e 50 6c 65 61 | printf("\nPlea| 00006ce0 73 65 20 20 77 61 69 74 20 2e 2e 2e 5c 6e 22 29 |se wait ...\n")| 00006cf0 3b 0a 20 20 20 20 61 73 73 69 67 6e 5f 66 74 28 |;. assign_ft(| 00006d00 64 61 74 61 2c 20 6c 69 6d 69 74 2c 20 64 69 6d |data, limit, dim| 00006d10 2c 20 73 65 65 64 29 3b 0a 20 20 20 20 69 66 20 |, seed);. if | 00006d20 28 72 61 6e 67 65 3c 4e 2f 32 29 20 63 6c 69 70 |(range<N/2) clip| 00006d30 5f 66 74 28 64 61 74 61 2c 20 6c 69 6d 69 74 2c |_ft(data, limit,| 00006d40 20 72 61 6e 67 65 29 3b 0a 20 20 20 20 69 6e 76 | range);. inv| 00006d50 66 66 74 5f 32 64 28 64 61 74 61 2c 20 6c 69 6d |fft_2d(data, lim| 00006d60 69 74 29 3b 0a 20 20 20 20 69 66 20 28 21 6e 6f |it);. if (!no| 00006d70 72 6d 61 6c 69 73 65 5f 61 6e 64 5f 63 6f 6d 70 |rmalise_and_comp| 00006d80 61 63 74 28 26 64 61 74 61 2c 20 6c 69 6d 69 74 |act(&data, limit| 00006d90 29 29 20 77 65 72 72 28 31 2c 20 22 43 61 6e 27 |)) werr(1, "Can'| 00006da0 74 20 63 6f 6d 70 61 63 74 20 64 61 74 61 22 29 |t compact data")| 00006db0 3b 0a 20 20 20 20 6f 72 69 65 6e 74 3d 73 63 72 |;. orient=scr| 00006dc0 6f 6c 6c 78 3d 73 63 72 6f 6c 6c 79 3d 30 3b 0a |ollx=scrolly=0;.| 00006dd0 20 20 20 20 74 73 63 72 6f 6c 6c 78 3e 3e 3d 39 | tscrollx>>=9| 00006de0 2d 6c 69 6d 69 74 3b 0a 20 20 20 20 74 73 63 72 |-limit;. tscr| 00006df0 6f 6c 6c 79 3e 3e 3d 39 2d 6c 69 6d 69 74 3b 0a |olly>>=9-limit;.| 00006e00 20 20 20 20 69 66 20 28 74 73 63 72 6f 6c 6c 78 | if (tscrollx| 00006e10 3e 30 29 20 73 63 72 6f 6c 6c 28 64 61 74 61 2c |>0) scroll(data,| 00006e20 20 6c 69 6d 69 74 2c 20 72 69 67 68 74 2c 20 74 | limit, right, t| 00006e30 73 63 72 6f 6c 6c 78 29 3b 0a 20 20 20 20 69 66 |scrollx);. if| 00006e40 20 28 74 73 63 72 6f 6c 6c 78 3c 30 29 20 73 63 | (tscrollx<0) sc| 00006e50 72 6f 6c 6c 28 64 61 74 61 2c 20 6c 69 6d 69 74 |roll(data, limit| 00006e60 2c 20 6c 65 66 74 2c 20 2d 74 73 63 72 6f 6c 6c |, left, -tscroll| 00006e70 78 29 3b 0a 20 20 20 20 69 66 20 28 74 73 63 72 |x);. if (tscr| 00006e80 6f 6c 6c 79 3e 30 29 20 73 63 72 6f 6c 6c 28 64 |olly>0) scroll(d| 00006e90 61 74 61 2c 20 6c 69 6d 69 74 2c 20 75 70 2c 20 |ata, limit, up, | 00006ea0 20 20 20 74 73 63 72 6f 6c 6c 79 29 3b 0a 20 20 | tscrolly);. | 00006eb0 20 20 69 66 20 28 74 73 63 72 6f 6c 6c 79 3c 30 | if (tscrolly<0| 00006ec0 29 20 73 63 72 6f 6c 6c 28 64 61 74 61 2c 20 6c |) scroll(data, l| 00006ed0 69 6d 69 74 2c 20 64 6f 77 6e 2c 20 2d 74 73 63 |imit, down, -tsc| 00006ee0 72 6f 6c 6c 79 29 3b 0a 20 20 20 20 73 77 69 74 |rolly);. swit| 00006ef0 63 68 20 28 74 6f 72 69 65 6e 74 29 20 7b 0a 20 |ch (torient) {. | 00006f00 20 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 | case 1:. | 00006f10 20 20 20 20 20 72 6f 74 61 74 65 28 64 61 74 61 | rotate(data| 00006f20 2c 20 6c 69 6d 69 74 2c 20 54 52 55 45 29 3b 0a |, limit, TRUE);.| 00006f30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 | break;. | 00006f40 20 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 | case 2:. | 00006f50 20 20 20 20 20 72 6f 74 61 74 65 28 64 61 74 61 | rotate(data| 00006f60 2c 20 6c 69 6d 69 74 2c 20 54 52 55 45 29 3b 0a |, limit, TRUE);.| 00006f70 20 20 20 20 20 20 20 20 72 6f 74 61 74 65 28 64 | rotate(d| 00006f80 61 74 61 2c 20 6c 69 6d 69 74 2c 20 54 52 55 45 |ata, limit, TRUE| 00006f90 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b |);. break| 00006fa0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 0a |;. case 3:.| 00006fb0 20 20 20 20 20 20 20 20 72 6f 74 61 74 65 28 64 | rotate(d| 00006fc0 61 74 61 2c 20 6c 69 6d 69 74 2c 20 46 41 4c 53 |ata, limit, FALS| 00006fd0 45 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 |E);. brea| 00006fe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 20 |k;. }. do | 00006ff0 7b 0a 20 20 20 20 20 20 62 62 63 5f 63 6c 67 28 |{. bbc_clg(| 00007000 29 3b 0a 20 20 20 20 20 20 67 72 61 70 68 28 64 |);. graph(d| 00007010 61 74 61 2c 20 6c 69 6d 69 74 29 3b 0a 20 20 20 |ata, limit);. | 00007020 20 20 20 62 62 63 5f 76 64 75 71 28 32 38 2c 30 | bbc_vduq(28,0| 00007030 2c 33 31 2c 37 2c 30 29 3b 0a 20 20 20 20 20 20 |,31,7,0);. | 00007040 70 72 69 6e 74 66 28 22 20 20 73 63 61 70 65 5c |printf(" scape\| 00007050 6e 25 37 69 5c 6e 5c 6e 20 20 20 20 72 65 73 5c |n%7i\n\n res\| 00007060 6e 25 37 69 5c 6e 5c 6e 20 20 20 20 64 69 6d 5c |n%7i\n\n dim\| 00007070 6e 25 37 2e 32 66 5c 6e 5c 6e 20 20 72 61 6e 67 |n%7.2f\n\n rang| 00007080 65 5c 6e 25 37 2e 32 66 5c 6e 5c 6e 20 20 20 20 |e\n%7.2f\n\n | 00007090 73 65 61 5c 6e 25 37 2e 32 66 5c 6e 5c 6e 20 70 |sea\n%7.2f\n\n p| 000070a0 73 63 61 6c 65 5c 6e 25 37 2e 32 66 5c 6e 5c 6e |scale\n%7.2f\n\n| 000070b0 20 6c 73 63 61 6c 65 5c 6e 25 37 2e 32 66 5c 6e | lscale\n%7.2f\n| 000070c0 5c 6e 20 6f 72 69 65 6e 74 5c 6e 25 37 69 5c 6e |\n orient\n%7i\n| 000070d0 5c 6e 20 20 20 20 20 20 78 5c 6e 25 37 69 5c 6e |\n x\n%7i\n| 000070e0 5c 6e 20 20 20 20 20 20 79 5c 6e 25 37 69 5c 6e |\n y\n%7i\n| 000070f0 5c 6e 20 20 20 74 69 6c 74 5c 6e 25 37 2e 32 66 |\n tilt\n%7.2f| 00007100 22 2c 20 73 65 65 64 2c 20 6c 69 6d 69 74 2c 20 |", seed, limit, | 00007110 64 69 6d 2c 20 28 69 6e 74 29 72 61 6e 67 65 2f |dim, (int)range/| 00007120 28 64 6f 75 62 6c 65 29 28 69 6e 74 29 28 4e 2f |(double)(int)(N/| 00007130 32 29 2c 20 28 69 6e 74 29 73 65 61 6c 65 76 65 |2), (int)sealeve| 00007140 6c 2f 36 35 35 33 36 2e 30 2c 20 28 69 6e 74 29 |l/65536.0, (int)| 00007150 70 6f 77 73 63 61 6c 65 2f 36 35 35 33 36 2e 30 |powscale/65536.0| 00007160 2c 20 28 69 6e 74 29 6c 69 6e 73 63 61 6c 65 2f |, (int)linscale/| 00007170 36 35 35 33 36 2e 30 2c 20 6f 72 69 65 6e 74 2c |65536.0, orient,| 00007180 20 73 63 72 6f 6c 6c 78 2c 20 73 63 72 6f 6c 6c | scrollx, scroll| 00007190 79 2c 20 28 69 6e 74 29 74 69 6c 74 2f 36 35 35 |y, (int)tilt/655| 000071a0 33 36 2e 30 29 3b 0a 20 20 20 20 20 20 62 62 63 |36.0);. bbc| 000071b0 5f 76 64 75 71 28 32 38 2c 37 32 2c 33 31 2c 37 |_vduq(28,72,31,7| 000071c0 39 2c 30 29 3b 0a 20 20 20 20 20 20 62 62 63 5f |9,0);. bbc_| 000071d0 63 6c 73 28 29 3b 0a 20 20 20 20 20 20 70 72 69 |cls();. pri| 000071e0 6e 74 66 28 22 5c 6e 5c 6e 5c 6e 5c 6e 5c 6e 5c |ntf("\n\n\n\n\n\| 000071f0 6e 5c 6e 5c 6e 50 72 65 73 73 20 61 20 6b 65 79 |n\n\nPress a key| 00007200 20 2e 2e 2e 5c 6e 5c 6e 22 29 3b 0a 20 20 20 20 | ...\n\n");. | 00007210 20 20 70 72 69 6e 74 66 28 22 5b 20 27 3c 27 5c | printf("[ '<'\| 00007220 6e 20 20 6f 72 5c 6e 20 20 27 3e 27 5c 6e 20 20 |n or\n '>'\n | 00007230 74 6f 5c 6e 72 6f 74 61 74 65 5c 6e 20 73 63 61 |to\nrotate\n sca| 00007240 70 65 5c 6e 5c 6e 63 75 72 73 6f 72 73 5c 6e 20 |pe\n\ncursors\n | 00007250 28 2b 5c 78 38 62 29 5c 6e 20 20 74 6f 5c 6e 73 |(+\x8b)\n to\ns| 00007260 63 72 6f 6c 6c 5c 6e 20 73 63 61 70 65 5c 6e 5c |croll\n scape\n\| 00007270 6e 20 63 6f 70 79 5c 6e 20 20 74 6f 5c 6e 20 73 |n copy\n to\n s| 00007280 61 76 65 5c 6e 20 69 6d 61 67 65 5c 6e 5c 6e 5c |ave\n image\n\n\| 00007290 78 38 62 20 63 6f 70 79 5c 6e 20 20 74 6f 5c 6e |x8b copy\n to\n| 000072a0 20 73 61 76 65 5c 6e 63 6f 6c 6f 75 72 5c 6e 20 | save\ncolour\n | 000072b0 69 6d 61 67 65 5c 6e 20 20 20 20 20 20 20 5d 5c |image\n ]\| 000072c0 6e 22 29 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a |n");. do {.| 000072d0 20 20 20 20 20 20 20 20 6f 73 5f 63 6c 69 28 22 | os_cli("| 000072e0 66 78 20 31 35 20 31 22 29 3b 0a 20 20 20 20 20 |fx 15 1");. | 000072f0 20 20 20 62 62 63 5f 63 75 72 73 6f 72 28 30 29 | bbc_cursor(0)| 00007300 3b 0a 20 20 20 20 20 20 20 20 6f 73 5f 73 77 69 |;. os_swi| 00007310 32 28 4f 53 5f 42 79 74 65 2c 34 2c 31 29 3b 0a |2(OS_Byte,4,1);.| 00007320 20 20 20 20 20 20 20 20 6b 65 79 20 3d 20 62 62 | key = bb| 00007330 63 5f 67 65 74 28 29 3b 0a 20 20 20 20 20 20 20 |c_get();. | 00007340 20 6f 73 5f 73 77 69 32 28 4f 53 5f 42 79 74 65 | os_swi2(OS_Byte| 00007350 2c 34 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 |,4,0);. i| 00007360 66 20 28 6b 65 79 3d 3d 31 33 35 29 20 7b 0a 20 |f (key==135) {. | 00007370 20 20 20 20 20 20 20 20 20 73 63 72 65 65 6e 2b | screen+| 00007380 3d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 |=1;. sp| 00007390 72 69 6e 74 66 28 62 75 66 2c 20 22 3c 53 63 61 |rintf(buf, "<Sca| 000073a0 70 65 32 24 44 69 72 3e 2e 5e 2e 49 6d 61 67 65 |pe2$Dir>.^.Image| 000073b0 25 30 32 69 22 2c 20 73 63 72 65 65 6e 29 3b 0a |%02i", screen);.| 000073c0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 6b | if (ak| 000073d0 62 64 5f 70 6f 6c 6c 73 68 28 29 29 20 7b 0a 20 |bd_pollsh()) {. | 000073e0 20 20 20 20 20 20 20 20 20 20 20 64 75 6d 70 5f | dump_| 000073f0 69 6d 61 67 65 33 32 28 64 61 74 61 2c 20 6c 69 |image32(data, li| 00007400 6d 69 74 2c 20 62 75 66 29 3b 0a 20 20 20 20 20 |mit, buf);. | 00007410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 | }. | 00007420 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 | else {. | 00007430 20 20 20 20 77 69 6d 70 74 5f 63 6f 6d 70 6c 61 | wimpt_compla| 00007440 69 6e 28 73 70 72 69 74 65 5f 73 63 72 65 65 6e |in(sprite_screen| 00007450 73 61 76 65 28 62 75 66 2c 20 54 52 55 45 29 29 |save(buf, TRUE))| 00007460 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 |;. }. | 00007470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 | }. } | 00007480 77 68 69 6c 65 20 28 6b 65 79 3d 3d 31 33 35 29 |while (key==135)| 00007490 3b 0a 20 20 20 20 20 20 69 66 20 28 6b 65 79 3d |;. if (key=| 000074a0 3d 34 34 20 7c 7c 20 6b 65 79 3d 3d 34 36 29 20 |=44 || key==46) | 000074b0 72 6f 74 61 74 65 28 64 61 74 61 2c 20 6c 69 6d |rotate(data, lim| 000074c0 69 74 2c 20 6b 65 79 3d 3d 34 36 29 3b 0a 20 20 |it, key==46);. | 000074d0 20 20 20 20 69 66 20 28 6b 65 79 3d 3d 31 33 36 | if (key==136| 000074e0 20 7c 7c 20 6b 65 79 3d 3d 31 33 37 20 7c 7c 20 | || key==137 || | 000074f0 6b 65 79 3d 3d 31 33 38 20 7c 7c 20 6b 65 79 3d |key==138 || key=| 00007500 3d 31 33 39 29 20 7b 0a 20 20 20 20 20 20 20 20 |=139) {. | 00007510 69 3d 6c 69 6d 69 74 2d 32 3b 0a 20 20 20 20 20 |i=limit-2;. | 00007520 20 20 20 69 66 20 28 61 6b 62 64 5f 70 6f 6c 6c | if (akbd_poll| 00007530 73 68 28 29 29 20 69 2d 3d 32 3b 0a 20 20 20 20 |sh()) i-=2;. | 00007540 20 20 20 20 69 66 20 28 69 3c 30 29 20 69 3d 30 | if (i<0) i=0| 00007550 3b 0a 20 20 20 20 20 20 20 20 73 63 72 6f 6c 6c |;. scroll| 00007560 28 64 61 74 61 2c 20 6c 69 6d 69 74 2c 20 6b 65 |(data, limit, ke| 00007570 79 2c 20 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 |y, 1<<i);. | 00007580 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 6b |}. } while (k| 00007590 65 79 3d 3d 34 34 20 7c 7c 20 6b 65 79 3d 3d 34 |ey==44 || key==4| 000075a0 36 20 7c 7c 20 6b 65 79 3d 3d 31 33 36 20 7c 7c |6 || key==136 ||| 000075b0 20 6b 65 79 3d 3d 31 33 37 20 7c 7c 20 6b 65 79 | key==137 || key| 000075c0 3d 3d 31 33 38 20 7c 7c 20 6b 65 79 3d 3d 31 33 |==138 || key==13| 000075d0 39 29 3b 0a 20 20 20 20 66 6c 65 78 5f 66 72 65 |9);. flex_fre| 000075e0 65 28 28 66 6c 65 78 5f 70 74 72 29 26 64 61 74 |e((flex_ptr)&dat| 000075f0 61 29 3b 0a 20 20 20 20 62 62 63 5f 63 6c 73 28 |a);. bbc_cls(| 00007600 29 3b 0a 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 |);.. }.. retur| 00007610 6e 20 30 3b 0a 7d 0a |n 0;.}.| 00007617