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; |       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, |     getOperatorList: function PartialEvaluator_getOperatorList(stream, | ||||||
|                                                                resources, |                                                                resources, | ||||||
|                                                                operatorList, |                                                                operatorList, | ||||||
| @ -525,7 +537,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | |||||||
|         var fn = operation.fn; |         var fn = operation.fn; | ||||||
|         var shading; |         var shading; | ||||||
| 
 | 
 | ||||||
|         switch (fn) { |         switch (fn | 0) { | ||||||
|           case OPS.setStrokeColorN: |           case OPS.setStrokeColorN: | ||||||
|           case OPS.setFillColorN: |           case OPS.setFillColorN: | ||||||
|             if (args[args.length - 1].code) { |             if (args[args.length - 1].code) { | ||||||
| @ -668,6 +680,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | |||||||
|                            stateManager); |                            stateManager); | ||||||
|             args = []; |             args = []; | ||||||
|             continue; |             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); |         operatorList.addOp(fn, args); | ||||||
|       } |       } | ||||||
| @ -838,7 +858,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | |||||||
|         textState = stateManager.state; |         textState = stateManager.state; | ||||||
|         var fn = operation.fn; |         var fn = operation.fn; | ||||||
|         var args = operation.args; |         var args = operation.args; | ||||||
|         switch (fn) { |         switch (fn | 0) { | ||||||
|           case OPS.setFont: |           case OPS.setFont: | ||||||
|             handleSetFont(args[0].name); |             handleSetFont(args[0].name); | ||||||
|             textState.fontSize = args[1]; |             textState.fontSize = args[1]; | ||||||
|  | |||||||
| @ -968,26 +968,49 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { | |||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     // Path
 |     // Path
 | ||||||
|     moveTo: function CanvasGraphics_moveTo(x, y) { |     constructPath: function CanvasGraphics_constructPath(ops, args) { | ||||||
|       this.ctx.moveTo(x, y); |       var ctx = this.ctx; | ||||||
|       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) { |  | ||||||
|       var current = this.current; |       var current = this.current; | ||||||
|       this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3); |       var x = current.x, y = current.y; | ||||||
|       current.setCurrentPoint(x3, y3); |       for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { | ||||||
|     }, |         switch (ops[i] | 0) { | ||||||
|     curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) { |           case OPS.moveTo: | ||||||
|       this.curveTo(x1, y1, x3, y3, x3, y3); |             x = args[j++]; | ||||||
|       this.current.setCurrentPoint(x3, y3); |             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() { |     closePath: function CanvasGraphics_closePath() { | ||||||
|       this.ctx.closePath(); |       this.ctx.closePath(); | ||||||
|  | |||||||
| @ -152,7 +152,8 @@ var OPS = PDFJS.OPS = { | |||||||
|   paintInlineImageXObjectGroup: 87, |   paintInlineImageXObjectGroup: 87, | ||||||
|   paintImageXObjectRepeat: 88, |   paintImageXObjectRepeat: 88, | ||||||
|   paintImageMaskXObjectRepeat: 89, |   paintImageMaskXObjectRepeat: 89, | ||||||
|   paintSolidColorImageMask: 90 |   paintSolidColorImageMask: 90, | ||||||
|  |   constructPath: 91 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // A notice for devs. These are good for things that are helpful to devs, such
 | // 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(), |       var evaluator = new PartialEvaluator(new PdfManagerMock(), | ||||||
|                                            new XrefMock(), new HandlerMock(), |                                            new XrefMock(), new HandlerMock(), | ||||||
|                                            'prefix'); |                                            'prefix'); | ||||||
|       var stream = new StringStream('trueifalserinullh'); |       var stream = new StringStream('trueifalserinulln'); | ||||||
|       var result = evaluator.getOperatorList(stream, new ResourcesMock()); |       var result = evaluator.getOperatorList(stream, new ResourcesMock()); | ||||||
|       expect(!!result.fnArray && !!result.argsArray).toEqual(true); |       expect(!!result.fnArray && !!result.argsArray).toEqual(true); | ||||||
|       expect(result.fnArray.length).toEqual(3); |       expect(result.fnArray.length).toEqual(3); | ||||||
|       expect(result.fnArray[0]).toEqual(OPS.setFlatness); |       expect(result.fnArray[0]).toEqual(OPS.setFlatness); | ||||||
|       expect(result.fnArray[1]).toEqual(OPS.setRenderingIntent); |       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.length).toEqual(3); | ||||||
|       expect(result.argsArray[0].length).toEqual(1); |       expect(result.argsArray[0].length).toEqual(1); | ||||||
|       expect(result.argsArray[0][0]).toEqual(true); |       expect(result.argsArray[0][0]).toEqual(true); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user