void _drawWithMaskFilter(uiRect meshBounds, uiPaint paint, uiMaskFilter maskFilter, uiMeshMesh fillMesh, uiMeshMesh strokeMesh, bool convex, float alpha, float strokeMult, Texture tex, uiRect texBound, TextBlobMesh textMesh, bool notEmoji, _drawPathDrawMeshCallbackDelegate drawCallback) { var layer = this._currentLayer; var clipBounds = layer.layerBounds; uiRect?stackBounds; bool iior; layer.clipStack.getBounds(out stackBounds, out iior); if (stackBounds != null) { clipBounds = uiRectHelper.intersect(clipBounds, stackBounds.Value); } if (clipBounds.isEmpty) { this._drawPathDrawMeshQuit(fillMesh, strokeMesh, textMesh); return; } var state = layer.currentState; float sigma = state.scale * maskFilter.sigma; if (sigma <= 0) { this._drawPathDrawMeshQuit(fillMesh, strokeMesh, textMesh); return; } float sigma3 = 3 * sigma; var maskBounds = uiRectHelper.inflate(meshBounds, sigma3); maskBounds = uiRectHelper.intersect(maskBounds, uiRectHelper.inflate(clipBounds, sigma3)); if (maskBounds.isEmpty) { this._drawPathDrawMeshQuit(fillMesh, strokeMesh, textMesh); return; } var maskLayer = this._createMaskLayer(layer, maskBounds, drawCallback, paint, convex, alpha, strokeMult, tex, texBound, textMesh, fillMesh, strokeMesh, notEmoji); var blurLayer = this._createBlurLayer(maskLayer, sigma, sigma, layer); var blurMesh = ImageMeshGenerator.imageMesh(null, uiRectHelper.one, maskBounds); if (!this._applyClip(blurMesh.bounds)) { ObjectPool <uiMeshMesh> .release(blurMesh); return; } layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer)); }
void _restore() { var layer = this._currentLayer; D.assert(layer.states.Count > 0); if (layer.states.Count > 1) { ObjectPool <State> .release(layer.states[layer.states.Count - 1]); layer.states.RemoveAt(layer.states.Count - 1); layer.currentState = layer.states[layer.states.Count - 1]; layer.clipStack.restore(); return; } this._layers.RemoveAt(this._layers.Count - 1); var currentLayer = this._currentLayer = this._layers[this._layers.Count - 1]; var state = currentLayer.currentState; var mesh = ImageMeshGenerator.imageMesh(state.matrix, uiRectHelper.one, layer.layerBounds); if (!this._applyClip(mesh.bounds)) { ObjectPool <uiMeshMesh> .release(mesh); return; } var renderDraw = CanvasShader.texRT(currentLayer, layer.layerPaint.Value, mesh, layer); currentLayer.draws.Add(renderDraw); }
public void restore() { this._saveCount--; var layer = this._getLayer(); D.assert(layer.states.Count > 0); if (layer.states.Count > 1) { layer.states.RemoveAt(layer.states.Count - 1); layer.clipStack.restore(); return; } this._layers.RemoveAt(this._layers.Count - 1); var state = this._getState(); var mesh = ImageMeshGenerator.imageMesh(state.matrix, Rect.one, layer.layerBounds); if (!this._applyClip(mesh.bounds)) { return; } var renderDraw = CanvasShader.texRT(this._getLayer(), layer.layerPaint, mesh, layer); this._getLayer().draws.Add(renderDraw); }
void _drawWithMaskFilter(Rect meshBounds, Action <Paint> drawAction, Paint paint, MaskFilter maskFilter) { var layer = this._currentLayer; var clipBounds = layer.layerBounds; Rect stackBounds; bool iior; layer.clipStack.getBounds(out stackBounds, out iior); if (stackBounds != null) { clipBounds = clipBounds.intersect(stackBounds); } if (clipBounds.isEmpty) { return; } var state = layer.currentState; float sigma = state.scale * maskFilter.sigma; if (sigma <= 0) { return; } float sigma3 = 3 * sigma; var maskBounds = meshBounds.inflate(sigma3); maskBounds = maskBounds.intersect(clipBounds.inflate(sigma3)); if (maskBounds.isEmpty) { return; } var maskLayer = this._createMaskLayer(layer, maskBounds, drawAction, paint); var blurLayer = this._createBlurLayer(maskLayer, sigma, layer); var blurMesh = ImageMeshGenerator.imageMesh(null, Rect.one, maskBounds); if (!this._applyClip(blurMesh.bounds)) { return; } layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer)); }
void _saveLayer(uiRect bounds, uiPaint paint) { D.assert(bounds.width > 0); D.assert(bounds.height > 0); var parentLayer = this._currentLayer; var state = parentLayer.currentState; var textureWidth = Mathf.CeilToInt( bounds.width * state.scale * this._devicePixelRatio); if (textureWidth < 1) { textureWidth = 1; } var textureHeight = Mathf.CeilToInt( bounds.height * state.scale * this._devicePixelRatio); if (textureHeight < 1) { textureHeight = 1; } var layer = RenderLayer.create( rtID: Shader.PropertyToID(this._getNewRenderTextureKey()), width: textureWidth, height: textureHeight, layerBounds: bounds, layerPaint: paint ); parentLayer.addLayer(layer); this._layers.Add(layer); this._currentLayer = layer; if (paint.backdrop != null) { if (paint.backdrop is _uiBlurImageFilter) { var filter = (_uiBlurImageFilter)paint.backdrop; if (!(filter.sigmaX == 0 && filter.sigmaY == 0)) { _cachedPoints[0] = bounds.topLeft; _cachedPoints[1] = bounds.bottomLeft; _cachedPoints[2] = bounds.bottomRight; _cachedPoints[3] = bounds.topRight; state.matrix.Value.mapPoints(ref _cachedPoints); var parentBounds = parentLayer.layerBounds; for (int i = 0; i < 4; i++) { _cachedPoints[i] = new uiOffset( (_cachedPoints[i].dx - parentBounds.left) / parentBounds.width, (_cachedPoints[i].dy - parentBounds.top) / parentBounds.height ); } var mesh = ImageMeshGenerator.imageMesh( null, _cachedPoints[0], _cachedPoints[1], _cachedPoints[2], _cachedPoints[3], bounds); var renderDraw = CanvasShader.texRT(layer, layer.layerPaint.Value, mesh, parentLayer); layer.draws.Add(renderDraw); var blurLayer = this._createBlurLayer(layer, filter.sigmaX, filter.sigmaY, layer); var blurMesh = ImageMeshGenerator.imageMesh(null, uiRectHelper.one, bounds); layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer)); } } else if (paint.backdrop is _uiMatrixImageFilter) { var filter = (_uiMatrixImageFilter)paint.backdrop; if (!filter.transform.isIdentity()) { layer.filterMode = filter.filterMode; _cachedPoints[0] = bounds.topLeft; _cachedPoints[1] = bounds.bottomLeft; _cachedPoints[2] = bounds.bottomRight; _cachedPoints[3] = bounds.topRight; state.matrix.Value.mapPoints(ref _cachedPoints); var parentBounds = parentLayer.layerBounds; for (int i = 0; i < 4; i++) { _cachedPoints[i] = new uiOffset( (_cachedPoints[i].dx - parentBounds.left) / parentBounds.width, (_cachedPoints[i].dy - parentBounds.top) / parentBounds.height ); } var matrix = uiMatrix3.makeTrans(-bounds.left, -bounds.top); matrix.postConcat(filter.transform); matrix.postTranslate(bounds.left, bounds.top); var mesh = ImageMeshGenerator.imageMesh( matrix, _cachedPoints[0], _cachedPoints[1], _cachedPoints[2], _cachedPoints[3], bounds); var renderDraw = CanvasShader.texRT(layer, layer.layerPaint.Value, mesh, parentLayer); layer.draws.Add(renderDraw); } } } }