Home | History | Annotate | Download | only in hwui
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_HWUI_PATH_TESSELLATOR_H
     18 #define ANDROID_HWUI_PATH_TESSELLATOR_H
     19 
     20 #include <utils/Vector.h>
     21 
     22 #include "Matrix.h"
     23 #include "Rect.h"
     24 #include "Vertex.h"
     25 #include "VertexBuffer.h"
     26 
     27 namespace android {
     28 namespace uirenderer {
     29 
     30 class PathTessellator {
     31 public:
     32     /**
     33      * Populates scaleX and scaleY with the 'tessellation scale' of the transform - the effective X
     34      * and Y scales that tessellation will take into account when generating the 1.0 pixel thick
     35      * ramp.
     36      *
     37      * Two instances of the same shape (size, paint, etc.) will only generate the same vertices if
     38      * their tessellation scales are equal.
     39      */
     40     static void extractTessellationScales(const Matrix4& transform, float* scaleX, float* scaleY);
     41 
     42     /**
     43      * Populates a VertexBuffer with a tessellated approximation of the input convex path, as a single
     44      * triangle strip. Note: joins are not currently supported.
     45      *
     46      * @param path The path to be approximated
     47      * @param paint The paint the path will be drawn with, indicating AA, painting style
     48      *        (stroke vs fill), stroke width, stroke cap & join style, etc.
     49      * @param transform The transform the path is to be drawn with, used to drive stretch-aware path
     50      *        vertex approximation, and correct AA ramp offsetting.
     51      * @param vertexBuffer The output buffer
     52      */
     53     static void tessellatePath(const SkPath& path, const SkPaint* paint,
     54             const mat4& transform, VertexBuffer& vertexBuffer);
     55 
     56     /**
     57      * Populates a VertexBuffer with a tessellated approximation of points as a single triangle
     58      * strip (with degenerate tris separating), respecting the shape defined by the paint cap.
     59      *
     60      * @param points The center vertices of the points to be drawn
     61      * @param count The number of floats making up the point vertices
     62      * @param paint The paint the points will be drawn with indicating AA, stroke width & cap
     63      * @param transform The transform the points will be drawn with, used to drive stretch-aware path
     64      *        vertex approximation, and correct AA ramp offsetting
     65      * @param vertexBuffer The output buffer
     66      */
     67     static void tessellatePoints(const float* points, int count, const SkPaint* paint,
     68             const mat4& transform, VertexBuffer& vertexBuffer);
     69 
     70     /**
     71      * Populates a VertexBuffer with a tessellated approximation of lines as a single triangle
     72      * strip (with degenerate tris separating).
     73      *
     74      * @param points Pairs of endpoints defining the lines to be drawn
     75      * @param count The number of floats making up the line vertices
     76      * @param paint The paint the lines will be drawn with indicating AA, stroke width & cap
     77      * @param transform The transform the points will be drawn with, used to drive stretch-aware path
     78      *        vertex approximation, and correct AA ramp offsetting
     79      * @param vertexBuffer The output buffer
     80      */
     81     static void tessellateLines(const float* points, int count, const SkPaint* paint,
     82             const mat4& transform, VertexBuffer& vertexBuffer);
     83 
     84     /**
     85      * Approximates a convex, CW outline into a Vector of 2d vertices.
     86      *
     87      * @param path The outline to be approximated
     88      * @param thresholdSquared The threshold of acceptable error (in pixels) when approximating
     89      * @param outputVertices An empty Vector which will be populated with the output
     90      */
     91     static bool approximatePathOutlineVertices(const SkPath &path, float thresholdSquared,
     92             Vector<Vertex> &outputVertices);
     93 
     94 private:
     95     static bool approximatePathOutlineVertices(const SkPath &path, bool forceClose,
     96             float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared,
     97             Vector<Vertex> &outputVertices);
     98 
     99 /*
    100   endpoints a & b,
    101   control c
    102  */
    103     static void recursiveQuadraticBezierVertices(
    104             float ax, float ay,
    105             float bx, float by,
    106             float cx, float cy,
    107             float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared,
    108             Vector<Vertex> &outputVertices, int depth = 0);
    109 
    110 /*
    111   endpoints p1, p2
    112   control c1, c2
    113  */
    114     static void recursiveCubicBezierVertices(
    115             float p1x, float p1y,
    116             float c1x, float c1y,
    117             float p2x, float p2y,
    118             float c2x, float c2y,
    119             float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared,
    120             Vector<Vertex> &outputVertices, int depth = 0);
    121 };
    122 
    123 }; // namespace uirenderer
    124 }; // namespace android
    125 
    126 #endif // ANDROID_HWUI_PATH_TESSELLATOR_H
    127