Blame IlmImfExamples/drawImage.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
//
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//	Functions that algorithmically generate images, so that
Packit Service 6754ca
//	the code examples for image file reading and writing have
Packit Service 6754ca
//	data they can work with.
Packit Service 6754ca
//	Note that it is not necessary to study the code below in
Packit Service 6754ca
//	order to understand how the file I/O code examples work.
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#include "drawImage.h"
Packit Service 6754ca
Packit Service 6754ca
#include <math.h>
Packit Service 6754ca
#include <stdlib.h>
Packit Service 6754ca
#include <float.h>
Packit Service 6754ca
#include <algorithm>
Packit Service 6754ca
Packit Service 6754ca
#include "namespaceAlias.h"
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
Packit Service 6754ca
namespace
Packit Service 6754ca
{
Packit Service 6754ca
Packit Service 6754ca
float
Packit Service 6754ca
pw (float x, int y)
Packit Service 6754ca
{
Packit Service 6754ca
    float p = 1;
Packit Service 6754ca
Packit Service 6754ca
    while (y)
Packit Service 6754ca
    {
Packit Service 6754ca
	if (y & 1)
Packit Service 6754ca
	    p *= x;
Packit Service 6754ca
Packit Service 6754ca
	x *= x;
Packit Service 6754ca
	y >>= 1;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    return p;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
sp (Array2D<Rgba> &px, int w, int h,
Packit Service 6754ca
    float xc, float yc, float rc,
Packit Service 6754ca
    float rd, float gn, float bl, float lm)
Packit Service 6754ca
{
Packit Service 6754ca
    int x1 = int (max ((float) floor (xc - rc),  0.0f));
Packit Service 6754ca
    int x2 = int (min ((float) ceil  (xc + rc), w - 1.0f));
Packit Service 6754ca
    int y1 = int (max ((float) floor (yc - rc),  0.0f));
Packit Service 6754ca
    int y2 = int (min ((float) ceil  (yc + rc), h - 1.0f));
Packit Service 6754ca
Packit Service 6754ca
    for (int y = y1; y <= y2; ++y)
Packit Service 6754ca
    {
Packit Service 6754ca
	for (int x = x1; x <= x2; ++x)
Packit Service 6754ca
	{
Packit Service 6754ca
	    float xl = (x - xc) / rc;
Packit Service 6754ca
	    float yl = (y - yc) / rc;
Packit Service 6754ca
	    float r  = sqrt (xl * xl + yl * yl);
Packit Service 6754ca
Packit Service 6754ca
	    if (r >= 1)
Packit Service 6754ca
		continue;
Packit Service 6754ca
Packit Service 6754ca
	    float a = 1;
Packit Service 6754ca
Packit Service 6754ca
	    if (r * rc > rc - 1)
Packit Service 6754ca
		a = rc - r * rc;
Packit Service 6754ca
Packit Service 6754ca
	    float zl = sqrt (1 - r * r);
Packit Service 6754ca
	    float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710;
Packit Service 6754ca
Packit Service 6754ca
	    if (dl < 0)
Packit Service 6754ca
		dl *= -0.1;
Packit Service 6754ca
Packit Service 6754ca
	    float hl = pw (dl, 50) * 4;
Packit Service 6754ca
	    float dr = (dl + hl) * rd;
Packit Service 6754ca
	    float dg = (dl + hl) * gn;
Packit Service 6754ca
	    float db = (dl + hl) * bl;
Packit Service 6754ca
Packit Service 6754ca
	    Rgba &p = px[y][x];
Packit Service 6754ca
	    p.r = p.r * (1 - a) + dr * lm * a;
Packit Service 6754ca
	    p.g = p.g * (1 - a) + dg * lm * a;
Packit Service 6754ca
	    p.b = p.b * (1 - a) + db * lm * a;
Packit Service 6754ca
	    p.a = 1 - (1 - p.a) * (1 - a);
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
zsp (Array2D<half> &gpx, Array2D<float> &zpx, int w, int h,
Packit Service 6754ca
     float xc, float yc, float zc, float rc, float gn)
Packit Service 6754ca
{
Packit Service 6754ca
    int x1 = int (max ((float) floor (xc - rc),  0.0f));
Packit Service 6754ca
    int x2 = int (min ((float) ceil  (xc + rc), w - 1.0f));
Packit Service 6754ca
    int y1 = int (max ((float) floor (yc - rc),  0.0f));
Packit Service 6754ca
    int y2 = int (min ((float) ceil  (yc + rc), h - 1.0f));
Packit Service 6754ca
Packit Service 6754ca
    for (int x = x1; x <= x2; ++x)
Packit Service 6754ca
    {
Packit Service 6754ca
	for (int y = y1; y <= y2; ++y)
Packit Service 6754ca
	{
Packit Service 6754ca
	    float xl = (x - xc) / rc;
Packit Service 6754ca
	    float yl = (y - yc) / rc;
Packit Service 6754ca
	    float r  = sqrt (xl * xl + yl * yl);
Packit Service 6754ca
Packit Service 6754ca
	    if (r >= 1)
Packit Service 6754ca
		continue;
Packit Service 6754ca
Packit Service 6754ca
	    float a = 1;
Packit Service 6754ca
Packit Service 6754ca
	    if (r * rc > rc - 1)
Packit Service 6754ca
		a = rc - r * rc;
Packit Service 6754ca
Packit Service 6754ca
	    float zl = sqrt (1 - r * r);
Packit Service 6754ca
	    float zp = zc - rc * zl;
Packit Service 6754ca
Packit Service 6754ca
	    if (zp >= zpx[y][x])
Packit Service 6754ca
		continue;
Packit Service 6754ca
Packit Service 6754ca
	    float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710;
Packit Service 6754ca
Packit Service 6754ca
	    if (dl < 0)
Packit Service 6754ca
		dl *= -0.1;
Packit Service 6754ca
Packit Service 6754ca
	    float hl = pw (dl, 50) * 4;
Packit Service 6754ca
	    float dg = (dl + hl) * gn;
Packit Service 6754ca
Packit Service 6754ca
	    gpx[y][x] = dg;
Packit Service 6754ca
	    zpx[y][x] = zp;
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
inline float
Packit Service 6754ca
z (float k)
Packit Service 6754ca
{
Packit Service 6754ca
    k = 2 * (k - int (k));
Packit Service 6754ca
    return (k < 1)? k: 2 - k;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
inline void
Packit Service 6754ca
clear (Rgba &color)
Packit Service 6754ca
{
Packit Service 6754ca
    color.r = 0;
Packit Service 6754ca
    color.g = 0;
Packit Service 6754ca
    color.b = 0;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
inline void
Packit Service 6754ca
clear (GZ &gz)
Packit Service 6754ca
{
Packit Service 6754ca
    gz.g = 0;
Packit Service 6754ca
    gz.z = 0;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
add (float k, Rgba &color)
Packit Service 6754ca
{
Packit Service 6754ca
    color.a = k;
Packit Service 6754ca
    k *= 4;
Packit Service 6754ca
    color.r += 0.1f + 4 * z (k);
Packit Service 6754ca
    color.g += 0.1f + 4 * z (k + .33333f);
Packit Service 6754ca
    color.b += 0.1f + 4 * z (k + .66667f);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
add (float k, GZ &gz)
Packit Service 6754ca
{
Packit Service 6754ca
    k *= 5;
Packit Service 6754ca
    gz.g += 4 * z (k);
Packit Service 6754ca
    gz.z = k;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
inline void
Packit Service 6754ca
scale (float f, Rgba &color)
Packit Service 6754ca
{
Packit Service 6754ca
    color.r *= f;
Packit Service 6754ca
    color.g *= f;
Packit Service 6754ca
    color.b *= f;
Packit Service 6754ca
    color.a *= f;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
inline void
Packit Service 6754ca
scale (float f, GZ &gz)
Packit Service 6754ca
{
Packit Service 6754ca
    gz.g *= f;
Packit Service 6754ca
    gz.z *= f;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class P>
Packit Service 6754ca
void
Packit Service 6754ca
mndl (Array2D 

&px,

Packit Service 6754ca
      int w, int h,
Packit Service 6754ca
      int xMin, int xMax,
Packit Service 6754ca
      int yMin, int yMax,
Packit Service 6754ca
      int xSamples, int ySamples,
Packit Service 6754ca
      double rMin,
Packit Service 6754ca
      double rMax,
Packit Service 6754ca
      double iMin,
Packit Service 6754ca
      double aspect,
Packit Service 6754ca
      double rSeed,
Packit Service 6754ca
      double iSeed)
Packit Service 6754ca
{
Packit Service 6754ca
    if (xSamples > 6)
Packit Service 6754ca
	xSamples = 6;
Packit Service 6754ca
Packit Service 6754ca
    if (ySamples > 6)
Packit Service 6754ca
	ySamples = 6;
Packit Service 6754ca
Packit Service 6754ca
    double iMax = iMin + aspect * (rMax - rMin) * h / w;
Packit Service 6754ca
    double sx = double (rMax - rMin) / w;
Packit Service 6754ca
    double sy = double (iMax - iMin) / h;
Packit Service 6754ca
    double tx = 1.f / xSamples;
Packit Service 6754ca
    double ty = 1.f / ySamples;
Packit Service 6754ca
    float  t  = tx * ty;
Packit Service 6754ca
Packit Service 6754ca
    for (int y = yMin; y < yMax; ++y)
Packit Service 6754ca
    {
Packit Service 6754ca
        for (int x = xMin; x < xMax; ++x)
Packit Service 6754ca
        {
Packit Service 6754ca
            P &p = px[y - yMin][x - xMin];
Packit Service 6754ca
Packit Service 6754ca
	    clear (p);
Packit Service 6754ca
Packit Service 6754ca
	    for (int i = 0; i < xSamples; ++i)
Packit Service 6754ca
            {
Packit Service 6754ca
		for (int j = 0; j < ySamples; ++j)
Packit Service 6754ca
                {
Packit Service 6754ca
                    const double a = rMin + sx * (x + i * tx);
Packit Service 6754ca
		    const double b = iMin + sy * (y + j * ty);
Packit Service 6754ca
		    const double sMax = 100;
Packit Service 6754ca
		    const int kMax = 256;
Packit Service 6754ca
                    double r = rSeed;
Packit Service 6754ca
		    double i = iSeed;
Packit Service 6754ca
		    double s = 0;
Packit Service 6754ca
                    int k = 0;
Packit Service 6754ca
Packit Service 6754ca
                    while (k < kMax && s < sMax)
Packit Service 6754ca
                    {
Packit Service 6754ca
                        s = r * r - i * i;
Packit Service 6754ca
                        i = 2 * r * i + b;
Packit Service 6754ca
                        r = s + a;
Packit Service 6754ca
                        k++;
Packit Service 6754ca
                    }
Packit Service 6754ca
Packit Service 6754ca
		    add (k / float (kMax), p);
Packit Service 6754ca
                }
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
	    scale (t, p);
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage1 (Array2D<Rgba> &px, int w, int h)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = 0; y < h; ++y)
Packit Service 6754ca
    {
Packit Service 6754ca
	for (int x = 0; x < w; ++x)
Packit Service 6754ca
	{
Packit Service 6754ca
	    Rgba &p = px[y][x];
Packit Service 6754ca
	    p.r = 0;
Packit Service 6754ca
	    p.g = 0;
Packit Service 6754ca
	    p.b = 0;
Packit Service 6754ca
	    p.a = 0;
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    int n = 5600;
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < n; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
	float t = (i * 2.0 * M_PI) / n;
Packit Service 6754ca
	float xp = sin (t * 2.0) + 0.2 * sin (t * 15.0);
Packit Service 6754ca
	float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0);
Packit Service 6754ca
	float r = float (i + 1) / float (n);
Packit Service 6754ca
	float xq = xp + 0.3 * r * sin (t * 80.0);
Packit Service 6754ca
	float yq = yp + 0.3 * r * cos (t * 80.0);
Packit Service 6754ca
	float xr = xp + 0.3 * r * sin (t * 80.0 + M_PI / 2);
Packit Service 6754ca
	float yr = yp + 0.3 * r * cos (t * 80.0 + M_PI / 2);
Packit Service 6754ca
Packit Service 6754ca
	if (i % 10 == 0)
Packit Service 6754ca
	    sp (px, w, h,
Packit Service 6754ca
		xp * w / 3 + w / 2, yp * h / 3 + h / 2,
Packit Service 6754ca
		w * 0.05 * r,
Packit Service 6754ca
		2.0, 0.8, 0.1,
Packit Service 6754ca
		0.5 * r * r);
Packit Service 6754ca
Packit Service 6754ca
	sp (px, w, h,
Packit Service 6754ca
	    xq * w / 3 + w / 2, yq * h / 3 + h / 2,
Packit Service 6754ca
	    w * 0.01 * r,
Packit Service 6754ca
	    0.7, 0.2, 2.0,
Packit Service 6754ca
	    0.5 * r * r);
Packit Service 6754ca
Packit Service 6754ca
	sp (px, w, h,
Packit Service 6754ca
	    xr * w / 3 + w / 2, yr * h / 3 + h / 2,
Packit Service 6754ca
	    w * 0.01 * r,
Packit Service 6754ca
	    0.2, 1.5, 0.1,
Packit Service 6754ca
	    0.5 * r * r);
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage2 (Array2D<half> &gpx, Array2D<float> &zpx, int w, int h)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = 0; y < h; ++y)
Packit Service 6754ca
    {
Packit Service 6754ca
	for (int x = 0; x < w; ++x)
Packit Service 6754ca
	{
Packit Service 6754ca
	    gpx[y][x] = 0;
Packit Service 6754ca
	    zpx[y][x] = FLT_MAX;
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    int n = 2000;
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < n; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
	float t = (i * 2.0 * M_PI) / n;
Packit Service 6754ca
	float xp = sin (t * 4.0) + 0.2 * sin (t * 15.0);
Packit Service 6754ca
	float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0);
Packit Service 6754ca
	float zp = sin (t * 5.0);
Packit Service 6754ca
	float rd = 0.7 + 0.3 * sin (t * 15.0);
Packit Service 6754ca
	float gn = 0.5 - 0.5 * zp + 0.2;
Packit Service 6754ca
Packit Service 6754ca
	zsp (gpx, zpx, w, h,
Packit Service 6754ca
	     xp * w / 3 + w / 2,
Packit Service 6754ca
	     yp * h / 3 + h / 2,
Packit Service 6754ca
	     zp * w + 3 * w,
Packit Service 6754ca
	     w * rd * 0.05,
Packit Service 6754ca
	     2.5 * gn * gn);
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage3 (Array2D<Rgba> &px,
Packit Service 6754ca
            int w, int h,
Packit Service 6754ca
            int xMin, int xMax,
Packit Service 6754ca
            int yMin, int yMax,
Packit Service 6754ca
            int xLevel, int yLevel)
Packit Service 6754ca
{
Packit Service 6754ca
    mndl (px,
Packit Service 6754ca
	  w, h,
Packit Service 6754ca
	  xMin, xMax,
Packit Service 6754ca
	  yMin, yMax,
Packit Service 6754ca
	  (1 << xLevel), (1 << yLevel),
Packit Service 6754ca
	  0.328, 0.369,
Packit Service 6754ca
	  0.5,
Packit Service 6754ca
	  double (1 << yLevel) / double (1 << xLevel),
Packit Service 6754ca
	  -0.713, 0.9738);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage4 (Array2D<Rgba> &px,
Packit Service 6754ca
            int w, int h,
Packit Service 6754ca
            int xMin, int xMax,
Packit Service 6754ca
            int yMin, int yMax,
Packit Service 6754ca
            int xLevel, int yLevel)
Packit Service 6754ca
{
Packit Service 6754ca
    mndl (px,
Packit Service 6754ca
	  w, h,
Packit Service 6754ca
	  xMin, xMax,
Packit Service 6754ca
	  yMin, yMax,
Packit Service 6754ca
	  (1 << xLevel), (1 << yLevel),
Packit Service 6754ca
	  0.3247, 0.33348,
Packit Service 6754ca
	  0.4346,
Packit Service 6754ca
	  double (1 << yLevel) / double (1 << xLevel),
Packit Service 6754ca
	  0.4, -0.765);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage5 (Array2D<Rgba> &px,
Packit Service 6754ca
            int w, int h,
Packit Service 6754ca
            int xMin, int xMax,
Packit Service 6754ca
            int yMin, int yMax,
Packit Service 6754ca
            int xLevel, int yLevel)
Packit Service 6754ca
{
Packit Service 6754ca
    mndl (px,
Packit Service 6754ca
	  w, h,
Packit Service 6754ca
	  xMin, xMax,
Packit Service 6754ca
	  yMin, yMax,
Packit Service 6754ca
	  (1 << xLevel), (1 << yLevel),
Packit Service 6754ca
	  0.2839, 0.2852,
Packit Service 6754ca
	  0.00961,
Packit Service 6754ca
	  double (1 << yLevel) / double (1 << xLevel),
Packit Service 6754ca
	  0.25, 0.31);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage6 (Array2D<GZ> &px, int w, int h)
Packit Service 6754ca
{
Packit Service 6754ca
    mndl (px,
Packit Service 6754ca
	  w, h,
Packit Service 6754ca
	  0, w,
Packit Service 6754ca
	  0, h,
Packit Service 6754ca
	  3, 3,
Packit Service 6754ca
	  -2.5, 1.0,
Packit Service 6754ca
	  -1.3333,
Packit Service 6754ca
	  1,
Packit Service 6754ca
	  0, 0);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
drawImage7 (Array<Rgba> &px, int w, int h, int y)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int x = 0; x < w; ++x)
Packit Service 6754ca
    {
Packit Service 6754ca
	float xc = x - w / 2;
Packit Service 6754ca
	float yc = y - h / 2;
Packit Service 6754ca
	float a = atan2 (xc, yc);
Packit Service 6754ca
	float r = sqrt (xc * xc + yc * yc);
Packit Service 6754ca
Packit Service 6754ca
	Rgba &p = px[x];
Packit Service 6754ca
	p.r = sin (3.0f * a + 0.3f * sin (0.10f * r)) * 0.5f + 0.5f;
Packit Service 6754ca
	p.g = sin (3.0f * a + 0.3f * sin (0.11f * r)) * 0.5f + 0.5f;
Packit Service 6754ca
	p.b = sin (3.0f * a + 0.3f * sin (0.12f * r)) * 0.5f + 0.5f;
Packit Service 6754ca
	p.a = 1;
Packit Service 6754ca
    }
Packit Service 6754ca
}