docs: public static int colorSpline(int x, int numKnots, int[] xknots, int[] yknots) {
  		int span;
  		int numSpans = numKnots - 3;
  		float k0, k1, k2, k3;
  		float c0, c1, c2, c3;
  		
  		if (numSpans < 1)
  			throw new IllegalArgumentException("Too few knots in spline");
  		
  		for (span = 0; span < numSpans; span++)
  			if (xknots[span+1] > x)
  				break;
  		if (span > numKnots-3)
  			span = numKnots-3;
  		float t = (float)(x-xknots[span]) / (xknots[span+1]-xknots[span]);
  		span--;
  		if (span < 0) {
  			span = 0;
  			t = 0;
  		}
  
  		int v = 0;
  		for (int i = 0; i < 4; i++) {
  			int shift = i * 8;
  			
  			k0 = (yknots[span] >> shift) & 0xff;
  			k1 = (yknots[span+1] >> shift) & 0xff;
  			k2 = (yknots[span+2] >> shift) & 0xff;
  			k3 = (yknots[span+3] >> shift) & 0xff;
  			
  			c3 = m00*k0 + m01*k1 + m02*k2 + m03*k3;
  			c2 = m10*k0 + m11*k1 + m12*k2 + m13*k3;
  			c1 = m20*k0 + m21*k1 + m22*k2 + m23*k3;
  			c0 = m30*k0 + m31*k1 + m32*k2 + m33*k3;
  			int n = (int)(((c3*t + c2)*t + c1)*t + c0);
  			if (n < 0)
  				n = 0;
  			else if (n > 255)
  				n = 255;
  			v |= n << shift;
  		}
  		
  		return v;
  	}