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

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

Issue 189963004: Fix the rendering error of SkDraw::drawVertices in gpu path for solid color (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: code rebase + update comments according to Brian's suggestions Created 6 years, 6 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
« no previous file with comments | « include/core/SkVertState.h ('k') | src/core/SkVertState.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkDraw.h" 8 #include "SkDraw.h"
9 #include "SkBlitter.h" 9 #include "SkBlitter.h"
10 #include "SkBounder.h" 10 #include "SkBounder.h"
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 #include "SkColorPriv.h" 12 #include "SkColorPriv.h"
13 #include "SkDevice.h" 13 #include "SkDevice.h"
14 #include "SkDeviceLooper.h" 14 #include "SkDeviceLooper.h"
15 #include "SkFixed.h" 15 #include "SkFixed.h"
16 #include "SkMaskFilter.h" 16 #include "SkMaskFilter.h"
17 #include "SkPaint.h" 17 #include "SkPaint.h"
18 #include "SkPathEffect.h" 18 #include "SkPathEffect.h"
19 #include "SkRasterClip.h" 19 #include "SkRasterClip.h"
20 #include "SkRasterizer.h" 20 #include "SkRasterizer.h"
21 #include "SkRRect.h" 21 #include "SkRRect.h"
22 #include "SkScan.h" 22 #include "SkScan.h"
23 #include "SkShader.h" 23 #include "SkShader.h"
24 #include "SkSmallAllocator.h" 24 #include "SkSmallAllocator.h"
25 #include "SkString.h" 25 #include "SkString.h"
26 #include "SkStroke.h" 26 #include "SkStroke.h"
27 #include "SkTLazy.h" 27 #include "SkTLazy.h"
28 #include "SkUtils.h" 28 #include "SkUtils.h"
29 #include "SkVertState.h"
29 30
30 #include "SkAutoKern.h" 31 #include "SkAutoKern.h"
31 #include "SkBitmapProcShader.h" 32 #include "SkBitmapProcShader.h"
32 #include "SkDrawProcs.h" 33 #include "SkDrawProcs.h"
33 #include "SkMatrixUtils.h" 34 #include "SkMatrixUtils.h"
34 35
35 36
36 //#define TRACE_BITMAP_DRAWS 37 //#define TRACE_BITMAP_DRAWS
37 38
38 39
(...skipping 2164 matching lines...) Expand 10 before | Expand all | Expand 10 after
2203 fDevice->drawPath(*this, tmp, iter.getPaint(), NULL, true); 2204 fDevice->drawPath(*this, tmp, iter.getPaint(), NULL, true);
2204 } else { 2205 } else {
2205 this->drawPath(tmp, iter.getPaint(), NULL, true); 2206 this->drawPath(tmp, iter.getPaint(), NULL, true);
2206 } 2207 }
2207 } 2208 }
2208 } 2209 }
2209 } 2210 }
2210 2211
2211 /////////////////////////////////////////////////////////////////////////////// 2212 ///////////////////////////////////////////////////////////////////////////////
2212 2213
2213 struct VertState {
2214 int f0, f1, f2;
2215
2216 VertState(int vCount, const uint16_t indices[], int indexCount)
2217 : fIndices(indices) {
2218 fCurrIndex = 0;
2219 if (indices) {
2220 fCount = indexCount;
2221 } else {
2222 fCount = vCount;
2223 }
2224 }
2225
2226 typedef bool (*Proc)(VertState*);
2227 Proc chooseProc(SkCanvas::VertexMode mode);
2228
2229 private:
2230 int fCount;
2231 int fCurrIndex;
2232 const uint16_t* fIndices;
2233
2234 static bool Triangles(VertState*);
2235 static bool TrianglesX(VertState*);
2236 static bool TriangleStrip(VertState*);
2237 static bool TriangleStripX(VertState*);
2238 static bool TriangleFan(VertState*);
2239 static bool TriangleFanX(VertState*);
2240 };
2241
2242 bool VertState::Triangles(VertState* state) {
2243 int index = state->fCurrIndex;
2244 if (index + 3 > state->fCount) {
2245 return false;
2246 }
2247 state->f0 = index + 0;
2248 state->f1 = index + 1;
2249 state->f2 = index + 2;
2250 state->fCurrIndex = index + 3;
2251 return true;
2252 }
2253
2254 bool VertState::TrianglesX(VertState* state) {
2255 const uint16_t* indices = state->fIndices;
2256 int index = state->fCurrIndex;
2257 if (index + 3 > state->fCount) {
2258 return false;
2259 }
2260 state->f0 = indices[index + 0];
2261 state->f1 = indices[index + 1];
2262 state->f2 = indices[index + 2];
2263 state->fCurrIndex = index + 3;
2264 return true;
2265 }
2266
2267 bool VertState::TriangleStrip(VertState* state) {
2268 int index = state->fCurrIndex;
2269 if (index + 3 > state->fCount) {
2270 return false;
2271 }
2272 state->f2 = index + 2;
2273 if (index & 1) {
2274 state->f0 = index + 1;
2275 state->f1 = index + 0;
2276 } else {
2277 state->f0 = index + 0;
2278 state->f1 = index + 1;
2279 }
2280 state->fCurrIndex = index + 1;
2281 return true;
2282 }
2283
2284 bool VertState::TriangleStripX(VertState* state) {
2285 const uint16_t* indices = state->fIndices;
2286 int index = state->fCurrIndex;
2287 if (index + 3 > state->fCount) {
2288 return false;
2289 }
2290 state->f2 = indices[index + 2];
2291 if (index & 1) {
2292 state->f0 = indices[index + 1];
2293 state->f1 = indices[index + 0];
2294 } else {
2295 state->f0 = indices[index + 0];
2296 state->f1 = indices[index + 1];
2297 }
2298 state->fCurrIndex = index + 1;
2299 return true;
2300 }
2301
2302 bool VertState::TriangleFan(VertState* state) {
2303 int index = state->fCurrIndex;
2304 if (index + 3 > state->fCount) {
2305 return false;
2306 }
2307 state->f0 = 0;
2308 state->f1 = index + 1;
2309 state->f2 = index + 2;
2310 state->fCurrIndex = index + 1;
2311 return true;
2312 }
2313
2314 bool VertState::TriangleFanX(VertState* state) {
2315 const uint16_t* indices = state->fIndices;
2316 int index = state->fCurrIndex;
2317 if (index + 3 > state->fCount) {
2318 return false;
2319 }
2320 state->f0 = indices[0];
2321 state->f1 = indices[index + 1];
2322 state->f2 = indices[index + 2];
2323 state->fCurrIndex = index + 1;
2324 return true;
2325 }
2326
2327 VertState::Proc VertState::chooseProc(SkCanvas::VertexMode mode) {
2328 switch (mode) {
2329 case SkCanvas::kTriangles_VertexMode:
2330 return fIndices ? TrianglesX : Triangles;
2331 case SkCanvas::kTriangleStrip_VertexMode:
2332 return fIndices ? TriangleStripX : TriangleStrip;
2333 case SkCanvas::kTriangleFan_VertexMode:
2334 return fIndices ? TriangleFanX : TriangleFan;
2335 default:
2336 return NULL;
2337 }
2338 }
2339
2340 typedef void (*HairProc)(const SkPoint&, const SkPoint&, const SkRasterClip&, 2214 typedef void (*HairProc)(const SkPoint&, const SkPoint&, const SkRasterClip&,
2341 SkBlitter*); 2215 SkBlitter*);
2342 2216
2343 static HairProc ChooseHairProc(bool doAntiAlias) { 2217 static HairProc ChooseHairProc(bool doAntiAlias) {
2344 return doAntiAlias ? SkScan::AntiHairLine : SkScan::HairLine; 2218 return doAntiAlias ? SkScan::AntiHairLine : SkScan::HairLine;
2345 } 2219 }
2346 2220
2347 static bool texture_to_matrix(const VertState& state, const SkPoint verts[], 2221 static bool texture_to_matrix(const VertState& state, const SkPoint verts[],
2348 const SkPoint texs[], SkMatrix* matrix) { 2222 const SkPoint texs[], SkMatrix* matrix) {
2349 SkPoint src[3], dst[3]; 2223 SkPoint src[3], dst[3];
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
2606 continue; 2480 continue;
2607 } 2481 }
2608 } 2482 }
2609 2483
2610 SkPoint tmp[] = { 2484 SkPoint tmp[] = {
2611 devVerts[state.f0], devVerts[state.f1], devVerts[state.f2] 2485 devVerts[state.f0], devVerts[state.f1], devVerts[state.f2]
2612 }; 2486 };
2613 SkScan::FillTriangle(tmp, *fRC, blitter.get()); 2487 SkScan::FillTriangle(tmp, *fRC, blitter.get());
2614 } 2488 }
2615 } else { 2489 } else {
2616 // no colors[] and no texture 2490 // no colors[] and no texture, stroke hairlines with paint's color.
2617 HairProc hairProc = ChooseHairProc(paint.isAntiAlias()); 2491 HairProc hairProc = ChooseHairProc(paint.isAntiAlias());
2618 const SkRasterClip& clip = *fRC; 2492 const SkRasterClip& clip = *fRC;
2619 while (vertProc(&state)) { 2493 while (vertProc(&state)) {
2620 hairProc(devVerts[state.f0], devVerts[state.f1], clip, blitter.get() ); 2494 hairProc(devVerts[state.f0], devVerts[state.f1], clip, blitter.get() );
2621 hairProc(devVerts[state.f1], devVerts[state.f2], clip, blitter.get() ); 2495 hairProc(devVerts[state.f1], devVerts[state.f2], clip, blitter.get() );
2622 hairProc(devVerts[state.f2], devVerts[state.f0], clip, blitter.get() ); 2496 hairProc(devVerts[state.f2], devVerts[state.f0], clip, blitter.get() );
2623 } 2497 }
2624 } 2498 }
2625 } 2499 }
2626 2500
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2836 mask->fImage = SkMask::AllocImage(size); 2710 mask->fImage = SkMask::AllocImage(size);
2837 memset(mask->fImage, 0, mask->computeImageSize()); 2711 memset(mask->fImage, 0, mask->computeImageSize());
2838 } 2712 }
2839 2713
2840 if (SkMask::kJustComputeBounds_CreateMode != mode) { 2714 if (SkMask::kJustComputeBounds_CreateMode != mode) {
2841 draw_into_mask(*mask, devPath, style); 2715 draw_into_mask(*mask, devPath, style);
2842 } 2716 }
2843 2717
2844 return true; 2718 return true;
2845 } 2719 }
OLDNEW
« no previous file with comments | « include/core/SkVertState.h ('k') | src/core/SkVertState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698