145
161
nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
149
for (r = 0; r < h; r++) {
150
unsigned char *d, *s;
151
d = (unsigned char *) px;
152
s = (unsigned char *) spx;
153
for (c = 0; c < w; c++) {
155
a = NR_PREMUL (s[3], alpha);
157
/* Transparent FG, NOP */
158
} else if ((a == 255) || (d[3] == 0)) {
159
/* Full coverage, COPY */
166
/* Full composition */
167
ca = 65025 - (255 - a) * (255 - d[3]);
168
d[0] = NR_COMPOSENNN_A7 (s[0], a, d[0], d[3], ca);
169
d[1] = NR_COMPOSENNN_A7 (s[1], a, d[1], d[3], ca);
170
d[2] = NR_COMPOSENNN_A7 (s[2], a, d[2], d[3], ca);
171
d[3] = (ca + 127) / 255;
167
} else if (alpha == 255) {
168
for (r = h; r > 0; r--) {
169
unsigned char *d = px;
170
const unsigned char *s = spx;
171
for (c = w; c > 0; c--) {
173
/* Transparent FG, NOP */
174
} else if ((s[3] == 255) || (d[3] == 0)) {
175
/* Full coverage, COPY */
178
/* Full composition */
180
ca = NR_COMPOSEA_112(s[3], d[3]);
181
d[0] = NR_COMPOSENNN_111121(s[0], s[3], d[0], d[3], ca);
182
d[1] = NR_COMPOSENNN_111121(s[1], s[3], d[1], d[3], ca);
183
d[2] = NR_COMPOSENNN_111121(s[2], s[3], d[2], d[3], ca);
184
d[3] = NR_NORMALIZE_21(ca);
193
for (r = h; r > 0; r--) {
194
unsigned char *d = px;
195
const unsigned char *s = spx;
196
for (c = w; c > 0; c--) {
198
a = NR_PREMUL_112(s[3], alpha);
200
/* Transparent FG, NOP */
201
} else if ((a == 255*255) || (d[3] == 0)) {
202
/* Full coverage, COPY */
206
d[3] = NR_NORMALIZE_21(a);
208
/* Full composition */
210
ca = NR_COMPOSEA_213(a, d[3]);
211
d[0] = NR_COMPOSENNN_121131(s[0], a, d[0], d[3], ca);
212
d[1] = NR_COMPOSENNN_121131(s[1], a, d[1], d[3], ca);
213
d[2] = NR_COMPOSENNN_121131(s[2], a, d[2], d[3], ca);
214
d[3] = NR_NORMALIZE_31(ca);
182
226
nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
186
for (r = 0; r < h; r++) {
187
unsigned char *d, *s;
188
d = (unsigned char *) px;
189
s = (unsigned char *) spx;
190
for (c = 0; c < w; c++) {
192
a = NR_PREMUL (s[3], alpha);
194
/* Transparent FG, NOP */
195
} else if ((a == 255) || (d[3] == 0)) {
196
/* Full coverage, demul src */
197
d[0] = (s[0] * 255 + (s[3] >> 1)) / s[3];
198
d[1] = (s[1] * 255 + (s[3] >> 1)) / s[3];
199
d[2] = (s[2] * 255 + (s[3] >> 1)) / s[3];
232
} else if (alpha == 255) {
233
for (r = h; r > 0; r--) {
234
unsigned char *d = px;
235
const unsigned char *s = spx;
236
for (c = w; c > 0; c--) {
238
/* Transparent FG, NOP */
239
} else if (s[3] == 255) {
240
/* Full coverage, demul src */
241
// dc' = ((1 - sa) * da*dc + sc)/da' = sc/da' = sc
242
// da' = 1 - (1 - sa) * (1 - da) = 1 - 0 * (1 - da) = 1
244
} else if (d[3] == 0) {
245
/* Full coverage, demul src */
246
// dc' = ((1 - sa) * da*dc + sc)/da' = sc/da' = sc/sa = sc/sa
247
// da' = 1 - (1 - sa) * (1 - da) = 1 - (1 - sa) = sa
248
d[0] = NR_DEMUL_111(s[0], s[3]);
249
d[1] = NR_DEMUL_111(s[1], s[3]);
250
d[2] = NR_DEMUL_111(s[2], s[3]);
204
253
/* Full composition */
205
ca = 65025 - (255 - s[3]) * (255 - d[3]);
206
d[0] = NR_COMPOSEPNN_A7 (s[0], s[3], d[0], d[3], ca);
207
d[1] = NR_COMPOSEPNN_A7 (s[1], s[3], d[1], d[3], ca);
208
d[2] = NR_COMPOSEPNN_A7 (s[2], s[3], d[2], d[3], ca);
209
d[3] = (65025 - (255 - s[3]) * (255 - d[3]) + 127) / 255;
254
// dc' = ((1 - sa) * da*dc + sc)/da' = ((1 - sa) * da*dc + sc)/da'
255
// da' = 1 - (1 - sa) * (1 - da) = 1 - (1 - sa) * (1 - da)
256
unsigned int da = NR_COMPOSEA_112(s[3], d[3]);
257
d[0] = NR_COMPOSEPNN_111121(s[0], s[3], d[0], d[3], da);
258
d[1] = NR_COMPOSEPNN_111121(s[1], s[3], d[1], d[3], da);
259
d[2] = NR_COMPOSEPNN_111121(s[2], s[3], d[2], d[3], da);
260
d[3] = NR_NORMALIZE_21(da);
269
for (r = h; r > 0; r--) {
270
unsigned char *d = px;
271
const unsigned char *s = spx;
272
for (c = w; c > 0; c--) {
274
a = NR_PREMUL_112(s[3], alpha);
276
/* Transparent FG, NOP */
277
} else if (d[3] == 0) {
278
/* Full coverage, demul src */
279
// dc' = ((1 - alpha*sa) * da*dc + alpha*sc)/da' = alpha*sc/da' = alpha*sc/(alpha*sa) = sc/sa
280
// da' = 1 - (1 - alpha*sa) * (1 - da) = 1 - (1 - alpha*sa) = alpha*sa
281
d[0] = NR_DEMUL_111(s[0], s[3]);
282
d[1] = NR_DEMUL_111(s[1], s[3]);
283
d[2] = NR_DEMUL_111(s[2], s[3]);
284
d[3] = NR_NORMALIZE_21(a);
211
// calculate premultiplied from two premultiplieds:
212
d[0] = NR_COMPOSEPPP(NR_PREMUL (s[0], alpha), a, NR_PREMUL (d[0], d[3]), 0); // last parameter not used
213
d[1] = NR_COMPOSEPPP(NR_PREMUL (s[1], alpha), a, NR_PREMUL (d[1], d[3]), 0);
214
d[2] = NR_COMPOSEPPP(NR_PREMUL (s[2], alpha), a, NR_PREMUL (d[2], d[3]), 0);
216
d[3] = (65025 - (255 - a) * (255 - d[3]) + 127) / 255;
217
// un-premultiply channels:
218
d[0] = d[0]*255/d[3];
219
d[1] = d[1]*255/d[3];
220
d[2] = d[2]*255/d[3];
286
// dc' = ((1 - alpha*sa) * da*dc + alpha*sc)/da'
287
// da' = 1 - (1 - alpha*sa) * (1 - da)
288
unsigned int da = NR_COMPOSEA_213(a, d[3]);
289
d[0] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[0], alpha), a, d[0], d[3], da);
290
d[1] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[1], alpha), a, d[1], d[3], da);
291
d[2] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[2], alpha), a, d[2], d[3], da);
292
d[3] = NR_NORMALIZE_31(da);
232
304
nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
236
for (r = 0; r < h; r++) {
237
unsigned char *d, *s;
238
d = (unsigned char *) px;
239
s = (unsigned char *) spx;
240
for (c = 0; c < w; c++) {
242
a = NR_PREMUL (s[3], alpha);
244
/* Transparent FG, NOP */
245
} else if ((a == 255) || (d[3] == 0)) {
246
/* Transparent BG, premul src */
247
d[0] = NR_PREMUL (s[0], a);
248
d[1] = NR_PREMUL (s[1], a);
249
d[2] = NR_PREMUL (s[2], a);
252
d[0] = NR_COMPOSENPP (s[0], a, d[0], d[3]);
253
d[1] = NR_COMPOSENPP (s[1], a, d[1], d[3]);
254
d[2] = NR_COMPOSENPP (s[2], a, d[2], d[3]);
255
d[3] = (65025 - (255 - a) * (255 - d[3]) + 127) / 255;
310
} else if (alpha == 255) {
311
for (r = h; r > 0; r--) {
312
unsigned char *d = px;
313
const unsigned char *s = spx;
314
for (c = w; c > 0; c--) {
316
/* Transparent FG, NOP */
317
} else if (s[3] == 255) {
318
/* Opaque FG, COPY */
319
// dc' = (1 - sa) * dc + sa*sc = sa*sc = sc
320
// da' = 1 - (1 - sa) * (1 - da) = 1 - 0 * (1 - da) = 1 (= sa)
322
} else if (d[3] == 0) {
323
/* Transparent BG, premul src */
324
// dc' = (1 - sa) * dc + sa*sc = sa*sc
325
// da' = 1 - (1 - sa) * (1 - da) = 1 - (1 - sa) = sa
326
d[0] = NR_PREMUL_111(s[0], s[3]);
327
d[1] = NR_PREMUL_111(s[1], s[3]);
328
d[2] = NR_PREMUL_111(s[2], s[3]);
331
// dc' = (1 - sa) * dc + sa*sc
332
// da' = 1 - (1 - sa) * (1 - da)
333
d[0] = NR_COMPOSENPP_1111(s[0], s[3], d[0]);
334
d[1] = NR_COMPOSENPP_1111(s[1], s[3], d[1]);
335
d[2] = NR_COMPOSENPP_1111(s[2], s[3], d[2]);
336
d[3] = NR_COMPOSEA_111(s[3], d[3]);
345
for (r = h; r > 0; r--) {
346
unsigned char *d = px;
347
const unsigned char *s = spx;
348
for (c = w; c > 0; c--) {
350
a = NR_PREMUL_112 (s[3], alpha);
352
/* Transparent FG, NOP */
353
} else if (d[3] == 0) {
354
/* Transparent BG, premul src */
355
// dc' = (1 - alpha*sa) * dc + alpha*sa*sc = alpha*sa*sc
356
// da' = 1 - (1 - alpha*sa) * (1 - da) = 1 - (1 - alpha*sa) = alpha*sa
357
d[0] = NR_PREMUL_121(s[0], a);
358
d[1] = NR_PREMUL_121(s[1], a);
359
d[2] = NR_PREMUL_121(s[2], a);
360
d[3] = NR_NORMALIZE_21(a);
362
// dc' = (1 - alpha*sa) * dc + alpha*sa*sc
363
// da' = 1 - (1 - alpha*sa) * (1 - da)
364
d[0] = NR_COMPOSENPP_1211(s[0], a, d[0]);
365
d[1] = NR_COMPOSENPP_1211(s[1], a, d[1]);
366
d[2] = NR_COMPOSENPP_1211(s[2], a, d[2]);
367
d[3] = NR_COMPOSEA_211(a, d[3]);
266
379
nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
270
for (r = 0; r < h; r++) {
271
unsigned char *d, *s;
272
d = (unsigned char *) px;
273
s = (unsigned char *) spx;
274
for (c = 0; c < w; c++) {
276
a = NR_PREMUL (s[3], alpha);
278
/* Transparent FG, NOP */
279
} else if ((a == 255) || (d[3] == 0)) {
280
/* Transparent BG, COPY */
281
d[0] = NR_PREMUL (s[0], alpha);
282
d[1] = NR_PREMUL (s[1], alpha);
283
d[2] = NR_PREMUL (s[2], alpha);
284
d[3] = NR_PREMUL (s[3], alpha);
288
d[0] = NR_COMPOSEPPP (s[0], s[3], d[0], d[3]);
289
d[1] = NR_COMPOSEPPP (s[1], s[3], d[1], d[3]);
290
d[2] = NR_COMPOSEPPP (s[2], s[3], d[2], d[3]);
291
d[3] = (65025 - (255 - s[3]) * (255 - d[3]) + 127) / 255;
294
c = NR_PREMUL (s[0], alpha);
295
d[0] = NR_COMPOSEPPP (c, a, d[0], d[3]);
296
c = NR_PREMUL (s[1], alpha);
297
d[1] = NR_COMPOSEPPP (c, a, d[1], d[3]);
298
c = NR_PREMUL (s[2], alpha);
299
d[2] = NR_COMPOSEPPP (c, a, d[2], d[3]);
300
d[3] = (65025 - (255 - a) * (255 - d[3]) + 127) / 255;
384
/* Transparent FG, NOP */
385
} else if (alpha == 255) {
387
for (r = h; r > 0; r--) {
388
unsigned char *d = px;
389
const unsigned char *s = spx;
390
for (c = w; c > 0; c--) {
392
/* Transparent FG, NOP */
393
} else if ((s[3] == 255) || (d[3] == 0)) {
394
/* Transparent BG, COPY */
397
d[0] = NR_COMPOSEPPP_1111(s[0], s[3], d[0]);
398
d[1] = NR_COMPOSEPPP_1111(s[1], s[3], d[1]);
399
d[2] = NR_COMPOSEPPP_1111(s[2], s[3], d[2]);
400
d[3] = NR_COMPOSEA_111(s[3], d[3]);
409
for (r = h; r > 0; r--) {
410
unsigned char *d = px;
411
const unsigned char *s = spx;
412
for (c = w; c > 0; c--) {
414
/* Transparent FG, NOP */
415
} else if (d[3] == 0) {
416
/* Transparent BG, COPY */
417
d[0] = NR_PREMUL_111(s[0], alpha);
418
d[1] = NR_PREMUL_111(s[1], alpha);
419
d[2] = NR_PREMUL_111(s[2], alpha);
420
d[3] = NR_PREMUL_111(s[3], alpha);
422
// dc' = (1 - alpha*sa) * dc + alpha*sc
423
// da' = 1 - (1 - alpha*sa) * (1 - da)
425
a = NR_PREMUL_112(s[3], alpha);
426
d[0] = NR_COMPOSEPPP_2211(NR_PREMUL_112(alpha, s[0]), a, d[0]);
427
d[1] = NR_COMPOSEPPP_2211(NR_PREMUL_112(alpha, s[1]), a, d[1]);
428
d[2] = NR_COMPOSEPPP_2211(NR_PREMUL_112(alpha, s[2]), a, d[2]);
429
d[3] = NR_COMPOSEA_211(a, d[3]);
469
596
nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
473
for (r = 0; r < h; r++) {
474
unsigned char *d, *s, *m;
475
d = (unsigned char *) px;
476
s = (unsigned char *) spx;
477
m = (unsigned char *) mpx;
478
for (c = 0; c < w; c++) {
600
for (r = h; r > 0; r--) {
601
unsigned char *d = px;
602
const unsigned char *s = spx;
603
const unsigned char *m = mpx;
604
for (c = w; c > 0; c--) {
480
a = NR_PREMUL (s[3], m[0]);
606
a = NR_PREMUL_112(s[3], m[0]);
482
608
/* Transparent FG, NOP */
483
} else if ((a == 255) || (d[3] == 0)) {
609
} else if (a == 255*255) {
610
/* Opaque FG, COPY */
612
} else if (d[3] == 0) {
484
613
/* Full coverage, demul src */
485
d[0] = (s[0] * 255 + (s[3] >> 1)) / s[3];
486
d[1] = (s[1] * 255 + (s[3] >> 1)) / s[3];
487
d[2] = (s[2] * 255 + (s[3] >> 1)) / s[3];
614
// dc' = ((1 - m*sa) * da*dc + m*sc)/da' = m*sc/da' = m*sc/(m*sa) = sc/sa
615
// da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - m*sa) = m*sa
616
d[0] = NR_DEMUL_111(s[0], s[3]);
617
d[1] = NR_DEMUL_111(s[1], s[3]);
618
d[2] = NR_DEMUL_111(s[2], s[3]);
619
d[3] = NR_NORMALIZE_21(a);
620
} else if (m[0] == 255) {
621
/* Full composition */
622
// dc' = ((1 - m*sa) * da*dc + m*sc)/da' = ((1 - sa) * da*dc + sc)/da'
623
// da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - sa) * (1 - da)
624
unsigned int da = NR_COMPOSEA_112(s[3], d[3]);
625
d[0] = NR_COMPOSEPNN_111121(s[0], s[3], d[0], d[3], da);
626
d[1] = NR_COMPOSEPNN_111121(s[1], s[3], d[1], d[3], da);
627
d[2] = NR_COMPOSEPNN_111121(s[2], s[3], d[2], d[3], da);
628
d[3] = NR_NORMALIZE_21(da);
492
/* Full composition */
493
ca = 65025 - (255 - s[3]) * (255 - d[3]);
494
d[0] = NR_COMPOSEPNN_A7 (s[0], s[3], d[0], d[3], ca);
495
d[1] = NR_COMPOSEPNN_A7 (s[1], s[3], d[1], d[3], ca);
496
d[2] = NR_COMPOSEPNN_A7 (s[2], s[3], d[2], d[3], ca);
497
d[3] = (65025 - (255 - s[3]) * (255 - d[3]) + 127) / 255;
499
// calculate premultiplied from two premultiplieds:
500
d[0] = NR_COMPOSEPPP(NR_PREMUL (s[0], m[0]), a, NR_PREMUL (d[0], d[3]), 0); // last parameter not used
501
d[1] = NR_COMPOSEPPP(NR_PREMUL (s[1], m[0]), a, NR_PREMUL (d[1], d[3]), 0);
502
d[2] = NR_COMPOSEPPP(NR_PREMUL (s[2], m[0]), a, NR_PREMUL (d[2], d[3]), 0);
504
d[3] = (65025 - (255 - a) * (255 - d[3]) + 127) / 255;
505
// un-premultiply channels:
506
d[0] = d[0]*255/d[3];
507
d[1] = d[1]*255/d[3];
508
d[2] = d[2]*255/d[3];
630
// dc' = ((1 - m*sa) * da*dc + m*sc)/da'
631
// da' = 1 - (1 - m*sa) * (1 - da)
632
unsigned int da = NR_COMPOSEA_213(a, d[3]);
633
d[0] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[0], m[0]), a, d[0], d[3], da);
634
d[1] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[1], m[0]), a, d[1], d[3], da);
635
d[2] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[2], m[0]), a, d[2], d[3], da);
636
d[3] = NR_NORMALIZE_31(da);
559
681
nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
563
for (r = 0; r < h; r++) {
564
unsigned char *d, *s, *m;
565
d = (unsigned char *) px;
566
s = (unsigned char *) spx;
567
m = (unsigned char *) mpx;
568
for (c = 0; c < w; c++) {
685
for (r = h; r > 0; r--) {
686
unsigned char *d = px;
687
const unsigned char *s = spx;
688
const unsigned char *m = mpx;
689
for (c = w; c > 0; c--) {
570
a = NR_PREMUL (s[3], m[0]);
691
a = NR_PREMUL_112 (s[3], m[0]);
572
693
/* Transparent FG, NOP */
573
} else if ((a == 255) || (d[3] == 0)) {
694
} else if (a == 255*255) {
695
/* Opaque FG, COPY */
697
} else if (d[3] == 0) {
574
698
/* Transparent BG, COPY */
575
d[0] = NR_PREMUL (s[0], m[0]);
576
d[1] = NR_PREMUL (s[1], m[0]);
577
d[2] = NR_PREMUL (s[2], m[0]);
578
d[3] = NR_PREMUL (s[3], m[0]);
699
// dc' = (1 - m*sa) * dc + m*sc = m*sc
700
// da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - m*sa) = m*sa
701
d[0] = NR_PREMUL_111 (s[0], m[0]);
702
d[1] = NR_PREMUL_111 (s[1], m[0]);
703
d[2] = NR_PREMUL_111 (s[2], m[0]);
704
d[3] = NR_NORMALIZE_21(a);
582
d[0] = NR_COMPOSEPPP (s[0], s[3], d[0], d[3]);
583
d[1] = NR_COMPOSEPPP (s[1], s[3], d[1], d[3]);
584
d[2] = NR_COMPOSEPPP (s[2], s[3], d[2], d[3]);
585
d[3] = NR_A7_NORMALIZED(s[3], d[3]);
588
c = NR_PREMUL (s[0], m[0]);
589
d[0] = NR_COMPOSEPPP (c, a, d[0], d[3]);
590
c = NR_PREMUL (s[1], m[0]);
591
d[1] = NR_COMPOSEPPP (c, a, d[1], d[3]);
592
c = NR_PREMUL (s[2], m[0]);
593
d[2] = NR_COMPOSEPPP (c, a, d[2], d[3]);
594
d[3] = NR_A7_NORMALIZED(a, d[3]);
706
// dc' = (1 - m*sa) * dc + m*sc
707
// da' = 1 - (1 - m*sa) * (1 - da)
708
d[0] = NR_COMPOSEPPP_2211 (NR_PREMUL_112 (s[0], m[0]), a, d[0]);
709
d[1] = NR_COMPOSEPPP_2211 (NR_PREMUL_112 (s[1], m[0]), a, d[1]);
710
d[2] = NR_COMPOSEPPP_2211 (NR_PREMUL_112 (s[2], m[0]), a, d[2]);
711
d[3] = NR_COMPOSEA_211(a, d[3]);
608
nr_R8G8B8A8_N_EMPTY_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned long rgba)
610
unsigned int r, g, b, a;
613
r = NR_RGBA32_R (rgba);
614
g = NR_RGBA32_G (rgba);
615
b = NR_RGBA32_B (rgba);
616
a = NR_RGBA32_A (rgba);
620
for (y = 0; y < h; y++) {
621
unsigned char *d, *s;
622
d = (unsigned char *) px;
623
s = (unsigned char *) spx;
624
for (x = 0; x < w; x++) {
628
d[3] = NR_PREMUL (s[0], a);
638
nr_R8G8B8A8_P_EMPTY_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned long rgba)
640
unsigned int r, g, b, a;
643
r = NR_RGBA32_R (rgba);
644
g = NR_RGBA32_G (rgba);
645
b = NR_RGBA32_B (rgba);
646
a = NR_RGBA32_A (rgba);
653
c[0] = NR_PREMUL (r, a);
654
c[1] = NR_PREMUL (g, a);
655
c[2] = NR_PREMUL (b, a);
657
/* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
658
nr_mmx_R8G8B8A8_P_EMPTY_A8_RGBAP (px, w, h, rs, spx, srs, c);
663
for (y = 0; y < h; y++) {
664
unsigned char *d, *s;
665
d = (unsigned char *) px;
666
s = (unsigned char *) spx;
667
for (x = 0; x < w; x++) {
670
d[0] = (r * ca + 32512) / 65025;
671
d[1] = (g * ca + 32512) / 65025;
672
d[2] = (b * ca + 32512) / 65025;
673
d[3] = (ca + 127) / 255;
683
nr_R8G8B8_R8G8B8_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
685
unsigned int r, g, b, a;
688
r = NR_RGBA32_R (rgba);
689
g = NR_RGBA32_G (rgba);
690
b = NR_RGBA32_B (rgba);
691
a = NR_RGBA32_A (rgba);
695
for (y = 0; y < h; y++) {
696
unsigned char *d, *m;
697
d = (unsigned char *) px;
698
m = (unsigned char *) mpx;
699
for (x = 0; x < w; x++) {
701
alpha = NR_PREMUL (a, m[0]);
702
d[0] = NR_COMPOSEN11 (r, alpha, d[0]);
703
d[1] = NR_COMPOSEN11 (g, alpha, d[1]);
704
d[2] = NR_COMPOSEN11 (b, alpha, d[2]);
714
nr_R8G8B8A8_N_R8G8B8A8_N_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned long rgba)
716
unsigned int r, g, b, a;
719
r = NR_RGBA32_R (rgba);
720
g = NR_RGBA32_G (rgba);
721
b = NR_RGBA32_B (rgba);
722
a = NR_RGBA32_A (rgba);
726
for (y = 0; y < h; y++) {
727
unsigned char *d, *s;
728
d = (unsigned char *) px;
729
s = (unsigned char *) spx;
730
for (x = 0; x < w; x++) {
732
ca = NR_PREMUL (s[0], a);
734
/* Transparent FG, NOP */
735
} else if ((ca == 255) || (d[3] == 0)) {
736
/* Full coverage, COPY */
723
/* FINAL DST MASK COLOR */
726
nr_R8G8B8A8_N_EMPTY_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
728
unsigned int r, g, b, a;
731
r = NR_RGBA32_R (rgba);
732
g = NR_RGBA32_G (rgba);
733
b = NR_RGBA32_B (rgba);
734
a = NR_RGBA32_A (rgba);
736
for (y = h; y > 0; y--) {
740
unsigned char *d = px;
741
const unsigned char *m = mpx;
742
for (x = w; x > 0; x--) {
743
/* Full composition */
744
da = 65025 - (255 - ca) * (255 - d[3]);
745
d[0] = NR_COMPOSENNN_A7 (r, ca, d[0], d[3], da);
746
d[1] = NR_COMPOSENNN_A7 (g, ca, d[1], d[3], da);
747
d[2] = NR_COMPOSENNN_A7 (b, ca, d[2], d[3], da);
748
d[3] = (da + 127) / 255;
746
d[3] = NR_PREMUL_111 (m[0], a);
757
nr_R8G8B8A8_P_EMPTY_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
759
unsigned int r, g, b, a;
762
r = NR_RGBA32_R (rgba);
763
g = NR_RGBA32_G (rgba);
764
b = NR_RGBA32_B (rgba);
765
a = NR_RGBA32_A (rgba);
770
c[0] = NR_PREMUL_111 (r, a);
771
c[1] = NR_PREMUL_111 (g, a);
772
c[2] = NR_PREMUL_111 (b, a);
774
/* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
775
nr_mmx_R8G8B8A8_P_EMPTY_A8_RGBAP (px, w, h, rs, mpx, mrs, c);
781
// Pre-premultiply color values
787
for (y = h; y > 0; y--) {
788
unsigned char *d = px;
789
const unsigned char *m = mpx;
792
} else if (a == 255) {
793
for (x = w; x > 0; x--) {
794
d[0] = NR_PREMUL_111(m[0], r);
795
d[1] = NR_PREMUL_111(m[0], g);
796
d[2] = NR_PREMUL_111(m[0], b);
802
for (x = w; x > 0; x--) {
803
// Color values are already premultiplied with a
804
d[0] = NR_PREMUL_121(m[0], r);
805
d[1] = NR_PREMUL_121(m[0], g);
806
d[2] = NR_PREMUL_121(m[0], b);
807
d[3] = NR_PREMUL_111(m[0], a);
818
nr_R8G8B8_R8G8B8_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
820
unsigned int r, g, b, a;
823
r = NR_RGBA32_R (rgba);
824
g = NR_RGBA32_G (rgba);
825
b = NR_RGBA32_B (rgba);
826
a = NR_RGBA32_A (rgba);
830
} else if (a == 255) {
831
for (y = h; y > 0; y--) {
832
unsigned char *d = px;
833
const unsigned char *m = mpx;
834
for (x = w; x > 0; x--) {
835
d[0] = NR_COMPOSEN11_1111 (r, m[0], d[0]);
836
d[1] = NR_COMPOSEN11_1111 (g, m[0], d[1]);
837
d[2] = NR_COMPOSEN11_1111 (b, m[0], d[2]);
845
for (y = h; y > 0; y--) {
846
unsigned char *d = px;
847
const unsigned char *m = mpx;
848
for (x = w; x > 0; x--) {
849
// dc' = (1 - m*sa) * dc + m*sa*sc
851
alpha = NR_PREMUL_112 (a, m[0]);
852
d[0] = NR_COMPOSEN11_1211 (r, alpha, d[0]);
853
d[1] = NR_COMPOSEN11_1211 (g, alpha, d[1]);
854
d[2] = NR_COMPOSEN11_1211 (b, alpha, d[2]);
865
nr_R8G8B8A8_N_R8G8B8A8_N_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
867
unsigned int r, g, b, a;
870
r = NR_RGBA32_R (rgba);
871
g = NR_RGBA32_G (rgba);
872
b = NR_RGBA32_B (rgba);
873
a = NR_RGBA32_A (rgba);
877
} else if (a == 255) {
878
for (y = h; y > 0; y--) {
879
unsigned char *d = px;
880
const unsigned char *m = mpx;
881
for (x = w; x > 0; x--) {
883
/* Transparent FG, NOP */
884
} else if (m[0] == 255 || d[3] == 0) {
885
/* Full coverage, COPY */
891
/* Full composition */
892
unsigned int da = NR_COMPOSEA_112(m[0], d[3]);
893
d[0] = NR_COMPOSENNN_111121(r, m[0], d[0], d[3], da);
894
d[1] = NR_COMPOSENNN_111121(g, m[0], d[1], d[3], da);
895
d[2] = NR_COMPOSENNN_111121(b, m[0], d[2], d[3], da);
896
d[3] = NR_NORMALIZE_21(da);
905
for (y = h; y > 0; y--) {
906
unsigned char *d = px;
907
const unsigned char *m = mpx;
908
for (x = w; x > 0; x--) {
910
ca = NR_PREMUL_112 (m[0], a);
912
/* Transparent FG, NOP */
913
} else if (d[3] == 0) {
914
/* Full coverage, COPY */
918
d[3] = NR_NORMALIZE_21(ca);
920
/* Full composition */
921
unsigned int da = NR_COMPOSEA_213(ca, d[3]);
922
d[0] = NR_COMPOSENNN_121131(r, ca, d[0], d[3], da);
923
d[1] = NR_COMPOSENNN_121131(g, ca, d[1], d[3], da);
924
d[2] = NR_COMPOSENNN_121131(b, ca, d[2], d[3], da);
925
d[3] = NR_NORMALIZE_31(da);
896
d[0] = NR_COMPOSEN11 (s[0], s[3], d[0]);
897
d[1] = NR_COMPOSEN11 (s[1], s[3], d[1]);
898
d[2] = NR_COMPOSEN11 (s[2], s[3], d[2]);
1097
d[0] = NR_COMPOSEN11_1111(s[0], s[3], d[0]);
1098
d[1] = NR_COMPOSEN11_1111(s[1], s[3], d[1]);
1099
d[2] = NR_COMPOSEN11_1111(s[2], s[3], d[2]);
906
for (c = 0; c < w; c++) {
1108
for (r = h; r > 0; r--) {
1109
unsigned char *d = px;
1110
const unsigned char *s = spx;
1111
for (c = w; c > 0; c--) {
908
a = NR_PREMUL (s[3], alpha);
1113
a = NR_PREMUL_112(s[3], alpha);
1114
// dc' = (1 - alpha*sa) * dc + alpha*sa*sc
912
d[0] = NR_COMPOSEN11 (s[0], a, d[0]);
913
d[1] = NR_COMPOSEN11 (s[1], a, d[1]);
914
d[2] = NR_COMPOSEN11 (s[2], a, d[2]);
1118
d[0] = NR_COMPOSEN11_1211(s[0], a, d[0]);
1119
d[1] = NR_COMPOSEN11_1211(s[1], a, d[1]);
1120
d[2] = NR_COMPOSEN11_1211(s[2], a, d[2]);
916
1122
/* a == 255 is impossible, because alpha < 255 */
927
1133
nr_R8G8B8_R8G8B8_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
931
for (y = 0; y < h; y++) {
932
unsigned char *d, *s, *m;
933
d = (unsigned char *) px;
934
s = (unsigned char *) spx;
935
m = (unsigned char *) mpx;
936
for (x = 0; x < w; x++) {
1137
for (y = h; y > 0; y--) {
1138
unsigned char* d = px;
1139
const unsigned char* s = spx;
1140
const unsigned char* m = mpx;
1141
for (x = w; x > 0; x--) {
938
a = NR_PREMUL (s[3], m[0]);
940
unsigned int r, g, b;
941
r = NR_PREMUL (s[0], m[0]);
942
d[0] = NR_COMPOSEP11 (r, a, d[0]);
943
g = NR_PREMUL (s[1], m[0]);
944
d[1] = NR_COMPOSEP11 (g, a, d[1]);
945
b = NR_PREMUL (s[2], m[0]);
946
d[2] = NR_COMPOSEP11 (b, a, d[2]);
1143
a = NR_PREMUL_112(s[3], m[0]);
1146
} else if (a == 255*255) {
1149
// dc' = (1 - m*sa) * dc + m*sc
1150
d[0] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[0], m[0]), a, d[0]);
1151
d[1] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[1], m[0]), a, d[1]);
1152
d[2] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[2], m[0]), a, d[2]);