Merge pull request #4683 from yurydelendik/grouppath
Groups path commands into single operation
This commit is contained in:
		
						commit
						a26d28a393
					
				| @ -502,6 +502,18 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | ||||
|       return font; | ||||
|     }, | ||||
| 
 | ||||
|     buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { | ||||
|       var lastIndex = operatorList.length - 1; | ||||
|       if (lastIndex < 0 || | ||||
|           operatorList.fnArray[lastIndex] !== OPS.constructPath) { | ||||
|         operatorList.addOp(OPS.constructPath, [[fn], args]); | ||||
|       } else { | ||||
|         var opArgs = operatorList.argsArray[lastIndex]; | ||||
|         opArgs[0].push(fn); | ||||
|         Array.prototype.push.apply(opArgs[1], args); | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     getOperatorList: function PartialEvaluator_getOperatorList(stream, | ||||
|                                                                resources, | ||||
|                                                                operatorList, | ||||
| @ -525,7 +537,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | ||||
|         var fn = operation.fn; | ||||
|         var shading; | ||||
| 
 | ||||
|         switch (fn) { | ||||
|         switch (fn | 0) { | ||||
|           case OPS.setStrokeColorN: | ||||
|           case OPS.setFillColorN: | ||||
|             if (args[args.length - 1].code) { | ||||
| @ -668,6 +680,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | ||||
|                            stateManager); | ||||
|             args = []; | ||||
|             continue; | ||||
|           case OPS.moveTo: | ||||
|           case OPS.lineTo: | ||||
|           case OPS.curveTo: | ||||
|           case OPS.curveTo2: | ||||
|           case OPS.curveTo3: | ||||
|           case OPS.closePath: | ||||
|             self.buildPath(operatorList, fn, args); | ||||
|             continue; | ||||
|         } | ||||
|         operatorList.addOp(fn, args); | ||||
|       } | ||||
| @ -838,7 +858,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | ||||
|         textState = stateManager.state; | ||||
|         var fn = operation.fn; | ||||
|         var args = operation.args; | ||||
|         switch (fn) { | ||||
|         switch (fn | 0) { | ||||
|           case OPS.setFont: | ||||
|             handleSetFont(args[0].name); | ||||
|             textState.fontSize = args[1]; | ||||
|  | ||||
| @ -968,26 +968,49 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { | ||||
|     }, | ||||
| 
 | ||||
|     // Path
 | ||||
|     moveTo: function CanvasGraphics_moveTo(x, y) { | ||||
|       this.ctx.moveTo(x, y); | ||||
|       this.current.setCurrentPoint(x, y); | ||||
|     }, | ||||
|     lineTo: function CanvasGraphics_lineTo(x, y) { | ||||
|       this.ctx.lineTo(x, y); | ||||
|       this.current.setCurrentPoint(x, y); | ||||
|     }, | ||||
|     curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) { | ||||
|       this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); | ||||
|       this.current.setCurrentPoint(x3, y3); | ||||
|     }, | ||||
|     curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) { | ||||
|     constructPath: function CanvasGraphics_constructPath(ops, args) { | ||||
|       var ctx = this.ctx; | ||||
|       var current = this.current; | ||||
|       this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3); | ||||
|       current.setCurrentPoint(x3, y3); | ||||
|     }, | ||||
|     curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) { | ||||
|       this.curveTo(x1, y1, x3, y3, x3, y3); | ||||
|       this.current.setCurrentPoint(x3, y3); | ||||
|       var x = current.x, y = current.y; | ||||
|       for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { | ||||
|         switch (ops[i] | 0) { | ||||
|           case OPS.moveTo: | ||||
|             x = args[j++]; | ||||
|             y = args[j++]; | ||||
|             ctx.moveTo(x, y); | ||||
|             break; | ||||
|           case OPS.lineTo: | ||||
|             x = args[j++]; | ||||
|             y = args[j++]; | ||||
|             ctx.lineTo(x, y); | ||||
|             break; | ||||
|           case OPS.curveTo: | ||||
|             ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], | ||||
|                               args[j + 4], args[j + 5]); | ||||
|             x = args[j + 4]; | ||||
|             y = args[j + 5]; | ||||
|             j += 6; | ||||
|             break; | ||||
|           case OPS.curveTo2: | ||||
|             ctx.bezierCurveTo(x, y, args[j], args[j + 1], | ||||
|                               args[j + 2], args[j + 3]); | ||||
|             x = args[j + 2]; | ||||
|             y = args[j + 3]; | ||||
|             j += 4; | ||||
|             break; | ||||
|           case OPS.curveTo3: | ||||
|             ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], | ||||
|                               args[j + 2], args[j + 3]); | ||||
|             x = args[j + 2]; | ||||
|             y = args[j + 3]; | ||||
|             j += 4; | ||||
|             break; | ||||
|           case OPS.closePath: | ||||
|             ctx.closePath(); | ||||
|             break; | ||||
|         } | ||||
|       } | ||||
|       current.setCurrentPoint(x, y); | ||||
|     }, | ||||
|     closePath: function CanvasGraphics_closePath() { | ||||
|       this.ctx.closePath(); | ||||
|  | ||||
| @ -152,7 +152,8 @@ var OPS = PDFJS.OPS = { | ||||
|   paintInlineImageXObjectGroup: 87, | ||||
|   paintImageXObjectRepeat: 88, | ||||
|   paintImageMaskXObjectRepeat: 89, | ||||
|   paintSolidColorImageMask: 90 | ||||
|   paintSolidColorImageMask: 90, | ||||
|   constructPath: 91 | ||||
| }; | ||||
| 
 | ||||
| // A notice for devs. These are good for things that are helpful to devs, such
 | ||||
|  | ||||
| @ -115,13 +115,13 @@ describe('evaluator', function() { | ||||
|       var evaluator = new PartialEvaluator(new PdfManagerMock(), | ||||
|                                            new XrefMock(), new HandlerMock(), | ||||
|                                            'prefix'); | ||||
|       var stream = new StringStream('trueifalserinullh'); | ||||
|       var stream = new StringStream('trueifalserinulln'); | ||||
|       var result = evaluator.getOperatorList(stream, new ResourcesMock()); | ||||
|       expect(!!result.fnArray && !!result.argsArray).toEqual(true); | ||||
|       expect(result.fnArray.length).toEqual(3); | ||||
|       expect(result.fnArray[0]).toEqual(OPS.setFlatness); | ||||
|       expect(result.fnArray[1]).toEqual(OPS.setRenderingIntent); | ||||
|       expect(result.fnArray[2]).toEqual(OPS.closePath); | ||||
|       expect(result.fnArray[2]).toEqual(OPS.endPath); | ||||
|       expect(result.argsArray.length).toEqual(3); | ||||
|       expect(result.argsArray[0].length).toEqual(1); | ||||
|       expect(result.argsArray[0][0]).toEqual(true); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user