OpenGLRenderer.h revision a6456d0d7ea2a65474b8a3db5dbf001880c40a71
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 <GLES2/gl2.h>
21#include <GLES2/gl2ext.h>
22
23#include <SkBitmap.h>
24#include <SkMatrix.h>
25#include <SkPaint.h>
26#include <SkRegion.h>
27#include <SkShader.h>
28#include <SkXfermode.h>
29
30#include <utils/Functor.h>
31#include <utils/RefBase.h>
32#include <utils/SortedVector.h>
33#include <utils/Vector.h>
34
35#include <cutils/compiler.h>
36
37#include "Debug.h"
38#include "Extensions.h"
39#include "Matrix.h"
40#include "Program.h"
41#include "Rect.h"
42#include "Snapshot.h"
43#include "Vertex.h"
44#include "SkiaShader.h"
45#include "SkiaColorFilter.h"
46#include "Caches.h"
47
48namespace android {
49namespace uirenderer {
50
51struct DrawModifiers {
52    SkiaShader* mShader;
53    SkiaColorFilter* mColorFilter;
54
55    // Drop shadow
56    bool mHasShadow;
57    float mShadowRadius;
58    float mShadowDx;
59    float mShadowDy;
60    int mShadowColor;
61
62    // Draw filters
63    bool mHasDrawFilter;
64    int mPaintFilterClearBits;
65    int mPaintFilterSetBits;
66};
67
68struct DeferredDisplayState {
69    Rect mBounds; // local bounds, mapped with matrix to be in screen space coordinates, clipped.
70    int mMultipliedAlpha; // -1 if invalid (because caching not set)
71
72    // the below are set and used by the OpenGLRenderer at record and deferred playback
73    Rect mClip;
74    mat4 mMatrix;
75    SkiaShader* mShader;
76    DrawModifiers mDrawModifiers;
77};
78
79///////////////////////////////////////////////////////////////////////////////
80// Renderer
81///////////////////////////////////////////////////////////////////////////////
82
83class DisplayList;
84class VertexBuffer;
85
86/**
87 * OpenGL renderer used to draw accelerated 2D graphics. The API is a
88 * simplified version of Skia's Canvas API.
89 */
90class OpenGLRenderer {
91public:
92    ANDROID_API OpenGLRenderer();
93    virtual ~OpenGLRenderer();
94
95    /**
96     * Sets the name of this renderer. The name is optional and
97     * empty by default. If the pointer is null the name is set
98     * to the empty string.
99     */
100    ANDROID_API void setName(const char* name);
101
102    /**
103     * Returns the name of this renderer as UTF8 string.
104     * The returned pointer is never null.
105     */
106    ANDROID_API const char* getName() const;
107
108    /**
109     * Read externally defined properties to control the behavior
110     * of the renderer.
111     */
112    ANDROID_API void initProperties();
113
114    /**
115     * Indicates whether this renderer executes drawing commands immediately.
116     * If this method returns true, the drawing commands will be executed
117     * later.
118     */
119    virtual bool isDeferred();
120
121    /**
122     * Sets the dimension of the underlying drawing surface. This method must
123     * be called at least once every time the drawing surface changes size.
124     *
125     * @param width The width in pixels of the underlysing surface
126     * @param height The height in pixels of the underlysing surface
127     */
128    virtual void setViewport(int width, int height);
129
130    /**
131     * Prepares the renderer to draw a frame. This method must be invoked
132     * at the beginning of each frame. When this method is invoked, the
133     * entire drawing surface is assumed to be redrawn.
134     *
135     * @param opaque If true, the target surface is considered opaque
136     *               and will not be cleared. If false, the target surface
137     *               will be cleared
138     */
139    ANDROID_API status_t prepare(bool opaque);
140
141    /**
142     * Prepares the renderer to draw a frame. This method must be invoked
143     * at the beginning of each frame. Only the specified rectangle of the
144     * frame is assumed to be dirty. A clip will automatically be set to
145     * the specified rectangle.
146     *
147     * @param left The left coordinate of the dirty rectangle
148     * @param top The top coordinate of the dirty rectangle
149     * @param right The right coordinate of the dirty rectangle
150     * @param bottom The bottom coordinate of the dirty rectangle
151     * @param opaque If true, the target surface is considered opaque
152     *               and will not be cleared. If false, the target surface
153     *               will be cleared in the specified dirty rectangle
154     */
155    virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
156
157    /**
158     * Indicates the end of a frame. This method must be invoked whenever
159     * the caller is done rendering a frame.
160     */
161    virtual void finish();
162
163    /**
164     * This method must be invoked before handing control over to a draw functor.
165     * See callDrawGLFunction() for instance.
166     *
167     * This command must not be recorded inside display lists.
168     */
169    virtual void interrupt();
170
171    /**
172     * This method must be invoked after getting control back from a draw functor.
173     *
174     * This command must not be recorded inside display lists.
175     */
176    virtual void resume();
177
178    ANDROID_API status_t invokeFunctors(Rect& dirty);
179    ANDROID_API void detachFunctor(Functor* functor);
180    ANDROID_API void attachFunctor(Functor* functor);
181    virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty);
182
183    ANDROID_API void pushLayerUpdate(Layer* layer);
184    ANDROID_API void clearLayerUpdates();
185
186    ANDROID_API int getSaveCount() const;
187    virtual int save(int flags);
188    virtual void restore();
189    virtual void restoreToCount(int saveCount);
190
191    virtual int saveLayer(float left, float top, float right, float bottom,
192            SkPaint* p, int flags);
193    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
194            int alpha, int flags);
195
196    virtual void translate(float dx, float dy);
197    virtual void rotate(float degrees);
198    virtual void scale(float sx, float sy);
199    virtual void skew(float sx, float sy);
200
201    bool hasRectToRectTransform();
202    ANDROID_API void getMatrix(SkMatrix* matrix);
203    virtual void setMatrix(SkMatrix* matrix);
204    virtual void concatMatrix(SkMatrix* matrix);
205
206    ANDROID_API const Rect& getClipBounds();
207    ANDROID_API bool quickReject(float left, float top, float right, float bottom);
208    bool quickRejectNoScissor(float left, float top, float right, float bottom);
209    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
210    virtual bool clipPath(SkPath* path, SkRegion::Op op);
211    virtual bool clipRegion(SkRegion* region, SkRegion::Op op);
212    virtual Rect* getClipRect();
213
214    virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags);
215    virtual void outputDisplayList(DisplayList* displayList);
216    virtual status_t drawLayer(Layer* layer, float x, float y, SkPaint* paint);
217    virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
218    virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
219    virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
220            float srcRight, float srcBottom, float dstLeft, float dstTop,
221            float dstRight, float dstBottom, SkPaint* paint);
222    virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
223    virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
224            float* vertices, int* colors, SkPaint* paint);
225    virtual status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
226            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
227            float left, float top, float right, float bottom, SkPaint* paint);
228    status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
229            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
230            float left, float top, float right, float bottom, int alpha, SkXfermode::Mode mode);
231    virtual status_t drawColor(int color, SkXfermode::Mode mode);
232    virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
233    virtual status_t drawRoundRect(float left, float top, float right, float bottom,
234            float rx, float ry, SkPaint* paint);
235    virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
236    virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
237    virtual status_t drawArc(float left, float top, float right, float bottom,
238            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
239    virtual status_t drawPath(SkPath* path, SkPaint* paint);
240    virtual status_t drawLines(float* points, int count, SkPaint* paint);
241    virtual status_t drawPoints(float* points, int count, SkPaint* paint);
242    virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
243            float hOffset, float vOffset, SkPaint* paint);
244    virtual status_t drawPosText(const char* text, int bytesCount, int count,
245            const float* positions, SkPaint* paint);
246    virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
247            const float* positions, SkPaint* paint, float length = -1.0f);
248    virtual status_t drawRects(const float* rects, int count, SkPaint* paint);
249
250    virtual void resetShader();
251    virtual void setupShader(SkiaShader* shader);
252
253    virtual void resetColorFilter();
254    virtual void setupColorFilter(SkiaColorFilter* filter);
255
256    virtual void resetShadow();
257    virtual void setupShadow(float radius, float dx, float dy, int color);
258
259    virtual void resetPaintFilter();
260    virtual void setupPaintFilter(int clearBits, int setBits);
261
262    SkPaint* filterPaint(SkPaint* paint, bool alwaysCopy = false);
263
264    bool disallowDeferral() {
265        // returns true if the OpenGLRenderer's state can be completely represented by
266        // a DeferredDisplayState object
267        return !mSnapshot->clipRegion->isEmpty() ||
268                mSnapshot->alpha < 1.0 ||
269                (mSnapshot->flags & Snapshot::kFlagIsLayer) ||
270                (mSnapshot->flags & Snapshot::kFlagFboTarget); // ensure we're not in a layer
271    }
272
273    bool disallowReorder() { return mDrawReorderDisabled; }
274
275    bool storeDisplayState(DeferredDisplayState& state);
276    void restoreDisplayState(const DeferredDisplayState& state);
277
278    const DrawModifiers& getDrawModifiers() { return mDrawModifiers; }
279    void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; }
280
281    ANDROID_API bool isCurrentTransformSimple() {
282        return mSnapshot->transform->isSimple();
283    }
284
285    /**
286     * Sets the alpha on the current snapshot. This alpha value will be modulated
287     * with other alpha values when drawing primitives.
288     */
289    void setAlpha(float alpha) {
290        mSnapshot->alpha = alpha;
291    }
292
293    /**
294     * Inserts a named group marker in the stream of GL commands. This marker
295     * can be used by tools to group commands into logical groups. A call to
296     * this method must always be followed later on by a call to endMark().
297     */
298    void startMark(const char* name) const;
299
300    /**
301     * Closes the last group marker opened by startMark().
302     */
303    void endMark() const;
304
305    /**
306     * Gets the alpha and xfermode out of a paint object. If the paint is null
307     * alpha will be 255 and the xfermode will be SRC_OVER. This method does
308     * not multiply the paint's alpha by the current snapshot's alpha.
309     *
310     * @param paint The paint to extract values from
311     * @param alpha Where to store the resulting alpha
312     * @param mode Where to store the resulting xfermode
313     */
314    static inline void getAlphaAndModeDirect(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) {
315        if (paint) {
316            *mode = getXfermode(paint->getXfermode());
317
318            // Skia draws using the color's alpha channel if < 255
319            // Otherwise, it uses the paint's alpha
320            int color = paint->getColor();
321            *alpha = (color >> 24) & 0xFF;
322            if (*alpha == 255) {
323                *alpha = paint->getAlpha();
324            }
325        } else {
326            *mode = SkXfermode::kSrcOver_Mode;
327            *alpha = 255;
328        }
329    }
330
331protected:
332    /**
333     * Computes the projection matrix, initialize the first snapshot
334     * and stores the dimensions of the render target.
335     */
336    void initViewport(int width, int height);
337
338    /**
339     * Clears the underlying surface if needed.
340     */
341    virtual status_t clear(float left, float top, float right, float bottom, bool opaque);
342
343    /**
344     * Call this method after updating a layer during a drawing pass.
345     */
346    void resumeAfterLayer();
347
348    /**
349     * This method is called whenever a stencil buffer is required. Subclasses
350     * should override this method and call attachStencilBufferToLayer() on the
351     * appropriate layer(s).
352     */
353    virtual void ensureStencilBuffer();
354
355    /**
356     * Obtains a stencil render buffer (allocating it if necessary) and
357     * attaches it to the specified layer.
358     */
359    void attachStencilBufferToLayer(Layer* layer);
360
361    /**
362     * Compose the layer defined in the current snapshot with the layer
363     * defined by the previous snapshot.
364     *
365     * The current snapshot *must* be a layer (flag kFlagIsLayer set.)
366     *
367     * @param curent The current snapshot containing the layer to compose
368     * @param previous The previous snapshot to compose the current layer with
369     */
370    virtual void composeLayer(sp<Snapshot> current, sp<Snapshot> previous);
371
372    /**
373     * Marks the specified region as dirty at the specified bounds.
374     */
375    void dirtyLayerUnchecked(Rect& bounds, Region* region);
376
377    /**
378     * Returns the current snapshot.
379     */
380    sp<Snapshot> getSnapshot() {
381        return mSnapshot;
382    }
383
384    /**
385     * Returns the region of the current layer.
386     */
387    virtual Region* getRegion() {
388        return mSnapshot->region;
389    }
390
391    /**
392     * Indicates whether rendering is currently targeted at a layer.
393     */
394    virtual bool hasLayer() {
395        return (mSnapshot->flags & Snapshot::kFlagFboTarget) && mSnapshot->region;
396    }
397
398    /**
399     * Returns the name of the FBO this renderer is rendering into.
400     */
401    virtual GLint getTargetFbo() {
402        return 0;
403    }
404
405    /**
406     * Renders the specified layer as a textured quad.
407     *
408     * @param layer The layer to render
409     * @param rect The bounds of the layer
410     */
411    void drawTextureLayer(Layer* layer, const Rect& rect);
412
413    /**
414     * Gets the alpha and xfermode out of a paint object. If the paint is null
415     * alpha will be 255 and the xfermode will be SRC_OVER.
416     *
417     * @param paint The paint to extract values from
418     * @param alpha Where to store the resulting alpha
419     * @param mode Where to store the resulting xfermode
420     */
421    inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode);
422
423    /**
424     * Safely retrieves the mode from the specified xfermode. If the specified
425     * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
426     */
427    static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
428        SkXfermode::Mode resultMode;
429        if (!SkXfermode::AsMode(mode, &resultMode)) {
430            resultMode = SkXfermode::kSrcOver_Mode;
431        }
432        return resultMode;
433    }
434
435    /**
436     * Set to true to suppress error checks at the end of a frame.
437     */
438    virtual bool suppressErrorChecks() {
439        return false;
440    }
441
442    Caches& getCaches() {
443        return mCaches;
444    }
445
446private:
447    /**
448     * Discards the content of the framebuffer if supported by the driver.
449     * This method should be called at the beginning of a frame to optimize
450     * rendering on some tiler architectures.
451     */
452    void discardFramebuffer(float left, float top, float right, float bottom);
453
454    /**
455     * Ensures the state of the renderer is the same as the state of
456     * the GL context.
457     */
458    void syncState();
459
460    /**
461     * Tells the GPU what part of the screen is about to be redrawn.
462     * This method will use the clip rect that we started drawing the
463     * frame with.
464     * This method needs to be invoked every time getTargetFbo() is
465     * bound again.
466     */
467    void startTiling(const sp<Snapshot>& snapshot, bool opaque = false);
468
469    /**
470     * Tells the GPU what part of the screen is about to be redrawn.
471     * This method needs to be invoked every time getTargetFbo() is
472     * bound again.
473     */
474    void startTiling(const Rect& clip, int windowHeight, bool opaque = false);
475
476    /**
477     * Tells the GPU that we are done drawing the frame or that we
478     * are switching to another render target.
479     */
480    void endTiling();
481
482    /**
483     * Saves the current state of the renderer as a new snapshot.
484     * The new snapshot is saved in mSnapshot and the previous snapshot
485     * is linked from mSnapshot->previous.
486     *
487     * @param flags The save flags; see SkCanvas for more information
488     *
489     * @return The new save count. This value can be passed to #restoreToCount()
490     */
491    int saveSnapshot(int flags);
492
493    /**
494     * Restores the current snapshot; mSnapshot becomes mSnapshot->previous.
495     *
496     * @return True if the clip was modified.
497     */
498    bool restoreSnapshot();
499
500    /**
501     * Sets the clipping rectangle using glScissor. The clip is defined by
502     * the current snapshot's clipRect member.
503     */
504    void setScissorFromClip();
505
506    /**
507     * Sets the clipping region using the stencil buffer. The clip region
508     * is defined by the current snapshot's clipRegion member.
509     */
510    void setStencilFromClip();
511
512    /**
513     * Performs a quick reject but does not affect the scissor. Returns
514     * the transformed rect to test and the current clip.
515     */
516    bool quickRejectNoScissor(float left, float top, float right, float bottom,
517            Rect& transformed, Rect& clip);
518
519    /**
520     * Performs a quick reject but adjust the bounds to account for stroke width if necessary
521     */
522    bool quickRejectPreStroke(float left, float top, float right, float bottom, SkPaint* paint);
523
524    /**
525     * Creates a new layer stored in the specified snapshot.
526     *
527     * @param snapshot The snapshot associated with the new layer
528     * @param left The left coordinate of the layer
529     * @param top The top coordinate of the layer
530     * @param right The right coordinate of the layer
531     * @param bottom The bottom coordinate of the layer
532     * @param alpha The translucency of the layer
533     * @param mode The blending mode of the layer
534     * @param flags The layer save flags
535     * @param previousFbo The name of the current framebuffer
536     *
537     * @return True if the layer was successfully created, false otherwise
538     */
539    bool createLayer(float left, float top, float right, float bottom,
540            int alpha, SkXfermode::Mode mode, int flags, GLuint previousFbo);
541
542    /**
543     * Creates a new layer stored in the specified snapshot as an FBO.
544     *
545     * @param layer The layer to store as an FBO
546     * @param snapshot The snapshot associated with the new layer
547     * @param bounds The bounds of the layer
548     * @param previousFbo The name of the current framebuffer
549     */
550    bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo);
551
552    /**
553     * Compose the specified layer as a region.
554     *
555     * @param layer The layer to compose
556     * @param rect The layer's bounds
557     */
558    void composeLayerRegion(Layer* layer, const Rect& rect);
559
560    /**
561     * Compose the specified layer as a simple rectangle.
562     *
563     * @param layer The layer to compose
564     * @param rect The layer's bounds
565     * @param swap If true, the source and destination are swapped
566     */
567    void composeLayerRect(Layer* layer, const Rect& rect, bool swap = false);
568
569    /**
570     * Clears all the regions corresponding to the current list of layers.
571     * This method MUST be invoked before any drawing operation.
572     */
573    void clearLayerRegions();
574
575    /**
576     * Mark the layer as dirty at the specified coordinates. The coordinates
577     * are transformed with the supplied matrix.
578     */
579    void dirtyLayer(const float left, const float top,
580            const float right, const float bottom, const mat4 transform);
581
582    /**
583     * Mark the layer as dirty at the specified coordinates.
584     */
585    void dirtyLayer(const float left, const float top,
586            const float right, const float bottom);
587
588    /**
589     * Draws a colored rectangle with the specified color. The specified coordinates
590     * are transformed by the current snapshot's transform matrix unless specified
591     * otherwise.
592     *
593     * @param left The left coordinate of the rectangle
594     * @param top The top coordinate of the rectangle
595     * @param right The right coordinate of the rectangle
596     * @param bottom The bottom coordinate of the rectangle
597     * @param color The rectangle's ARGB color, defined as a packed 32 bits word
598     * @param mode The Skia xfermode to use
599     * @param ignoreTransform True if the current transform should be ignored
600     */
601    void drawColorRect(float left, float top, float right, float bottom,
602            int color, SkXfermode::Mode mode, bool ignoreTransform = false);
603
604    /**
605     * Draws a series of colored rectangles with the specified color. The specified
606     * coordinates are transformed by the current snapshot's transform matrix unless
607     * specified otherwise.
608     *
609     * @param rects A list of rectangles, 4 floats (left, top, right, bottom)
610     *              per rectangle
611     * @param color The rectangles' ARGB color, defined as a packed 32 bits word
612     * @param mode The Skia xfermode to use
613     * @param ignoreTransform True if the current transform should be ignored
614     * @param dirty True if calling this method should dirty the current layer
615     * @param clip True if the rects should be clipped, false otherwise
616     */
617    status_t drawColorRects(const float* rects, int count, int color,
618            SkXfermode::Mode mode, bool ignoreTransform = false,
619            bool dirty = true, bool clip = true);
620
621    /**
622     * Draws the shape represented by the specified path texture.
623     * This method invokes drawPathTexture() but takes into account
624     * the extra left/top offset and the texture offset to correctly
625     * position the final shape.
626     *
627     * @param left The left coordinate of the shape to render
628     * @param top The top coordinate of the shape to render
629     * @param texture The texture reprsenting the shape
630     * @param paint The paint to draw the shape with
631     */
632    status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
633
634    /**
635     * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey
636     * different compositing rules.
637     *
638     * @param texture The texture to draw with
639     * @param left The x coordinate of the bitmap
640     * @param top The y coordinate of the bitmap
641     * @param paint The paint to render with
642     */
643    void drawAlphaBitmap(Texture* texture, float left, float top, SkPaint* paint);
644
645    /**
646     * Renders a strip of polygons with the specified paint, used for tessellated geometry.
647     *
648     * @param vertexBuffer The VertexBuffer to be drawn
649     * @param paint The paint to render with
650     * @param useOffset Offset the vertexBuffer (used in drawing non-AA lines)
651     */
652    status_t drawVertexBuffer(const VertexBuffer& vertexBuffer, SkPaint* paint,
653            bool useOffset = false);
654
655    /**
656     * Renders the convex hull defined by the specified path as a strip of polygons.
657     *
658     * @param path The hull of the path to draw
659     * @param paint The paint to render with
660     */
661    status_t drawConvexPath(const SkPath& path, SkPaint* paint);
662
663    /**
664     * Draws a textured rectangle with the specified texture. The specified coordinates
665     * are transformed by the current snapshot's transform matrix.
666     *
667     * @param left The left coordinate of the rectangle
668     * @param top The top coordinate of the rectangle
669     * @param right The right coordinate of the rectangle
670     * @param bottom The bottom coordinate of the rectangle
671     * @param texture The texture name to map onto the rectangle
672     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
673     * @param mode The blending mode
674     * @param blend True if the texture contains an alpha channel
675     */
676    void drawTextureRect(float left, float top, float right, float bottom, GLuint texture,
677            float alpha, SkXfermode::Mode mode, bool blend);
678
679    /**
680     * Draws a textured rectangle with the specified texture. The specified coordinates
681     * are transformed by the current snapshot's transform matrix.
682     *
683     * @param left The left coordinate of the rectangle
684     * @param top The top coordinate of the rectangle
685     * @param right The right coordinate of the rectangle
686     * @param bottom The bottom coordinate of the rectangle
687     * @param texture The texture to use
688     * @param paint The paint containing the alpha, blending mode, etc.
689     */
690    void drawTextureRect(float left, float top, float right, float bottom,
691            Texture* texture, SkPaint* paint);
692
693    /**
694     * Draws a textured mesh with the specified texture. If the indices are omitted,
695     * the mesh is drawn as a simple quad. The mesh pointers become offsets when a
696     * VBO is bound.
697     *
698     * @param left The left coordinate of the rectangle
699     * @param top The top coordinate of the rectangle
700     * @param right The right coordinate of the rectangle
701     * @param bottom The bottom coordinate of the rectangle
702     * @param texture The texture name to map onto the rectangle
703     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
704     * @param mode The blending mode
705     * @param blend True if the texture contains an alpha channel
706     * @param vertices The vertices that define the mesh
707     * @param texCoords The texture coordinates of each vertex
708     * @param elementsCount The number of elements in the mesh, required by indices
709     * @param swapSrcDst Whether or not the src and dst blending operations should be swapped
710     * @param ignoreTransform True if the current transform should be ignored
711     * @param vbo The VBO used to draw the mesh
712     * @param ignoreScale True if the model view matrix should not be scaled
713     * @param dirty True if calling this method should dirty the current layer
714     */
715    void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture,
716            float alpha, SkXfermode::Mode mode, bool blend,
717            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
718            bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0,
719            bool ignoreScale = false, bool dirty = true);
720
721    void drawAlpha8TextureMesh(float left, float top, float right, float bottom,
722            GLuint texture, bool hasColor, int color, int alpha, SkXfermode::Mode mode,
723            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
724            bool ignoreTransform, bool dirty = true);
725
726    /**
727     * Draws text underline and strike-through if needed.
728     *
729     * @param text The text to decor
730     * @param bytesCount The number of bytes in the text
731     * @param length The length in pixels of the text, can be <= 0.0f to force a measurement
732     * @param x The x coordinate where the text will be drawn
733     * @param y The y coordinate where the text will be drawn
734     * @param paint The paint to draw the text with
735     */
736    void drawTextDecorations(const char* text, int bytesCount, float length,
737            float x, float y, SkPaint* paint);
738
739   /**
740     * Draws shadow layer on text (with optional positions).
741     *
742     * @param paint The paint to draw the shadow with
743     * @param text The text to draw
744     * @param bytesCount The number of bytes in the text
745     * @param count The number of glyphs in the text
746     * @param positions The x, y positions of individual glyphs (or NULL)
747     * @param fontRenderer The font renderer object
748     * @param alpha The alpha value for drawing the shadow
749     * @param mode The xfermode for drawing the shadow
750     * @param x The x coordinate where the shadow will be drawn
751     * @param y The y coordinate where the shadow will be drawn
752     */
753    void drawTextShadow(SkPaint* paint, const char* text, int bytesCount, int count,
754            const float* positions, FontRenderer& fontRenderer, int alpha, SkXfermode::Mode mode,
755            float x, float y);
756
757    /**
758     * Draws a path texture. Path textures are alpha8 bitmaps that need special
759     * compositing to apply colors/filters/etc.
760     *
761     * @param texture The texture to render
762     * @param x The x coordinate where the texture will be drawn
763     * @param y The y coordinate where the texture will be drawn
764     * @param paint The paint to draw the texture with
765     */
766     void drawPathTexture(const PathTexture* texture, float x, float y, SkPaint* paint);
767
768    /**
769     * Resets the texture coordinates stored in mMeshVertices. Setting the values
770     * back to default is achieved by calling:
771     *
772     * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
773     *
774     * @param u1 The left coordinate of the texture
775     * @param v1 The bottom coordinate of the texture
776     * @param u2 The right coordinate of the texture
777     * @param v2 The top coordinate of the texture
778     */
779    void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
780
781    /**
782     * Returns true if the specified paint will draw invisible text.
783     */
784    bool canSkipText(const SkPaint* paint) const;
785
786    /**
787     * Binds the specified texture. The texture unit must have been selected
788     * prior to calling this method.
789     */
790    inline void bindTexture(GLuint texture) {
791        glBindTexture(GL_TEXTURE_2D, texture);
792    }
793
794    /**
795     * Binds the specified EGLImage texture. The texture unit must have been selected
796     * prior to calling this method.
797     */
798    inline void bindExternalTexture(GLuint texture) {
799        glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
800    }
801
802    /**
803     * Enable or disable blending as necessary. This function sets the appropriate
804     * blend function based on the specified xfermode.
805     */
806    inline void chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description,
807            bool swapSrcDst = false);
808
809    /**
810     * Use the specified program with the current GL context. If the program is already
811     * in use, it will not be bound again. If it is not in use, the current program is
812     * marked unused and the specified program becomes used and becomes the new
813     * current program.
814     *
815     * @param program The program to use
816     *
817     * @return true If the specified program was already in use, false otherwise.
818     */
819    inline bool useProgram(Program* program);
820
821    /**
822     * Invoked before any drawing operation. This sets required state.
823     */
824    void setupDraw(bool clear = true);
825
826    /**
827     * Various methods to setup OpenGL rendering.
828     */
829    void setupDrawWithTexture(bool isAlpha8 = false);
830    void setupDrawWithTextureAndColor(bool isAlpha8 = false);
831    void setupDrawWithExternalTexture();
832    void setupDrawNoTexture();
833    void setupDrawAA();
834    void setupDrawPoint(float pointSize);
835    void setupDrawColor(int color, int alpha);
836    void setupDrawColor(float r, float g, float b, float a);
837    void setupDrawAlpha8Color(int color, int alpha);
838    void setupDrawTextGamma(const SkPaint* paint);
839    void setupDrawShader();
840    void setupDrawColorFilter();
841    void setupDrawBlending(SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
842            bool swapSrcDst = false);
843    void setupDrawBlending(bool blend = true, SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
844            bool swapSrcDst = false);
845    void setupDrawProgram();
846    void setupDrawDirtyRegionsDisabled();
847    void setupDrawModelViewIdentity(bool offset = false);
848    void setupDrawModelView(float left, float top, float right, float bottom,
849            bool ignoreTransform = false, bool ignoreModelView = false);
850    void setupDrawModelViewTranslate(float left, float top, float right, float bottom,
851            bool ignoreTransform = false);
852    void setupDrawPointUniforms();
853    void setupDrawColorUniforms();
854    void setupDrawPureColorUniforms();
855    void setupDrawShaderIdentityUniforms();
856    void setupDrawShaderUniforms(bool ignoreTransform = false);
857    void setupDrawColorFilterUniforms();
858    void setupDrawSimpleMesh();
859    void setupDrawTexture(GLuint texture);
860    void setupDrawExternalTexture(GLuint texture);
861    void setupDrawTextureTransform();
862    void setupDrawTextureTransformUniforms(mat4& transform);
863    void setupDrawTextGammaUniforms();
864    void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0);
865    void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords, GLvoid* colors);
866    void setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords);
867    void setupDrawVertices(GLvoid* vertices);
868    void finishDrawTexture();
869    void accountForClear(SkXfermode::Mode mode);
870
871    bool updateLayer(Layer* layer, bool inFrame);
872    void updateLayers();
873
874    /**
875     * Renders the specified region as a series of rectangles. This method
876     * is used for debugging only.
877     */
878    void drawRegionRects(const Region& region);
879
880    /**
881     * Renders the specified region as a series of rectangles. The region
882     * must be in screen-space coordinates.
883     */
884    void drawRegionRects(const SkRegion& region, int color, SkXfermode::Mode mode,
885            bool dirty = false);
886
887    /**
888     * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS
889     * is turned on.
890     */
891    void debugClip();
892
893    void debugOverdraw(bool enable, bool clear);
894    void renderOverdraw();
895
896    /**
897     * Should be invoked every time the glScissor is modified.
898     */
899    inline void dirtyClip() {
900        mDirtyClip = true;
901    }
902
903    // Dimensions of the drawing surface
904    int mWidth, mHeight;
905
906    // Matrix used for ortho projection in shaders
907    mat4 mOrthoMatrix;
908
909    // Model-view matrix used to position/size objects
910    mat4 mModelView;
911
912    // Number of saved states
913    int mSaveCount;
914    // Base state
915    sp<Snapshot> mFirstSnapshot;
916    // Current state
917    sp<Snapshot> mSnapshot;
918    // State used to define the clipping region
919    sp<Snapshot> mTilingSnapshot;
920
921    // Used to draw textured quads
922    TextureVertex mMeshVertices[4];
923
924    // shader, filters, and shadow
925    DrawModifiers mDrawModifiers;
926    SkPaint mFilteredPaint;
927
928    // Various caches
929    Caches& mCaches;
930    Extensions& mExtensions;
931
932    // List of rectangles to clear after saveLayer() is invoked
933    Vector<Rect*> mLayers;
934    // List of functors to invoke after a frame is drawn
935    SortedVector<Functor*> mFunctors;
936    // List of layers to update at the beginning of a frame
937    Vector<Layer*> mLayerUpdates;
938
939    // Indentity matrix
940    const mat4 mIdentity;
941
942    // Indicates whether the clip must be restored
943    bool mDirtyClip;
944
945    // The following fields are used to setup drawing
946    // Used to describe the shaders to generate
947    ProgramDescription mDescription;
948    // Color description
949    bool mColorSet;
950    float mColorA, mColorR, mColorG, mColorB;
951    // Indicates that the shader should get a color
952    bool mSetShaderColor;
953    // Current texture unit
954    GLuint mTextureUnit;
955    // Track dirty regions, true by default
956    bool mTrackDirtyRegions;
957    // Indicate whether we are drawing an opaque frame
958    bool mOpaqueFrame;
959
960    // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
961    // Properties.h
962    bool mScissorOptimizationDisabled;
963    bool mDrawDeferDisabled;
964    bool mDrawReorderDisabled;
965
966    // No-ops start/endTiling when set
967    bool mSuppressTiling;
968
969    // Optional name of the renderer
970    String8 mName;
971
972    friend class DisplayListRenderer;
973
974}; // class OpenGLRenderer
975
976}; // namespace uirenderer
977}; // namespace android
978
979#endif // ANDROID_HWUI_OPENGL_RENDERER_H
980