18ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com/*
28ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com * Copyright 2012 The Android Open Source Project
38ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com *
48ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com * Use of this source code is governed by a BSD-style license that can be
58ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com * found in the LICENSE file.
68ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com */
78ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
88ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com#ifndef ANDROID_HWUI_PATH_RENDERER_H
98ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com#define ANDROID_HWUI_PATH_RENDERER_H
108ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
1124b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com#include <SkTArray.h>
128ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
138ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com#include "Vertex.h"
148ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
1524b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.comclass SkMatrix;
1624b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com
178ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.comnamespace android {
188ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.comnamespace uirenderer {
198ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
208ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.comclass VertexBuffer {
218ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.compublic:
228ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    VertexBuffer():
238ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        mBuffer(0),
248ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        mSize(0),
258ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        mCleanupMethod(0)
268ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    {}
278ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
288ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    ~VertexBuffer() {
298ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        if (mCleanupMethod)
308ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            mCleanupMethod(mBuffer);
318ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    }
328ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
338ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    template <class TYPE>
348ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    TYPE* alloc(int size) {
358ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        mSize = size;
368ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        mBuffer = (void*)new TYPE[size];
378ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        mCleanupMethod = &(cleanup<TYPE>);
388ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
398ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        return (TYPE*)mBuffer;
408ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    }
418ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
428ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    void* getBuffer() { return mBuffer; }
438ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    unsigned int getSize() { return mSize; }
448ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
458ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.comprivate:
468ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    template <class TYPE>
478ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    static void cleanup(void* buffer) {
488ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com        delete[] (TYPE*)buffer;
498ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    }
508ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
518ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    void* mBuffer;
528ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    unsigned int mSize;
538ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com    void (*mCleanupMethod)(void*);
548ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com};
558ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
568ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.comclass PathRenderer {
578ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.compublic:
5824b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com    static SkRect ComputePathBounds(const SkPath& path, const SkPaint* paint);
598ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
6074dda9018e8bdd650698e763404f19144c6d0a42jvanverth@google.com    static void ConvexPathVertices(const SkPath& path, const SkStrokeRec& stroke, bool isAA,
6124b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com            const SkMatrix* transform, VertexBuffer* vertexBuffer);
628ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
638ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.comprivate:
6424b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com    static bool ConvexPathPerimeterVertices(const SkPath &path, bool forceClose,
6524b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com        float sqrInvScaleX, float sqrInvScaleY, SkTArray<Vertex, true>* outputVertices);
668ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
678ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com/*
688ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com  endpoints a & b,
698ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com  control c
708ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com */
7124b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com    static void RecursiveQuadraticBezierVertices(
728ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float ax, float ay,
738ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float bx, float by,
748ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float cx, float cy,
758ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float sqrInvScaleX, float sqrInvScaleY,
7624b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com            SkTArray<Vertex, true>* outputVertices);
778ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
788ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com/*
798ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com  endpoints p1, p2
808ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com  control c1, c2
818ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com */
8224b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com    static void RecursiveCubicBezierVertices(
838ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float p1x, float p1y,
848ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float c1x, float c1y,
858ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float p2x, float p2y,
868ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float c2x, float c2y,
878ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com            float sqrInvScaleX, float sqrInvScaleY,
8824b4f97d00988efefb856abdbd4357cafdc36c86jvanverth@google.com            SkTArray<Vertex, true>* outputVertices);
898ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com};
908ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
918ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com}; // namespace uirenderer
928ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com}; // namespace android
938ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com
948ffb7046cb789ade4dde1ad588fb8ae995fd3f9ajvanverth@google.com#endif // ANDROID_HWUI_PATH_RENDERER_H
95