OSDN Git Service

Merge "Prevent getting data from Clipboard if device is locked" into lmp-dev am:...
[android-x86/frameworks-base.git] / libs / hwui / OpenGLRenderer.h
1 /*
2  * Copyright (C) 2010 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 #ifndef ANDROID_HWUI_OPENGL_RENDERER_H
18 #define ANDROID_HWUI_OPENGL_RENDERER_H
19
20 #include "CanvasState.h"
21 #include "Debug.h"
22 #include "Extensions.h"
23 #include "Matrix.h"
24 #include "Program.h"
25 #include "Rect.h"
26 #include "Snapshot.h"
27 #include "UvMapper.h"
28 #include "Vertex.h"
29 #include "Caches.h"
30 #include "utils/PaintUtils.h"
31
32 #include <GLES2/gl2.h>
33 #include <GLES2/gl2ext.h>
34
35 #include <SkBitmap.h>
36 #include <SkCanvas.h>
37 #include <SkColorFilter.h>
38 #include <SkDrawLooper.h>
39 #include <SkMatrix.h>
40 #include <SkPaint.h>
41 #include <SkRegion.h>
42 #include <SkXfermode.h>
43
44 #include <utils/Blur.h>
45 #include <utils/Functor.h>
46 #include <utils/RefBase.h>
47 #include <utils/SortedVector.h>
48
49 #include <cutils/compiler.h>
50
51 #include <androidfw/ResourceTypes.h>
52
53 #include <vector>
54
55 class SkShader;
56
57 namespace android {
58 namespace uirenderer {
59
60 enum class DrawOpMode {
61     kImmediate,
62     kDefer,
63     kFlush
64 };
65
66 class DeferredDisplayState;
67 struct Glop;
68 class RenderState;
69 class RenderNode;
70 class TextDrawFunctor;
71 class VertexBuffer;
72
73 enum StateDeferFlags {
74     kStateDeferFlag_Draw = 0x1,
75     kStateDeferFlag_Clip = 0x2
76 };
77
78 enum ClipSideFlags {
79     kClipSide_None = 0x0,
80     kClipSide_Left = 0x1,
81     kClipSide_Top = 0x2,
82     kClipSide_Right = 0x4,
83     kClipSide_Bottom = 0x8,
84     kClipSide_Full = 0xF,
85     kClipSide_ConservativeFull = 0x1F
86 };
87
88 enum VertexBufferDisplayFlags {
89     kVertexBuffer_Offset = 0x1,
90     kVertexBuffer_ShadowInterp = 0x2,
91 };
92
93 /**
94  * Defines additional transformation that should be applied by the model view matrix, beyond that of
95  * the currentTransform()
96  */
97 enum ModelViewMode {
98     /**
99      * Used when the model view should simply translate geometry passed to the shader. The resulting
100      * matrix will be a simple translation.
101      */
102     kModelViewMode_Translate = 0,
103
104     /**
105      * Used when the model view should translate and scale geometry. The resulting matrix will be a
106      * translation + scale. This is frequently used together with VBO 0, the (0,0,1,1) rect.
107      */
108     kModelViewMode_TranslateAndScale = 1,
109 };
110
111 ///////////////////////////////////////////////////////////////////////////////
112 // Renderer
113 ///////////////////////////////////////////////////////////////////////////////
114 /**
115  * OpenGL Renderer implementation.
116  */
117 class OpenGLRenderer : public CanvasStateClient {
118 public:
119     OpenGLRenderer(RenderState& renderState);
120     virtual ~OpenGLRenderer();
121
122     void initProperties();
123     void initLight(float lightRadius, uint8_t ambientShadowAlpha,
124             uint8_t spotShadowAlpha);
125     void setLightCenter(const Vector3& lightCenter);
126
127     /*
128      * Prepares the renderer to draw a frame. This method must be invoked
129      * at the beginning of each frame. Only the specified rectangle of the
130      * frame is assumed to be dirty. A clip will automatically be set to
131      * the specified rectangle.
132      *
133      * @param opaque If true, the target surface is considered opaque
134      *               and will not be cleared. If false, the target surface
135      *               will be cleared
136      */
137     virtual void prepareDirty(int viewportWidth, int viewportHeight,
138             float left, float top, float right, float bottom, bool opaque);
139
140     /**
141      * Indicates the end of a frame. This method must be invoked whenever
142      * the caller is done rendering a frame.
143      * Returns true if any drawing was done during the frame (the output
144      * has changed / is "dirty" and should be displayed to the user).
145      */
146     virtual bool finish();
147
148     void callDrawGLFunction(Functor* functor, Rect& dirty);
149
150     void pushLayerUpdate(Layer* layer);
151     void cancelLayerUpdate(Layer* layer);
152     void flushLayerUpdates();
153     void markLayersAsBuildLayers();
154
155     virtual int saveLayer(float left, float top, float right, float bottom,
156             const SkPaint* paint, int flags) {
157         return saveLayer(left, top, right, bottom, paint, flags, nullptr);
158     }
159
160     // Specialized saveLayer implementation, which will pass the convexMask to an FBO layer, if
161     // created, which will in turn clip to that mask when drawn back/restored.
162     int saveLayer(float left, float top, float right, float bottom,
163             const SkPaint* paint, int flags, const SkPath* convexMask);
164
165     int saveLayerDeferred(float left, float top, float right, float bottom,
166             const SkPaint* paint, int flags);
167
168     void drawRenderNode(RenderNode* displayList, Rect& dirty, int32_t replayFlags = 1);
169     void drawLayer(Layer* layer);
170     void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint);
171     void drawBitmaps(const SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount,
172             TextureVertex* vertices, bool pureTranslate, const Rect& bounds, const SkPaint* paint);
173     void drawBitmap(const SkBitmap* bitmap, Rect src, Rect dst,
174             const SkPaint* paint);
175     void drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
176             const float* vertices, const int* colors, const SkPaint* paint);
177     void drawPatches(const SkBitmap* bitmap, AssetAtlas::Entry* entry,
178             TextureVertex* vertices, uint32_t indexCount, const SkPaint* paint);
179     void drawPatch(const SkBitmap* bitmap, const Patch* mesh, AssetAtlas::Entry* entry,
180             float left, float top, float right, float bottom, const SkPaint* paint);
181     void drawColor(int color, SkXfermode::Mode mode);
182     void drawRect(float left, float top, float right, float bottom,
183             const SkPaint* paint);
184     void drawRoundRect(float left, float top, float right, float bottom,
185             float rx, float ry, const SkPaint* paint);
186     void drawCircle(float x, float y, float radius, const SkPaint* paint);
187     void drawOval(float left, float top, float right, float bottom,
188             const SkPaint* paint);
189     void drawArc(float left, float top, float right, float bottom,
190             float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint);
191     void drawPath(const SkPath* path, const SkPaint* paint);
192     void drawLines(const float* points, int count, const SkPaint* paint);
193     void drawPoints(const float* points, int count, const SkPaint* paint);
194     void drawTextOnPath(const glyph_t* glyphs, int bytesCount, int count, const SkPath* path,
195             float hOffset, float vOffset, const SkPaint* paint);
196     void drawText(const glyph_t* glyphs, int bytesCount, int count, float x, float y,
197             const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
198             DrawOpMode drawOpMode = DrawOpMode::kImmediate);
199     void drawRects(const float* rects, int count, const SkPaint* paint);
200
201     void drawShadow(float casterAlpha,
202             const VertexBuffer* ambientShadowVertexBuffer,
203             const VertexBuffer* spotShadowVertexBuffer);
204
205     void setDrawFilter(SkDrawFilter* filter);
206
207     /**
208      * Store the current display state (most importantly, the current clip and transform), and
209      * additionally map the state's bounds from local to window coordinates.
210      *
211      * Returns true if quick-rejected
212      */
213     bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags);
214     void restoreDisplayState(const DeferredDisplayState& state, bool skipClipRestore = false);
215     void setupMergedMultiDraw(const Rect* clipRect);
216
217     bool isCurrentTransformSimple() {
218         return currentTransform()->isSimple();
219     }
220
221     Caches& getCaches() {
222         return mCaches;
223     }
224
225     RenderState& renderState() {
226         return mRenderState;
227     }
228
229     int getViewportWidth() { return mState.getViewportWidth(); }
230     int getViewportHeight() { return mState.getViewportHeight(); }
231
232     /**
233      * Scales the alpha on the current snapshot. This alpha value will be modulated
234      * with other alpha values when drawing primitives.
235      */
236     void scaleAlpha(float alpha) { mState.scaleAlpha(alpha); }
237
238     /**
239      * Inserts a named event marker in the stream of GL commands.
240      */
241     void eventMark(const char* name) const;
242
243     /**
244      * Inserts a formatted event marker in the stream of GL commands.
245      */
246     void eventMarkDEBUG(const char *fmt, ...) const;
247
248     /**
249      * Inserts a named group marker in the stream of GL commands. This marker
250      * can be used by tools to group commands into logical groups. A call to
251      * this method must always be followed later on by a call to endMark().
252      */
253     void startMark(const char* name) const;
254
255     /**
256      * Closes the last group marker opened by startMark().
257      */
258     void endMark() const;
259
260     /**
261      * Build the best transform to use to rasterize text given a full
262      * transform matrix, and whether filteration is needed.
263      *
264      * Returns whether filtration is needed
265      */
266     bool findBestFontTransform(const mat4& transform, SkMatrix* outMatrix) const;
267
268 #if DEBUG_MERGE_BEHAVIOR
269     void drawScreenSpaceColorRect(float left, float top, float right, float bottom, int color) {
270         mCaches.setScissorEnabled(false);
271
272         // should only be called outside of other draw ops, so stencil can only be in test state
273         bool stencilWasEnabled = mCaches.stencil.isTestEnabled();
274         mCaches.stencil.disable();
275
276         drawColorRect(left, top, right, bottom, color, SkXfermode::kSrcOver_Mode, true);
277
278         if (stencilWasEnabled) mCaches.stencil.enableTest();
279         mDirty = true;
280     }
281 #endif
282
283     const Vector3& getLightCenter() const { return mState.currentLightCenter(); }
284     float getLightRadius() const { return mLightRadius; }
285     uint8_t getAmbientShadowAlpha() const { return mAmbientShadowAlpha; }
286     uint8_t getSpotShadowAlpha() const { return mSpotShadowAlpha; }
287
288     ///////////////////////////////////////////////////////////////////
289     /// State manipulation
290
291     int getSaveCount() const;
292     int save(int flags);
293     void restore();
294     void restoreToCount(int saveCount);
295
296     void setGlobalMatrix(const Matrix4& matrix) {
297         mState.setMatrix(matrix);
298     }
299     void setLocalMatrix(const Matrix4& matrix);
300     void setLocalMatrix(const SkMatrix& matrix);
301     void concatMatrix(const SkMatrix& matrix) { mState.concatMatrix(matrix); }
302
303     void translate(float dx, float dy, float dz = 0.0f);
304     void rotate(float degrees);
305     void scale(float sx, float sy);
306     void skew(float sx, float sy);
307
308     void setMatrix(const Matrix4& matrix); // internal only convenience method
309     void concatMatrix(const Matrix4& matrix); // internal only convenience method
310
311     const Rect& getLocalClipBounds() const { return mState.getLocalClipBounds(); }
312     const Rect& getRenderTargetClipBounds() const { return mState.getRenderTargetClipBounds(); }
313     bool quickRejectConservative(float left, float top,
314             float right, float bottom) const {
315         return mState.quickRejectConservative(left, top, right, bottom);
316     }
317
318     bool clipRect(float left, float top,
319             float right, float bottom, SkRegion::Op op);
320     bool clipPath(const SkPath* path, SkRegion::Op op);
321     bool clipRegion(const SkRegion* region, SkRegion::Op op);
322
323     /**
324      * Does not support different clipping Ops (that is, every call to setClippingOutline is
325      * effectively using SkRegion::kReplaceOp)
326      *
327      * The clipping outline is independent from the regular clip.
328      */
329     void setClippingOutline(LinearAllocator& allocator, const Outline* outline);
330     void setClippingRoundRect(LinearAllocator& allocator,
331             const Rect& rect, float radius, bool highPriority = true);
332     void setProjectionPathMask(LinearAllocator& allocator, const SkPath* path);
333
334     inline bool hasRectToRectTransform() const { return mState.hasRectToRectTransform(); }
335     inline const mat4* currentTransform() const { return mState.currentTransform(); }
336
337     ///////////////////////////////////////////////////////////////////
338     /// CanvasStateClient interface
339
340     virtual void onViewportInitialized() override;
341     virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override;
342     virtual GLuint getTargetFbo() const override { return 0; }
343
344     SkPath* allocPathForFrame() {
345         std::unique_ptr<SkPath> path(new SkPath());
346         SkPath* returnPath = path.get();
347         mTempPaths.push_back(std::move(path));
348         return returnPath;
349     }
350
351     void setBaseTransform(const Matrix4& matrix) { mBaseTransform = matrix; }
352
353 protected:
354     /**
355      * Perform the setup specific to a frame. This method does not
356      * issue any OpenGL commands.
357      */
358     void setupFrameState(int viewportWidth, int viewportHeight,
359             float left, float top, float right, float bottom, bool opaque);
360
361     /**
362      * Indicates the start of rendering. This method will setup the
363      * initial OpenGL state (viewport, clearing the buffer, etc.)
364      */
365     void startFrame();
366
367     /**
368      * Clears the underlying surface if needed.
369      */
370     virtual void clear(float left, float top, float right, float bottom, bool opaque);
371
372     /**
373      * Call this method after updating a layer during a drawing pass.
374      */
375     void resumeAfterLayer();
376
377     /**
378      * This method is called whenever a stencil buffer is required. Subclasses
379      * should override this method and call attachStencilBufferToLayer() on the
380      * appropriate layer(s).
381      */
382     virtual void ensureStencilBuffer();
383
384     /**
385      * Obtains a stencil render buffer (allocating it if necessary) and
386      * attaches it to the specified layer.
387      */
388     void attachStencilBufferToLayer(Layer* layer);
389
390     /**
391      * Draw a rectangle list. Currently only used for the the stencil buffer so that the stencil
392      * will have a value of 'n' in every unclipped pixel, where 'n' is the number of rectangles
393      * in the list.
394      */
395     void drawRectangleList(const RectangleList& rectangleList);
396
397     bool quickRejectSetupScissor(float left, float top, float right, float bottom,
398             const SkPaint* paint = nullptr);
399     bool quickRejectSetupScissor(const Rect& bounds, const SkPaint* paint = nullptr) {
400         return quickRejectSetupScissor(bounds.left, bounds.top,
401                 bounds.right, bounds.bottom, paint);
402     }
403
404     /**
405      * Compose the layer defined in the current snapshot with the layer
406      * defined by the previous snapshot.
407      *
408      * The current snapshot *must* be a layer (flag kFlagIsLayer set.)
409      *
410      * @param curent The current snapshot containing the layer to compose
411      * @param previous The previous snapshot to compose the current layer with
412      */
413     virtual void composeLayer(const Snapshot& current, const Snapshot& previous);
414
415     /**
416      * Marks the specified region as dirty at the specified bounds.
417      */
418     void dirtyLayerUnchecked(Rect& bounds, Region* region);
419
420     /**
421      * Returns the region of the current layer.
422      */
423     virtual Region* getRegion() const {
424         return mState.currentRegion();
425     }
426
427     /**
428      * Indicates whether rendering is currently targeted at a layer.
429      */
430     virtual bool hasLayer() const {
431         return (mState.currentFlags() & Snapshot::kFlagFboTarget) && mState.currentRegion();
432     }
433
434     /**
435      * Renders the specified layer as a textured quad.
436      *
437      * @param layer The layer to render
438      * @param rect The bounds of the layer
439      */
440     void drawTextureLayer(Layer* layer, const Rect& rect);
441
442     /**
443      * Gets the alpha from a layer, accounting for snapshot alpha
444      *
445      * @param layer The layer from which the alpha is extracted
446      */
447     inline float getLayerAlpha(const Layer* layer) const;
448
449     /**
450      * Set to true to suppress error checks at the end of a frame.
451      */
452     virtual bool suppressErrorChecks() const {
453         return false;
454     }
455
456     CanvasState mState;
457     Caches& mCaches;
458     RenderState& mRenderState;
459
460 private:
461     enum class GlopRenderType {
462         Standard,
463         Multi,
464         LayerClear
465     };
466
467     void renderGlop(const Glop& glop, GlopRenderType type = GlopRenderType::Standard);
468
469     /**
470      * Discards the content of the framebuffer if supported by the driver.
471      * This method should be called at the beginning of a frame to optimize
472      * rendering on some tiler architectures.
473      */
474     void discardFramebuffer(float left, float top, float right, float bottom);
475
476     /**
477      * Sets the clipping rectangle using glScissor. The clip is defined by
478      * the current snapshot's clipRect member.
479      */
480     void setScissorFromClip();
481
482     /**
483      * Sets the clipping region using the stencil buffer. The clip region
484      * is defined by the current snapshot's clipRegion member.
485      */
486     void setStencilFromClip();
487
488     /**
489      * Given the local bounds of the layer, calculates ...
490      */
491     void calculateLayerBoundsAndClip(Rect& bounds, Rect& clip, bool fboLayer);
492
493     /**
494      * Given the local bounds + clip of the layer, updates current snapshot's empty/invisible
495      */
496     void updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect& clip,
497             bool fboLayer, int alpha);
498
499     /**
500      * Creates a new layer stored in the specified snapshot.
501      *
502      * @param snapshot The snapshot associated with the new layer
503      * @param left The left coordinate of the layer
504      * @param top The top coordinate of the layer
505      * @param right The right coordinate of the layer
506      * @param bottom The bottom coordinate of the layer
507      * @param alpha The translucency of the layer
508      * @param mode The blending mode of the layer
509      * @param flags The layer save flags
510      * @param mask A mask to use when drawing the layer back, may be empty
511      *
512      * @return True if the layer was successfully created, false otherwise
513      */
514     bool createLayer(float left, float top, float right, float bottom,
515             const SkPaint* paint, int flags, const SkPath* convexMask);
516
517     /**
518      * Creates a new layer stored in the specified snapshot as an FBO.
519      *
520      * @param layer The layer to store as an FBO
521      * @param snapshot The snapshot associated with the new layer
522      * @param bounds The bounds of the layer
523      */
524     bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip);
525
526     /**
527      * Compose the specified layer as a region.
528      *
529      * @param layer The layer to compose
530      * @param rect The layer's bounds
531      */
532     void composeLayerRegion(Layer* layer, const Rect& rect);
533
534     /**
535      * Restores the content in layer to the screen, swapping the blend mode,
536      * specifically used in the restore() of a saveLayerAlpha().
537      *
538      * This allows e.g. a layer that would have been drawn on top of existing content (with SrcOver)
539      * to be drawn underneath.
540      *
541      * This will always ignore the canvas transform.
542      */
543     void composeLayerRectSwapped(Layer* layer, const Rect& rect);
544
545     /**
546      * Draws the content in layer to the screen.
547      */
548     void composeLayerRect(Layer* layer, const Rect& rect);
549
550     /**
551      * Clears all the regions corresponding to the current list of layers.
552      * This method MUST be invoked before any drawing operation.
553      */
554     void clearLayerRegions();
555
556     /**
557      * Mark the layer as dirty at the specified coordinates. The coordinates
558      * are transformed with the supplied matrix.
559      */
560     void dirtyLayer(const float left, const float top,
561             const float right, const float bottom, const Matrix4& transform);
562
563     /**
564      * Mark the layer as dirty at the specified coordinates.
565      */
566     void dirtyLayer(const float left, const float top,
567             const float right, const float bottom);
568
569     /**
570      * Draws a colored rectangle with the specified color. The specified coordinates
571      * are transformed by the current snapshot's transform matrix unless specified
572      * otherwise.
573      *
574      * @param left The left coordinate of the rectangle
575      * @param top The top coordinate of the rectangle
576      * @param right The right coordinate of the rectangle
577      * @param bottom The bottom coordinate of the rectangle
578      * @param paint The paint containing the color, blending mode, etc.
579      * @param ignoreTransform True if the current transform should be ignored
580      */
581     void drawColorRect(float left, float top, float right, float bottom,
582             const SkPaint* paint, bool ignoreTransform = false);
583
584     /**
585      * Draws a series of colored rectangles with the specified color. The specified
586      * coordinates are transformed by the current snapshot's transform matrix unless
587      * specified otherwise.
588      *
589      * @param rects A list of rectangles, 4 floats (left, top, right, bottom)
590      *              per rectangle
591      * @param paint The paint containing the color, blending mode, etc.
592      * @param ignoreTransform True if the current transform should be ignored
593      * @param dirty True if calling this method should dirty the current layer
594      * @param clip True if the rects should be clipped, false otherwise
595      */
596     void drawColorRects(const float* rects, int count, const SkPaint* paint,
597             bool ignoreTransform = false, bool dirty = true, bool clip = true);
598
599     /**
600      * Draws the shape represented by the specified path texture.
601      * This method invokes drawPathTexture() but takes into account
602      * the extra left/top offset and the texture offset to correctly
603      * position the final shape.
604      *
605      * @param left The left coordinate of the shape to render
606      * @param top The top coordinate of the shape to render
607      * @param texture The texture reprsenting the shape
608      * @param paint The paint to draw the shape with
609      */
610     void drawShape(float left, float top, PathTexture* texture, const SkPaint* paint);
611
612     /**
613      * Renders a strip of polygons with the specified paint, used for tessellated geometry.
614      *
615      * @param vertexBuffer The VertexBuffer to be drawn
616      * @param paint The paint to render with
617      * @param flags flags with which to draw
618      */
619     void drawVertexBuffer(float translateX, float translateY, const VertexBuffer& vertexBuffer,
620             const SkPaint* paint, int flags = 0);
621
622     /**
623      * Convenience for translating method
624      */
625     void drawVertexBuffer(const VertexBuffer& vertexBuffer,
626             const SkPaint* paint, int flags = 0) {
627         drawVertexBuffer(0.0f, 0.0f, vertexBuffer, paint, flags);
628     }
629
630     /**
631      * Renders the convex hull defined by the specified path as a strip of polygons.
632      *
633      * @param path The hull of the path to draw
634      * @param paint The paint to render with
635      */
636     void drawConvexPath(const SkPath& path, const SkPaint* paint);
637
638    /**
639      * Draws shadow layer on text (with optional positions).
640      *
641      * @param paint The paint to draw the shadow with
642      * @param text The text to draw
643      * @param count The number of glyphs in the text
644      * @param positions The x, y positions of individual glyphs (or NULL)
645      * @param fontRenderer The font renderer object
646      * @param alpha The alpha value for drawing the shadow
647      * @param x The x coordinate where the shadow will be drawn
648      * @param y The y coordinate where the shadow will be drawn
649      */
650     void drawTextShadow(const SkPaint* paint, const glyph_t* glyphs, int count,
651             const float* positions, FontRenderer& fontRenderer, int alpha,
652             float x, float y);
653
654     /**
655      * Draws a path texture. Path textures are alpha8 bitmaps that need special
656      * compositing to apply colors/filters/etc.
657      *
658      * @param texture The texture to render
659      * @param x The x coordinate where the texture will be drawn
660      * @param y The y coordinate where the texture will be drawn
661      * @param paint The paint to draw the texture with
662      */
663      void drawPathTexture(PathTexture* texture, float x, float y, const SkPaint* paint);
664
665     /**
666      * Resets the texture coordinates stored in mMeshVertices. Setting the values
667      * back to default is achieved by calling:
668      *
669      * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
670      *
671      * @param u1 The left coordinate of the texture
672      * @param v1 The bottom coordinate of the texture
673      * @param u2 The right coordinate of the texture
674      * @param v2 The top coordinate of the texture
675      */
676     void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
677
678     /**
679      * Returns true if the specified paint will draw invisible text.
680      */
681     bool canSkipText(const SkPaint* paint) const;
682
683     bool updateLayer(Layer* layer, bool inFrame);
684     void updateLayers();
685     void flushLayers();
686
687 #if DEBUG_LAYERS_AS_REGIONS
688     /**
689      * Renders the specified region as a series of rectangles. This method
690      * is used for debugging only.
691      */
692     void drawRegionRectsDebug(const Region& region);
693 #endif
694
695     /**
696      * Renders the specified region as a series of rectangles. The region
697      * must be in screen-space coordinates.
698      */
699     void drawRegionRects(const SkRegion& region, const SkPaint& paint, bool dirty = false);
700
701     /**
702      * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS
703      * is turned on.
704      */
705     void debugClip();
706
707     void debugOverdraw(bool enable, bool clear);
708     void renderOverdraw();
709     void countOverdraw();
710
711     /**
712      * Should be invoked every time the glScissor is modified.
713      */
714     inline void dirtyClip() { mState.setDirtyClip(true); }
715
716     inline const UvMapper& getMapper(const Texture* texture) {
717         return texture && texture->uvMapper ? *texture->uvMapper : mUvMapper;
718     }
719
720     /**
721      * Returns a texture object for the specified bitmap. The texture can
722      * come from the texture cache or an atlas. If this method returns
723      * NULL, the texture could not be found and/or allocated.
724      */
725     Texture* getTexture(const SkBitmap* bitmap);
726
727     bool reportAndClearDirty() { bool ret = mDirty; mDirty = false; return ret; }
728     inline Snapshot* writableSnapshot() { return mState.writableSnapshot(); }
729     inline const Snapshot* currentSnapshot() const { return mState.currentSnapshot(); }
730
731     // State used to define the clipping region
732     Rect mTilingClip;
733     // Is the target render surface opaque
734     bool mOpaque;
735     // Is a frame currently being rendered
736     bool mFrameStarted;
737
738     // Default UV mapper
739     const UvMapper mUvMapper;
740
741     // List of rectangles to clear after saveLayer() is invoked
742     std::vector<Rect> mLayers;
743     // List of layers to update at the beginning of a frame
744     std::vector< sp<Layer> > mLayerUpdates;
745
746     // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
747     // Properties.h
748     bool mScissorOptimizationDisabled;
749
750     bool mSkipOutlineClip;
751
752     // True if anything has been drawn since the last call to
753     // reportAndClearDirty()
754     bool mDirty;
755
756     // Lighting + shadows
757     Vector3 mLightCenter;
758     float mLightRadius;
759     uint8_t mAmbientShadowAlpha;
760     uint8_t mSpotShadowAlpha;
761
762     // Paths kept alive for the duration of the frame
763     std::vector<std::unique_ptr<SkPath>> mTempPaths;
764
765     /**
766      * Initial transform for a rendering pass; transform from global device
767      * coordinates to the current RenderNode's drawing content coordinates,
768      * with the RenderNode's RenderProperty transforms already applied.
769      * Calling setMatrix(mBaseTransform) will result in drawing at the origin
770      * of the DisplayList's recorded surface prior to any Canvas
771      * transformation.
772      */
773     Matrix4 mBaseTransform;
774
775     friend class Layer;
776     friend class TextDrawFunctor;
777     friend class DrawBitmapOp;
778     friend class DrawPatchOp;
779
780 }; // class OpenGLRenderer
781
782 }; // namespace uirenderer
783 }; // namespace android
784
785 #endif // ANDROID_HWUI_OPENGL_RENDERER_H