CALC.C


/****************************************************************************
Microsoft RPC Version 2.0
Copyright Microsoft Corp. 1992, 1993, 1994- 1996
mandel Example

FILE: calc.c

PURPOSE: Server side of the RPC distributed application Mandel

FUNCTIONS: MandelCalc() - Do the calculations for the Windows
Mandelbrot Set distributed drawing program.

****************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

#ifdef RPC
#include "mdlrpc.h"
#endif
#include "mandel.h"


short calcmand(double, double, short);


void MandelCalc(PCPOINT pcptLL,
PLONGRECT prcDraw,
double precision,
DWORD ulThreshold,
LINEBUF * pbBuf)
{
DWORD h, height, width;
double dreal, dimag, dimag2;
short maxit = 0;
short * pbPtr;

pbPtr = *pbBuf; // LINEBUF is an array of shorts

dreal = pcptLL->real + ((double)prcDraw->xLeft * precision);
dimag = pcptLL->imag + ((double)prcDraw->yBottom * precision);

maxit = (short) ulThreshold;

height = (prcDraw->yTop - prcDraw->yBottom) + 1;
width = (prcDraw->xRight - prcDraw->xLeft) + 1;

for ( ; width > 0; --width, dreal += precision) {
for (dimag2 = dimag, h = height; h > 0; --h, dimag2 += precision) {
if ((dreal > 4.0) || (dreal < -4.0) ||
(dimag2 > 4.0) || (dimag2 < -4.0))
*(pbPtr++) = 0;
else
*(pbPtr++) = calcmand(dreal, dimag2, maxit);
}
}
}


/* C version of the assembly language program */
short calcmand(double dreal,
double dimag,
short maxit)
{
double x, y, xsq, ysq;
short k;

k = maxit;
x = dreal;
y = dimag;

while (1) {
xsq = x * x;
ysq = y * y;
y = 2.0 * x * y + dimag;
x = (xsq - ysq) + dreal;
if (--k == 0)
return((short) (maxit - k));
if ((xsq + ysq) > 4.0)
return((short) (maxit - k));
}
}