+static void premultiplyf32(const uint8_t *mmsrc, const uint8_t *aasrc,
+ uint8_t *ddst,
+ ptrdiff_t mlinesize, ptrdiff_t alinesize,
+ ptrdiff_t dlinesize,
+ int w, int h,
+ int half, int shift, int offset)
+{
+ const float *msrc = (const float *)mmsrc;
+ const float *asrc = (const float *)aasrc;
+ float *dst = (float *)ddst;
+ int x, y;
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x++) {
+ dst[x] = msrc[x] * asrc[x];
+ }
+
+ dst += dlinesize / 4;
+ msrc += mlinesize / 4;
+ asrc += alinesize / 4;
+ }
+}
+
+static void premultiplyf32offset(const uint8_t *mmsrc, const uint8_t *aasrc,
+ uint8_t *ddst,
+ ptrdiff_t mlinesize, ptrdiff_t alinesize,
+ ptrdiff_t dlinesize,
+ int w, int h,
+ int half, int shift, int offset)
+{
+ const float *msrc = (const float *)mmsrc;
+ const float *asrc = (const float *)aasrc;
+ float *dst = (float *)ddst;
+ int x, y;
+
+ float offsetf = offset / 65535.0f;
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x++) {
+ dst[x] = ((msrc[x] - offsetf) * asrc[x]) + offsetf;
+ }
+
+ dst += dlinesize / 4;
+ msrc += mlinesize / 4;
+ asrc += alinesize / 4;
+ }
+}
+