diff --git a/common/rfb/TransImageGetter.cxx b/common/rfb/TransImageGetter.cxx
index f5435f7..e2939c7 100644
--- a/common/rfb/TransImageGetter.cxx
+++ b/common/rfb/TransImageGetter.cxx
@@ -15,6 +15,7 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  * USA.
  */
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -30,248 +31,49 @@
 
 using namespace rfb;
 
-static void noTransFn(void* table_,
-                      const PixelFormat& inPF, void* inPtr, int inStride,
-                      const PixelFormat& outPF, void* outPtr, int outStride,
-                      int width, int height)
-{
-  rdr::U8* ip = (rdr::U8*)inPtr;
-  rdr::U8* op = (rdr::U8*)outPtr;
-  int inStrideBytes = inStride * (inPF.bpp/8);
-  int outStrideBytes = outStride * (outPF.bpp/8);
-  int widthBytes = width * (outPF.bpp/8);
-
-  while (height > 0) {
-    memcpy(op, ip, widthBytes);
-    ip += inStrideBytes;
-    op += outStrideBytes;
-    height--;
-  }
-}
-
-#define BPPOUT 8
-#include "transInitTempl.h"
-#define BPPIN 8
-#include "transTempl.h"
-#undef BPPIN
-#define BPPIN 16
-#include "transTempl.h"
-#undef BPPIN
-#define BPPIN 32
-#include "transTempl.h"
-#undef BPPIN
-#undef BPPOUT
-
-#define BPPOUT 16
-#include "transInitTempl.h"
-#define BPPIN 8
-#include "transTempl.h"
-#undef BPPIN
-#define BPPIN 16
-#include "transTempl.h"
-#undef BPPIN
-#define BPPIN 32
-#include "transTempl.h"
-#undef BPPIN
-#undef BPPOUT
-
-#define BPPOUT 32
-#include "transInitTempl.h"
-#define BPPIN 8
-#include "transTempl.h"
-#undef BPPIN
-#define BPPIN 16
-#include "transTempl.h"
-#undef BPPIN
-#define BPPIN 32
-#include "transTempl.h"
-#undef BPPIN
-#undef BPPOUT
-
-
-// Translation functions.  Note that transSimple* is only used for 8/16bpp and
-// transRGB* is used for 16/32bpp
-
-static transFnType transSimpleFns[][3] = {
-  { transSimple8to8,  transSimple8to16,  transSimple8to32 },
-  { transSimple16to8, transSimple16to16, transSimple16to32 },
-};
-static transFnType transRGBFns[][3] = {
-  { transRGB16to8, transRGB16to16, transRGB16to32 },
-  { transRGB32to8, transRGB32to16, transRGB32to32 }
-};
-static transFnType transRGBCubeFns[][3] = {
-  { transRGBCube16to8, transRGBCube16to16, transRGBCube16to32 },
-  { transRGBCube32to8, transRGBCube32to16, transRGBCube32to32 }
-};
-
-// Table initialisation functions.
-
-typedef void (*initCMtoTCFnType)(rdr::U8** tablep, const PixelFormat& inPF,
-                                 ColourMap* cm, const PixelFormat& outPF);
-typedef void (*initTCtoTCFnType)(rdr::U8** tablep, const PixelFormat& inPF,
-                                 const PixelFormat& outPF);
-typedef void (*initCMtoCubeFnType)(rdr::U8** tablep, const PixelFormat& inPF,
-                                   ColourMap* cm, ColourCube* cube);
-typedef void (*initTCtoCubeFnType)(rdr::U8** tablep, const PixelFormat& inPF,
-                                   ColourCube* cube);
-
-
-static initCMtoTCFnType initSimpleCMtoTCFns[] = {
-    initSimpleCMtoTC8, initSimpleCMtoTC16, initSimpleCMtoTC32
-};
-
-static initTCtoTCFnType initSimpleTCtoTCFns[] = {
-    initSimpleTCtoTC8, initSimpleTCtoTC16, initSimpleTCtoTC32
-};
-
-static initCMtoCubeFnType initSimpleCMtoCubeFns[] = {
-    initSimpleCMtoCube8, initSimpleCMtoCube16, initSimpleCMtoCube32
-};
-
-static initTCtoCubeFnType initSimpleTCtoCubeFns[] = {
-    initSimpleTCtoCube8, initSimpleTCtoCube16, initSimpleTCtoCube32
-};
-
-static initTCtoTCFnType initRGBTCtoTCFns[] = {
-    initRGBTCtoTC8, initRGBTCtoTC16, initRGBTCtoTC32
-};
-
-static initTCtoCubeFnType initRGBTCtoCubeFns[] = {
-    initRGBTCtoCube8, initRGBTCtoCube16, initRGBTCtoCube32
-};
-
-
 TransImageGetter::TransImageGetter(bool econ)
-  : economic(econ), pb(0), table(0), transFn(0), cube(0)
+  : PixelTransformer(econ), pb(0)
 {
 }
 
 TransImageGetter::~TransImageGetter()
 {
-  delete [] table;
 }
 
 void TransImageGetter::init(PixelBuffer* pb_, const PixelFormat& out,
-                            SMsgWriter* writer, ColourCube* cube_)
+                            SMsgWriter* writer_, ColourCube* cube_)
 {
   pb = pb_;
-  outPF = out;
-  transFn = 0;
-  cube = cube_;
-  const PixelFormat& inPF = pb->getPF();
+  writer = writer_;
 
-  if ((inPF.bpp != 8) && (inPF.bpp != 16) && (inPF.bpp != 32))
-    throw Exception("TransImageGetter: bpp in not 8, 16 or 32");
-
-  if ((outPF.bpp != 8) && (outPF.bpp != 16) && (outPF.bpp != 32))
-    throw Exception("TransImageGetter: bpp out not 8, 16 or 32");
-
-  if (!outPF.trueColour) {
-    if (outPF.bpp != 8)
-      throw Exception("TransImageGetter: outPF has color map but not 8bpp");
-
-    if (!inPF.trueColour) {
-      if (inPF.bpp != 8)
-        throw Exception("TransImageGetter: inPF has colorMap but not 8bpp");
-
-      // CM to CM/Cube
-
-      if (cube) {
-        transFn = transSimpleFns[inPF.bpp/16][outPF.bpp/16];
-        (*initSimpleCMtoCubeFns[outPF.bpp/16]) (&table, inPF,
-                                                pb->getColourMap(), cube);
-      } else {
-        transFn = noTransFn;
-        setColourMapEntries(0, 256, writer);
-      }
-      return;
-    }
-
-    // TC to CM/Cube
-
-    ColourCube defaultCube(6,6,6);
-    if (!cube) cube = &defaultCube;
-
-    if ((inPF.bpp > 16) || (economic && (inPF.bpp == 16))) {
-      transFn = transRGBCubeFns[inPF.bpp/32][outPF.bpp/16];
-      (*initRGBTCtoCubeFns[outPF.bpp/16]) (&table, inPF, cube);
-    } else {
-      transFn = transSimpleFns[inPF.bpp/16][outPF.bpp/16];
-      (*initSimpleTCtoCubeFns[outPF.bpp/16]) (&table, inPF, cube);
-    }
-
-    if (cube != &defaultCube)
-      return;
-
-    if (writer) writer->writeSetColourMapEntries(0, 216, cube);
-    cube = 0;
-    return;
-  }
-
-  if (inPF.equal(outPF)) {
-    transFn = noTransFn;
-    return;
-  }
-
-  if (!inPF.trueColour) {
-
-    // CM to TC
-
-    if (inPF.bpp != 8)
-      throw Exception("TransImageGetter: inPF has colorMap but not 8bpp");
-    transFn = transSimpleFns[inPF.bpp/16][outPF.bpp/16];
-    (*initSimpleCMtoTCFns[outPF.bpp/16]) (&table, inPF, pb->getColourMap(),
-                                          outPF);
-    return;
-  }
-
-  // TC to TC
-
-  if ((inPF.bpp > 16) || (economic && (inPF.bpp == 16))) {
-    transFn = transRGBFns[inPF.bpp/32][outPF.bpp/16];
-    (*initRGBTCtoTCFns[outPF.bpp/16]) (&table, inPF, outPF);
-  } else {
-    transFn = transSimpleFns[inPF.bpp/16][outPF.bpp/16];
-    (*initSimpleTCtoTCFns[outPF.bpp/16]) (&table, inPF, outPF);
-  }
+  PixelTransformer::init(pb->getPF(), pb->getColourMap(), out, cube_,
+                         cmCallback, this);
 }
 
-void TransImageGetter::setColourMapEntries(int firstCol, int nCols,
-                                           SMsgWriter* writer)
+void TransImageGetter::setColourMapEntries(int firstCol, int nCols)
 {
-  if (nCols == 0)
-    nCols = (1 << pb->getPF().depth) - firstCol;
-  if (pb->getPF().trueColour) return; // shouldn't be called in this case
-
-  if (outPF.trueColour) {
-    (*initSimpleCMtoTCFns[outPF.bpp/16]) (&table, pb->getPF(),
-                                          pb->getColourMap(), outPF);
-  } else if (cube) {
-    (*initSimpleCMtoCubeFns[outPF.bpp/16]) (&table, pb->getPF(),
-                                            pb->getColourMap(), cube);
-  } else if (writer && pb->getColourMap()) {
-    writer->writeSetColourMapEntries(firstCol, nCols, pb->getColourMap());
-  }
+  PixelTransformer::setColourMapEntries(firstCol, nCols);
 }
 
 void TransImageGetter::getImage(void* outPtr, const Rect& r, int outStride)
 {
-  if (!transFn)
-    throw Exception("TransImageGetter: not initialised yet");
-
   int inStride;
   const rdr::U8* inPtr = pb->getPixelsR(r.translate(offset.negate()), &inStride);
 
   if (!outStride) outStride = r.width();
 
-  (*transFn)(table, pb->getPF(), (void*)inPtr, inStride,
-             outPF, outPtr, outStride, r.width(), r.height());
+  translateRect((void*)inPtr, inStride, r, outPtr, outStride, r.tl);
 }
 
-void TransImageGetter::translatePixels(void* inPtr, void* outPtr,
-                                       int nPixels) const
+void TransImageGetter::cmCallback(int firstColour, int nColours,
+                                  ColourMap* cm, void* data)
 {
-  (*transFn)(table, pb->getPF(), inPtr, nPixels,
-             outPF, outPtr, nPixels, nPixels, 1);
+  TransImageGetter *self;
+
+  assert(data);
+  self = (TransImageGetter*)data;
+
+  if (self->writer)
+    self->writer->writeSetColourMapEntries(firstColour, nColours, cm);
 }
+
