Renderer.h revision 564acf7c9bff822f608cda0d5df0a64a9f9aaefd
1/* 2 * Copyright (C) 2013 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_RENDERER_H 18#define ANDROID_HWUI_RENDERER_H 19 20#include <SkRegion.h> 21 22#include <utils/String8.h> 23 24#include "AssetAtlas.h" 25#include "SkPaint.h" 26 27namespace android { 28 29class Functor; 30struct Res_png_9patch; 31 32namespace uirenderer { 33 34class DisplayList; 35class Layer; 36class Matrix4; 37class SkiaColorFilter; 38class SkiaShader; 39class Patch; 40 41enum DrawOpMode { 42 kDrawOpMode_Immediate, 43 kDrawOpMode_Defer, 44 kDrawOpMode_Flush 45}; 46 47/** 48 * Hwui's abstract version of Canvas. 49 * 50 * Provides methods for frame state operations, as well as the SkCanvas style transform/clip state, 51 * and varied drawing operations. 52 * 53 * Should at some point interact with native SkCanvas. 54 */ 55class ANDROID_API Renderer { 56public: 57 virtual ~Renderer() {} 58 59 /** 60 * Sets the name of this renderer. The name is optional and empty by default, for debugging 61 * purposes only. If the pointer is null the name is set to the empty string. 62 */ 63 void setName(const char * name) { 64 if (name) { 65 mName.setTo(name); 66 } else { 67 mName.clear(); 68 } 69 } 70 71 /** 72 * Returns the name of this renderer as UTF8 string. 73 * The returned pointer is never null. 74 */ 75 const char* getName() const { 76 return mName.string(); 77 } 78 79 /** 80 * Indicates whether this renderer is recording drawing commands for later playback. 81 * If this method returns true, the drawing commands are deferred. 82 */ 83 virtual bool isRecording() const { 84 return false; 85 } 86 87 /** 88 * Safely retrieves the mode from the specified xfermode. If the specified 89 * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode. 90 */ 91 static inline SkXfermode::Mode getXfermode(SkXfermode* mode) { 92 SkXfermode::Mode resultMode; 93 if (!SkXfermode::AsMode(mode, &resultMode)) { 94 resultMode = SkXfermode::kSrcOver_Mode; 95 } 96 return resultMode; 97 } 98 99// ---------------------------------------------------------------------------- 100// Frame state operations 101// ---------------------------------------------------------------------------- 102 /** 103 * Sets the dimension of the underlying drawing surface. This method must 104 * be called at least once every time the drawing surface changes size. 105 * 106 * @param width The width in pixels of the underlysing surface 107 * @param height The height in pixels of the underlysing surface 108 */ 109 virtual void setViewport(int width, int height) = 0; 110 111 /** 112 * Prepares the renderer to draw a frame. This method must be invoked 113 * at the beginning of each frame. When this method is invoked, the 114 * entire drawing surface is assumed to be redrawn. 115 * 116 * @param opaque If true, the target surface is considered opaque 117 * and will not be cleared. If false, the target surface 118 * will be cleared 119 */ 120 virtual status_t prepare(bool opaque) = 0; 121 122 /** 123 * Prepares the renderer to draw a frame. This method must be invoked 124 * at the beginning of each frame. Only the specified rectangle of the 125 * frame is assumed to be dirty. A clip will automatically be set to 126 * the specified rectangle. 127 * 128 * @param left The left coordinate of the dirty rectangle 129 * @param top The top coordinate of the dirty rectangle 130 * @param right The right coordinate of the dirty rectangle 131 * @param bottom The bottom coordinate of the dirty rectangle 132 * @param opaque If true, the target surface is considered opaque 133 * and will not be cleared. If false, the target surface 134 * will be cleared in the specified dirty rectangle 135 */ 136 virtual status_t prepareDirty(float left, float top, float right, float bottom, 137 bool opaque) = 0; 138 139 /** 140 * Indicates the end of a frame. This method must be invoked whenever 141 * the caller is done rendering a frame. 142 */ 143 virtual void finish() = 0; 144 145 /** 146 * This method must be invoked before handing control over to a draw functor. 147 * See callDrawGLFunction() for instance. 148 * 149 * This command must not be recorded inside display lists. 150 */ 151 virtual void interrupt() = 0; 152 153 /** 154 * This method must be invoked after getting control back from a draw functor. 155 * 156 * This command must not be recorded inside display lists. 157 */ 158 virtual void resume() = 0; 159 160// ---------------------------------------------------------------------------- 161// Canvas state operations 162// ---------------------------------------------------------------------------- 163 // Save (layer) 164 virtual int getSaveCount() const = 0; 165 virtual int save(int flags) = 0; 166 virtual void restore() = 0; 167 virtual void restoreToCount(int saveCount) = 0; 168 169 int saveLayer(float left, float top, float right, float bottom, 170 const SkPaint* paint, int flags) { 171 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; 172 int alpha = 255; 173 if (paint) { 174 mode = getXfermode(paint->getXfermode()); 175 alpha = paint->getAlpha(); 176 } 177 return saveLayer(left, top, right, bottom, alpha, mode, flags); 178 } 179 int saveLayerAlpha(float left, float top, float right, float bottom, 180 int alpha, int flags) { 181 return saveLayer(left, top, right, bottom, alpha, SkXfermode::kSrcOver_Mode, flags); 182 } 183 virtual int saveLayer(float left, float top, float right, float bottom, 184 int alpha, SkXfermode::Mode mode, int flags) = 0; 185 186 // Matrix 187 virtual void getMatrix(SkMatrix* outMatrix) const = 0; 188 virtual void translate(float dx, float dy, float dz = 0.0f) = 0; 189 virtual void rotate(float degrees) = 0; 190 virtual void scale(float sx, float sy) = 0; 191 virtual void skew(float sx, float sy) = 0; 192 193 virtual void setMatrix(SkMatrix* matrix) = 0; 194 virtual void concatMatrix(SkMatrix* matrix) = 0; 195 196 // clip 197 virtual const Rect& getClipBounds() const = 0; 198 virtual bool quickRejectConservative(float left, float top, 199 float right, float bottom) const = 0; 200 virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0; 201 virtual bool clipPath(SkPath* path, SkRegion::Op op) = 0; 202 virtual bool clipRegion(SkRegion* region, SkRegion::Op op) = 0; 203 204 // Misc - should be implemented with SkPaint inspection 205 virtual void resetShader() = 0; 206 virtual void setupShader(SkiaShader* shader) = 0; 207 208 virtual void resetColorFilter() = 0; 209 virtual void setupColorFilter(SkiaColorFilter* filter) = 0; 210 211 virtual void resetShadow() = 0; 212 virtual void setupShadow(float radius, float dx, float dy, int color) = 0; 213 214 virtual void resetPaintFilter() = 0; 215 virtual void setupPaintFilter(int clearBits, int setBits) = 0; 216 217// ---------------------------------------------------------------------------- 218// Canvas draw operations 219// ---------------------------------------------------------------------------- 220 virtual status_t drawColor(int color, SkXfermode::Mode mode) = 0; 221 222 // Bitmap-based 223 virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) = 0; 224 virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) = 0; 225 virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 226 float srcRight, float srcBottom, float dstLeft, float dstTop, 227 float dstRight, float dstBottom, SkPaint* paint) = 0; 228 virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint) = 0; 229 virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 230 float* vertices, int* colors, SkPaint* paint) = 0; 231 virtual status_t drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, 232 float left, float top, float right, float bottom, SkPaint* paint) = 0; 233 234 // Shapes 235 virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint) = 0; 236 virtual status_t drawRects(const float* rects, int count, SkPaint* paint) = 0; 237 virtual status_t drawRoundRect(float left, float top, float right, float bottom, 238 float rx, float ry, SkPaint* paint) = 0; 239 virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint) = 0; 240 virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint) = 0; 241 virtual status_t drawArc(float left, float top, float right, float bottom, 242 float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) = 0; 243 virtual status_t drawPath(SkPath* path, SkPaint* paint) = 0; 244 virtual status_t drawLines(float* points, int count, SkPaint* paint) = 0; 245 virtual status_t drawPoints(float* points, int count, SkPaint* paint) = 0; 246 247 // Text 248 virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, 249 const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds, 250 DrawOpMode drawOpMode = kDrawOpMode_Immediate) = 0; 251 virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, 252 float hOffset, float vOffset, SkPaint* paint) = 0; 253 virtual status_t drawPosText(const char* text, int bytesCount, int count, 254 const float* positions, SkPaint* paint) = 0; 255 256// ---------------------------------------------------------------------------- 257// Canvas draw operations - special 258// ---------------------------------------------------------------------------- 259 virtual status_t drawLayer(Layer* layer, float x, float y) = 0; 260 virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, 261 int32_t replayFlags) = 0; 262 263 // TODO: rename for consistency 264 virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty) = 0; 265 266private: 267 // Optional name of the renderer 268 String8 mName; 269}; // class Renderer 270 271}; // namespace uirenderer 272}; // namespace android 273 274#endif // ANDROID_HWUI_RENDERER_H 275