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