diff --git a/fractal.c b/fractal.c
index 8f41a69..3cbaca5 100644
--- a/fractal.c
+++ b/fractal.c
@@ -1,7 +1,8 @@
 
-#include <helianthus.h>
 #include <math.h>
 
+#include <helianthus.h>
+
 
 Animation anim = 0;
 unsigned char pixels[512][512][4];
@@ -12,42 +13,11 @@ double cx = -2;
 double cy = -2;
 
 
-void hsvToRgb(double h, double s, double v, unsigned char *pixel) {
-  h -= floor(h/360)*360;
-  s /= 100;
-  v = v/100*255;
-  s = s > 0 ? (s < 1 ? s : 1) : 0;
-  v = v > 0 ? (v < 255 ? v : 255) : 0;
-
-  h /= 60.0;
-  int i = (int)h;
-  double f = h - i;
-  int pp = v*(1 - s);
-  int qq = v*(1 - s*f);
-  int tt = v*(1 - s*(1 - f));
-
-  unsigned char p = (unsigned char)(pp > 0 ? (pp < 255 ? pp : 255) : 0);
-  unsigned char q = (unsigned char)(qq > 0 ? (qq < 255 ? qq : 255) : 0);
-  unsigned char t = (unsigned char)(tt > 0 ? (tt < 255 ? tt : 255) : 0);
-  unsigned char u = (unsigned char)v;
-
-  switch(i) {
-    case  0: pixel[0] = u, pixel[1] = t, pixel[2] = p; break;
-    case  1: pixel[0] = q, pixel[1] = u, pixel[2] = p; break;
-    case  2: pixel[0] = p, pixel[1] = u, pixel[2] = t; break;
-    case  3: pixel[0] = p, pixel[1] = q, pixel[2] = u; break;
-    case  4: pixel[0] = t, pixel[1] = p, pixel[2] = u; break;
-    default: pixel[0] = u, pixel[1] = p, pixel[2] = q; break;
-  }
-  pixel[3] = 255;
-}
-
-
 void setColor(double x, unsigned char *pixel) {
   double h0 = 240;
   double h1 = 0;
   double h = h0 + (h1 - h0)*x;
-  hsvToRgb(h, 100, 100, pixel);
+  pixelSet(pixel, colorByHSV(h, 1, 1));
 }
 
 
@@ -66,18 +36,17 @@ void julia(double r, double i) {
       setColor(b/64.0, pixels[y][x]);
     }
   }
-
 }
 
 
 void fractal() {
-  if (anim) animationDestroy(anim);
   julia(r, i);
-  anim = createAnimationFromImageEx(512, 512, pixels, FALSE, FALSE, FALSE, FALSE);
+  imageToExistingGLTexture(animationGetGLTexId(anim), 512, 512, pixels);
 }
 
 
 void init() {
+  anim = createAnimationFromImageEx(512, 512, pixels, FALSE, FALSE, FALSE, FALSE);
   fractal();
 }