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

Side by Side Diff: src/core/SkPatchGrid.cpp

Issue 451723003: SkPatchGrid interface (after SkPatch/SkPicture rebase). (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Renamed GM to SKPatchGridGM and removed last mesh references in comments Created 6 years, 4 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 unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkPatchGrid.h"
9 #include "SkPatchUtils.h"
10
11 SkPatchGrid::SkPatchGrid(int rows, int cols)
12 : fRows(rows)
13 , fCols(cols)
14 , fCornerPts(NULL)
15 , fCornerColors(NULL)
16 , fHrzCtrlPts(NULL)
17 , fVrtCtrlPts(NULL) {
18 this->reset(fRows, fCols);
19 }
20
21 SkPatchGrid::~SkPatchGrid() {
22 SkDELETE_ARRAY(fCornerPts);
23 SkDELETE_ARRAY(fCornerColors);
24 SkDELETE_ARRAY(fHrzCtrlPts);
25 SkDELETE_ARRAY(fVrtCtrlPts);
26 }
27
28 bool SkPatchGrid::setPatch(int x, int y, const SkPoint ctrlPts[12], const SkColo r colors[4]) {
29 // Check for the passed paramaters to be within the range of the grid dimens ions.
30 if (x < 0 || y < 0 || x > fCols - 1 || y > fRows - 1) {
31 return false;
32 }
33
34 //setup corners and colors
egdaniel 2014/08/08 18:45:41 space after //
dandov 2014/08/08 19:00:55 Done.
35 int cornerPos = y * (fCols + 1) + x;
36 fCornerPts[cornerPos] = ctrlPts[SkPatch::kTopP0_CubicCtrlPts];
37 fCornerPts[cornerPos + 1] = ctrlPts[SkPatch::kTopP3_CubicCtrlPts];
38 fCornerPts[cornerPos + (fCols + 1)] = ctrlPts[SkPatch::kBottomP0_CubicCtrlPt s];
39 fCornerPts[cornerPos + (fCols + 1) + 1] = ctrlPts[SkPatch::kBottomP3_CubicCt rlPts];
40
41 fCornerColors[cornerPos] = colors[0];
42 fCornerColors[cornerPos + 1] = colors[1];
43 fCornerColors[cornerPos + (fCols + 1)] = colors[3];
44 fCornerColors[cornerPos + (fCols + 1) + 1] = colors[2];
45
46 // set horizontal control points
47 int hrzPos = y * (fCols * 2) + (x * 2);
48 fHrzCtrlPts[hrzPos] = ctrlPts[SkPatch::kTopP1_CubicCtrlPts];
49 fHrzCtrlPts[hrzPos + 1] = ctrlPts[SkPatch::kTopP2_CubicCtrlPts];
50 fHrzCtrlPts[hrzPos + (fCols * 2)] = ctrlPts[SkPatch::kBottomP1_CubicCtrlPts] ;
51 fHrzCtrlPts[hrzPos + (fCols * 2) + 1] = ctrlPts[SkPatch::kBottomP2_CubicCtrl Pts];
52
53 int vrtPos = (y*2) * (fCols + 1) + x;
54 fVrtCtrlPts[vrtPos] = ctrlPts[SkPatch::kLeftP1_CubicCtrlPts];
55 fVrtCtrlPts[vrtPos + 1] = ctrlPts[SkPatch::kRightP1_CubicCtrlPts];
56 fVrtCtrlPts[vrtPos + (fCols + 1)] = ctrlPts[SkPatch::kLeftP2_CubicCtrlPts];
57 fVrtCtrlPts[vrtPos + (fCols + 1) + 1] = ctrlPts[SkPatch::kRightP2_CubicCtrlP ts];
58 return true;
59 }
60
61 bool SkPatchGrid::setPatch(int x, int y, const SkPatch& patch) {
62 return this->setPatch(x, y, patch.getControlPoints(), patch.getColors());
63 }
64
65 bool SkPatchGrid::getPatch(int x, int y, SkPatch* patch) const {
66
67 if (x < 0 || y < 0 || x > fCols - 1 || y > fRows - 1 || NULL == patch) {
68 return false;
69 }
70 //set the patch by building the array of points and colors with the correspo nding values.
egdaniel 2014/08/08 18:45:41 space after //
dandov 2014/08/08 19:00:55 Done.
71
72 SkPoint ctrlPts[12];
73 SkColor colors[4];
74
75 int cornerPos = y * (fCols + 1) + x;
76 ctrlPts[SkPatch::kTopP0_CubicCtrlPts] = fCornerPts[cornerPos];
77 ctrlPts[SkPatch::kTopP3_CubicCtrlPts] = fCornerPts[cornerPos + 1];
78 ctrlPts[SkPatch::kBottomP0_CubicCtrlPts] = fCornerPts[cornerPos + (fCols + 1 )];
79 ctrlPts[SkPatch::kBottomP3_CubicCtrlPts] = fCornerPts[cornerPos + (fCols + 1 ) + 1];
80
81 colors[0] = fCornerColors[cornerPos];
82 colors[1] = fCornerColors[cornerPos + 1];
83 colors[3] = fCornerColors[cornerPos + (fCols + 1)];
84 colors[2] = fCornerColors[cornerPos + (fCols + 1) + 1];
85
86 int hrzPos = y * (fCols * 2) + (x * 2);
87 ctrlPts[SkPatch::kTopP1_CubicCtrlPts] = fHrzCtrlPts[hrzPos];
88 ctrlPts[SkPatch::kTopP2_CubicCtrlPts] = fHrzCtrlPts[hrzPos + 1];
89 ctrlPts[SkPatch::kBottomP1_CubicCtrlPts] = fHrzCtrlPts[hrzPos + (fCols * 2)] ;
90 ctrlPts[SkPatch::kBottomP2_CubicCtrlPts] = fHrzCtrlPts[hrzPos + (fCols * 2) + 1];
91
92 int vrtPos = (y*2) * (fCols + 1) + x;
93 ctrlPts[SkPatch::kLeftP1_CubicCtrlPts] = fVrtCtrlPts[vrtPos];
94 ctrlPts[SkPatch::kRightP1_CubicCtrlPts] = fVrtCtrlPts[vrtPos + 1];
95 ctrlPts[SkPatch::kLeftP2_CubicCtrlPts] = fVrtCtrlPts[vrtPos + (fCols + 1)];
96 ctrlPts[SkPatch::kRightP2_CubicCtrlPts] = fVrtCtrlPts[vrtPos + (fCols + 1) + 1];
97
98 patch->reset(ctrlPts, colors);
99
100 return true;
101 }
102
103 void SkPatchGrid::reset(int rows, int cols) {
104 SkDELETE_ARRAY(fCornerPts);
105 SkDELETE_ARRAY(fCornerColors);
106 SkDELETE_ARRAY(fHrzCtrlPts);
107 SkDELETE_ARRAY(fVrtCtrlPts);
108
109 fCols = cols;
110 fRows = rows;
111
112 fCornerPts = SkNEW_ARRAY(SkPoint, (fRows + 1) * (fCols + 1));
113 fCornerColors = SkNEW_ARRAY(SkColor, (fRows + 1) * (fCols + 1));
114 fHrzCtrlPts = SkNEW_ARRAY(SkPoint, (fRows + 1) * fCols * 2);
115 fVrtCtrlPts = SkNEW_ARRAY(SkPoint, fRows * 2 * (fCols + 1));
116
117 memset(fCornerPts, 0, (fRows + 1) * (fCols + 1) * sizeof(SkPoint));
118 memset(fCornerColors, 0, (fRows + 1) * (fCols + 1) * sizeof(SkColor));
119 memset(fHrzCtrlPts, 0, (fRows + 1) * fCols * 2 * sizeof(SkPoint));
120 memset(fVrtCtrlPts, 0, fRows * 2 * (fCols + 1) * sizeof(SkPoint));
121 }
122
123 void SkPatchGrid::draw(SkCanvas* canvas, SkPaint& paint) {
124 int* maxCols = SkNEW_ARRAY(int, fCols);
125 int* maxRows = SkNEW_ARRAY(int, fRows);
126 memset(maxCols, 0, fCols * sizeof(int));
127 memset(maxRows, 0, fRows * sizeof(int));
128
129 // Get the maximum level of detail per axis for each row and column
130 for (int y = 0; y < fRows; y++) {
131 for (int x = 0; x < fCols; x++) {
132 SkPatch patch;
133 this->getPatch(x, y, &patch);
134 SkMatrix matrix = canvas->getTotalMatrix();
135 SkISize lod = SkPatchUtils::GetLevelOfDetail(patch, &matrix);
136 maxCols[x] = SkMax32(maxCols[x], lod.width());
137 maxRows[y] = SkMax32(maxRows[y], lod.height());
138 }
139 }
140 // Draw the patches by generating their geometry with the maximum level of d etail per axis.
141 for (int x = 0; x < fCols; x++) {
142 for (int y = 0; y < fRows; y++) {
143 SkPatch patch;
144 this->getPatch(x, y, &patch);
145 SkPatch::VertexData data;
146 patch.getVertexData(&data, maxCols[x], maxRows[y]);
147 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, data.fVertexCo unt,
148 data.fPoints, data.fTexCoords, data.fColors, NU LL,
149 data.fIndices, data.fIndexCount, paint);
150 }
151 }
152 SkDELETE_ARRAY(maxCols);
153 SkDELETE_ARRAY(maxRows);
154 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698