PathTessellator.h revision 9c3dd62d0fbec40ea15b0a56a01bcfefa3ceabdd
165cd612face362d054a85d0f7e5881c59cd523beChris Craik/*
265cd612face362d054a85d0f7e5881c59cd523beChris Craik * Copyright (C) 2012 The Android Open Source Project
365cd612face362d054a85d0f7e5881c59cd523beChris Craik *
465cd612face362d054a85d0f7e5881c59cd523beChris Craik * Licensed under the Apache License, Version 2.0 (the "License");
565cd612face362d054a85d0f7e5881c59cd523beChris Craik * you may not use this file except in compliance with the License.
665cd612face362d054a85d0f7e5881c59cd523beChris Craik * You may obtain a copy of the License at
765cd612face362d054a85d0f7e5881c59cd523beChris Craik *
865cd612face362d054a85d0f7e5881c59cd523beChris Craik *      http://www.apache.org/licenses/LICENSE-2.0
965cd612face362d054a85d0f7e5881c59cd523beChris Craik *
1065cd612face362d054a85d0f7e5881c59cd523beChris Craik * Unless required by applicable law or agreed to in writing, software
1165cd612face362d054a85d0f7e5881c59cd523beChris Craik * distributed under the License is distributed on an "AS IS" BASIS,
1265cd612face362d054a85d0f7e5881c59cd523beChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365cd612face362d054a85d0f7e5881c59cd523beChris Craik * See the License for the specific language governing permissions and
1465cd612face362d054a85d0f7e5881c59cd523beChris Craik * limitations under the License.
1565cd612face362d054a85d0f7e5881c59cd523beChris Craik */
1665cd612face362d054a85d0f7e5881c59cd523beChris Craik
1765cd612face362d054a85d0f7e5881c59cd523beChris Craik#ifndef ANDROID_HWUI_PATH_TESSELLATOR_H
1865cd612face362d054a85d0f7e5881c59cd523beChris Craik#define ANDROID_HWUI_PATH_TESSELLATOR_H
1965cd612face362d054a85d0f7e5881c59cd523beChris Craik
2065cd612face362d054a85d0f7e5881c59cd523beChris Craik#include <utils/Vector.h>
2165cd612face362d054a85d0f7e5881c59cd523beChris Craik
2265cd612face362d054a85d0f7e5881c59cd523beChris Craik#include "Matrix.h"
2365cd612face362d054a85d0f7e5881c59cd523beChris Craik#include "Rect.h"
2465cd612face362d054a85d0f7e5881c59cd523beChris Craik#include "Vertex.h"
2555bfb4e728fe1db619af5d2c287f4abe711b3343ztenghui#include "VertexBuffer.h"
2665cd612face362d054a85d0f7e5881c59cd523beChris Craik
2765cd612face362d054a85d0f7e5881c59cd523beChris Craiknamespace android {
2865cd612face362d054a85d0f7e5881c59cd523beChris Craiknamespace uirenderer {
2965cd612face362d054a85d0f7e5881c59cd523beChris Craik
3065cd612face362d054a85d0f7e5881c59cd523beChris Craikclass PathTessellator {
3165cd612face362d054a85d0f7e5881c59cd523beChris Craikpublic:
3205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    /**
3305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Populates scaleX and scaleY with the 'tessellation scale' of the transform - the effective X
3405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * and Y scales that tessellation will take into account when generating the 1.0 pixel thick
3505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * ramp.
3605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     *
3705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * Two instances of the same shape (size, paint, etc.) will only generate the same vertices if
3805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     * their tessellation scales are equal.
3905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik     */
4005f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    static void extractTessellationScales(const Matrix4& transform, float* scaleX, float* scaleY);
4165cd612face362d054a85d0f7e5881c59cd523beChris Craik
4215a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik    /**
4315a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * Populates a VertexBuffer with a tessellated approximation of the input convex path, as a single
4415a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * triangle strip. Note: joins are not currently supported.
4515a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *
4615a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param path The path to be approximated
4715a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param paint The paint the path will be drawn with, indicating AA, painting style
4815a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *        (stroke vs fill), stroke width, stroke cap & join style, etc.
4915a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param transform The transform the path is to be drawn with, used to drive stretch-aware path
5015a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *        vertex approximation, and correct AA ramp offsetting.
5115a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param vertexBuffer The output buffer
5215a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     */
5365cd612face362d054a85d0f7e5881c59cd523beChris Craik    static void tessellatePath(const SkPath& path, const SkPaint* paint,
54d6b65f67717025b1162f86f04e2caa5723566cacChris Craik            const mat4& transform, VertexBuffer& vertexBuffer);
5565cd612face362d054a85d0f7e5881c59cd523beChris Craik
5615a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik    /**
5715a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * Populates a VertexBuffer with a tessellated approximation of points as a single triangle
5815a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * strip (with degenerate tris separating), respecting the shape defined by the paint cap.
5915a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *
6015a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param points The center vertices of the points to be drawn
6115a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param count The number of floats making up the point vertices
6215a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param paint The paint the points will be drawn with indicating AA, stroke width & cap
6315a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param transform The transform the points will be drawn with, used to drive stretch-aware path
6415a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *        vertex approximation, and correct AA ramp offsetting
6515a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param vertexBuffer The output buffer
6615a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     */
67d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    static void tessellatePoints(const float* points, int count, const SkPaint* paint,
6805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            const mat4& transform, VertexBuffer& vertexBuffer);
696d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
7015a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik    /**
7115a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * Populates a VertexBuffer with a tessellated approximation of lines as a single triangle
7215a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * strip (with degenerate tris separating).
7315a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *
7415a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param points Pairs of endpoints defining the lines to be drawn
7515a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param count The number of floats making up the line vertices
7615a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param paint The paint the lines will be drawn with indicating AA, stroke width & cap
7715a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param transform The transform the points will be drawn with, used to drive stretch-aware path
7815a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *        vertex approximation, and correct AA ramp offsetting
7915a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param vertexBuffer The output buffer
8015a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     */
81d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    static void tessellateLines(const float* points, int count, const SkPaint* paint,
8205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik            const mat4& transform, VertexBuffer& vertexBuffer);
8365cd612face362d054a85d0f7e5881c59cd523beChris Craik
8415a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik    /**
8515a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * Approximates a convex, CW outline into a Vector of 2d vertices.
8615a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     *
8715a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param path The outline to be approximated
8815a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param thresholdSquared The threshold of acceptable error (in pixels) when approximating
8915a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     * @param outputVertices An empty Vector which will be populated with the output
9015a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik     */
9115a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik    static bool approximatePathOutlineVertices(const SkPath &path, float thresholdSquared,
9215a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik            Vector<Vertex> &outputVertices);
9315a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik
9465cd612face362d054a85d0f7e5881c59cd523beChris Craikprivate:
9565cd612face362d054a85d0f7e5881c59cd523beChris Craik    static bool approximatePathOutlineVertices(const SkPath &path, bool forceClose,
9615a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik            float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared,
9715a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik            Vector<Vertex> &outputVertices);
9865cd612face362d054a85d0f7e5881c59cd523beChris Craik
9965cd612face362d054a85d0f7e5881c59cd523beChris Craik/*
10065cd612face362d054a85d0f7e5881c59cd523beChris Craik  endpoints a & b,
10165cd612face362d054a85d0f7e5881c59cd523beChris Craik  control c
10265cd612face362d054a85d0f7e5881c59cd523beChris Craik */
10365cd612face362d054a85d0f7e5881c59cd523beChris Craik    static void recursiveQuadraticBezierVertices(
10465cd612face362d054a85d0f7e5881c59cd523beChris Craik            float ax, float ay,
10565cd612face362d054a85d0f7e5881c59cd523beChris Craik            float bx, float by,
10665cd612face362d054a85d0f7e5881c59cd523beChris Craik            float cx, float cy,
10715a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik            float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared,
1089c3dd62d0fbec40ea15b0a56a01bcfefa3ceabddChris Craik            Vector<Vertex> &outputVertices, int depth = 0);
10965cd612face362d054a85d0f7e5881c59cd523beChris Craik
11065cd612face362d054a85d0f7e5881c59cd523beChris Craik/*
11165cd612face362d054a85d0f7e5881c59cd523beChris Craik  endpoints p1, p2
11265cd612face362d054a85d0f7e5881c59cd523beChris Craik  control c1, c2
11365cd612face362d054a85d0f7e5881c59cd523beChris Craik */
11465cd612face362d054a85d0f7e5881c59cd523beChris Craik    static void recursiveCubicBezierVertices(
11565cd612face362d054a85d0f7e5881c59cd523beChris Craik            float p1x, float p1y,
11665cd612face362d054a85d0f7e5881c59cd523beChris Craik            float c1x, float c1y,
11765cd612face362d054a85d0f7e5881c59cd523beChris Craik            float p2x, float p2y,
11865cd612face362d054a85d0f7e5881c59cd523beChris Craik            float c2x, float c2y,
11915a07a21eb33e8ca1c7444944fe0541a53380c0cChris Craik            float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared,
1209c3dd62d0fbec40ea15b0a56a01bcfefa3ceabddChris Craik            Vector<Vertex> &outputVertices, int depth = 0);
12165cd612face362d054a85d0f7e5881c59cd523beChris Craik};
12265cd612face362d054a85d0f7e5881c59cd523beChris Craik
12365cd612face362d054a85d0f7e5881c59cd523beChris Craik}; // namespace uirenderer
12465cd612face362d054a85d0f7e5881c59cd523beChris Craik}; // namespace android
12565cd612face362d054a85d0f7e5881c59cd523beChris Craik
12665cd612face362d054a85d0f7e5881c59cd523beChris Craik#endif // ANDROID_HWUI_PATH_TESSELLATOR_H
127