mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:12:43 +00:00 
			
		
		
		
	LibPDF: Implement type 2 flex, hflex, hflex1, flex1 operators
This is the type 2 equivalent to type2 othersubr, from what I can tell. See "4.1 Path Construction Operators" in 5177.Type2.pdf, "The Type 2 Charstring Format". Makes text show up alright on https://developer.apple.com/library/archive/documentation/mac/pdf/Text.pdf
This commit is contained in:
		
							parent
							
								
									3e707efdfa
								
							
						
					
					
						commit
						e1a743f286
					
				
					 1 changed files with 85 additions and 6 deletions
				
			
		|  | @ -187,6 +187,18 @@ PDFErrorOr<Type1FontProgram::Glyph> Type1FontProgram::parse_glyph(ReadonlyBytes | |||
|         point.translate_by(dx1 + dx2 + dx3, dy1 + dy2 + dy3); | ||||
|     }; | ||||
| 
 | ||||
|     auto flex = [&](float dx1, float dy1, float dx2, float dy2, float dx3, float dy3, | ||||
|                     float dx4, float dy4, float dx5, float dy5, float dx6, float dy6, | ||||
|                     float flex_depth) { | ||||
|         // FIXME: The beziers are supposed to collapse to a line if the displacement is less
 | ||||
|         //        than flex_depth. For now, we rely on antialiasing, but if we want to implement
 | ||||
|         //        this, we'd have to add a Flex segment type to path and then look at flex_depth
 | ||||
|         //        at rasterization time.
 | ||||
|         (void)flex_depth; | ||||
|         cube_bezier_curve_to(dx1, dy1, dx2, dy2, dx3, dy3); | ||||
|         cube_bezier_curve_to(dx4, dy4, dx5, dy5, dx6, dy6); | ||||
|     }; | ||||
| 
 | ||||
|     // Shared operator logic
 | ||||
|     auto rline_to = [&]() { | ||||
|         auto dx = pop_front(); | ||||
|  | @ -540,14 +552,81 @@ PDFErrorOr<Type1FontProgram::Glyph> Type1FontProgram::parse_glyph(ReadonlyBytes | |||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|                 case Hflex: | ||||
|                 case Flex: | ||||
|                 case Hflex1: | ||||
|                 case Flex1: | ||||
|                     // TODO: implement these
 | ||||
|                     dbgln_if(PDF_DEBUG, "Unimplemented flex: 12 {}", data[i]); | ||||
|                 case Flex: { | ||||
|                     auto flex_depth = pop(); | ||||
|                     auto dy6 = pop(); | ||||
|                     auto dx6 = pop(); | ||||
|                     auto dy5 = pop(); | ||||
|                     auto dx5 = pop(); | ||||
|                     auto dy4 = pop(); | ||||
|                     auto dx4 = pop(); | ||||
|                     auto dy3 = pop(); | ||||
|                     auto dx3 = pop(); | ||||
|                     auto dy2 = pop(); | ||||
|                     auto dx2 = pop(); | ||||
|                     auto dy1 = pop(); | ||||
|                     auto dx1 = pop(); | ||||
|                     flex(dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4, dx5, dy5, dx6, dy6, flex_depth); | ||||
|                     state.sp = 0; | ||||
|                     break; | ||||
|                 } | ||||
|                 case Hflex: { | ||||
|                     auto flex_depth = 50; | ||||
|                     auto dx6 = pop(); | ||||
|                     auto dx5 = pop(); | ||||
|                     auto dx4 = pop(); | ||||
|                     auto dx3 = pop(); | ||||
|                     auto dy2 = pop(); | ||||
|                     auto dx2 = pop(); | ||||
|                     auto dx1 = pop(); | ||||
|                     flex(dx1, 0, dx2, dy2, dx3, 0, dx4, 0, dx5, -dy2, dx6, 0, flex_depth); | ||||
|                     state.sp = 0; | ||||
|                     break; | ||||
|                 } | ||||
|                 case Hflex1: { | ||||
|                     auto flex_depth = 50; | ||||
|                     auto dx6 = pop(); | ||||
|                     auto dy5 = pop(); | ||||
|                     auto dx5 = pop(); | ||||
|                     auto dx4 = pop(); | ||||
|                     auto dx3 = pop(); | ||||
|                     auto dy2 = pop(); | ||||
|                     auto dx2 = pop(); | ||||
|                     auto dy1 = pop(); | ||||
|                     auto dx1 = pop(); | ||||
|                     flex(dx1, dy1, dx2, dy2, dx3, 0, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5), flex_depth); | ||||
|                     state.sp = 0; | ||||
|                     break; | ||||
|                 } | ||||
|                 case Flex1: { | ||||
|                     auto flex_depth = 50; | ||||
|                     auto d6 = pop(); | ||||
|                     auto dy5 = pop(); | ||||
|                     auto dx5 = pop(); | ||||
|                     auto dy4 = pop(); | ||||
|                     auto dx4 = pop(); | ||||
|                     auto dy3 = pop(); | ||||
|                     auto dx3 = pop(); | ||||
|                     auto dy2 = pop(); | ||||
|                     auto dx2 = pop(); | ||||
|                     auto dy1 = pop(); | ||||
|                     auto dx1 = pop(); | ||||
| 
 | ||||
|                     float dx6, dy6; | ||||
|                     auto dx = dx1 + dx2 + dx3 + dx4 + dx5; | ||||
|                     auto dy = dy1 + dy2 + dy3 + dy4 + dy5; | ||||
|                     if (fabs(dx) > fabs(dy)) { | ||||
|                         dx6 = d6; | ||||
|                         dy6 = -dy; | ||||
|                     } else { | ||||
|                         dx6 = -dx; | ||||
|                         dy6 = d6; | ||||
|                     } | ||||
| 
 | ||||
|                     flex(dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4, dx5, dy5, dx6, dy6, flex_depth); | ||||
|                     state.sp = 0; | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|                 default: | ||||
|                     dbgln_if(PDF_DEBUG, "Unhandled command: 12 {}", data[i]); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nico Weber
						Nico Weber