public void fusionWithSoftLightFullAlpha(CPLayer fusion, CPRect rc) {
		CPRect rect = new CPRect(0, 0, width, height);
		rect.clip(rc);

		for (int j = rect.top; j < rect.bottom; j++) {
			int off = rect.left + j * width;
			for (int i = rect.left; i < rect.right; i++, off++) {
				int color1 = data[off];
				int alpha1 = (color1 >>> 24) * alpha / 100;

				if (alpha1 == 0) {
					continue;
				}

				int color2 = fusion.data[off];
				int alpha2 = (color2 >>> 24) * fusion.alpha / 100;

				int newAlpha = alpha1 + alpha2 - alpha1 * alpha2 / 255;
				if (newAlpha > 0) {
					int alpha12 = alpha1 * alpha2 / 255;
					int alpha1n2 = alpha1 * (alpha2 ^ 0xff) / 255;
					int alphan12 = (alpha1 ^ 0xff) * alpha2 / 255;

					int color = newAlpha << 24;
					int c1, c2;

					c1 = (color1 >>> 16 & 0xff);
					c2 = (color2 >>> 16 & 0xff);
					color |= (alpha1n2 * c1 + alphan12 * c2 + ((c1 <= 127) ? (alpha12 * ((2 * c1 - 255)
							* softLightLUTSquare[c2] / 255 + c2)) : (alpha12 * ((2 * c1 - 255)
							* softLightLUTSquareRoot[c2] / 255 + c2))))
							/ newAlpha << 16;

					c1 = (color1 >>> 8 & 0xff);
					c2 = (color2 >>> 8 & 0xff);
					color |= (alpha1n2 * c1 + alphan12 * c2 + ((c1 <= 127) ? (alpha12 * ((2 * c1 - 255)
							* softLightLUTSquare[c2] / 255 + c2)) : (alpha12 * ((2 * c1 - 255)
							* softLightLUTSquareRoot[c2] / 255 + c2))))
							/ newAlpha << 8;

					c1 = color1 & 0xff;
					c2 = color2 & 0xff;
					color |= (alpha1n2 * c1 + alphan12 * c2 + ((c1 <= 127) ? (alpha12 * ((2 * c1 - 255)
							* softLightLUTSquare[c2] / 255 + c2)) : (alpha12 * ((2 * c1 - 255)
							* softLightLUTSquareRoot[c2] / 255 + c2))))
							/ newAlpha;

					fusion.data[off] = color;
				}
			}
		}
		fusion.alpha = 100;
	}