[gs-bugs] [Bug 689606] transparency performance
bugs.ghostscript.com-bugzilla-daemon at ghostscript.com
bugs.ghostscript.com-bugzilla-daemon at ghostscript.com
Fri Mar 27 09:08:44 PDT 2009
http://bugs.ghostscript.com/show_bug.cgi?id=689606
henry.stiles at artifex.com changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
Summary|transparency performance |transparency performance
|with many small images |
------- Additional Comments From henry.stiles at artifex.com 2009-03-27 09:08 -------
repurpose this bug for collecting transparency performance examples which will
be shared with rotateright. Here is a shark profile for XPS spec page 1 (make
xps XCFLAGS=-g) and close up of pdf14_compose_group.
# Report 0 - Session 1 - Time Profile of gxps
SharkProfileViewer
# Generated from the visible portion of the outline view
- 67.0%, pdf14_compose_group, gxps
- 5.3%, art_pdf_recomposite_group_8, gxps
- 4.5%, __bzero, libSystem.B.dylib
- 3.7%, blkclr, mach_kernel
- 3.0%, __memcpy, libSystem.B.dylib
2.7%, lo_alltraps, mach_kernel
- 1.8%, ml_set_interrupts_enabled, mach_kernel
- 1.7%, pmap_remove_range, mach_kernel
- 1.5%, pmap_enter, mach_kernel
- 0.9%, OSAddAtomic, mach_kernel
- 0.7%, vm_page_lookup, mach_kernel
- 0.6%, pmap_get_mapwindow, mach_kernel
- 0.4%, vm_page_free_prepare, mach_kernel
- 0.4%, vm_page_grab, mach_kernel
- 0.3%, vm_fault, mach_kernel
- 0.3%, vm_map_lookup_locked, mach_kernel
- 0.3%, hw_lock_unlock, mach_kernel
- 0.2%, hw_lock_to, mach_kernel
- 0.2%, vm_fault_enter, mach_kernel
- 0.2%, vm_page_remove, mach_kernel
- 0.2%, vm_fault_cleanup, mach_kernel
- 0.2%, user_trap, mach_kernel
- 0.2%, vm_page_insert_internal, mach_kernel
- 0.1%, lck_rw_lock_shared, mach_kernel
- 0.1%, usimple_lock, mach_kernel
- 0.1%, thread_cancel_timer, mach_kernel
- 0.1%, pmap64_pdpt, mach_kernel
- 0.1%, mutex_lock_spin, mach_kernel
- 0.1%, pmap_pte, mach_kernel
- 0.1%, vm_page_free_list, mach_kernel
- 0.1%, chudxnu_cpu_free, mach_kernel
- 0.1%, mutex_unlock, mach_kernel
- 0.1%, pmap64_pde, mach_kernel
- 0.1%, vm_page_alloc, mach_kernel
- 0.1%, lck_rw_lock_exclusive, mach_kernel
- 0.1%, image_render_color, gxps
- 0.1%, gx_build_blended_image_row, gxps
- 0.1%, chunk_locate_ptr, gxps
- 0.1%, floor$fenv_access_off, libSystem.B.dylib
- 0.1%, kernel_preempt_check, mach_kernel
- 0.1%, c_pdf14trans_read, gxps
- 0.1%, bzero_phys, mach_kernel
- 0.1%, _disable_preemption, mach_kernel
- 0.1%, mem_true24_fill_rectangle, gxps
- 0.1%, vm_object_lock, mach_kernel
- 0.1%, vm_map_enter, mach_kernel
- 0.1%, vm_page_activate, mach_kernel
- 0.1%, pdf14_preserve_backdrop, gxps
- 0.1%, pdf14_fill_rectangle, gxps
- 0.1%, current_processor, mach_kernel
- 0.1%, lck_rw_done, mach_kernel
215 nos_alpha_g_ptr = nos_ptr + n_chan * nos_planestride;
216 else
217 nos_alpha_g_ptr = NULL;
218
219 if (maskbuf != NULL) {
220 mask_ptr = maskbuf->data + x0 - maskbuf->rect.p.x + ! Int mult
221 (y0 - maskbuf->rect.p.y) * maskbuf->rowstride;
222 mask_planestride = maskbuf->planestride;
223 mask_bg_alpha = maskbuf->alpha;
224 mask_tr_fn = maskbuf->transfer_fn;
225 }
226
227 for (y = y0; y < y1; ++y) {
9.1% 8.5% 228 for (x = 0; x < width; ++x) {
229 byte pix_alpha = alpha;
230
231 /* Complement the components for subtractive color spaces */
3.5% 3.3% 232 if (additive) {
10.4% 9.7% 233 for (i = 0; i < n_chan; ++i) {
14.6% 13.7% 234 tos_pixel[i] = tos_ptr[x + i * tos_planestride];
10.4% 9.7% 235 nos_pixel[i] = nos_ptr[x + i * nos_planestride];
236 }
237 } else {
238 for (i = 0; i < num_comp; ++i) {
239 tos_pixel[i] = 255 - tos_ptr[x + i * tos_planestride];
240 nos_pixel[i] = 255 - nos_ptr[x + i * nos_planestride];
241 }
242 tos_pixel[num_comp] = tos_ptr[x + num_comp * tos_planestride]; ! Int mult
243 nos_pixel[num_comp] = nos_ptr[x + num_comp * nos_planestride]; ! Int mult
244 }
245
1.2% 1.1% 246 if (mask_ptr != NULL) {
4.5% 4.2% 247 int mask_alpha = mask_ptr[x + num_comp * mask_planestride]; !
Int mult
248 int tmp;
249 byte mask;
250
251 /*
252 * The mask data is really monochrome. Thus for additive (RGB)
253 * we use the R channel for alpha since R = G = B. For
254 * subtractive (CMYK) we use the K channel.
255 */
7.0% 6.6% 256 if (mask_alpha == 255) {
257 /* todo: rgba->mask */
258 mask = additive ? mask_ptr[x]
259 : 255 - mask_ptr[x + 3 * mask_planestride];
0.1% 0.1% 260 } else if (mask_alpha == 0)
261 mask = mask_bg_alpha;
262 else {
263 int t2 = additive ? mask_ptr[x]
264 : 255 - mask_ptr[x + 3 * mask_planestride];
265
266 t2 = (t2 - mask_bg_alpha) * mask_alpha + 0x80; ! Int mult
267 mask = mask_bg_alpha + ((t2 + (t2 >> 8)) >> 8);
268 }
269 mask = mask_tr_fn[mask];
2.9% 2.7% 270 tmp = pix_alpha * mask + 0x80; ! Int mult
6.1% 5.7% 271 pix_alpha = (tmp + (tmp >> 8)) >> 8;
272 # if VD_PAINT_MASK
273 vd_pixel(int2fixed(x), int2fixed(y), mask);
274 # endif
275 }
276
1.1% 1.0% 277 if (nos_knockout) {
278 byte *nos_shape_ptr = nos_has_shape ?
279 &nos_ptr[x + nos_shape_offset] : NULL;
280 byte tos_shape = tos_ptr[x + tos_shape_offset];
281
282 art_pdf_composite_knockout_isolated_8(nos_pixel,
283 nos_shape_ptr,
284 tos_pixel,
285 n_chan - 1,
286 tos_shape,
287 pix_alpha, shape);
1.1% 1.1% 288 } else if (tos_isolated) {
289 art_pdf_composite_group_8(nos_pixel, nos_alpha_g_ptr,
290 tos_pixel, n_chan - 1,
291 pix_alpha, blend_mode, pblend_procs);
292 } else {
293 byte tos_alpha_g = tos_ptr[x + tos_alpha_g_offset];
8.0% 13.9% 294 art_pdf_recomposite_group_8(nos_pixel, nos_alpha_g_ptr,
295 tos_pixel, tos_alpha_g, n_chan - 1,
296 pix_alpha, blend_mode, pblend_procs);
297 }
1.1% 1.0% 298 if (nos_has_shape) {
299 nos_ptr[x + nos_shape_offset] =
300 art_pdf_union_mul_8 (nos_ptr[x + nos_shape_offset],
301 tos_ptr[x + tos_shape_offset],
302 shape);
303 }
304
305 /* Complement the results for subtractive color spaces */
306 if (additive) {
12.8% 12.0% 307 for (i = 0; i < n_chan; ++i) {
4.6% 4.3% 308 nos_ptr[x + i * nos_planestride] = nos_pixel[i];
309 }
310 } else {
311 for (i = 0; i < num_comp; ++i)
312 nos_ptr[x + i * nos_planestride] = 255 - nos_pixel[i];
313 nos_ptr[x + num_comp * nos_planestride] = nos_pixel[num_comp];
314 }
315 # if VD_PAINT_COLORS
316 vd_pixel(int2fixed(x), int2fixed(y), n_chan == 1 ?
317 (nos_pixel[0] << 16) + (nos_pixel[0] << 8) + nos_pixel[0] :
318 (nos_pixel[0] << 16) + (nos_pixel[1] << 8) + nos_pixel[2]);
319 # endif
320 # if VD_PAINT_ALPHA
321 vd_pixel(int2fixed(x), int2fixed(y),
322 (nos_pixel[n_chan - 1] << 16) + (nos_pixel[n_chan - 1] << 8) +
323 nos_pixel[n_chan - 1]);
324 # endif
325 if (nos_alpha_g_ptr != NULL)
1.4% 1.3% 326 ++nos_alpha_g_ptr;
327 }
0.0% 0.0% 328 tos_ptr += tos->rowstride;
0.0% 0.0% 329 nos_ptr += nos->rowstride;
330 if (nos_alpha_g_ptr != NULL)
331 nos_alpha_g_ptr += nos->rowstride - width;
332 if (mask_ptr != NULL)
333 mask_ptr += maskbuf->rowstride;
334 }
335 }
------- You are receiving this mail because: -------
You are the QA contact for the bug, or are watching the QA contact.
More information about the gs-bugs
mailing list