24 #ifndef AGG_PIXFMT_RGB_PACKED_INCLUDED 25 #define AGG_PIXFMT_RGB_PACKED_INCLUDED 28 #include "agg_basics.h" 29 #include "agg_color_rgba.h" 30 #include "agg_rendering_buffer.h" 38 typedef color_type::value_type value_type;
39 typedef color_type::calc_type calc_type;
40 typedef int16u pixel_type;
42 static AGG_INLINE
void blend_pix(pixel_type* p,
43 unsigned cr,
unsigned cg,
unsigned cb,
48 calc_type r = (rgb >> 7) & 0xF8;
49 calc_type g = (rgb >> 2) & 0xF8;
50 calc_type b = (rgb << 3) & 0xF8;
52 (((((cr - r) * alpha + (r << 8)) >> 1) & 0x7C00) |
53 ((((cg - g) * alpha + (g << 8)) >> 6) & 0x03E0) |
54 (((cb - b) * alpha + (b << 8)) >> 11) | 0x8000);
57 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
59 return (pixel_type)(((r & 0xF8) << 7) |
64 static AGG_INLINE color_type make_color(pixel_type p)
66 return color_type((p >> 7) & 0xF8,
77 typedef color_type::value_type value_type;
78 typedef color_type::calc_type calc_type;
79 typedef int16u pixel_type;
81 static AGG_INLINE
void blend_pix(pixel_type* p,
82 unsigned cr,
unsigned cg,
unsigned cb,
86 alpha = color_type::base_mask - alpha;
88 calc_type r = (rgb >> 7) & 0xF8;
89 calc_type g = (rgb >> 2) & 0xF8;
90 calc_type b = (rgb << 3) & 0xF8;
92 ((((r * alpha + cr * cover) >> 1) & 0x7C00) |
93 (((g * alpha + cg * cover) >> 6) & 0x03E0) |
94 ((b * alpha + cb * cover) >> 11) | 0x8000);
97 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
99 return (pixel_type)(((r & 0xF8) << 7) |
104 static AGG_INLINE color_type make_color(pixel_type p)
106 return color_type((p >> 7) & 0xF8,
120 typedef color_type::value_type value_type;
121 typedef color_type::calc_type calc_type;
122 typedef int16u pixel_type;
123 typedef Gamma gamma_type;
126 void gamma(
const gamma_type& g) { m_gamma = &g; }
128 AGG_INLINE
void blend_pix(pixel_type* p,
129 unsigned cr,
unsigned cg,
unsigned cb,
134 calc_type r = m_gamma->dir((rgb >> 7) & 0xF8);
135 calc_type g = m_gamma->dir((rgb >> 2) & 0xF8);
136 calc_type b = m_gamma->dir((rgb << 3) & 0xF8);
138 (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 7) & 0x7C00) |
139 ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 2) & 0x03E0) |
140 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3) | 0x8000);
143 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
145 return (pixel_type)(((r & 0xF8) << 7) |
150 static AGG_INLINE color_type make_color(pixel_type p)
152 return color_type((p >> 7) & 0xF8,
158 const Gamma* m_gamma;
169 typedef color_type::value_type value_type;
170 typedef color_type::calc_type calc_type;
171 typedef int16u pixel_type;
173 static AGG_INLINE
void blend_pix(pixel_type* p,
174 unsigned cr,
unsigned cg,
unsigned cb,
179 calc_type r = (rgb >> 8) & 0xF8;
180 calc_type g = (rgb >> 3) & 0xFC;
181 calc_type b = (rgb << 3) & 0xF8;
183 (((((cr - r) * alpha + (r << 8)) ) & 0xF800) |
184 ((((cg - g) * alpha + (g << 8)) >> 5) & 0x07E0) |
185 (((cb - b) * alpha + (b << 8)) >> 11));
188 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
190 return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
193 static AGG_INLINE color_type make_color(pixel_type p)
195 return color_type((p >> 8) & 0xF8,
207 typedef color_type::value_type value_type;
208 typedef color_type::calc_type calc_type;
209 typedef int16u pixel_type;
211 static AGG_INLINE
void blend_pix(pixel_type* p,
212 unsigned cr,
unsigned cg,
unsigned cb,
216 alpha = color_type::base_mask - alpha;
218 calc_type r = (rgb >> 8) & 0xF8;
219 calc_type g = (rgb >> 3) & 0xFC;
220 calc_type b = (rgb << 3) & 0xF8;
222 ((((r * alpha + cr * cover) ) & 0xF800) |
223 (((g * alpha + cg * cover) >> 5 ) & 0x07E0) |
224 ((b * alpha + cb * cover) >> 11));
227 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
229 return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
232 static AGG_INLINE color_type make_color(pixel_type p)
234 return color_type((p >> 8) & 0xF8,
247 typedef color_type::value_type value_type;
248 typedef color_type::calc_type calc_type;
249 typedef int16u pixel_type;
250 typedef Gamma gamma_type;
253 void gamma(
const gamma_type& g) { m_gamma = &g; }
255 AGG_INLINE
void blend_pix(pixel_type* p,
256 unsigned cr,
unsigned cg,
unsigned cb,
261 calc_type r = m_gamma->dir((rgb >> 8) & 0xF8);
262 calc_type g = m_gamma->dir((rgb >> 3) & 0xFC);
263 calc_type b = m_gamma->dir((rgb << 3) & 0xF8);
265 (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 8) & 0xF800) |
266 ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 3) & 0x07E0) |
267 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3));
270 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
272 return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
275 static AGG_INLINE color_type make_color(pixel_type p)
277 return color_type((p >> 8) & 0xF8,
283 const Gamma* m_gamma;
292 typedef color_type::value_type value_type;
293 typedef color_type::calc_type calc_type;
294 typedef int32u pixel_type;
296 static AGG_INLINE
void blend_pix(pixel_type* p,
297 unsigned cr,
unsigned cg,
unsigned cb,
302 calc_type r = (rgb >> 14) & 0xFFC0;
303 calc_type g = (rgb >> 4) & 0xFFC0;
304 calc_type b = (rgb << 6) & 0xFFC0;
306 (((((cr - r) * alpha + (r << 16)) >> 2) & 0x3FF00000) |
307 ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) |
308 (((cb - b) * alpha + (b << 16)) >> 22) | 0xC0000000);
311 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
313 return (pixel_type)(((r & 0xFFC0) << 14) |
314 ((g & 0xFFC0) << 4) |
315 (b >> 6) | 0xC0000000);
318 static AGG_INLINE color_type make_color(pixel_type p)
320 return color_type((p >> 14) & 0xFFC0,
332 typedef color_type::value_type value_type;
333 typedef color_type::calc_type calc_type;
334 typedef int32u pixel_type;
336 static AGG_INLINE
void blend_pix(pixel_type* p,
337 unsigned cr,
unsigned cg,
unsigned cb,
341 alpha = color_type::base_mask - alpha;
342 cover = (cover + 1) << (color_type::base_shift - 8);
344 calc_type r = (rgb >> 14) & 0xFFC0;
345 calc_type g = (rgb >> 4) & 0xFFC0;
346 calc_type b = (rgb << 6) & 0xFFC0;
348 ((((r * alpha + cr * cover) >> 2) & 0x3FF00000) |
349 (((g * alpha + cg * cover) >> 12) & 0x000FFC00) |
350 ((b * alpha + cb * cover) >> 22) | 0xC0000000);
353 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
355 return (pixel_type)(((r & 0xFFC0) << 14) |
356 ((g & 0xFFC0) << 4) |
357 (b >> 6) | 0xC0000000);
360 static AGG_INLINE color_type make_color(pixel_type p)
362 return color_type((p >> 14) & 0xFFC0,
375 typedef color_type::value_type value_type;
376 typedef color_type::calc_type calc_type;
377 typedef int32u pixel_type;
378 typedef Gamma gamma_type;
381 void gamma(
const gamma_type& g) { m_gamma = &g; }
383 AGG_INLINE
void blend_pix(pixel_type* p,
384 unsigned cr,
unsigned cg,
unsigned cb,
389 calc_type r = m_gamma->dir((rgb >> 14) & 0xFFC0);
390 calc_type g = m_gamma->dir((rgb >> 4) & 0xFFC0);
391 calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0);
393 (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 14) & 0x3FF00000) |
394 ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) |
395 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ) | 0xC0000000);
398 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
400 return (pixel_type)(((r & 0xFFC0) << 14) |
401 ((g & 0xFFC0) << 4) |
402 (b >> 6) | 0xC0000000);
405 static AGG_INLINE color_type make_color(pixel_type p)
407 return color_type((p >> 14) & 0xFFC0,
412 const Gamma* m_gamma;
420 typedef color_type::value_type value_type;
421 typedef color_type::calc_type calc_type;
422 typedef int32u pixel_type;
424 static AGG_INLINE
void blend_pix(pixel_type* p,
425 unsigned cr,
unsigned cg,
unsigned cb,
430 calc_type b = (bgr >> 14) & 0xFFC0;
431 calc_type g = (bgr >> 4) & 0xFFC0;
432 calc_type r = (bgr << 6) & 0xFFC0;
434 (((((cb - b) * alpha + (b << 16)) >> 2) & 0x3FF00000) |
435 ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) |
436 (((cr - r) * alpha + (r << 16)) >> 22) | 0xC0000000);
439 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
441 return (pixel_type)(((b & 0xFFC0) << 14) |
442 ((g & 0xFFC0) << 4) |
443 (r >> 6) | 0xC0000000);
446 static AGG_INLINE color_type make_color(pixel_type p)
448 return color_type((p << 6) & 0xFFC0,
460 typedef color_type::value_type value_type;
461 typedef color_type::calc_type calc_type;
462 typedef int32u pixel_type;
464 static AGG_INLINE
void blend_pix(pixel_type* p,
465 unsigned cr,
unsigned cg,
unsigned cb,
469 alpha = color_type::base_mask - alpha;
470 cover = (cover + 1) << (color_type::base_shift - 8);
472 calc_type b = (bgr >> 14) & 0xFFC0;
473 calc_type g = (bgr >> 4) & 0xFFC0;
474 calc_type r = (bgr << 6) & 0xFFC0;
476 ((((b * alpha + cb * cover) >> 2) & 0x3FF00000) |
477 (((g * alpha + cg * cover) >> 12) & 0x000FFC00) |
478 ((r * alpha + cr * cover) >> 22) | 0xC0000000);
481 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
483 return (pixel_type)(((b & 0xFFC0) << 14) |
484 ((g & 0xFFC0) << 4) |
485 (r >> 6) | 0xC0000000);
488 static AGG_INLINE color_type make_color(pixel_type p)
490 return color_type((p << 6) & 0xFFC0,
503 typedef color_type::value_type value_type;
504 typedef color_type::calc_type calc_type;
505 typedef int32u pixel_type;
506 typedef Gamma gamma_type;
509 void gamma(
const gamma_type& g) { m_gamma = &g; }
511 AGG_INLINE
void blend_pix(pixel_type* p,
512 unsigned cr,
unsigned cg,
unsigned cb,
517 calc_type b = m_gamma->dir((bgr >> 14) & 0xFFC0);
518 calc_type g = m_gamma->dir((bgr >> 4) & 0xFFC0);
519 calc_type r = m_gamma->dir((bgr << 6) & 0xFFC0);
521 (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 14) & 0x3FF00000) |
522 ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) |
523 (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 6 ) | 0xC0000000);
526 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
528 return (pixel_type)(((b & 0xFFC0) << 14) |
529 ((g & 0xFFC0) << 4) |
530 (r >> 6) | 0xC0000000);
533 static AGG_INLINE color_type make_color(pixel_type p)
535 return color_type((p << 6) & 0xFFC0,
541 const Gamma* m_gamma;
550 typedef color_type::value_type value_type;
551 typedef color_type::calc_type calc_type;
552 typedef int32u pixel_type;
554 static AGG_INLINE
void blend_pix(pixel_type* p,
555 unsigned cr,
unsigned cg,
unsigned cb,
560 calc_type r = (rgb >> 16) & 0xFFE0;
561 calc_type g = (rgb >> 5) & 0xFFE0;
562 calc_type b = (rgb << 6) & 0xFFC0;
564 (((((cr - r) * alpha + (r << 16)) ) & 0xFFE00000) |
565 ((((cg - g) * alpha + (g << 16)) >> 11) & 0x001FFC00) |
566 (((cb - b) * alpha + (b << 16)) >> 22));
569 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
571 return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6));
574 static AGG_INLINE color_type make_color(pixel_type p)
576 return color_type((p >> 16) & 0xFFE0,
587 typedef color_type::value_type value_type;
588 typedef color_type::calc_type calc_type;
589 typedef int32u pixel_type;
591 static AGG_INLINE
void blend_pix(pixel_type* p,
592 unsigned cr,
unsigned cg,
unsigned cb,
596 alpha = color_type::base_mask - alpha;
597 cover = (cover + 1) << (color_type::base_shift - 8);
599 calc_type r = (rgb >> 16) & 0xFFE0;
600 calc_type g = (rgb >> 5) & 0xFFE0;
601 calc_type b = (rgb << 6) & 0xFFC0;
603 ((((r * alpha + cr * cover) ) & 0xFFE00000) |
604 (((g * alpha + cg * cover) >> 11) & 0x001FFC00) |
605 ((b * alpha + cb * cover) >> 22));
608 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
610 return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6));
613 static AGG_INLINE color_type make_color(pixel_type p)
615 return color_type((p >> 16) & 0xFFE0,
628 typedef color_type::value_type value_type;
629 typedef color_type::calc_type calc_type;
630 typedef int32u pixel_type;
631 typedef Gamma gamma_type;
634 void gamma(
const gamma_type& g) { m_gamma = &g; }
636 AGG_INLINE
void blend_pix(pixel_type* p,
637 unsigned cr,
unsigned cg,
unsigned cb,
642 calc_type r = m_gamma->dir((rgb >> 16) & 0xFFE0);
643 calc_type g = m_gamma->dir((rgb >> 5) & 0xFFE0);
644 calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0);
646 (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 16) & 0xFFE00000) |
647 ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 5 ) & 0x001FFC00) |
648 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ));
651 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
653 return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6));
656 static AGG_INLINE color_type make_color(pixel_type p)
658 return color_type((p >> 16) & 0xFFE0,
664 const Gamma* m_gamma;
672 typedef color_type::value_type value_type;
673 typedef color_type::calc_type calc_type;
674 typedef int32u pixel_type;
676 static AGG_INLINE
void blend_pix(pixel_type* p,
677 unsigned cr,
unsigned cg,
unsigned cb,
682 calc_type b = (bgr >> 16) & 0xFFC0;
683 calc_type g = (bgr >> 6) & 0xFFE0;
684 calc_type r = (bgr << 5) & 0xFFE0;
686 (((((cb - b) * alpha + (b << 16)) ) & 0xFFC00000) |
687 ((((cg - g) * alpha + (g << 16)) >> 10) & 0x003FF800) |
688 (((cr - r) * alpha + (r << 16)) >> 21));
691 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
693 return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5));
696 static AGG_INLINE color_type make_color(pixel_type p)
698 return color_type((p << 5) & 0xFFE0,
709 typedef color_type::value_type value_type;
710 typedef color_type::calc_type calc_type;
711 typedef int32u pixel_type;
713 static AGG_INLINE
void blend_pix(pixel_type* p,
714 unsigned cr,
unsigned cg,
unsigned cb,
718 alpha = color_type::base_mask - alpha;
719 cover = (cover + 1) << (color_type::base_shift - 8);
721 calc_type b = (bgr >> 16) & 0xFFC0;
722 calc_type g = (bgr >> 6) & 0xFFE0;
723 calc_type r = (bgr << 5) & 0xFFE0;
725 ((((b * alpha + cb * cover) ) & 0xFFC00000) |
726 (((g * alpha + cg * cover) >> 10) & 0x003FF800) |
727 ((r * alpha + cr * cover) >> 21));
730 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
732 return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5));
735 static AGG_INLINE color_type make_color(pixel_type p)
737 return color_type((p << 5) & 0xFFE0,
750 typedef color_type::value_type value_type;
751 typedef color_type::calc_type calc_type;
752 typedef int32u pixel_type;
753 typedef Gamma gamma_type;
756 void gamma(
const gamma_type& g) { m_gamma = &g; }
758 AGG_INLINE
void blend_pix(pixel_type* p,
759 unsigned cr,
unsigned cg,
unsigned cb,
764 calc_type b = m_gamma->dir((bgr >> 16) & 0xFFC0);
765 calc_type g = m_gamma->dir((bgr >> 6) & 0xFFE0);
766 calc_type r = m_gamma->dir((bgr << 5) & 0xFFE0);
768 (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 16) & 0xFFC00000) |
769 ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 6 ) & 0x003FF800) |
770 (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 5 ));
773 static AGG_INLINE pixel_type make_pix(
unsigned r,
unsigned g,
unsigned b)
775 return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5));
778 static AGG_INLINE color_type make_color(pixel_type p)
780 return color_type((p << 5) & 0xFFE0,
786 const Gamma* m_gamma;
795 typedef RenBuf rbuf_type;
796 typedef typename rbuf_type::row_data row_data;
797 typedef Blender blender_type;
798 typedef typename blender_type::color_type color_type;
799 typedef typename blender_type::pixel_type pixel_type;
800 typedef int order_type;
801 typedef typename color_type::value_type value_type;
802 typedef typename color_type::calc_type calc_type;
805 base_shift = color_type::base_shift,
806 base_scale = color_type::base_scale,
807 base_mask = color_type::base_mask,
808 pix_width =
sizeof(pixel_type),
813 AGG_INLINE
void copy_or_blend_pix(pixel_type* p,
const color_type& c,
unsigned cover)
817 calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
818 if(alpha == base_mask)
820 *p = m_blender.make_pix(c.r, c.g, c.b);
824 m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover);
832 void attach(rbuf_type& rb) { m_rbuf = &rb; }
835 template<
class PixFmt>
836 bool attach(PixFmt& pixf,
int x1,
int y1,
int x2,
int y2)
839 if(r.clip(
rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
841 int stride = pixf.stride();
842 m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1),
851 Blender& blender() {
return m_blender; }
854 AGG_INLINE
unsigned width()
const {
return m_rbuf->width(); }
855 AGG_INLINE
unsigned height()
const {
return m_rbuf->height(); }
856 AGG_INLINE
int stride()
const {
return m_rbuf->stride(); }
859 AGG_INLINE int8u* row_ptr(
int y) {
return m_rbuf->row_ptr(y); }
860 AGG_INLINE
const int8u* row_ptr(
int y)
const {
return m_rbuf->row_ptr(y); }
861 AGG_INLINE row_data row(
int y)
const {
return m_rbuf->row(y); }
864 AGG_INLINE int8u* pix_ptr(
int x,
int y)
866 return m_rbuf->row_ptr(y) + x * pix_width;
869 AGG_INLINE
const int8u* pix_ptr(
int x,
int y)
const 871 return m_rbuf->row_ptr(y) + x * pix_width;
875 AGG_INLINE
void make_pix(int8u* p,
const color_type& c)
877 *(pixel_type*)p = m_blender.make_pix(c.r, c.g, c.b);
881 AGG_INLINE color_type pixel(
int x,
int y)
const 883 return m_blender.make_color(((pixel_type*)m_rbuf->row_ptr(y))[x]);
887 AGG_INLINE
void copy_pixel(
int x,
int y,
const color_type& c)
890 m_rbuf->row_ptr(x, y, 1))[x] =
891 m_blender.make_pix(c.r, c.g, c.b);
895 AGG_INLINE
void blend_pixel(
int x,
int y,
const color_type& c, int8u cover)
897 copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y, 1) + x, c, cover);
901 AGG_INLINE
void copy_hline(
int x,
int y,
905 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
906 pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
915 AGG_INLINE
void copy_vline(
int x,
int y,
919 pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
922 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x;
929 void blend_hline(
int x,
int y,
936 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
937 calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
938 if(alpha == base_mask)
940 pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
951 m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover);
960 void blend_vline(
int x,
int y,
967 calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
968 if(alpha == base_mask)
970 pixel_type v = m_blender.make_pix(c.r, c.g, c.b);
973 ((pixel_type*)m_rbuf->row_ptr(x, y++, 1))[x] = v;
982 (pixel_type*)m_rbuf->row_ptr(x, y++, 1),
983 c.r, c.g, c.b, alpha, cover);
991 void blend_solid_hspan(
int x,
int y,
996 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
999 copy_or_blend_pix(p, c, *covers++);
1006 void blend_solid_vspan(
int x,
int y,
1008 const color_type& c,
1009 const int8u* covers)
1013 copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x,
1020 void copy_color_hspan(
int x,
int y,
1022 const color_type* colors)
1024 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
1027 *p++ = m_blender.make_pix(colors->r, colors->g, colors->b);
1034 void copy_color_vspan(
int x,
int y,
1036 const color_type* colors)
1040 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x;
1041 *p = m_blender.make_pix(colors->r, colors->g, colors->b);
1048 void blend_color_hspan(
int x,
int y,
1050 const color_type* colors,
1051 const int8u* covers,
1054 pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x;
1057 copy_or_blend_pix(p++, *colors++, covers ? *covers++ : cover);
1063 void blend_color_vspan(
int x,
int y,
1065 const color_type* colors,
1066 const int8u* covers,
1071 copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x,
1072 *colors++, covers ? *covers++ : cover);
1078 template<
class RenBuf2>
1079 void copy_from(
const RenBuf2& from,
1084 const int8u* p = from.row_ptr(ysrc);
1087 std::memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,
1088 p + xsrc * pix_width,
1094 template<
class SrcPixelFormatRenderer>
1095 void blend_from(
const SrcPixelFormatRenderer& from,
1101 typedef typename SrcPixelFormatRenderer::order_type src_order;
1103 const value_type* psrc = (
const value_type*)from.row_ptr(ysrc);
1108 (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
1111 value_type alpha = psrc[src_order::A];
1114 if(alpha == base_mask && cover == 255)
1116 *pdst = m_blender.make_pix(psrc[src_order::R],
1118 psrc[src_order::B]);
1122 m_blender.blend_pix(pdst,
1138 template<
class SrcPixelFormatRenderer>
1139 void blend_from_color(
const SrcPixelFormatRenderer& from,
1140 const color_type& color,
1146 typedef typename SrcPixelFormatRenderer::value_type src_value_type;
1147 typedef typename SrcPixelFormatRenderer::color_type src_color_type;
1148 const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
1151 psrc += xsrc * SrcPixelFormatRenderer::pix_step + SrcPixelFormatRenderer::pix_offset;
1153 (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
1157 m_blender.blend_pix(pdst,
1158 color.r, color.g, color.b, color.a,
1160 psrc += SrcPixelFormatRenderer::pix_step;
1168 template<
class SrcPixelFormatRenderer>
1169 void blend_from_lut(
const SrcPixelFormatRenderer& from,
1170 const color_type* color_lut,
1176 typedef typename SrcPixelFormatRenderer::value_type src_value_type;
1177 const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
1180 psrc += xsrc * SrcPixelFormatRenderer::pix_step + SrcPixelFormatRenderer::pix_offset;
1182 (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
1186 const color_type& color = color_lut[*psrc];
1187 m_blender.blend_pix(pdst,
1188 color.r, color.g, color.b, color.a,
1190 psrc += SrcPixelFormatRenderer::pix_step;
1231 this->blender().gamma(g);
1244 this->blender().gamma(g);
1259 this->blender().gamma(g);
1274 this->blender().gamma(g);
1289 this->blender().gamma(g);
1304 this->blender().gamma(g);