Merge pull request #10902 from ahuglajbclajep/tiling-pattern-support
Implement tiling patterns for the SVG back-end
This commit is contained in:
		
						commit
						7fc329d6e3
					
				| @ -982,12 +982,65 @@ SVGGraphics = class SVGGraphics { | |||||||
|    */ |    */ | ||||||
|   _makeColorN_Pattern(args) { |   _makeColorN_Pattern(args) { | ||||||
|     if (args[0] === 'TilingPattern') { |     if (args[0] === 'TilingPattern') { | ||||||
|       warn('Unimplemented pattern TilingPattern'); |       return this._makeTilingPattern(args); | ||||||
|       return null; |  | ||||||
|     } |     } | ||||||
|     return this._makeShadingPattern(args); |     return this._makeShadingPattern(args); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * @private | ||||||
|  |    */ | ||||||
|  |   _makeTilingPattern(args) { | ||||||
|  |     const color = args[1]; | ||||||
|  |     const operatorList = args[2]; | ||||||
|  |     const matrix = args[3] || IDENTITY_MATRIX; | ||||||
|  |     const [x0, y0, x1, y1] = args[4]; | ||||||
|  |     const xstep = args[5]; | ||||||
|  |     const ystep = args[6]; | ||||||
|  |     const paintType = args[7]; | ||||||
|  | 
 | ||||||
|  |     const tilingId = `shading${shadingCount++}`; | ||||||
|  |     const [tx0, ty0] = Util.applyTransform([x0, y0], matrix); | ||||||
|  |     const [tx1, ty1] = Util.applyTransform([x1, y1], matrix); | ||||||
|  |     const [xscale, yscale] = Util.singularValueDecompose2dScale(matrix); | ||||||
|  |     const txstep = xstep * xscale; | ||||||
|  |     const tystep = ystep * yscale; | ||||||
|  | 
 | ||||||
|  |     const tiling = this.svgFactory.createElement('svg:pattern'); | ||||||
|  |     tiling.setAttributeNS(null, 'id', tilingId); | ||||||
|  |     tiling.setAttributeNS(null, 'patternUnits', 'userSpaceOnUse'); | ||||||
|  |     tiling.setAttributeNS(null, 'width', txstep); | ||||||
|  |     tiling.setAttributeNS(null, 'height', tystep); | ||||||
|  |     tiling.setAttributeNS(null, 'x', `${tx0}`); | ||||||
|  |     tiling.setAttributeNS(null, 'y', `${ty0}`); | ||||||
|  | 
 | ||||||
|  |     // Save current state.
 | ||||||
|  |     const svg = this.svg; | ||||||
|  |     const transformMatrix = this.transformMatrix; | ||||||
|  |     const fillColor = this.current.fillColor; | ||||||
|  |     const strokeColor = this.current.strokeColor; | ||||||
|  | 
 | ||||||
|  |     const bbox = this.svgFactory.create(tx1 - tx0, ty1 - ty0); | ||||||
|  |     this.svg = bbox; | ||||||
|  |     this.transformMatrix = matrix; | ||||||
|  |     if (paintType === 2) { | ||||||
|  |       const cssColor = Util.makeCssRgb(...color); | ||||||
|  |       this.current.fillColor = cssColor; | ||||||
|  |       this.current.strokeColor = cssColor; | ||||||
|  |     } | ||||||
|  |     this.executeOpTree(this.convertOpList(operatorList)); | ||||||
|  | 
 | ||||||
|  |     // Restore saved state.
 | ||||||
|  |     this.svg = svg; | ||||||
|  |     this.transformMatrix = transformMatrix; | ||||||
|  |     this.current.fillColor = fillColor; | ||||||
|  |     this.current.strokeColor = strokeColor; | ||||||
|  | 
 | ||||||
|  |     tiling.appendChild(bbox.childNodes[0]); | ||||||
|  |     this.defs.appendChild(tiling); | ||||||
|  |     return `url(#${tilingId})`; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * @private |    * @private | ||||||
|    */ |    */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user