Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Unified Diff: include/core/SkPatch.h

Issue 405163003: SkPatch abstraction (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gyp/gmslides.gypi ('k') | src/core/SkPatch.cpp » ('j') | src/core/SkPatch.cpp » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/core/SkPatch.h
diff --git a/include/core/SkPatch.h b/include/core/SkPatch.h
new file mode 100644
index 0000000000000000000000000000000000000000..55f9070290785cc74fb026e1143f151684deae4e
--- /dev/null
+++ b/include/core/SkPatch.h
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkPatch_DEFINED
+#define SkPatch_DEFINED
+
+#include "SkPreConfig.h"
egdaniel 2014/07/21 21:16:03 In general we like to keep includes in alphabetica
dandov 2014/07/22 13:55:14 Done.
+#include "SkTypes.h"
+#include "SkScalar.h"
+#include "SkPoint.h"
+#include "SkColor.h"
+#include "GrColor.h"
+
+#include <stdint.h>
+
+
+class SkPatchMesh;
jvanverth1 2014/07/21 22:10:09 This forward declaration isn't needed.
dandov 2014/07/22 13:55:14 Done.
+
+class SkPatchMesh {
egdaniel 2014/07/21 21:16:03 Comment here describing what an SkPatchMesh is
dandov 2014/07/22 13:55:14 Done.
+
+public:
+
+ /**
+ * Client is responsible for setting up the PatchMesh by providing which variables it is going
egdaniel 2014/07/21 21:16:03 Nit: all the "*" should be lined up with the first
dandov 2014/07/22 13:55:14 Done.
+ * to use and by allocating its memory.
+ * Vertices and Indices are always generated.
+ * useColors and useTexCoords define if this patchmesh will handle colors and texture coordinates
+ * intercalated defines if the data is:
+ * array of objects {{vertex,color,uv}, {vertex,color,uv}, {vertex,color,uv}}
+ * object of arrays {{vertex, vertex, vertex}, {color, color, color}, {uv, uv, uv}}
+ */
+ SkPatchMesh();
+
+ enum SkColorFormat {
+ kNoColor_ColorFormat,
+ kSkColor_ColorFormat,
+ //kSkPMColor_ColorFormat,
+ kGrColor_ColorFormat
+ };
+
+ void init(int vertCount, int indexCount, SkColorFormat format, bool useTexCoords,
+ bool intercalate);
+
+ ~SkPatchMesh();
+
+ /**
+ * The client is responsible for setting the values using the functions vertexAt, colorAt,
+ * texCoordAt. These functions have an assert to check if this patchmesh handles colors or
+ * texture coordinates and if it is an array of objects or and object of arrays, based on this
+ * and the type of arrays being used they return a reference to the value to be set.
+ */
+ SkPoint& pointAt(int index);
+
+ uint32_t& colorAt(int index);
+ bool setColorAt(int index, uint8_t r, uint8_t g, uint8_t b, uint8_t a);
+
+ SkPoint& texCoordAt(int index);
+
+ /**
+ * The client is responsible for setting up the indices. Index refers to which group of indices
+ * to set, indices refers to the pointer of the data to set and size is the number of elements
+ * that are going to set.
+ * They need to be separated because (depending on the patch) they might be less number of
+ * indices than vertices.
+ */
+ void setIndices(int index, uint16_t* indices, int size);
+
+ int getVertexCount();
+
+ int getIndexCount();
+
+ bool useColors();
+
+ bool useTexCoords();
+
+ bool isIntercalated();
+
+ const SkPoint* getPoints();
+
+ const uint16_t* getIndices();
+
+ const SkColor* getColors();
+
+ const SkPoint* getTexCoords();
+
+ const uint8_t* getData();
+
+private:
+ int fVertCount, fIndexCount;
+ uint8_t* fData;
+ uint16_t* fIndices;
+ bool fUseColors, fUseTexCoords, fIntercalate;
+ int fColorOffset, fTexOffset, fDataSize;
+ SkColorFormat fColorFormat;
+
+ void reset();
+};
+
+class SK_API SkPatch {
egdaniel 2014/07/21 21:16:03 Comment describing what an SkPatch is
dandov 2014/07/22 13:55:14 Done.
+
jvanverth1 2014/07/21 22:10:09 Unless we're planning on supporting other patch ty
+public:
+
+ virtual ~SkPatch() { }
+
+ virtual bool genMesh(SkPatchMesh* mesh, SkPatchMesh::SkColorFormat format, bool useTexCoords,
+ bool intercalate) const = 0;
+ virtual bool usesColors() const = 0;
+ virtual bool usesTexCoords() const = 0;
+};
+
+class CubicEvaluator {
jvanverth1 2014/07/21 22:10:09 SkCubicEvaluator
+
+public:
+ CubicEvaluator(){ }
+
+ /**
+ * Receives the 4 control points for the cubic.
+ */
+ CubicEvaluator(SkPoint a, SkPoint b, SkPoint c, SkPoint d);
+
+ /*
+ * Evaluate cubic bezier given a t parameter.
+ */
+ SkPoint eval(SkScalar t);
+
+ /*
+ * Evaluate cubic bezier using forward differences.
+ * Call hasNext to check if the next value is still within the range t=[0,1].
+ * Call next to obtain the SkPoint sampled at the next t.
+ * Call reset to start sampling from t=0
+ */
+ bool hasNext();
+
+ SkPoint next();
+
+ void reset(int res);
jvanverth1 2014/07/21 22:10:09 Since reset() is the first thing you'd do, I'd put
dandov 2014/07/22 13:55:14 Done.
+
+ const SkPoint* getPoints();
+
+ const SkPoint* getCoefs();
+
+ int getResolution();
+
+private:
+ int fMax, fCurrent, fRes;
jvanverth1 2014/07/21 22:10:09 Indented too far.
dandov 2014/07/22 13:55:14 I don't know why these are indented like that beca
+ SkPoint fFwDiff[4], fCoefs[4], fPoints[4];
+};
+
+class SK_API SkCoonsPatch : public SkPatch{
+
+public:
+ SkCoonsPatch() { }
jvanverth1 2014/07/21 22:10:09 Indent.
+
+ /*
+ * Points are in the following order:
+ * (bottom curve)
+ * 0 1 2 3
+ * (left curve) 8 10 (right curve)
+ * 9 11
+ * 4 5 6 7
+ * (top curve)
+ * Used pointer to an array to guarantee that this method receives an array of 4 SkColors
+ */
+ SkCoonsPatch(SkPoint points[12], SkColor (*colors)[4], int resX);
+
+ virtual bool genMesh(SkPatchMesh* mesh,
+ SkPatchMesh::SkColorFormat format = SkPatchMesh::kSkColor_ColorFormat,
+ bool useTexCoords = false, bool intercalate = false) const;
jvanverth1 2014/07/21 22:10:09 With two booleans in a row, it's going to be uncle
dandov 2014/07/22 13:55:14 Added an enum for the array format that also provi
+
+ virtual bool usesColors() const {
+ return true;
+ }
+
+ virtual bool usesTexCoords() const SK_OVERRIDE {
+ return false;
+ }
+
+ CubicEvaluator getTop() { return fTop; }
+
+ CubicEvaluator getLeft() { return fLeft; }
+
+ CubicEvaluator getRight() { return fRight; }
+
+ CubicEvaluator getBottom() { return fBottom; }
+
+ const SkPoint* getTopPoints() { return fTop.getPoints(); }
+
+ const SkPoint* getLeftPoints() { return fLeft.getPoints(); }
+
+ const SkPoint* getRightPoints() { return fRight.getPoints(); }
+
+ const SkPoint* getBottomPoints() { return fBottom.getPoints(); }
+
+private:
+ SkPoint* fPoints;
+ mutable CubicEvaluator fBottom, fTop, fLeft, fRight;
jvanverth1 2014/07/21 22:10:09 Indent.
+ SkPMColor fColors[4];
+ int fResX, fResY;
+
+ typedef SkPatch INHERITED;
+};
+
+#endif
« no previous file with comments | « gyp/gmslides.gypi ('k') | src/core/SkPatch.cpp » ('j') | src/core/SkPatch.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698