mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:12:44 +00:00 
			
		
		
		
	LibPDF: Clip stroke for B / B* operators
Fixes pages 17-19 on https://www.iro.umontreal.ca/~feeley/papers/ChevalierBoisvertFeeleyECOOP15.pdf Calling the fill handler after painting the stroke as previously doesn't work, since we need to set up the clip before both stroke and fill, and unset it after both. The duplication is a bit unfortunate, but also minor.
This commit is contained in:
		
							parent
							
								
									7c322ec710
								
							
						
					
					
						commit
						24951a039e
					
				
					 1 changed files with 18 additions and 2 deletions
				
			
		|  | @ -388,22 +388,38 @@ RENDERER_HANDLER(path_fill_evenodd) | |||
| 
 | ||||
| RENDERER_HANDLER(path_fill_stroke_nonzero) | ||||
| { | ||||
|     begin_path_paint(); | ||||
|     if (state().stroke_style.has<NonnullRefPtr<Gfx::PaintStyle>>()) { | ||||
|         m_anti_aliasing_painter.stroke_path(m_current_path, state().stroke_style.get<NonnullRefPtr<Gfx::PaintStyle>>(), line_width()); | ||||
|     } else { | ||||
|         m_anti_aliasing_painter.stroke_path(m_current_path, state().stroke_style.get<Color>(), line_width()); | ||||
|     } | ||||
|     return handle_path_fill_nonzero(args); | ||||
|     m_current_path.close_all_subpaths(); | ||||
|     if (state().paint_style.has<NonnullRefPtr<Gfx::PaintStyle>>()) { | ||||
|         m_anti_aliasing_painter.fill_path(m_current_path, state().paint_style.get<NonnullRefPtr<Gfx::PaintStyle>>(), 1.0, Gfx::Painter::WindingRule::Nonzero); | ||||
|     } else { | ||||
|         m_anti_aliasing_painter.fill_path(m_current_path, state().paint_style.get<Color>(), Gfx::Painter::WindingRule::Nonzero); | ||||
|     } | ||||
|     end_path_paint(); | ||||
|     return {}; | ||||
| } | ||||
| 
 | ||||
| RENDERER_HANDLER(path_fill_stroke_evenodd) | ||||
| { | ||||
|     begin_path_paint(); | ||||
|     if (state().stroke_style.has<NonnullRefPtr<Gfx::PaintStyle>>()) { | ||||
|         m_anti_aliasing_painter.stroke_path(m_current_path, state().stroke_style.get<NonnullRefPtr<Gfx::PaintStyle>>(), line_width()); | ||||
|     } else { | ||||
|         m_anti_aliasing_painter.stroke_path(m_current_path, state().stroke_style.get<Color>(), line_width()); | ||||
|     } | ||||
|     return handle_path_fill_evenodd(args); | ||||
|     m_current_path.close_all_subpaths(); | ||||
|     if (state().paint_style.has<NonnullRefPtr<Gfx::PaintStyle>>()) { | ||||
|         m_anti_aliasing_painter.fill_path(m_current_path, state().paint_style.get<NonnullRefPtr<Gfx::PaintStyle>>(), 1.0, Gfx::Painter::WindingRule::EvenOdd); | ||||
|     } else { | ||||
|         m_anti_aliasing_painter.fill_path(m_current_path, state().paint_style.get<Color>(), Gfx::Painter::WindingRule::EvenOdd); | ||||
|     } | ||||
|     end_path_paint(); | ||||
|     return {}; | ||||
| } | ||||
| 
 | ||||
| RENDERER_HANDLER(path_close_fill_stroke_nonzero) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nico Weber
						Nico Weber