blob: 1f931ed08c0df194095349b6ba73c045f74d2c05 [file] [log] [blame]
Chris Craik9e7fcfd2015-11-25 13:27:33 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "BakedOpDispatcher.h"
18
19#include "BakedOpRenderer.h"
20#include "Caches.h"
sergeyv3e9999b2017-01-19 15:37:02 -080021#include "DeferredLayerUpdater.h"
Chris Craik9e7fcfd2015-11-25 13:27:33 -080022#include "Glop.h"
23#include "GlopBuilder.h"
Chris Craikf09ff5a2015-12-08 17:21:58 -080024#include "Patch.h"
Chris Craik386aa032015-12-07 17:08:25 -080025#include "PathTessellator.h"
John Reck1bcacfd2017-11-03 10:12:19 -070026#include "VertexBuffer.h"
Chris Craik9e7fcfd2015-11-25 13:27:33 -080027#include "renderstate/OffscreenBufferPool.h"
28#include "renderstate/RenderState.h"
29#include "utils/GLUtils.h"
Chris Craik9e7fcfd2015-11-25 13:27:33 -080030
Chris Craik386aa032015-12-07 17:08:25 -080031#include <SkPaintDefaults.h>
Chris Craik678ff812016-03-01 13:27:54 -080032#include <SkPathOps.h>
John Reck1bcacfd2017-11-03 10:12:19 -070033#include <math.h>
34#include <algorithm>
Chris Craik9e7fcfd2015-11-25 13:27:33 -080035
36namespace android {
37namespace uirenderer {
38
Chris Craik15c3f192015-12-03 12:16:56 -080039void BakedOpDispatcher::onMergedBitmapOps(BakedOpRenderer& renderer,
John Reck1bcacfd2017-11-03 10:12:19 -070040 const MergedBakedOpList& opList) {
Mike Reed8cafcc62018-05-03 11:32:46 -040041 // DEAD CODE
Chris Craikf09ff5a2015-12-08 17:21:58 -080042}
43
44void BakedOpDispatcher::onMergedPatchOps(BakedOpRenderer& renderer,
John Reck1bcacfd2017-11-03 10:12:19 -070045 const MergedBakedOpList& opList) {
Mike Reed8cafcc62018-05-03 11:32:46 -040046 // DEAD CODE
Chris Craik15c3f192015-12-03 12:16:56 -080047}
48
John Reck1bcacfd2017-11-03 10:12:19 -070049static void renderTextShadow(BakedOpRenderer& renderer, const TextOp& op,
50 const BakedOpState& textOpState) {
Mike Reedebf9ffc2018-05-02 11:20:38 -040051 // DEAD CODE
Chris Craik15c3f192015-12-03 12:16:56 -080052}
53
John Reck1bcacfd2017-11-03 10:12:19 -070054enum class TextRenderType { Defer, Flush };
Chris Craik15c3f192015-12-03 12:16:56 -080055
sergeyv284b7652016-05-10 13:58:12 -070056static void renderText(BakedOpRenderer& renderer, const TextOp& op, const BakedOpState& state,
John Reck1bcacfd2017-11-03 10:12:19 -070057 const ClipBase* renderClip, TextRenderType renderType) {
Mike Reedebf9ffc2018-05-02 11:20:38 -040058 // DEAD CODE
Chris Craik15c3f192015-12-03 12:16:56 -080059}
60
61void BakedOpDispatcher::onMergedTextOps(BakedOpRenderer& renderer,
John Reck1bcacfd2017-11-03 10:12:19 -070062 const MergedBakedOpList& opList) {
sergeyv284b7652016-05-10 13:58:12 -070063 for (size_t i = 0; i < opList.count; i++) {
64 const BakedOpState& state = *(opList.states[i]);
65 const TextOp& op = *(static_cast<const TextOp*>(state.op));
66 renderTextShadow(renderer, op, state);
67 }
68
Chris Craike4db79d2015-12-22 16:32:23 -080069 ClipRect renderTargetClip(opList.clip);
70 const ClipBase* clip = opList.clipSideFlags ? &renderTargetClip : nullptr;
Chris Craik15c3f192015-12-03 12:16:56 -080071 for (size_t i = 0; i < opList.count; i++) {
72 const BakedOpState& state = *(opList.states[i]);
73 const TextOp& op = *(static_cast<const TextOp*>(state.op));
John Reck1bcacfd2017-11-03 10:12:19 -070074 TextRenderType renderType =
75 (i + 1 == opList.count) ? TextRenderType::Flush : TextRenderType::Defer;
sergeyv284b7652016-05-10 13:58:12 -070076 renderText(renderer, op, state, clip, renderType);
Chris Craik15c3f192015-12-03 12:16:56 -080077 }
78}
79
Chris Craik386aa032015-12-07 17:08:25 -080080namespace VertexBufferRenderFlags {
John Reck1bcacfd2017-11-03 10:12:19 -070081enum {
82 Offset = 0x1,
83 ShadowInterp = 0x2,
84};
Chris Craik386aa032015-12-07 17:08:25 -080085}
86
87static void renderVertexBuffer(BakedOpRenderer& renderer, const BakedOpState& state,
John Reck1bcacfd2017-11-03 10:12:19 -070088 const VertexBuffer& vertexBuffer, float translateX, float translateY,
89 const SkPaint& paint, int vertexBufferRenderFlags) {
Chris Craik386aa032015-12-07 17:08:25 -080090 if (CC_LIKELY(vertexBuffer.getVertexCount())) {
91 bool shadowInterp = vertexBufferRenderFlags & VertexBufferRenderFlags::ShadowInterp;
sergeyv92a5d4b2016-04-20 14:20:18 -070092 const int transformFlags = vertexBufferRenderFlags & VertexBufferRenderFlags::Offset
John Reck1bcacfd2017-11-03 10:12:19 -070093 ? TransformFlags::OffsetByFudgeFactor
94 : 0;
Chris Craik138c21f2016-04-28 16:59:42 -070095
Chris Craik386aa032015-12-07 17:08:25 -080096 Glop glop;
97 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
98 .setRoundRectClipState(state.roundRectClipState)
Chris Craik138c21f2016-04-28 16:59:42 -070099 .setMeshVertexBuffer(vertexBuffer)
100 .setFillPaint(paint, state.alpha, shadowInterp)
Chris Craik386aa032015-12-07 17:08:25 -0800101 .setTransform(state.computedState.transform, transformFlags)
102 .setModelViewOffsetRect(translateX, translateY, vertexBuffer.getBounds())
103 .build();
104 renderer.renderGlop(state, glop);
105 }
106}
107
Chris Craik386aa032015-12-07 17:08:25 -0800108SkRect getBoundsOfFill(const RecordedOp& op) {
109 SkRect bounds = op.unmappedBounds.toSkRect();
110 if (op.paint->getStyle() == SkPaint::kStrokeAndFill_Style) {
111 float outsetDistance = op.paint->getStrokeWidth() / 2;
112 bounds.outset(outsetDistance, outsetDistance);
113 }
114 return bounds;
115}
116
John Reck1bcacfd2017-11-03 10:12:19 -0700117void BakedOpDispatcher::onArcOp(BakedOpRenderer& renderer, const ArcOp& op,
118 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400119 // DEAD CODE
Chris Craik386aa032015-12-07 17:08:25 -0800120}
121
John Reck1bcacfd2017-11-03 10:12:19 -0700122void BakedOpDispatcher::onBitmapOp(BakedOpRenderer& renderer, const BitmapOp& op,
123 const BakedOpState& state) {
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800124 Texture* texture = renderer.getTexture(op.bitmap);
125 if (!texture) return;
126 const AutoTexture autoCleanup(texture);
127
128 const int textureFillFlags = (op.bitmap->colorType() == kAlpha_8_SkColorType)
John Reck1bcacfd2017-11-03 10:12:19 -0700129 ? TextureFillFlags::IsAlphaMaskTexture
130 : TextureFillFlags::None;
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800131 Glop glop;
132 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
133 .setRoundRectClipState(state.roundRectClipState)
134 .setMeshTexturedUnitQuad(texture->uvMapper)
135 .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha)
136 .setTransform(state.computedState.transform, TransformFlags::None)
John Reck38e0c322015-11-10 12:19:17 -0800137 .setModelViewMapUnitToRectSnap(Rect(texture->width(), texture->height()))
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800138 .build();
139 renderer.renderGlop(state, glop);
140}
141
John Reck1bcacfd2017-11-03 10:12:19 -0700142void BakedOpDispatcher::onBitmapMeshOp(BakedOpRenderer& renderer, const BitmapMeshOp& op,
143 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400144 // DEAD CODE
Chris Craikf09ff5a2015-12-08 17:21:58 -0800145}
146
John Reck1bcacfd2017-11-03 10:12:19 -0700147void BakedOpDispatcher::onBitmapRectOp(BakedOpRenderer& renderer, const BitmapRectOp& op,
148 const BakedOpState& state) {
Chris Craikf09ff5a2015-12-08 17:21:58 -0800149 Texture* texture = renderer.getTexture(op.bitmap);
150 if (!texture) return;
151 const AutoTexture autoCleanup(texture);
152
John Reck38e0c322015-11-10 12:19:17 -0800153 Rect uv(std::max(0.0f, op.src.left / texture->width()),
154 std::max(0.0f, op.src.top / texture->height()),
155 std::min(1.0f, op.src.right / texture->width()),
156 std::min(1.0f, op.src.bottom / texture->height()));
Chris Craikf09ff5a2015-12-08 17:21:58 -0800157
158 const int textureFillFlags = (op.bitmap->colorType() == kAlpha_8_SkColorType)
John Reck1bcacfd2017-11-03 10:12:19 -0700159 ? TextureFillFlags::IsAlphaMaskTexture
160 : TextureFillFlags::None;
161 const bool tryToSnap = MathUtils::areEqual(op.src.getWidth(), op.unmappedBounds.getWidth()) &&
162 MathUtils::areEqual(op.src.getHeight(), op.unmappedBounds.getHeight());
Chris Craikf09ff5a2015-12-08 17:21:58 -0800163 Glop glop;
164 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
165 .setRoundRectClipState(state.roundRectClipState)
166 .setMeshTexturedUvQuad(texture->uvMapper, uv)
167 .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha)
168 .setTransform(state.computedState.transform, TransformFlags::None)
169 .setModelViewMapUnitToRectOptionalSnap(tryToSnap, op.unmappedBounds)
170 .build();
171 renderer.renderGlop(state, glop);
172}
173
John Reck1bcacfd2017-11-03 10:12:19 -0700174void BakedOpDispatcher::onColorOp(BakedOpRenderer& renderer, const ColorOp& op,
175 const BakedOpState& state) {
Chris Craika2048482016-03-25 14:17:49 -0700176 SkPaint paint;
177 paint.setColor(op.color);
Mike Reed260ab722016-10-07 15:59:20 -0400178 paint.setBlendMode(op.mode);
Chris Craika2048482016-03-25 14:17:49 -0700179
180 Glop glop;
181 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
182 .setRoundRectClipState(state.roundRectClipState)
183 .setMeshUnitQuad()
184 .setFillPaint(paint, state.alpha)
185 .setTransform(Matrix4::identity(), TransformFlags::None)
186 .setModelViewMapUnitToRect(state.computedState.clipState->rect)
187 .build();
188 renderer.renderGlop(state, glop);
189}
190
John Reck1bcacfd2017-11-03 10:12:19 -0700191void BakedOpDispatcher::onFunctorOp(BakedOpRenderer& renderer, const FunctorOp& op,
192 const BakedOpState& state) {
Chris Craike29ce6f2015-12-10 16:25:13 -0800193 renderer.renderFunctor(op, state);
194}
195
John Reck1bcacfd2017-11-03 10:12:19 -0700196void BakedOpDispatcher::onLinesOp(BakedOpRenderer& renderer, const LinesOp& op,
197 const BakedOpState& state) {
Chris Craik386aa032015-12-07 17:08:25 -0800198 VertexBuffer buffer;
199 PathTessellator::tessellateLines(op.points, op.floatCount, op.paint,
John Reck1bcacfd2017-11-03 10:12:19 -0700200 state.computedState.transform, buffer);
Chris Craik386aa032015-12-07 17:08:25 -0800201 int displayFlags = op.paint->isAntiAlias() ? 0 : VertexBufferRenderFlags::Offset;
202 renderVertexBuffer(renderer, state, buffer, 0, 0, *(op.paint), displayFlags);
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800203}
204
John Reck1bcacfd2017-11-03 10:12:19 -0700205void BakedOpDispatcher::onOvalOp(BakedOpRenderer& renderer, const OvalOp& op,
206 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400207 // DEAD CODE
Chris Craik386aa032015-12-07 17:08:25 -0800208}
209
John Reck1bcacfd2017-11-03 10:12:19 -0700210void BakedOpDispatcher::onPatchOp(BakedOpRenderer& renderer, const PatchOp& op,
211 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400212 // DEAD CODE
Chris Craikf09ff5a2015-12-08 17:21:58 -0800213}
214
John Reck1bcacfd2017-11-03 10:12:19 -0700215void BakedOpDispatcher::onPathOp(BakedOpRenderer& renderer, const PathOp& op,
216 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400217 // DEAD CODE
Chris Craik386aa032015-12-07 17:08:25 -0800218}
219
John Reck1bcacfd2017-11-03 10:12:19 -0700220void BakedOpDispatcher::onPointsOp(BakedOpRenderer& renderer, const PointsOp& op,
221 const BakedOpState& state) {
Chris Craik386aa032015-12-07 17:08:25 -0800222 VertexBuffer buffer;
223 PathTessellator::tessellatePoints(op.points, op.floatCount, op.paint,
John Reck1bcacfd2017-11-03 10:12:19 -0700224 state.computedState.transform, buffer);
Chris Craik386aa032015-12-07 17:08:25 -0800225 int displayFlags = op.paint->isAntiAlias() ? 0 : VertexBufferRenderFlags::Offset;
226 renderVertexBuffer(renderer, state, buffer, 0, 0, *(op.paint), displayFlags);
227}
228
229// See SkPaintDefaults.h
230#define SkPaintDefaults_MiterLimit SkIntToScalar(4)
231
John Reck1bcacfd2017-11-03 10:12:19 -0700232void BakedOpDispatcher::onRectOp(BakedOpRenderer& renderer, const RectOp& op,
233 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400234 // DEAD CODE
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800235}
236
John Reck1bcacfd2017-11-03 10:12:19 -0700237void BakedOpDispatcher::onRoundRectOp(BakedOpRenderer& renderer, const RoundRectOp& op,
238 const BakedOpState& state) {
Mike Reed8cafcc62018-05-03 11:32:46 -0400239 // DEAD CODE
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800240}
241
John Reck1bcacfd2017-11-03 10:12:19 -0700242void BakedOpDispatcher::onSimpleRectsOp(BakedOpRenderer& renderer, const SimpleRectsOp& op,
243 const BakedOpState& state) {
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800244 Glop glop;
245 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
246 .setRoundRectClipState(state.roundRectClipState)
247 .setMeshIndexedQuads(&op.vertices[0], op.vertexCount / 4)
248 .setFillPaint(*op.paint, state.alpha)
249 .setTransform(state.computedState.transform, TransformFlags::None)
250 .setModelViewOffsetRect(0, 0, op.unmappedBounds)
251 .build();
252 renderer.renderGlop(state, glop);
253}
254
John Reck1bcacfd2017-11-03 10:12:19 -0700255void BakedOpDispatcher::onTextOp(BakedOpRenderer& renderer, const TextOp& op,
256 const BakedOpState& state) {
sergeyv284b7652016-05-10 13:58:12 -0700257 renderTextShadow(renderer, op, state);
258 renderText(renderer, op, state, state.computedState.getClipIfNeeded(), TextRenderType::Flush);
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800259}
260
John Reck1bcacfd2017-11-03 10:12:19 -0700261void BakedOpDispatcher::onTextOnPathOp(BakedOpRenderer& renderer, const TextOnPathOp& op,
262 const BakedOpState& state) {
Mike Reedebf9ffc2018-05-02 11:20:38 -0400263 // DEAD CODE
Chris Craikd7448e62015-12-15 10:34:36 -0800264}
265
John Reck1bcacfd2017-11-03 10:12:19 -0700266void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const TextureLayerOp& op,
267 const BakedOpState& state) {
sergeyv3e9999b2017-01-19 15:37:02 -0800268 GlLayer* layer = static_cast<GlLayer*>(op.layerHandle->backingLayer());
269 if (!layer) {
270 return;
271 }
272 const bool tryToSnap = layer->getForceFilter();
273 float alpha = (layer->getAlpha() / 255.0f) * state.alpha;
Chris Craikd2dfd8f2015-12-16 14:27:20 -0800274 Glop glop;
275 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
276 .setRoundRectClipState(state.roundRectClipState)
John Reck1bcacfd2017-11-03 10:12:19 -0700277 .setMeshTexturedUvQuad(nullptr, Rect(0, 1, 1, 0)) // TODO: simplify with VBO
sergeyv3e9999b2017-01-19 15:37:02 -0800278 .setFillTextureLayer(*(layer), alpha)
Chris Craikd2dfd8f2015-12-16 14:27:20 -0800279 .setTransform(state.computedState.transform, TransformFlags::None)
John Reck1bcacfd2017-11-03 10:12:19 -0700280 .setModelViewMapUnitToRectOptionalSnap(tryToSnap,
281 Rect(layer->getWidth(), layer->getHeight()))
Chris Craikd2dfd8f2015-12-16 14:27:20 -0800282 .build();
283 renderer.renderGlop(state, glop);
284}
285
Chris Craik37413282016-05-12 17:48:51 -0700286void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state,
John Reck1bcacfd2017-11-03 10:12:19 -0700287 int color, SkBlendMode mode, SkColorFilter* colorFilter) {
Chris Craik37413282016-05-12 17:48:51 -0700288 SkPaint paint;
289 paint.setColor(color);
Mike Reed260ab722016-10-07 15:59:20 -0400290 paint.setBlendMode(mode);
291 paint.setColorFilter(sk_ref_sp(colorFilter));
Chris Craik37413282016-05-12 17:48:51 -0700292 RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint);
293 BakedOpDispatcher::onRectOp(renderer, rectOp, state);
294}
295
John Reck1bcacfd2017-11-03 10:12:19 -0700296void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op,
297 const BakedOpState& state) {
Chris Craikc0f3f2f2016-02-02 16:10:32 -0800298 // Note that we don't use op->paint in this function - it's never set on a LayerOp
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800299 OffscreenBuffer* buffer = *op.layerHandle;
300
sergeyvaebbbef2016-05-31 14:18:02 -0700301 if (CC_UNLIKELY(!buffer)) return;
Chris Craik37413282016-05-12 17:48:51 -0700302
sergeyvaebbbef2016-05-31 14:18:02 -0700303 float layerAlpha = op.alpha * state.alpha;
304 Glop glop;
305 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
306 .setRoundRectClipState(state.roundRectClipState)
307 .setMeshTexturedIndexedVbo(buffer->vbo, buffer->elementCount)
John Reck1bcacfd2017-11-03 10:12:19 -0700308 .setFillLayer(buffer->texture, op.colorFilter, layerAlpha, op.mode,
309 Blend::ModeOrderSwap::NoSwap)
sergeyvaebbbef2016-05-31 14:18:02 -0700310 .setTransform(state.computedState.transform, TransformFlags::None)
John Reck1bcacfd2017-11-03 10:12:19 -0700311 .setModelViewOffsetRectSnap(
312 op.unmappedBounds.left, op.unmappedBounds.top,
sergeyvaebbbef2016-05-31 14:18:02 -0700313 Rect(op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight()))
314 .build();
315 renderer.renderGlop(state, glop);
316
317 if (!buffer->hasRenderedSinceRepaint) {
Chris Craik37413282016-05-12 17:48:51 -0700318 buffer->hasRenderedSinceRepaint = true;
319 if (CC_UNLIKELY(Properties::debugLayersUpdates)) {
320 // render debug layer highlight
John Reck1bcacfd2017-11-03 10:12:19 -0700321 renderRectForLayer(renderer, op, state, 0x7f00ff00, SkBlendMode::kSrcOver, nullptr);
Chris Craik37413282016-05-12 17:48:51 -0700322 } else if (CC_UNLIKELY(Properties::debugOverdraw)) {
323 // render transparent to increment overdraw for repaint area
John Reck1bcacfd2017-11-03 10:12:19 -0700324 renderRectForLayer(renderer, op, state, SK_ColorTRANSPARENT, SkBlendMode::kSrcOver,
325 nullptr);
Chris Craik37413282016-05-12 17:48:51 -0700326 }
327 }
Chris Craik9e7fcfd2015-11-25 13:27:33 -0800328}
329
John Reck1bcacfd2017-11-03 10:12:19 -0700330void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op,
331 const BakedOpState& state) {
Chris Craik7435eb12016-01-07 17:41:40 -0800332 LOG_ALWAYS_FATAL_IF(*(op.layerHandle) != nullptr, "layer already exists!");
333 *(op.layerHandle) = renderer.copyToLayer(state.computedState.clippedBounds);
334 LOG_ALWAYS_FATAL_IF(*op.layerHandle == nullptr, "layer copy failed");
Chris Craikb87eadd2016-01-06 09:16:05 -0800335}
336
John Reck1bcacfd2017-11-03 10:12:19 -0700337void BakedOpDispatcher::onCopyFromLayerOp(BakedOpRenderer& renderer, const CopyFromLayerOp& op,
338 const BakedOpState& state) {
Chris Craik7435eb12016-01-07 17:41:40 -0800339 LOG_ALWAYS_FATAL_IF(*op.layerHandle == nullptr, "no layer to draw underneath!");
340 if (!state.computedState.clippedBounds.isEmpty()) {
341 if (op.paint && op.paint->getAlpha() < 255) {
342 SkPaint layerPaint;
343 layerPaint.setAlpha(op.paint->getAlpha());
Mike Reed260ab722016-10-07 15:59:20 -0400344 layerPaint.setBlendMode(SkBlendMode::kDstIn);
345 layerPaint.setColorFilter(sk_ref_sp(op.paint->getColorFilter()));
John Reck1bcacfd2017-11-03 10:12:19 -0700346 RectOp rectOp(state.computedState.clippedBounds, Matrix4::identity(), nullptr,
347 &layerPaint);
Chris Craik7435eb12016-01-07 17:41:40 -0800348 BakedOpDispatcher::onRectOp(renderer, rectOp, state);
349 }
350
351 OffscreenBuffer& layer = **(op.layerHandle);
Mike Reed260ab722016-10-07 15:59:20 -0400352 auto mode = PaintUtils::getBlendModeDirect(op.paint);
Chris Craik7435eb12016-01-07 17:41:40 -0800353 Glop glop;
354 GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
355 .setRoundRectClipState(state.roundRectClipState)
356 .setMeshTexturedUvQuad(nullptr, layer.getTextureCoordinates())
357 .setFillLayer(layer.texture, nullptr, 1.0f, mode, Blend::ModeOrderSwap::Swap)
358 .setTransform(state.computedState.transform, TransformFlags::None)
359 .setModelViewMapUnitToRect(state.computedState.clippedBounds)
360 .build();
361 renderer.renderGlop(state, glop);
362 }
John Reck7db5ffb2016-01-15 13:17:09 -0800363 renderer.renderState().layerPool().putOrDelete(*op.layerHandle);
Chris Craikb87eadd2016-01-06 09:16:05 -0800364}
365
John Reck1bcacfd2017-11-03 10:12:19 -0700366} // namespace uirenderer
367} // namespace android