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