24 #ifndef AGG_PIXFMT_RGBA_INCLUDED 25 #define AGG_PIXFMT_RGBA_INCLUDED 29 #include "agg_pixfmt_base.h" 30 #include "agg_rendering_buffer.h" 34 template<
class T>
inline T sd_min(T a, T b) {
return (a < b) ? a : b; }
35 template<
class T>
inline T sd_max(T a, T b) {
return (a > b) ? a : b; }
37 inline rgba & clip(rgba & c)
39 if (c.a > 1) c.a = 1;
else if (c.a < 0) c.a = 0;
40 if (c.r > c.a) c.r = c.a;
else if (c.r < 0) c.r = 0;
41 if (c.g > c.a) c.g = c.a;
else if (c.g < 0) c.g = 0;
42 if (c.b > c.a) c.b = c.a;
else if (c.b < 0) c.b = 0;
47 template<
class ColorT,
class Order>
50 typedef ColorT color_type;
51 typedef typename color_type::value_type value_type;
54 static AGG_INLINE
void premultiply(value_type* p)
56 value_type a = p[Order::A];
57 p[Order::R] = color_type::multiply(p[Order::R], a);
58 p[Order::G] = color_type::multiply(p[Order::G], a);
59 p[Order::B] = color_type::multiply(p[Order::B], a);
64 static AGG_INLINE
void demultiply(value_type* p)
66 value_type a = p[Order::A];
67 p[Order::R] = color_type::demultiply(p[Order::R], a);
68 p[Order::G] = color_type::demultiply(p[Order::G], a);
69 p[Order::B] = color_type::demultiply(p[Order::B], a);
74 template<
class ColorT,
class Order,
class GammaLut>
78 typedef ColorT color_type;
79 typedef typename color_type::value_type value_type;
83 AGG_INLINE
void operator () (value_type* p)
85 p[Order::R] = m_gamma.dir(p[Order::R]);
86 p[Order::G] = m_gamma.dir(p[Order::G]);
87 p[Order::B] = m_gamma.dir(p[Order::B]);
91 const GammaLut& m_gamma;
98 typedef ColorT color_type;
99 typedef typename color_type::value_type value_type;
103 AGG_INLINE
void operator () (value_type* p)
105 p[Order::R] = m_gamma.inv(p[Order::R]);
106 p[Order::G] = m_gamma.inv(p[Order::G]);
107 p[Order::B] = m_gamma.inv(p[Order::B]);
111 const GammaLut& m_gamma;
115 template<
class ColorT,
class Order>
118 typedef ColorT color_type;
119 typedef Order order_type;
120 typedef typename color_type::value_type value_type;
123 static AGG_INLINE
void set_plain_color(value_type* p, color_type c)
133 static AGG_INLINE color_type get_plain_color(
const value_type* p)
139 p[Order::A]).demultiply();
143 template<
class ColorT,
class Order>
146 typedef ColorT color_type;
147 typedef Order order_type;
148 typedef typename color_type::value_type value_type;
151 static AGG_INLINE
void set_plain_color(value_type* p, color_type c)
160 static AGG_INLINE color_type get_plain_color(
const value_type* p)
172 template<
class ColorT,
class Order>
175 typedef ColorT color_type;
176 typedef Order order_type;
177 typedef typename color_type::value_type value_type;
178 typedef typename color_type::calc_type calc_type;
179 typedef typename color_type::long_type long_type;
186 static AGG_INLINE
void blend_pix(value_type* p,
187 value_type cr, value_type cg, value_type cb, value_type alpha, cover_type cover)
189 blend_pix(p, cr, cg, cb, color_type::mult_cover(alpha, cover));
193 static AGG_INLINE
void blend_pix(value_type* p,
194 value_type cr, value_type cg, value_type cb, value_type alpha)
196 p[Order::R] = color_type::lerp(p[Order::R], cr, alpha);
197 p[Order::G] = color_type::lerp(p[Order::G], cg, alpha);
198 p[Order::B] = color_type::lerp(p[Order::B], cb, alpha);
199 p[Order::A] = color_type::prelerp(p[Order::A], alpha, alpha);
206 template<
class ColorT,
class Order>
209 typedef ColorT color_type;
210 typedef Order order_type;
211 typedef typename color_type::value_type value_type;
212 typedef typename color_type::calc_type calc_type;
213 typedef typename color_type::long_type long_type;
219 static AGG_INLINE
void blend_pix(value_type* p,
220 value_type cr, value_type cg, value_type cb, value_type alpha, cover_type cover)
223 color_type::mult_cover(cr, cover),
224 color_type::mult_cover(cg, cover),
225 color_type::mult_cover(cb, cover),
226 color_type::mult_cover(alpha, cover));
230 static AGG_INLINE
void blend_pix(value_type* p,
231 value_type cr, value_type cg, value_type cb, value_type alpha)
233 p[Order::R] = color_type::prelerp(p[Order::R], cr, alpha);
234 p[Order::G] = color_type::prelerp(p[Order::G], cg, alpha);
235 p[Order::B] = color_type::prelerp(p[Order::B], cb, alpha);
236 p[Order::A] = color_type::prelerp(p[Order::A], alpha, alpha);
242 template<
class ColorT,
class Order>
245 typedef ColorT color_type;
246 typedef Order order_type;
247 typedef typename color_type::value_type value_type;
248 typedef typename color_type::calc_type calc_type;
249 typedef typename color_type::long_type long_type;
255 static AGG_INLINE
void blend_pix(value_type* p,
256 value_type cr, value_type cg, value_type cb, value_type alpha, cover_type cover)
258 blend_pix(p, cr, cg, cb, color_type::mult_cover(alpha, cover));
262 static AGG_INLINE
void blend_pix(value_type* p,
263 value_type cr, value_type cg, value_type cb, value_type alpha)
265 if (alpha > color_type::empty_value())
267 calc_type a = p[Order::A];
268 calc_type r = color_type::multiply(p[Order::R], a);
269 calc_type g = color_type::multiply(p[Order::G], a);
270 calc_type b = color_type::multiply(p[Order::B], a);
271 p[Order::R] = color_type::lerp(r, cr, alpha);
272 p[Order::G] = color_type::lerp(g, cg, alpha);
273 p[Order::B] = color_type::lerp(b, cb, alpha);
274 p[Order::A] = color_type::prelerp(a, alpha, alpha);
284 template<
class ColorT,
class Order>
287 typedef ColorT color_type;
288 typedef typename color_type::value_type value_type;
294 static AGG_INLINE
void blend_pix(value_type* p,
295 value_type, value_type, value_type, value_type, cover_type cover)
297 if (cover >= cover_full)
299 p[0] = p[1] = p[2] = p[3] = color_type::empty_value();
301 else if (cover > cover_none)
303 set(p,
get(p, cover_full - cover));
309 template<
class ColorT,
class Order>
312 typedef ColorT color_type;
313 typedef typename color_type::value_type value_type;
319 static AGG_INLINE
void blend_pix(value_type* p,
320 value_type r, value_type g, value_type b, value_type a, cover_type cover)
322 if (cover >= cover_full)
328 rgba s =
get(r, g, b, a, cover);
329 rgba d =
get(p, cover_full - cover);
340 template<
class ColorT,
class Order>
343 typedef ColorT color_type;
344 typedef typename color_type::value_type value_type;
348 static AGG_INLINE
void blend_pix(value_type*,
349 value_type, value_type, value_type, value_type, cover_type)
356 template<
class ColorT,
class Order>
359 typedef ColorT color_type;
360 typedef typename color_type::value_type value_type;
366 static AGG_INLINE
void blend_pix(value_type* p,
367 value_type r, value_type g, value_type b, value_type a, cover_type cover)
372 rgba s =
get(r, g, b, a, cover);
374 d.r += s.r - d.r * s.a;
375 d.g += s.g - d.g * s.a;
376 d.b += s.b - d.b * s.a;
377 d.a += s.a - d.a * s.a;
384 template<
class ColorT,
class Order>
387 typedef ColorT color_type;
388 typedef typename color_type::value_type value_type;
394 static AGG_INLINE
void blend_pix(value_type* p,
395 value_type r, value_type g, value_type b, value_type a, cover_type cover)
397 rgba s =
get(r, g, b, a, cover);
399 double d1a = 1 - d.a;
409 template<
class ColorT,
class Order>
412 typedef ColorT color_type;
413 typedef typename color_type::value_type value_type;
419 static AGG_INLINE
void blend_pix(value_type* p,
420 value_type r, value_type g, value_type b, value_type a, cover_type cover)
422 double da = ColorT::to_double(p[Order::A]);
425 rgba s =
get(r, g, b, a, cover);
426 rgba d =
get(p, cover_full - cover);
437 template<
class ColorT,
class Order>
440 typedef ColorT color_type;
441 typedef typename color_type::value_type value_type;
447 static AGG_INLINE
void blend_pix(value_type* p,
448 value_type, value_type, value_type, value_type a, cover_type cover)
450 double sa = ColorT::to_double(a);
451 rgba d =
get(p, cover_full - cover);
452 rgba d2 =
get(p, cover);
462 template<
class ColorT,
class Order>
465 typedef ColorT color_type;
466 typedef typename color_type::value_type value_type;
472 static AGG_INLINE
void blend_pix(value_type* p,
473 value_type r, value_type g, value_type b, value_type a, cover_type cover)
475 rgba s =
get(r, g, b, a, cover);
476 rgba d =
get(p, cover_full - cover);
477 double d1a = 1 - ColorT::to_double(p[Order::A]);
487 template<
class ColorT,
class Order>
490 typedef ColorT color_type;
491 typedef typename color_type::value_type value_type;
497 static AGG_INLINE
void blend_pix(value_type* p,
498 value_type, value_type, value_type, value_type a, cover_type cover)
500 rgba d =
get(p, cover_full - cover);
501 rgba dc =
get(p, cover);
502 double s1a = 1 - ColorT::to_double(a);
512 template<
class ColorT,
class Order>
515 typedef ColorT color_type;
516 typedef typename color_type::value_type value_type;
522 static AGG_INLINE
void blend_pix(value_type* p,
523 value_type r, value_type g, value_type b, value_type a, cover_type cover)
525 rgba s =
get(r, g, b, a, cover);
527 double s1a = 1 - s.a;
528 d.r = s.r * d.a + d.r * s1a;
529 d.g = s.g * d.a + d.g * s1a;
530 d.b = s.b * d.a + d.g * s1a;
536 template<
class ColorT,
class Order>
539 typedef ColorT color_type;
540 typedef typename color_type::value_type value_type;
546 static AGG_INLINE
void blend_pix(value_type* p,
547 value_type r, value_type g, value_type b, value_type a, cover_type cover)
549 rgba sc =
get(r, g, b, a, cover);
550 rgba dc =
get(p, cover);
551 rgba d =
get(p, cover_full - cover);
552 double sa = ColorT::to_double(a);
553 double d1a = 1 - ColorT::to_double(p[Order::A]);
554 d.r += dc.r * sa + sc.r * d1a;
555 d.g += dc.g * sa + sc.g * d1a;
556 d.b += dc.b * sa + sc.b * d1a;
563 template<
class ColorT,
class Order>
566 typedef ColorT color_type;
567 typedef typename color_type::value_type value_type;
573 static AGG_INLINE
void blend_pix(value_type* p,
574 value_type r, value_type g, value_type b, value_type a, cover_type cover)
576 rgba s =
get(r, g, b, a, cover);
578 double s1a = 1 - s.a;
579 double d1a = 1 - ColorT::to_double(p[Order::A]);
580 d.r = s.r * d1a + d.r * s1a;
581 d.g = s.g * d1a + d.g * s1a;
582 d.b = s.b * d1a + d.b * s1a;
583 d.a = s.a + d.a - 2 * s.a * d.a;
589 template<
class ColorT,
class Order>
592 typedef ColorT color_type;
593 typedef typename color_type::value_type value_type;
599 static AGG_INLINE
void blend_pix(value_type* p,
600 value_type r, value_type g, value_type b, value_type a, cover_type cover)
602 rgba s =
get(r, g, b, a, cover);
606 d.a = sd_min(d.a + s.a, 1.0);
607 d.r = sd_min(d.r + s.r, d.a);
608 d.g = sd_min(d.g + s.g, d.a);
609 d.b = sd_min(d.b + s.b, d.a);
617 template<
class ColorT,
class Order>
620 typedef ColorT color_type;
621 typedef typename color_type::value_type value_type;
627 static AGG_INLINE
void blend_pix(value_type* p,
628 value_type r, value_type g, value_type b, value_type a, cover_type cover)
630 rgba s =
get(r, g, b, a, cover);
634 d.a += s.a - s.a * d.a;
635 d.r = sd_max(d.r - s.r, 0.0);
636 d.g = sd_max(d.g - s.g, 0.0);
637 d.b = sd_max(d.b - s.b, 0.0);
644 template<
class ColorT,
class Order>
647 typedef ColorT color_type;
648 typedef typename color_type::value_type value_type;
654 static AGG_INLINE
void blend_pix(value_type* p,
655 value_type r, value_type g, value_type b, value_type a, cover_type cover)
657 rgba s =
get(r, g, b, a, cover);
661 double s1a = 1 - s.a;
662 double d1a = 1 - d.a;
663 d.r = s.r * d.r + s.r * d1a + d.r * s1a;
664 d.g = s.g * d.g + s.g * d1a + d.g * s1a;
665 d.b = s.b * d.b + s.b * d1a + d.b * s1a;
666 d.a += s.a - s.a * d.a;
673 template<
class ColorT,
class Order>
676 typedef ColorT color_type;
677 typedef typename color_type::value_type value_type;
683 static AGG_INLINE
void blend_pix(value_type* p,
684 value_type r, value_type g, value_type b, value_type a, cover_type cover)
686 rgba s =
get(r, g, b, a, cover);
690 d.r += s.r - s.r * d.r;
691 d.g += s.g - s.g * d.g;
692 d.b += s.b - s.b * d.b;
693 d.a += s.a - s.a * d.a;
700 template<
class ColorT,
class Order>
703 typedef ColorT color_type;
704 typedef typename color_type::value_type value_type;
714 static AGG_INLINE
double calc(
double dca,
double sca,
double da,
double sa,
double sada,
double d1a,
double s1a)
716 return (2 * dca <= da) ?
717 2 * sca * dca + sca * d1a + dca * s1a :
718 sada - 2 * (da - dca) * (sa - sca) + sca * d1a + dca * s1a;
721 static AGG_INLINE
void blend_pix(value_type* p,
722 value_type r, value_type g, value_type b, value_type a, cover_type cover)
724 rgba s =
get(r, g, b, a, cover);
728 double d1a = 1 - d.a;
729 double s1a = 1 - s.a;
730 double sada = s.a * d.a;
731 d.r = calc(d.r, s.r, d.a, s.a, sada, d1a, s1a);
732 d.g = calc(d.g, s.g, d.a, s.a, sada, d1a, s1a);
733 d.b = calc(d.b, s.b, d.a, s.a, sada, d1a, s1a);
734 d.a += s.a - s.a * d.a;
741 template<
class ColorT,
class Order>
744 typedef ColorT color_type;
745 typedef typename color_type::value_type value_type;
751 static AGG_INLINE
void blend_pix(value_type* p,
752 value_type r, value_type g, value_type b, value_type a, cover_type cover)
754 rgba s =
get(r, g, b, a, cover);
758 double d1a = 1 - d.a;
759 double s1a = 1 - s.a;
760 d.r = sd_min(s.r * d.a, d.r * s.a) + s.r * d1a + d.r * s1a;
761 d.g = sd_min(s.g * d.a, d.g * s.a) + s.g * d1a + d.g * s1a;
762 d.b = sd_min(s.b * d.a, d.b * s.a) + s.b * d1a + d.b * s1a;
763 d.a += s.a - s.a * d.a;
770 template<
class ColorT,
class Order>
773 typedef ColorT color_type;
774 typedef typename color_type::value_type value_type;
780 static AGG_INLINE
void blend_pix(value_type* p,
781 value_type r, value_type g, value_type b, value_type a, cover_type cover)
783 rgba s =
get(r, g, b, a, cover);
787 double d1a = 1 - d.a;
788 double s1a = 1 - s.a;
789 d.r = sd_max(s.r * d.a, d.r * s.a) + s.r * d1a + d.r * s1a;
790 d.g = sd_max(s.g * d.a, d.g * s.a) + s.g * d1a + d.g * s1a;
791 d.b = sd_max(s.b * d.a, d.b * s.a) + s.b * d1a + d.b * s1a;
792 d.a += s.a - s.a * d.a;
799 template<
class ColorT,
class Order>
802 typedef ColorT color_type;
803 typedef typename color_type::value_type value_type;
815 static AGG_INLINE
double calc(
double dca,
double sca,
double da,
double sa,
double sada,
double d1a,
double s1a)
817 if (sca < sa)
return sada * sd_min(1.0, (dca / da) * sa / (sa - sca)) + sca * d1a + dca * s1a;
818 if (dca > 0)
return sada + sca * d1a + dca * s1a;
822 static AGG_INLINE
void blend_pix(value_type* p,
823 value_type r, value_type g, value_type b, value_type a, cover_type cover)
825 rgba s =
get(r, g, b, a, cover);
831 double sada = s.a * d.a;
832 double s1a = 1 - s.a;
833 double d1a = 1 - d.a;
834 d.r = calc(d.r, s.r, d.a, s.a, sada, d1a, s1a);
835 d.g = calc(d.g, s.g, d.a, s.a, sada, d1a, s1a);
836 d.b = calc(d.b, s.b, d.a, s.a, sada, d1a, s1a);
837 d.a += s.a - s.a * d.a;
846 template<
class ColorT,
class Order>
849 typedef ColorT color_type;
850 typedef typename color_type::value_type value_type;
860 static AGG_INLINE
double calc(
double dca,
double sca,
double da,
double sa,
double sada,
double d1a,
double s1a)
862 if (sca > 0)
return sada * (1 - sd_min(1.0, (1 - dca / da) * sa / sca)) + sca * d1a + dca * s1a;
863 if (dca > da)
return sada + dca * s1a;
867 static AGG_INLINE
void blend_pix(value_type* p,
868 value_type r, value_type g, value_type b, value_type a, cover_type cover)
870 rgba s =
get(r, g, b, a, cover);
876 double sada = s.a * d.a;
877 double s1a = 1 - s.a;
878 double d1a = 1 - d.a;
879 d.r = calc(d.r, s.r, d.a, s.a, sada, d1a, s1a);
880 d.g = calc(d.g, s.g, d.a, s.a, sada, d1a, s1a);
881 d.b = calc(d.b, s.b, d.a, s.a, sada, d1a, s1a);
891 template<
class ColorT,
class Order>
894 typedef ColorT color_type;
895 typedef typename color_type::value_type value_type;
905 static AGG_INLINE
double calc(
double dca,
double sca,
double da,
double sa,
double sada,
double d1a,
double s1a)
907 return (2 * sca < sa) ?
908 2 * sca * dca + sca * d1a + dca * s1a :
909 sada - 2 * (da - dca) * (sa - sca) + sca * d1a + dca * s1a;
912 static AGG_INLINE
void blend_pix(value_type* p,
913 value_type r, value_type g, value_type b, value_type a, cover_type cover)
915 rgba s =
get(r, g, b, a, cover);
919 double d1a = 1 - d.a;
920 double s1a = 1 - s.a;
921 double sada = s.a * d.a;
922 d.r = calc(d.r, s.r, d.a, s.a, sada, d1a, s1a);
923 d.g = calc(d.g, s.g, d.a, s.a, sada, d1a, s1a);
924 d.b = calc(d.b, s.b, d.a, s.a, sada, d1a, s1a);
932 template<
class ColorT,
class Order>
935 typedef ColorT color_type;
936 typedef typename color_type::value_type value_type;
948 static AGG_INLINE
double calc(
double dca,
double sca,
double da,
double sa,
double sada,
double d1a,
double s1a)
950 double dcasa = dca * sa;
951 if (2 * sca <= sa)
return dcasa - (sada - 2 * sca * da) * dcasa * (sada - dcasa) + sca * d1a + dca * s1a;
952 if (4 * dca <= da)
return dcasa + (2 * sca * da - sada) * ((((16 * dcasa - 12) * dcasa + 4) * dca * da) - dca * da) + sca * d1a + dca * s1a;
953 return dcasa + (2 * sca * da - sada) * (std::sqrt(dcasa) - dcasa) + sca * d1a + dca * s1a;
956 static AGG_INLINE
void blend_pix(value_type* p,
957 value_type r, value_type g, value_type b, value_type a, cover_type cover)
959 rgba s =
get(r, g, b, a, cover);
965 double sada = s.a * d.a;
966 double s1a = 1 - s.a;
967 double d1a = 1 - d.a;
968 d.r = calc(d.r, s.r, d.a, s.a, sada, d1a, s1a);
969 d.g = calc(d.g, s.g, d.a, s.a, sada, d1a, s1a);
970 d.b = calc(d.b, s.b, d.a, s.a, sada, d1a, s1a);
980 template<
class ColorT,
class Order>
983 typedef ColorT color_type;
984 typedef typename color_type::value_type value_type;
990 static AGG_INLINE
void blend_pix(value_type* p,
991 value_type r, value_type g, value_type b, value_type a, cover_type cover)
993 rgba s =
get(r, g, b, a, cover);
997 d.r += s.r - 2 * sd_min(s.r * d.a, d.r * s.a);
998 d.g += s.g - 2 * sd_min(s.g * d.a, d.g * s.a);
999 d.b += s.b - 2 * sd_min(s.b * d.a, d.b * s.a);
1000 d.a += s.a - s.a * d.a;
1007 template<
class ColorT,
class Order>
1010 typedef ColorT color_type;
1011 typedef typename color_type::value_type value_type;
1017 static AGG_INLINE
void blend_pix(value_type* p,
1018 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1020 rgba s =
get(r, g, b, a, cover);
1024 double d1a = 1 - d.a;
1025 double s1a = 1 - s.a;
1026 d.r = (s.r * d.a + d.r * s.a - 2 * s.r * d.r) + s.r * d1a + d.r * s1a;
1027 d.g = (s.g * d.a + d.g * s.a - 2 * s.g * d.g) + s.g * d1a + d.g * s1a;
1028 d.b = (s.b * d.a + d.b * s.a - 2 * s.b * d.b) + s.b * d1a + d.b * s1a;
1029 d.a += s.a - s.a * d.a;
1037 template<
class ColorT,
class Order>
struct comp_op_rgba_contrast
1039 typedef ColorT color_type;
1040 typedef Order order_type;
1041 typedef typename color_type::value_type value_type;
1042 typedef typename color_type::calc_type calc_type;
1043 typedef typename color_type::long_type long_type;
1046 base_shift = color_type::base_shift,
1047 base_mask = color_type::base_mask
1051 static AGG_INLINE
void blend_pix(value_type* p,
1052 unsigned sr,
unsigned sg,
unsigned sb,
1053 unsigned sa,
unsigned cover)
1057 sr = (sr * cover + 255) >> 8;
1058 sg = (sg * cover + 255) >> 8;
1059 sb = (sb * cover + 255) >> 8;
1060 sa = (sa * cover + 255) >> 8;
1062 long_type dr = p[Order::R];
1063 long_type dg = p[Order::G];
1064 long_type db = p[Order::B];
1065 int da = p[Order::A];
1066 long_type d2a = da >> 1;
1067 unsigned s2a = sa >> 1;
1069 int r = (int)((((dr - d2a) * int((sr - s2a)*2 + base_mask)) >> base_shift) + d2a);
1070 int g = (int)((((dg - d2a) * int((sg - s2a)*2 + base_mask)) >> base_shift) + d2a);
1071 int b = (int)((((db - d2a) * int((sb - s2a)*2 + base_mask)) >> base_shift) + d2a);
1073 r = (r < 0) ? 0 : r;
1074 g = (g < 0) ? 0 : g;
1075 b = (b < 0) ? 0 : b;
1077 p[Order::R] = (value_type)((r > da) ? da : r);
1078 p[Order::G] = (value_type)((g > da) ? da : g);
1079 p[Order::B] = (value_type)((b > da) ? da : b);
1084 template<
class ColorT,
class Order>
struct comp_op_rgba_invert
1086 typedef ColorT color_type;
1087 typedef Order order_type;
1088 typedef typename color_type::value_type value_type;
1089 typedef typename color_type::calc_type calc_type;
1090 typedef typename color_type::long_type long_type;
1093 base_shift = color_type::base_shift,
1094 base_mask = color_type::base_mask
1099 static AGG_INLINE
void blend_pix(value_type* p,
1100 unsigned sr,
unsigned sg,
unsigned sb,
1101 unsigned sa,
unsigned cover)
1103 sa = (sa * cover + 255) >> 8;
1106 calc_type da = p[Order::A];
1107 calc_type dr = ((da - p[Order::R]) * sa + base_mask) >> base_shift;
1108 calc_type dg = ((da - p[Order::G]) * sa + base_mask) >> base_shift;
1109 calc_type db = ((da - p[Order::B]) * sa + base_mask) >> base_shift;
1110 calc_type s1a = base_mask - sa;
1111 p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift));
1112 p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift));
1113 p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift));
1114 p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));
1120 template<
class ColorT,
class Order>
struct comp_op_rgba_invert_rgb
1122 typedef ColorT color_type;
1123 typedef Order order_type;
1124 typedef typename color_type::value_type value_type;
1125 typedef typename color_type::calc_type calc_type;
1126 typedef typename color_type::long_type long_type;
1129 base_shift = color_type::base_shift,
1130 base_mask = color_type::base_mask
1135 static AGG_INLINE
void blend_pix(value_type* p,
1136 unsigned sr,
unsigned sg,
unsigned sb,
1137 unsigned sa,
unsigned cover)
1141 sr = (sr * cover + 255) >> 8;
1142 sg = (sg * cover + 255) >> 8;
1143 sb = (sb * cover + 255) >> 8;
1144 sa = (sa * cover + 255) >> 8;
1148 calc_type da = p[Order::A];
1149 calc_type dr = ((da - p[Order::R]) * sr + base_mask) >> base_shift;
1150 calc_type dg = ((da - p[Order::G]) * sg + base_mask) >> base_shift;
1151 calc_type db = ((da - p[Order::B]) * sb + base_mask) >> base_shift;
1152 calc_type s1a = base_mask - sa;
1153 p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift));
1154 p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift));
1155 p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift));
1156 p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));
1166 typedef typename ColorT::value_type value_type;
1167 typedef typename ColorT::calc_type calc_type;
1168 typedef void (*comp_op_func_type)(value_type* p,
1174 static comp_op_func_type g_comp_op_func[];
1178 template<
class ColorT,
class Order>
1236 comp_op_color_dodge,
1256 template<
class ColorT,
class Order>
1259 typedef ColorT color_type;
1260 typedef Order order_type;
1261 typedef typename color_type::value_type value_type;
1262 typedef typename color_type::calc_type calc_type;
1263 typedef typename color_type::long_type long_type;
1265 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1266 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1268 comp_op_table_rgba<ColorT, Order>::g_comp_op_func[op](p,
1269 color_type::multiply(r, a),
1270 color_type::multiply(g, a),
1271 color_type::multiply(b, a),
1277 template<
class ColorT,
class Order>
1280 typedef ColorT color_type;
1281 typedef Order order_type;
1282 typedef typename color_type::value_type value_type;
1283 typedef typename color_type::calc_type calc_type;
1284 typedef typename color_type::long_type long_type;
1286 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1287 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1289 r = color_type::multiply(r, a);
1290 g = color_type::multiply(g, a);
1291 b = color_type::multiply(b, a);
1292 value_type da = p[Order::A];
1293 comp_op_table_rgba<ColorT, Order>::g_comp_op_func[op](p,
1294 color_type::multiply(r, da),
1295 color_type::multiply(g, da),
1296 color_type::multiply(b, da),
1297 color_type::multiply(a, da), cover);
1302 template<
class ColorT,
class Order>
1305 typedef ColorT color_type;
1306 typedef Order order_type;
1307 typedef typename color_type::value_type value_type;
1308 typedef typename color_type::calc_type calc_type;
1309 typedef typename color_type::long_type long_type;
1311 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1312 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1314 comp_op_table_rgba<ColorT, Order>::g_comp_op_func[op](p, r, g, b, a, cover);
1319 template<
class ColorT,
class Order>
1322 typedef ColorT color_type;
1323 typedef Order order_type;
1324 typedef typename color_type::value_type value_type;
1325 typedef typename color_type::calc_type calc_type;
1326 typedef typename color_type::long_type long_type;
1328 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1329 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1331 value_type da = p[Order::A];
1332 comp_op_table_rgba<ColorT, Order>::g_comp_op_func[op](p,
1333 color_type::multiply(r, da),
1334 color_type::multiply(g, da),
1335 color_type::multiply(b, da),
1336 color_type::multiply(a, da), cover);
1341 template<
class ColorT,
class Order>
1344 typedef ColorT color_type;
1345 typedef Order order_type;
1346 typedef typename color_type::value_type value_type;
1347 typedef typename color_type::calc_type calc_type;
1348 typedef typename color_type::long_type long_type;
1350 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1351 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1360 template<
class ColorT,
class Order>
1363 typedef ColorT color_type;
1364 typedef Order order_type;
1365 typedef typename color_type::value_type value_type;
1366 typedef typename color_type::calc_type calc_type;
1367 typedef typename color_type::long_type long_type;
1369 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1370 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1379 template<
class BlenderPre>
1382 typedef typename BlenderPre::color_type color_type;
1383 typedef typename BlenderPre::order_type order_type;
1384 typedef typename color_type::value_type value_type;
1385 typedef typename color_type::calc_type calc_type;
1386 typedef typename color_type::long_type long_type;
1388 static AGG_INLINE
void blend_pix(
unsigned, value_type* p,
1389 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1391 BlenderPre::blend_pix(p,
1392 color_type::multiply(r, a),
1393 color_type::multiply(g, a),
1394 color_type::multiply(b, a),
1400 template<
class BlenderPre>
1403 typedef typename BlenderPre::color_type color_type;
1404 typedef typename BlenderPre::order_type order_type;
1405 typedef typename color_type::value_type value_type;
1406 typedef typename color_type::calc_type calc_type;
1407 typedef typename color_type::long_type long_type;
1409 static AGG_INLINE
void blend_pix(
unsigned, value_type* p,
1410 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1412 r = color_type::multiply(r, a);
1413 g = color_type::multiply(g, a);
1414 b = color_type::multiply(b, a);
1415 value_type da = p[order_type::A];
1416 BlenderPre::blend_pix(p,
1417 color_type::multiply(r, da),
1418 color_type::multiply(g, da),
1419 color_type::multiply(b, da),
1420 color_type::multiply(a, da), cover);
1425 template<
class BlenderPre>
1428 typedef typename BlenderPre::color_type color_type;
1429 typedef typename BlenderPre::order_type order_type;
1430 typedef typename color_type::value_type value_type;
1431 typedef typename color_type::calc_type calc_type;
1432 typedef typename color_type::long_type long_type;
1434 static AGG_INLINE
void blend_pix(
unsigned, value_type* p,
1435 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1437 BlenderPre::blend_pix(p, r, g, b, a, cover);
1442 template<
class BlenderPre>
1445 typedef typename BlenderPre::color_type color_type;
1446 typedef typename BlenderPre::order_type order_type;
1447 typedef typename color_type::value_type value_type;
1448 typedef typename color_type::calc_type calc_type;
1449 typedef typename color_type::long_type long_type;
1451 static AGG_INLINE
void blend_pix(
unsigned, value_type* p,
1452 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1454 unsigned da = p[order_type::A];
1455 BlenderPre::blend_pix(p,
1456 color_type::multiply(r, da),
1457 color_type::multiply(g, da),
1458 color_type::multiply(b, da),
1459 color_type::multiply(a, da),
1465 template<
class BlenderPre>
1468 typedef typename BlenderPre::color_type color_type;
1469 typedef typename BlenderPre::order_type order_type;
1470 typedef typename color_type::value_type value_type;
1471 typedef typename color_type::calc_type calc_type;
1472 typedef typename color_type::long_type long_type;
1474 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1475 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1484 template<
class BlenderPre>
1487 typedef typename BlenderPre::color_type color_type;
1488 typedef typename BlenderPre::order_type order_type;
1489 typedef typename color_type::value_type value_type;
1490 typedef typename color_type::calc_type calc_type;
1491 typedef typename color_type::long_type long_type;
1493 static AGG_INLINE
void blend_pix(
unsigned op, value_type* p,
1494 value_type r, value_type g, value_type b, value_type a, cover_type cover)
1504 template<
class Blender,
class RenBuf>
1509 typedef RenBuf rbuf_type;
1510 typedef typename rbuf_type::row_data row_data;
1511 typedef Blender blender_type;
1512 typedef typename blender_type::color_type color_type;
1513 typedef typename blender_type::order_type order_type;
1514 typedef typename color_type::value_type value_type;
1515 typedef typename color_type::calc_type calc_type;
1520 pix_width =
sizeof(value_type) * pix_step,
1524 value_type c[num_components];
1526 void set(value_type r, value_type g, value_type b, value_type a)
1528 c[order_type::R] = r;
1529 c[order_type::G] = g;
1530 c[order_type::B] = b;
1531 c[order_type::A] = a;
1534 void set(
const color_type& color)
1536 set(color.r, color.g, color.b, color.a);
1539 void get(value_type& r, value_type& g, value_type& b, value_type& a)
const 1541 r = c[order_type::R];
1542 g = c[order_type::G];
1543 b = c[order_type::B];
1544 a = c[order_type::A];
1547 color_type
get()
const 1573 return (
const pixel_type*)(c + n * pix_step);
1579 AGG_INLINE
void blend_pix(
pixel_type* p,
const color_type& c,
unsigned cover)
1581 m_blender.blend_pix(p->c, c.r, c.g, c.b, c.a, cover);
1585 AGG_INLINE
void blend_pix(
pixel_type* p,
const color_type& c)
1587 m_blender.blend_pix(p->c, c.r, c.g, c.b, c.a);
1591 AGG_INLINE
void copy_or_blend_pix(
pixel_type* p,
const color_type& c,
unsigned cover)
1593 if (!c.is_transparent())
1595 if (c.is_opaque() && cover == cover_mask)
1597 p->set(c.r, c.g, c.b, c.a);
1601 m_blender.blend_pix(p->c, c.r, c.g, c.b, c.a, cover);
1607 AGG_INLINE
void copy_or_blend_pix(
pixel_type* p,
const color_type& c)
1609 if (!c.is_transparent())
1613 p->set(c.r, c.g, c.b, c.a);
1617 m_blender.blend_pix(p->c, c.r, c.g, c.b, c.a);
1626 void attach(rbuf_type& rb) { m_rbuf = &rb; }
1629 template<
class PixFmt>
1630 bool attach(PixFmt& pixf,
int x1,
int y1,
int x2,
int y2)
1632 rect_i r(x1, y1, x2, y2);
1633 if (r.clip(
rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
1635 int stride = pixf.stride();
1636 m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1),
1646 AGG_INLINE
unsigned width()
const {
return m_rbuf->width(); }
1647 AGG_INLINE
unsigned height()
const {
return m_rbuf->height(); }
1648 AGG_INLINE
int stride()
const {
return m_rbuf->stride(); }
1651 AGG_INLINE int8u* row_ptr(
int y) {
return m_rbuf->row_ptr(y); }
1652 AGG_INLINE
const int8u* row_ptr(
int y)
const {
return m_rbuf->row_ptr(y); }
1653 AGG_INLINE row_data row(
int y)
const {
return m_rbuf->row(y); }
1656 AGG_INLINE int8u* pix_ptr(
int x,
int y)
1658 return m_rbuf->row_ptr(y) +
sizeof(value_type) * (x * pix_step);
1661 AGG_INLINE
const int8u* pix_ptr(
int x,
int y)
const 1663 return m_rbuf->row_ptr(y) +
sizeof(value_type) * (x * pix_step);
1667 AGG_INLINE
pixel_type* pix_value_ptr(
int x,
int y,
unsigned len)
1669 return (
pixel_type*)(m_rbuf->row_ptr(x, y, len) +
sizeof(value_type) * (x * pix_step));
1673 AGG_INLINE
const pixel_type* pix_value_ptr(
int x,
int y)
const 1675 int8u* p = m_rbuf->row_ptr(y);
1676 return p ? (
pixel_type*)(p +
sizeof(value_type) * (x * pix_step)) : 0;
1680 AGG_INLINE
static pixel_type* pix_value_ptr(
void* p)
1686 AGG_INLINE
static const pixel_type* pix_value_ptr(
const void* p)
1692 AGG_INLINE
static void write_plain_color(
void* p, color_type c)
1694 blender_type::set_plain_color(pix_value_ptr(p)->c, c);
1698 AGG_INLINE
static color_type read_plain_color(
const void* p)
1700 return blender_type::get_plain_color(pix_value_ptr(p)->c);
1704 AGG_INLINE
static void make_pix(int8u* p,
const color_type& c)
1710 AGG_INLINE color_type pixel(
int x,
int y)
const 1712 if (
const pixel_type* p = pix_value_ptr(x, y))
1716 return color_type::no_color();
1720 AGG_INLINE
void copy_pixel(
int x,
int y,
const color_type& c)
1722 pix_value_ptr(x, y, 1)->set(c);
1726 AGG_INLINE
void blend_pixel(
int x,
int y,
const color_type& c, int8u cover)
1728 copy_or_blend_pix(pix_value_ptr(x, y, 1), c, cover);
1732 AGG_INLINE
void copy_hline(
int x,
int y,
1734 const color_type& c)
1749 AGG_INLINE
void copy_vline(
int x,
int y,
1751 const color_type& c)
1757 *pix_value_ptr(x, y++, 1) = v;
1763 void blend_hline(
int x,
int y,
1765 const color_type& c,
1768 if (!c.is_transparent())
1771 if (c.is_opaque() && cover == cover_mask)
1784 if (cover == cover_mask)
1797 blend_pix(p, c, cover);
1808 void blend_vline(
int x,
int y,
1810 const color_type& c,
1813 if (!c.is_transparent())
1815 if (c.is_opaque() && cover == cover_mask)
1821 *pix_value_ptr(x, y++, 1) = v;
1827 if (cover == cover_mask)
1831 blend_pix(pix_value_ptr(x, y++, 1), c, c.a);
1839 blend_pix(pix_value_ptr(x, y++, 1), c, cover);
1849 void blend_solid_hspan(
int x,
int y,
1851 const color_type& c,
1852 const int8u* covers)
1854 if (!c.is_transparent())
1859 if (c.is_opaque() && *covers == cover_mask)
1865 blend_pix(p, c, *covers);
1876 void blend_solid_vspan(
int x,
int y,
1878 const color_type& c,
1879 const int8u* covers)
1881 if (!c.is_transparent())
1886 if (c.is_opaque() && *covers == cover_mask)
1892 blend_pix(p, c, *covers);
1901 void copy_color_hspan(
int x,
int y,
1903 const color_type* colors)
1916 void copy_color_vspan(
int x,
int y,
1918 const color_type* colors)
1922 pix_value_ptr(x, y++, 1)->set(*colors++);
1928 void blend_color_hspan(
int x,
int y,
1930 const color_type* colors,
1931 const int8u* covers,
1939 copy_or_blend_pix(p, *colors++, *covers++);
1946 if (cover == cover_mask)
1950 copy_or_blend_pix(p, *colors++);
1959 copy_or_blend_pix(p, *colors++, cover);
1968 void blend_color_vspan(
int x,
int y,
1970 const color_type* colors,
1971 const int8u* covers,
1978 copy_or_blend_pix(pix_value_ptr(x, y++, 1), *colors++, *covers++);
1984 if (cover == cover_mask)
1988 copy_or_blend_pix(pix_value_ptr(x, y++, 1), *colors++);
1996 copy_or_blend_pix(pix_value_ptr(x, y++, 1), *colors++, cover);
2004 template<
class Function>
void for_each_pixel(Function f)
2006 for (
unsigned y = 0; y < height(); ++y)
2008 row_data r = m_rbuf->row(y);
2011 unsigned len = r.x2 - r.x1 + 1;
2036 template<
class GammaLut>
void apply_gamma_dir(
const GammaLut& g)
2042 template<
class GammaLut>
void apply_gamma_inv(
const GammaLut& g)
2048 template<
class RenBuf2>
void copy_from(
const RenBuf2& from,
2053 if (
const int8u* p = from.row_ptr(ysrc))
2055 std::memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,
2056 p + xsrc * pix_width,
2063 template<
class SrcPixelFormatRenderer>
2064 void blend_from(
const SrcPixelFormatRenderer& from,
2070 typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
2072 if (
const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
2074 pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
2080 psrc = psrc->advance(len - 1);
2081 pdst = pdst->advance(len - 1);
2086 if (cover == cover_mask)
2090 copy_or_blend_pix(pdst, psrc->get());
2091 psrc = psrc->advance(srcinc);
2092 pdst = pdst->advance(dstinc);
2100 copy_or_blend_pix(pdst, psrc->get(), cover);
2101 psrc = psrc->advance(srcinc);
2102 pdst = pdst->advance(dstinc);
2111 template<
class SrcPixelFormatRenderer>
2112 void blend_from_color(
const SrcPixelFormatRenderer& from,
2113 const color_type& color,
2119 typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
2120 typedef typename SrcPixelFormatRenderer::color_type src_color_type;
2122 if (
const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
2124 pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
2128 copy_or_blend_pix(pdst, color,
2129 src_color_type::scale_cover(cover, psrc->c[0]));
2130 psrc = psrc->next();
2131 pdst = pdst->next();
2140 template<
class SrcPixelFormatRenderer>
2141 void blend_from_lut(
const SrcPixelFormatRenderer& from,
2142 const color_type* color_lut,
2148 typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
2150 if (
const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
2152 pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
2154 if (cover == cover_mask)
2158 copy_or_blend_pix(pdst, color_lut[psrc->c[0]]);
2159 psrc = psrc->next();
2160 pdst = pdst->next();
2168 copy_or_blend_pix(pdst, color_lut[psrc->c[0]], cover);
2169 psrc = psrc->next();
2170 pdst = pdst->next();
2187 typedef RenBuf rbuf_type;
2188 typedef typename rbuf_type::row_data row_data;
2189 typedef Blender blender_type;
2190 typedef typename blender_type::color_type color_type;
2191 typedef typename blender_type::order_type order_type;
2192 typedef typename color_type::value_type value_type;
2193 typedef typename color_type::calc_type calc_type;
2198 pix_width =
sizeof(value_type) * pix_step,
2202 value_type c[num_components];
2204 void set(value_type r, value_type g, value_type b, value_type a)
2206 c[order_type::R] = r;
2207 c[order_type::G] = g;
2208 c[order_type::B] = b;
2209 c[order_type::A] = a;
2212 void set(
const color_type& color)
2214 set(color.r, color.g, color.b, color.a);
2217 void get(value_type& r, value_type& g, value_type& b, value_type& a)
const 2219 r = c[order_type::R];
2220 g = c[order_type::G];
2221 b = c[order_type::B];
2222 a = c[order_type::A];
2225 color_type
get()
const 2251 return (
const pixel_type*)(c + n * pix_step);
2258 AGG_INLINE
void blend_pix(
pixel_type* p,
const color_type& c,
unsigned cover = cover_full)
2260 m_blender.blend_pix(m_comp_op, p->c, c.r, c.g, c.b, c.a, cover);
2264 AGG_INLINE
void copy_or_blend_pix(
pixel_type* p,
const color_type& c,
unsigned cover = cover_full)
2266 if (!c.is_transparent())
2268 if (c.is_opaque() && cover == cover_mask)
2270 p->set(c.r, c.g, c.b, c.a);
2274 blend_pix(p, c, cover);
2286 void attach(rbuf_type& rb) { m_rbuf = &rb; }
2289 template<
class PixFmt>
2290 bool attach(PixFmt& pixf,
int x1,
int y1,
int x2,
int y2)
2292 rect_i r(x1, y1, x2, y2);
2293 if (r.clip(
rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
2295 int stride = pixf.stride();
2296 m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1),
2306 void comp_op(
unsigned op) { m_comp_op = op; }
2307 unsigned comp_op()
const {
return m_comp_op; }
2310 AGG_INLINE
unsigned width()
const {
return m_rbuf->width(); }
2311 AGG_INLINE
unsigned height()
const {
return m_rbuf->height(); }
2312 AGG_INLINE
int stride()
const {
return m_rbuf->stride(); }
2315 AGG_INLINE int8u* row_ptr(
int y) {
return m_rbuf->row_ptr(y); }
2316 AGG_INLINE
const int8u* row_ptr(
int y)
const {
return m_rbuf->row_ptr(y); }
2317 AGG_INLINE row_data row(
int y)
const {
return m_rbuf->row(y); }
2320 AGG_INLINE int8u* pix_ptr(
int x,
int y)
2322 return m_rbuf->row_ptr(y) +
sizeof(value_type) * (x * pix_step);
2325 AGG_INLINE
const int8u* pix_ptr(
int x,
int y)
const 2327 return m_rbuf->row_ptr(y) +
sizeof(value_type) * (x * pix_step);
2331 AGG_INLINE
pixel_type* pix_value_ptr(
int x,
int y,
unsigned len)
2333 return (
pixel_type*)(m_rbuf->row_ptr(x, y, len) +
sizeof(value_type) * (x * pix_step));
2337 AGG_INLINE
const pixel_type* pix_value_ptr(
int x,
int y)
const 2339 int8u* p = m_rbuf->row_ptr(y);
2340 return p ? (
pixel_type*)(p +
sizeof(value_type) * (x * pix_step)) : 0;
2344 AGG_INLINE
static pixel_type* pix_value_ptr(
void* p)
2350 AGG_INLINE
static const pixel_type* pix_value_ptr(
const void* p)
2356 AGG_INLINE
static void make_pix(int8u* p,
const color_type& c)
2362 AGG_INLINE color_type pixel(
int x,
int y)
const 2364 if (
const pixel_type* p = pix_value_ptr(x, y))
2368 return color_type::no_color();
2372 AGG_INLINE
void copy_pixel(
int x,
int y,
const color_type& c)
2374 make_pix(pix_value_ptr(x, y, 1), c);
2378 AGG_INLINE
void blend_pixel(
int x,
int y,
const color_type& c, int8u cover)
2380 blend_pix(pix_value_ptr(x, y, 1), c, cover);
2384 AGG_INLINE
void copy_hline(
int x,
int y,
2386 const color_type& c)
2401 AGG_INLINE
void copy_vline(
int x,
int y,
2403 const color_type& c)
2409 *pix_value_ptr(x, y++, 1) = v;
2415 void blend_hline(
int x,
int y,
unsigned len,
2416 const color_type& c, int8u cover)
2422 blend_pix(p, c, cover);
2429 void blend_vline(
int x,
int y,
unsigned len,
2430 const color_type& c, int8u cover)
2434 blend_pix(pix_value_ptr(x, y++, 1), c, cover);
2440 void blend_solid_hspan(
int x,
int y,
unsigned len,
2441 const color_type& c,
const int8u* covers)
2447 blend_pix(p, c, *covers++);
2454 void blend_solid_vspan(
int x,
int y,
unsigned len,
2455 const color_type& c,
const int8u* covers)
2459 blend_pix(pix_value_ptr(x, y++, 1), c, *covers++);
2465 void copy_color_hspan(
int x,
int y,
2467 const color_type* colors)
2480 void copy_color_vspan(
int x,
int y,
2482 const color_type* colors)
2486 pix_value_ptr(x, y++, 1)->set(*colors++);
2492 void blend_color_hspan(
int x,
int y,
unsigned len,
2493 const color_type* colors,
2494 const int8u* covers,
2501 blend_pix(p, *colors++, covers ? *covers++ : cover);
2508 void blend_color_vspan(
int x,
int y,
unsigned len,
2509 const color_type* colors,
2510 const int8u* covers,
2515 blend_pix(pix_value_ptr(x, y++, 1), *colors++, covers ? *covers++ : cover);
2522 template<
class Function>
void for_each_pixel(Function f)
2525 for (y = 0; y < height(); ++y)
2527 row_data r = m_rbuf->row(y);
2530 unsigned len = r.x2 - r.x1 + 1;
2555 template<
class GammaLut>
void apply_gamma_dir(
const GammaLut& g)
2561 template<
class GammaLut>
void apply_gamma_inv(
const GammaLut& g)
2567 template<
class RenBuf2>
void copy_from(
const RenBuf2& from,
2572 if (
const int8u* p = from.row_ptr(ysrc))
2574 std::memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,
2575 p + xsrc * pix_width,
2582 template<
class SrcPixelFormatRenderer>
2583 void blend_from(
const SrcPixelFormatRenderer& from,
2589 typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
2591 if (
const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
2593 pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
2599 psrc = psrc->advance(len - 1);
2600 pdst = pdst->advance(len - 1);
2607 blend_pix(pdst, psrc->get(), cover);
2608 psrc = psrc->advance(srcinc);
2609 pdst = pdst->advance(dstinc);
2617 template<
class SrcPixelFormatRenderer>
2618 void blend_from_color(
const SrcPixelFormatRenderer& from,
2619 const color_type& color,
2625 typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
2626 typedef typename SrcPixelFormatRenderer::color_type src_color_type;
2628 if (
const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
2630 pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
2634 blend_pix(pdst, color,
2635 src_color_type::scale_cover(cover, psrc->c[0]));
2636 psrc = psrc->next();
2637 pdst = pdst->next();
2646 template<
class SrcPixelFormatRenderer>
2647 void blend_from_lut(
const SrcPixelFormatRenderer& from,
2648 const color_type* color_lut,
2654 typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
2656 if (
const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
2658 pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
2662 blend_pix(pdst, color_lut[psrc->c[0]], cover);
2663 psrc = psrc->next();
2664 pdst = pdst->next();