#define Det(a, b, c, d)      ((a)*(d) - (b)*(c))

int square_to_quad(float quad[4][2], float sq[3][3])
{
   register float  px, py, dx1, dx2, dy1, dy2;

   dx1 = quad[1][0] - quad[2][0];
   dx2 = quad[3][0] - quad[2][0];
   dy1 = quad[1][1] - quad[2][1];
   dy2 = quad[3][1] - quad[2][1];

   det = Det(dx1, dx2, dy1, dy2);
   if (det == 0) return 0;                  /* bad mapping */

   px = quad[0][0] - quad[1][0] + quad[2][0] - quad[3][0];
   py = quad[0][1] - quad[1][1] + quad[2][1] - quad[3][1];

   sq[0][2] = Det(px, dx2, py, dy2)/det;
   sq[1][2] = Det(dx1, px, dy1, py)/det;
   sq[2][2] = 1.;
   sq[0][0] = quad[1][0] - quad[0][0] + sq[0][2]*quad[1][0];
   sq[1][0] = quad[3][0] - quad[0][0] + sq[1][2]*quad[3][0];
   sq[2][0] = quad[0][0];
   sq[0][1] = quad[1][1] - quad[0][1] + sq[0][2]*quad[1][1];
   sq[1][1] = quad[3][1] - quad[0][1] + sq[1][2]*quad[3][1];
   sq[2][1] = quad[0][1];

   return 1;                               /* mapping successful */
}