42
42
#include " renderers/agg/include/agg_span_pattern_rgba.h"
43
43
#include " renderers/agg/include/agg_span_allocator.h"
44
44
#include " renderers/agg/include/agg_span_interpolator_linear.h"
45
- #include " renderers/agg/include/agg_span_image_filter_rgba.h"
46
45
#include " renderers/agg/include/agg_pattern_filters_rgba.h"
47
- #include " renderers/agg/include/agg_span_image_filter_rgb.h"
48
46
#include " renderers/agg/include/agg_image_accessors.h"
49
47
#include " renderers/agg/include/agg_conv_stroke.h"
50
48
#include " renderers/agg/include/agg_conv_dash.h"
51
49
#include " renderers/agg/include/agg_font_freetype.h"
52
50
#include " renderers/agg/include/agg_conv_contour.h"
53
51
#include " renderers/agg/include/agg_ellipse.h"
54
52
#include " renderers/agg/include/agg_gamma_functions.h"
53
+ #include " renderers/agg/include/agg_blur.h"
55
54
56
55
#include " renderers/agg/include/agg_rasterizer_outline_aa.h"
57
56
#include " renderers/agg/include/agg_renderer_outline_aa.h"
64
63
65
64
#include " renderers/agg/include/agg_conv_clipper.h"
66
65
66
+ #ifdef USE_PIXMAN
67
+ #include < pixman.h>
68
+ #endif
69
+
67
70
#ifdef AGG_ALIASED_ENABLED
68
71
#include " renderers/agg/include/agg_renderer_primitives.h"
69
72
#include " renderers/agg/include/agg_rasterizer_outline.h"
@@ -78,10 +81,13 @@ typedef mapserver::rgba8 color_type;
78
81
typedef mapserver::pixel32_type pixel_type;
79
82
80
83
typedef mapserver::blender_rgba_pre<color_type, band_order> blender_pre;
84
+ typedef mapserver::comp_op_adaptor_rgba_pre<color_type, band_order> compop_blender_pre;
81
85
82
86
typedef mapserver::pixfmt_alpha_blend_rgba<blender_pre, mapserver::rendering_buffer, pixel_type> pixel_format;
87
+ typedef mapserver::pixfmt_custom_blend_rgba<compop_blender_pre, mapserver::rendering_buffer> compop_pixel_format;
83
88
typedef mapserver::rendering_buffer rendering_buffer;
84
89
typedef mapserver::renderer_base<pixel_format> renderer_base;
90
+ typedef mapserver::renderer_base<compop_pixel_format> compop_renderer_base;
85
91
typedef mapserver::renderer_scanline_aa_solid<renderer_base> renderer_scanline;
86
92
typedef mapserver::rasterizer_scanline_aa<> rasterizer_scanline;
87
93
typedef mapserver::font_engine_freetype_int16 font_engine_type;
@@ -136,7 +142,9 @@ class AGG2Renderer
136
142
band_type* buffer;
137
143
rendering_buffer m_rendering_buffer;
138
144
pixel_format m_pixel_format;
145
+ compop_pixel_format m_compop_pixel_format;
139
146
renderer_base m_renderer_base;
147
+ compop_renderer_base m_compop_renderer_base;
140
148
renderer_scanline m_renderer_scanline;
141
149
#ifdef AGG_ALIASED_ENABLED
142
150
renderer_primitives m_renderer_primitives;
@@ -826,7 +834,9 @@ imageObj *agg2CreateImage(int width, int height, outputFormatObj *format, colorO
826
834
}
827
835
r->m_rendering_buffer .attach (r->buffer , width, height, width * 4 );
828
836
r->m_pixel_format .attach (r->m_rendering_buffer );
837
+ r->m_compop_pixel_format .attach (r->m_rendering_buffer );
829
838
r->m_renderer_base .attach (r->m_pixel_format );
839
+ r->m_compop_renderer_base .attach (r->m_compop_pixel_format );
830
840
r->m_renderer_scanline .attach (r->m_renderer_base );
831
841
r->default_gamma = atof (msGetOutputFormatOption ( format, " GAMMA" , " 0.75" ));
832
842
if (r->default_gamma <= 0.0 || r->default_gamma >= 1.0 ) {
@@ -1119,7 +1129,7 @@ int msHatchPolygon(imageObj *img, shapeObj *poly, double spacing, double width,
1119
1129
1120
1130
1121
1131
if (patternlength>1 ) {
1122
- // dash the hatch and render it clipped by the shape
1132
+ // dash the color- hatch and render it clipped by the shape
1123
1133
mapserver::conv_dash<mapserver::path_storage > dash (hatch);
1124
1134
mapserver::conv_stroke<mapserver::conv_dash<mapserver::path_storage> > stroke (dash);
1125
1135
for (int i=0 ; i<patternlength; i+=2 ) {
@@ -1146,10 +1156,194 @@ int msHatchPolygon(imageObj *img, shapeObj *poly, double spacing, double width,
1146
1156
return MS_SUCCESS;
1147
1157
}
1148
1158
1159
+ #ifdef USE_PIXMAN
1160
+ static pixman_op_t ms2pixman_compop (CompositingOperation c) {
1161
+ switch (c) {
1162
+ case MS_COMPOP_CLEAR:
1163
+ return PIXMAN_OP_CLEAR;
1164
+ case MS_COMPOP_SRC:
1165
+ return PIXMAN_OP_SRC;
1166
+ case MS_COMPOP_DST:
1167
+ return PIXMAN_OP_DST;
1168
+ case MS_COMPOP_SRC_OVER:
1169
+ return PIXMAN_OP_OVER;
1170
+ case MS_COMPOP_DST_OVER:
1171
+ return PIXMAN_OP_OVER_REVERSE;
1172
+ case MS_COMPOP_SRC_IN:
1173
+ return PIXMAN_OP_IN;
1174
+ case MS_COMPOP_DST_IN:
1175
+ return PIXMAN_OP_IN_REVERSE;
1176
+ case MS_COMPOP_SRC_OUT:
1177
+ return PIXMAN_OP_OUT;
1178
+ case MS_COMPOP_DST_OUT:
1179
+ return PIXMAN_OP_OUT_REVERSE;
1180
+ case MS_COMPOP_SRC_ATOP:
1181
+ return PIXMAN_OP_ATOP;
1182
+ case MS_COMPOP_DST_ATOP:
1183
+ return PIXMAN_OP_ATOP_REVERSE;
1184
+ case MS_COMPOP_XOR:
1185
+ return PIXMAN_OP_XOR;
1186
+ case MS_COMPOP_PLUS:
1187
+ return PIXMAN_OP_ADD;
1188
+ case MS_COMPOP_MULTIPLY:
1189
+ return PIXMAN_OP_MULTIPLY;
1190
+ case MS_COMPOP_SCREEN:
1191
+ return PIXMAN_OP_SCREEN;
1192
+ case MS_COMPOP_OVERLAY:
1193
+ return PIXMAN_OP_OVERLAY;
1194
+ case MS_COMPOP_DARKEN:
1195
+ return PIXMAN_OP_DARKEN;
1196
+ case MS_COMPOP_LIGHTEN:
1197
+ return PIXMAN_OP_LIGHTEN;
1198
+ case MS_COMPOP_COLOR_DODGE:
1199
+ return PIXMAN_OP_COLOR_DODGE;
1200
+ case MS_COMPOP_COLOR_BURN:
1201
+ return PIXMAN_OP_COLOR_DODGE;
1202
+ case MS_COMPOP_HARD_LIGHT:
1203
+ return PIXMAN_OP_HARD_LIGHT;
1204
+ case MS_COMPOP_SOFT_LIGHT:
1205
+ return PIXMAN_OP_SOFT_LIGHT;
1206
+ case MS_COMPOP_DIFFERENCE:
1207
+ return PIXMAN_OP_DIFFERENCE;
1208
+ case MS_COMPOP_EXCLUSION:
1209
+ return PIXMAN_OP_EXCLUSION;
1210
+ case MS_COMPOP_INVERT:
1211
+ case MS_COMPOP_INVERT_RGB:
1212
+ case MS_COMPOP_MINUS:
1213
+ case MS_COMPOP_CONTRAST:
1214
+ default :
1215
+ return PIXMAN_OP_OVER;
1216
+ }
1217
+ }
1218
+ #else
1219
+ static mapserver::comp_op_e ms2agg_compop (CompositingOperation c) {
1220
+ switch (c) {
1221
+ case MS_COMPOP_CLEAR:
1222
+ return mapserver::comp_op_clear;
1223
+ case MS_COMPOP_SRC:
1224
+ return mapserver::comp_op_src;
1225
+ case MS_COMPOP_DST:
1226
+ return mapserver::comp_op_dst;
1227
+ case MS_COMPOP_SRC_OVER:
1228
+ return mapserver::comp_op_src_over;
1229
+ case MS_COMPOP_DST_OVER:
1230
+ return mapserver::comp_op_dst_over;
1231
+ case MS_COMPOP_SRC_IN:
1232
+ return mapserver::comp_op_src_in;
1233
+ case MS_COMPOP_DST_IN:
1234
+ return mapserver::comp_op_dst_in;
1235
+ case MS_COMPOP_SRC_OUT:
1236
+ return mapserver::comp_op_src_out;
1237
+ case MS_COMPOP_DST_OUT:
1238
+ return mapserver::comp_op_dst_out;
1239
+ case MS_COMPOP_SRC_ATOP:
1240
+ return mapserver::comp_op_src_atop;
1241
+ case MS_COMPOP_DST_ATOP:
1242
+ return mapserver::comp_op_dst_atop;
1243
+ case MS_COMPOP_XOR:
1244
+ return mapserver::comp_op_xor;
1245
+ case MS_COMPOP_PLUS:
1246
+ return mapserver::comp_op_plus;
1247
+ case MS_COMPOP_MINUS:
1248
+ return mapserver::comp_op_minus;
1249
+ case MS_COMPOP_MULTIPLY:
1250
+ return mapserver::comp_op_multiply;
1251
+ case MS_COMPOP_SCREEN:
1252
+ return mapserver::comp_op_screen;
1253
+ case MS_COMPOP_OVERLAY:
1254
+ return mapserver::comp_op_overlay;
1255
+ case MS_COMPOP_DARKEN:
1256
+ return mapserver::comp_op_darken;
1257
+ case MS_COMPOP_LIGHTEN:
1258
+ return mapserver::comp_op_lighten;
1259
+ case MS_COMPOP_COLOR_DODGE:
1260
+ return mapserver::comp_op_color_dodge;
1261
+ case MS_COMPOP_COLOR_BURN:
1262
+ return mapserver::comp_op_color_burn;
1263
+ case MS_COMPOP_HARD_LIGHT:
1264
+ return mapserver::comp_op_hard_light;
1265
+ case MS_COMPOP_SOFT_LIGHT:
1266
+ return mapserver::comp_op_soft_light;
1267
+ case MS_COMPOP_DIFFERENCE:
1268
+ return mapserver::comp_op_difference;
1269
+ case MS_COMPOP_EXCLUSION:
1270
+ return mapserver::comp_op_exclusion;
1271
+ case MS_COMPOP_CONTRAST:
1272
+ return mapserver::comp_op_contrast;
1273
+ case MS_COMPOP_INVERT:
1274
+ return mapserver::comp_op_invert;
1275
+ case MS_COMPOP_INVERT_RGB:
1276
+ return mapserver::comp_op_invert_rgb;
1277
+ default :
1278
+ return mapserver::comp_op_src_over;
1279
+ }
1280
+ }
1281
+ #endif
1282
+
1283
+ int aggCompositeRasterBuffer (imageObj *dest, rasterBufferObj *overlay, CompositingOperation comp, int opacity) {
1284
+ assert (overlay->type == MS_BUFFER_BYTE_RGBA);
1285
+ AGG2Renderer *r = AGG_RENDERER (dest);
1286
+ #ifdef USE_PIXMAN
1287
+ pixman_image_t *si = pixman_image_create_bits (PIXMAN_a8r8g8b8,overlay->width ,overlay->height ,
1288
+ (uint32_t *)overlay->data .rgba .pixels ,overlay->data .rgba .row_step );
1289
+ pixman_image_t *bi = pixman_image_create_bits (PIXMAN_a8r8g8b8,dest->width ,dest->height ,
1290
+ (uint32_t *)r->buffer ,dest->width *4 );
1291
+ pixman_image_t *alpha_mask_i=NULL , *alpha_mask_i_ptr;
1292
+ pixman_image_set_filter (si,PIXMAN_FILTER_NEAREST, NULL , 0 );
1293
+ unsigned char *alpha_mask = NULL ;
1294
+ if (opacity > 0 ) {
1295
+ if (opacity == 100 ) {
1296
+ alpha_mask_i_ptr = NULL ;
1297
+ } else {
1298
+ unsigned char alpha = (unsigned char )(opacity * 2.55 );
1299
+ if (!alpha_mask_i) {
1300
+ alpha_mask = (unsigned char *)msSmallMalloc (dest->width * dest->height );
1301
+ alpha_mask_i = pixman_image_create_bits (PIXMAN_a8,dest->width ,dest->height ,
1302
+ (uint32_t *)alpha_mask,dest->width );
1303
+ }
1304
+ memset (alpha_mask,alpha,dest->width *dest->height );
1305
+ alpha_mask_i_ptr = alpha_mask_i;
1306
+ }
1307
+ pixman_image_composite (ms2pixman_compop (comp), si, alpha_mask_i_ptr, bi,
1308
+ 0 , 0 , 0 , 0 , 0 , 0 , dest->width ,dest->height );
1309
+ }
1310
+ pixman_image_unref (si);
1311
+ pixman_image_unref (bi);
1312
+ if (alpha_mask_i) {
1313
+ pixman_image_unref (alpha_mask_i);
1314
+ msFree (alpha_mask);
1315
+ }
1316
+ return MS_SUCCESS;
1317
+ #else
1318
+ rendering_buffer b (overlay->data .rgba .pixels , overlay->width , overlay->height , overlay->data .rgba .row_step );
1319
+ pixel_format pf (b);
1320
+ mapserver::comp_op_e comp_op = ms2agg_compop (comp);
1321
+ if (comp == mapserver::comp_op_src_over) {
1322
+ r->m_renderer_base .blend_from (pf,0 ,0 ,0 ,unsigned (opacity * 2.55 ));
1323
+ } else {
1324
+ compop_pixel_format pixf (r->m_rendering_buffer );
1325
+ compop_renderer_base ren (pixf);
1326
+ pixf.comp_op (comp_op);
1327
+ ren.blend_from (pf,0 ,0 ,0 ,unsigned (opacity * 2.55 ));
1328
+ }
1329
+ return MS_SUCCESS;
1330
+ #endif
1331
+ }
1332
+
1333
+ rasterBufferObj* msApplyFilterToRasterBuffer (const rasterBufferObj *rb, CompositingFilter *filter) {
1334
+ rasterBufferObj *rbret = (rasterBufferObj*)msSmallCalloc (sizeof (rasterBufferObj),1 );
1335
+ msCopyRasterBuffer (rbret,rb);
1336
+ rendering_buffer b (rbret->data .rgba .pixels , rbret->width , rbret->height , rbret->data .rgba .row_step );
1337
+ pixel_format pf (b);
1338
+ /* for now, we only support a blurring filter */
1339
+ int radius = atoi (filter->filter );
1340
+ mapserver::stack_blur_rgba32 (pf,radius,radius);
1341
+ return rbret;
1342
+ }
1149
1343
1150
1344
int msPopulateRendererVTableAGG (rendererVTableObj * renderer)
1151
1345
{
1152
- renderer->supports_transparent_layers = 0 ;
1346
+ renderer->compositeRasterBuffer = &aggCompositeRasterBuffer ;
1153
1347
renderer->supports_pixel_buffer = 1 ;
1154
1348
renderer->use_imagecache = 0 ;
1155
1349
renderer->supports_clipping = 0 ;
0 commit comments