1*c8164642SStephan Aßmus /* 2*c8164642SStephan Aßmus * Copyright 2005, Stephan Aßmus <superstippi@gmx.de>. 3*c8164642SStephan Aßmus * Copyright 2008, Andrej Spielmann <andrej.spielmann@seh.ox.ac.uk>. 4*c8164642SStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 5*c8164642SStephan Aßmus * 6*c8164642SStephan Aßmus * DrawingMode implementing B_OP_ALPHA in "Pixel Composite" mode on B_RGBA32. 7*c8164642SStephan Aßmus * 8*c8164642SStephan Aßmus */ 9*c8164642SStephan Aßmus 10*c8164642SStephan Aßmus #ifndef DRAWING_MODE_ALPHA_PC_SUBPIX_H 11*c8164642SStephan Aßmus #define DRAWING_MODE_ALPHA_PC_SUBPIX_H 12*c8164642SStephan Aßmus 13*c8164642SStephan Aßmus #include "DrawingMode.h" 14*c8164642SStephan Aßmus 15*c8164642SStephan Aßmus // BLEND_ALPHA_PC_SUBPIX 16*c8164642SStephan Aßmus #define BLEND_ALPHA_PC_SUBPIX(d, r, g, b, a1, a2, a3) \ 17*c8164642SStephan Aßmus { \ 18*c8164642SStephan Aßmus BLEND_COMPOSITE16_SUBPIX(d, r, g, b, a1, a2, a3); \ 19*c8164642SStephan Aßmus } 20*c8164642SStephan Aßmus 21*c8164642SStephan Aßmus 22*c8164642SStephan Aßmus // BLEND_ALPHA_PC 23*c8164642SStephan Aßmus #define BLEND_ALPHA_PC(d, r, g, b, a) \ 24*c8164642SStephan Aßmus { \ 25*c8164642SStephan Aßmus BLEND_COMPOSITE16(d, r, g, b, a); \ 26*c8164642SStephan Aßmus } 27*c8164642SStephan Aßmus 28*c8164642SStephan Aßmus 29*c8164642SStephan Aßmus // ASSIGN_ALPHA_PC 30*c8164642SStephan Aßmus #define ASSIGN_ALPHA_PC(d, r, g, b) \ 31*c8164642SStephan Aßmus { \ 32*c8164642SStephan Aßmus d[0] = (b); \ 33*c8164642SStephan Aßmus d[1] = (g); \ 34*c8164642SStephan Aßmus d[2] = (r); \ 35*c8164642SStephan Aßmus d[3] = 255; \ 36*c8164642SStephan Aßmus } 37*c8164642SStephan Aßmus 38*c8164642SStephan Aßmus 39*c8164642SStephan Aßmus // blend_hline_alpha_pc_subpix 40*c8164642SStephan Aßmus void 41*c8164642SStephan Aßmus blend_hline_alpha_pc_subpix(int x, int y, unsigned len, const color_type& c, 42*c8164642SStephan Aßmus uint8 cover, agg_buffer* buffer, const PatternHandler* pattern) 43*c8164642SStephan Aßmus { 44*c8164642SStephan Aßmus uint8* p = buffer->row_ptr(y) + (x << 2); 45*c8164642SStephan Aßmus do { 46*c8164642SStephan Aßmus rgb_color color = pattern->ColorAt(x, y); 47*c8164642SStephan Aßmus uint16 alpha = color.alpha * cover; 48*c8164642SStephan Aßmus if (alpha) { 49*c8164642SStephan Aßmus if (alpha == 255) { 50*c8164642SStephan Aßmus ASSIGN_ALPHA_PC(p, color.red, color.green, color.blue); 51*c8164642SStephan Aßmus } else { 52*c8164642SStephan Aßmus BLEND_ALPHA_PC(p, color.red, color.green, color.blue, alpha); 53*c8164642SStephan Aßmus } 54*c8164642SStephan Aßmus } 55*c8164642SStephan Aßmus x++; 56*c8164642SStephan Aßmus p += 4; 57*c8164642SStephan Aßmus len -= 3; 58*c8164642SStephan Aßmus } while (len); 59*c8164642SStephan Aßmus } 60*c8164642SStephan Aßmus 61*c8164642SStephan Aßmus 62*c8164642SStephan Aßmus // blend_solid_hspan_alpha_pc_subpix 63*c8164642SStephan Aßmus void 64*c8164642SStephan Aßmus blend_solid_hspan_alpha_pc_subpix(int x, int y, unsigned len, 65*c8164642SStephan Aßmus const color_type& c, const uint8* covers, agg_buffer* buffer, 66*c8164642SStephan Aßmus const PatternHandler* pattern) 67*c8164642SStephan Aßmus { 68*c8164642SStephan Aßmus uint8* p = buffer->row_ptr(y) + (x << 2); 69*c8164642SStephan Aßmus uint16 alphaRed; 70*c8164642SStephan Aßmus uint16 alphaGreen; 71*c8164642SStephan Aßmus uint16 alphaBlue; 72*c8164642SStephan Aßmus do { 73*c8164642SStephan Aßmus rgb_color color = pattern->ColorAt(x, y); 74*c8164642SStephan Aßmus alphaRed = color.alpha * covers[0]; 75*c8164642SStephan Aßmus alphaGreen = color.alpha * covers[1]; 76*c8164642SStephan Aßmus alphaBlue = color.alpha * covers[2]; 77*c8164642SStephan Aßmus BLEND_ALPHA_PC_SUBPIX(p, color.red, color.green, color.blue, 78*c8164642SStephan Aßmus alphaBlue, alphaGreen, alphaRed); 79*c8164642SStephan Aßmus covers += 3; 80*c8164642SStephan Aßmus p += 4; 81*c8164642SStephan Aßmus x++; 82*c8164642SStephan Aßmus len -= 3; 83*c8164642SStephan Aßmus } while (len); 84*c8164642SStephan Aßmus } 85*c8164642SStephan Aßmus 86*c8164642SStephan Aßmus #endif // DRAWING_MODE_ALPHA_PC_SUBPIX_H 87*c8164642SStephan Aßmus 88