1710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik/* 2710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * Copyright (C) 2012 The Android Open Source Project 3710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * 4710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * you may not use this file except in compliance with the License. 6710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * You may obtain a copy of the License at 7710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * 8710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * 10710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * Unless required by applicable law or agreed to in writing, software 11710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * See the License for the specific language governing permissions and 14710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * limitations under the License. 15710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik */ 16710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 17710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik#ifndef ANDROID_HWUI_PATH_RENDERER_H 18710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik#define ANDROID_HWUI_PATH_RENDERER_H 19710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 20710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik#include <utils/Vector.h> 21710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 22710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik#include "Vertex.h" 23710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 24710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craiknamespace android { 25710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craiknamespace uirenderer { 26710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 27710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikclass Matrix4; 28710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craiktypedef Matrix4 mat4; 29710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 30710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikclass VertexBuffer { 31710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikpublic: 32710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik VertexBuffer(): 33710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mBuffer(0), 34710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mSize(0), 35710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mCleanupMethod(0) 36710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik {} 37710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 38cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik ~VertexBuffer() { 39710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik if (mCleanupMethod) 40710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mCleanupMethod(mBuffer); 41710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik } 42710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 43710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik template <class TYPE> 44cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik TYPE* alloc(int size) { 45710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mSize = size; 46710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mBuffer = (void*)new TYPE[size]; 47710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik mCleanupMethod = &(cleanup<TYPE>); 48710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 49710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik return (TYPE*)mBuffer; 50710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik } 51710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 52710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik void* getBuffer() { return mBuffer; } 53710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik unsigned int getSize() { return mSize; } 54710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 55710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikprivate: 56710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik template <class TYPE> 57cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik static void cleanup(void* buffer) { 58710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik delete[] (TYPE*)buffer; 59710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik } 60710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 61710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik void* mBuffer; 62710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik unsigned int mSize; 63710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik void (*mCleanupMethod)(void*); 64710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik}; 65710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 66710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikclass PathRenderer { 67710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikpublic: 68cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik static SkRect computePathBounds(const SkPath& path, const SkPaint* paint); 69710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 70cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik static void convexPathVertices(const SkPath& path, const SkPaint* paint, 71cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik const mat4 *transform, VertexBuffer& vertexBuffer); 72710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 73710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craikprivate: 74780c12875ce0c0d3fd072484d4b8b3c327cc4f31Chris Craik static bool convexPathPerimeterVertices(const SkPath &path, bool forceClose, 75780c12875ce0c0d3fd072484d4b8b3c327cc4f31Chris Craik float sqrInvScaleX, float sqrInvScaleY, Vector<Vertex> &outputVertices); 76710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 77710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik/* 78710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik endpoints a & b, 79710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik control c 80710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik */ 81710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik static void recursiveQuadraticBezierVertices( 82cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float ax, float ay, 83cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float bx, float by, 84cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float cx, float cy, 85cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float sqrInvScaleX, float sqrInvScaleY, 86cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik Vector<Vertex> &outputVertices); 87710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 88710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik/* 89710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik endpoints p1, p2 90710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik control c1, c2 91710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik */ 92710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik static void recursiveCubicBezierVertices( 93cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float p1x, float p1y, 94cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float c1x, float c1y, 95cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float p2x, float p2y, 96cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float c2x, float c2y, 97cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik float sqrInvScaleX, float sqrInvScaleY, 98cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik Vector<Vertex> &outputVertices); 99710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik}; 100710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 101710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik}; // namespace uirenderer 102710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik}; // namespace android 103710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik 104710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik#endif // ANDROID_HWUI_PATH_RENDERER_H 105