1b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik/* 2b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Copyright (C) 2013 The Android Open Source Project 3b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 4b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * you may not use this file except in compliance with the License. 6b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * You may obtain a copy of the License at 7b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 8b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 10b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Unless required by applicable law or agreed to in writing, software 11b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * See the License for the specific language governing permissions and 14b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * limitations under the License. 15b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 16b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 17b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik#ifndef ANDROID_HWUI_RENDERER_H 18b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik#define ANDROID_HWUI_RENDERER_H 19b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 20c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik#include <SkColorFilter.h> 21c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik#include <SkPaint.h> 2214e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include <SkRegion.h> 2314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 2414e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include <utils/String8.h> 2514e513058ed4168c94e015638d16f5f87fd8063aChris Craik 26b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik#include "AssetAtlas.h" 27b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 28b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craiknamespace android { 2914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 3014e513058ed4168c94e015638d16f5f87fd8063aChris Craikclass Functor; 31564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craikstruct Res_png_9patch; 3214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 33b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craiknamespace uirenderer { 34b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 35e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode; 36b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass Layer; 37b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass Matrix4; 38b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass SkiaColorFilter; 39b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass Patch; 40b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 41b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikenum DrawOpMode { 42b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik kDrawOpMode_Immediate, 43b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik kDrawOpMode_Defer, 44b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik kDrawOpMode_Flush 45b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik}; 46b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 47b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik/** 48b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Hwui's abstract version of Canvas. 49b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 50b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Provides methods for frame state operations, as well as the SkCanvas style transform/clip state, 51b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * and varied drawing operations. 52b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 53b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Should at some point interact with native SkCanvas. 54b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 55b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass ANDROID_API Renderer { 56b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikpublic: 57b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual ~Renderer() {} 58b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 59b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik /** 60b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Safely retrieves the mode from the specified xfermode. If the specified 61b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode. 62b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 63b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik static inline SkXfermode::Mode getXfermode(SkXfermode* mode) { 64b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik SkXfermode::Mode resultMode; 65b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik if (!SkXfermode::AsMode(mode, &resultMode)) { 66b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik resultMode = SkXfermode::kSrcOver_Mode; 67b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik } 68b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik return resultMode; 69b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik } 70b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 71947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik // TODO: move to a method on android:Paint 72947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik static inline bool paintWillNotDraw(const SkPaint& paint) { 73947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik return paint.getAlpha() == 0 7473821c8d2bd453de6bf3f516e1f1cdb9a132f4a7Chris Craik && !paint.getColorFilter() 75bc341912b124ea52d1a383bb8cc0a12d0671eaa2Chris Craik && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode; 76947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik } 77947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik 78947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik // TODO: move to a method on android:Paint 79947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik static inline bool paintWillNotDrawText(const SkPaint& paint) { 80947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik return paint.getAlpha() == 0 81947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik && paint.getLooper() == NULL 8273821c8d2bd453de6bf3f516e1f1cdb9a132f4a7Chris Craik && !paint.getColorFilter() 83947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode; 84947eabf42d835d0dfb0daa2fe6d869139c7000d6Chris Craik } 85c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik 86c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik static bool isBlendedColorFilter(const SkColorFilter* filter) { 87c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik if (filter == NULL) { 88c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik return false; 89c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik } 90c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0; 91c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik } 92c5b5f0556b542a22f01d254e6284f69e9eb23e74Chris Craik 93b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 94b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// Frame state operations 95b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 96b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik /** 97b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Sets the dimension of the underlying drawing surface. This method must 98b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * be called at least once every time the drawing surface changes size. 99b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 100b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param width The width in pixels of the underlysing surface 101b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param height The height in pixels of the underlysing surface 102b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 103b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void setViewport(int width, int height) = 0; 104b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 105b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik /** 106b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Prepares the renderer to draw a frame. This method must be invoked 107b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * at the beginning of each frame. When this method is invoked, the 108b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * entire drawing surface is assumed to be redrawn. 109b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 110b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param opaque If true, the target surface is considered opaque 111b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * and will not be cleared. If false, the target surface 112b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * will be cleared 113b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 114b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t prepare(bool opaque) = 0; 115b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 116b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik /** 117b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Prepares the renderer to draw a frame. This method must be invoked 118b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * at the beginning of each frame. Only the specified rectangle of the 119b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * frame is assumed to be dirty. A clip will automatically be set to 120b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * the specified rectangle. 121b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * 122b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param left The left coordinate of the dirty rectangle 123b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param top The top coordinate of the dirty rectangle 124b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param right The right coordinate of the dirty rectangle 125b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param bottom The bottom coordinate of the dirty rectangle 126b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * @param opaque If true, the target surface is considered opaque 127b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * and will not be cleared. If false, the target surface 128b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * will be cleared in the specified dirty rectangle 129b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 130b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t prepareDirty(float left, float top, float right, float bottom, 131b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik bool opaque) = 0; 132b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 133b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik /** 134b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * Indicates the end of a frame. This method must be invoked whenever 135b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik * the caller is done rendering a frame. 136b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik */ 137b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void finish() = 0; 138b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 139b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 140b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// Canvas state operations 141b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 14214e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Save (layer) 143b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual int getSaveCount() const = 0; 144b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual int save(int flags) = 0; 145b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void restore() = 0; 146b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void restoreToCount(int saveCount) = 0; 147b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 148d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger virtual int saveLayer(float left, float top, float right, float bottom, 149d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger const SkPaint* paint, int flags) = 0; 150d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger 151b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik int saveLayerAlpha(float left, float top, float right, float bottom, 152b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik int alpha, int flags) { 153d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger SkPaint paint; 154d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger paint.setAlpha(alpha); 155d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger return saveLayer(left, top, right, bottom, &paint, flags); 156b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik } 157b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 158b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik // Matrix 15914e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void getMatrix(SkMatrix* outMatrix) const = 0; 160b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void translate(float dx, float dy, float dz = 0.0f) = 0; 161b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void rotate(float degrees) = 0; 162b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void scale(float sx, float sy) = 0; 163b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void skew(float sx, float sy) = 0; 164b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 165139088228faa7f3c446af7387e017933998a5570Derek Sollenberger virtual void setMatrix(const SkMatrix& matrix) = 0; 166139088228faa7f3c446af7387e017933998a5570Derek Sollenberger virtual void concatMatrix(const SkMatrix& matrix) = 0; 167b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 16814e513058ed4168c94e015638d16f5f87fd8063aChris Craik // clip 1693f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik virtual const Rect& getLocalClipBounds() const = 0; 17014e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual bool quickRejectConservative(float left, float top, 17114e513058ed4168c94e015638d16f5f87fd8063aChris Craik float right, float bottom) const = 0; 172b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0; 173d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0; 174d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0; 175b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 176b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik // Misc - should be implemented with SkPaint inspection 177b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void resetPaintFilter() = 0; 178b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual void setupPaintFilter(int clearBits, int setBits) = 0; 179b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 180b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 181b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// Canvas draw operations 182b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 183b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t drawColor(int color, SkXfermode::Mode mode) = 0; 184b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 185b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik // Bitmap-based 186796475006f5d670e8383a2050f11719522437a43Chris Craik virtual status_t drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) = 0; 187d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop, 188b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik float srcRight, float srcBottom, float dstLeft, float dstTop, 189d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float dstRight, float dstBottom, const SkPaint* paint) = 0; 190796475006f5d670e8383a2050f11719522437a43Chris Craik virtual status_t drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) = 0; 191d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight, 192d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* vertices, const int* colors, const SkPaint* paint) = 0; 193d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch, 194d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float left, float top, float right, float bottom, const SkPaint* paint) = 0; 195b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 196b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik // Shapes 197d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawRect(float left, float top, float right, float bottom, 198d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paint) = 0; 199d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawRects(const float* rects, int count, const SkPaint* paint) = 0; 200b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t drawRoundRect(float left, float top, float right, float bottom, 201d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float rx, float ry, const SkPaint* paint) = 0; 202d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint) = 0; 203d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawOval(float left, float top, float right, float bottom, 204d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paint) = 0; 205b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t drawArc(float left, float top, float right, float bottom, 206d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) = 0; 207d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPath(const SkPath* path, const SkPaint* paint) = 0; 208d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawLines(const float* points, int count, const SkPaint* paint) = 0; 209d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPoints(const float* points, int count, const SkPaint* paint) = 0; 210b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 211b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik // Text 212b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, 213d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, 214b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik DrawOpMode drawOpMode = kDrawOpMode_Immediate) = 0; 215d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, 216d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float hOffset, float vOffset, const SkPaint* paint) = 0; 217b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t drawPosText(const char* text, int bytesCount, int count, 218d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint) = 0; 219b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 220b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 221b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// Canvas draw operations - special 222b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik// ---------------------------------------------------------------------------- 223a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty, 224b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik int32_t replayFlags) = 0; 225b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 226b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik // TODO: rename for consistency 227b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty) = 0; 228b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik}; // class Renderer 229b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 230b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik}; // namespace uirenderer 231b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik}; // namespace android 232b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 233b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik#endif // ANDROID_HWUI_RENDERER_H 234