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

Side by Side Diff: src/effects/gradients/Sk4fGradientBase.cpp

Issue 1735773003: 4f gradient negative-dx interval fixup for kMirror_TileMode (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 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 | « no previous file | no next file » | 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 2016 Google Inc. 2 * Copyright 2016 Google Inc.
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 "Sk4fGradientBase.h" 8 #include "Sk4fGradientBase.h"
9 9
10 namespace { 10 namespace {
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 200
201 if (shader.fTileMode == SkShader::kClamp_TileMode) { 201 if (shader.fTileMode == SkShader::kClamp_TileMode) {
202 // synthetic edge interval: Pn .. +/-inf 202 // synthetic edge interval: Pn .. +/-inf
203 const SkPMColor clamp_color = 203 const SkPMColor clamp_color =
204 pack_color(shader.fOrigColors[last_index], fColorsArePremul); 204 pack_color(shader.fOrigColors[last_index], fColorsArePremul);
205 const SkScalar clamp_pos = dx_is_pos ? SK_ScalarMax : SK_ScalarMin; 205 const SkScalar clamp_pos = dx_is_pos ? SK_ScalarMax : SK_ScalarMin;
206 fIntervals.emplace_back(clamp_color, last_pos, 206 fIntervals.emplace_back(clamp_color, last_pos,
207 clamp_color, clamp_pos, 207 clamp_color, clamp_pos,
208 componentScale); 208 componentScale);
209 } else if (shader.fTileMode == SkShader::kMirror_TileMode) { 209 } else if (shader.fTileMode == SkShader::kMirror_TileMode) {
210 const int count = fIntervals.count();
210 // synthetic flipped intervals in [1 .. 2) 211 // synthetic flipped intervals in [1 .. 2)
211 for (int i = fIntervals.count() - 1; i >= 0; --i) { 212 for (int i = count - 1; i >= 0; --i) {
212 const Interval& interval = fIntervals[i]; 213 const Interval& interval = fIntervals[i];
213 const SkScalar p0 = interval.fP0; 214 const SkScalar p0 = interval.fP0;
214 const SkScalar p1 = interval.fP1; 215 const SkScalar p1 = interval.fP1;
215 Sk4f dc = Sk4f::Load(interval.fDc.fVec); 216 Sk4f dc = Sk4f::Load(interval.fDc.fVec);
216 Sk4f c = Sk4f::Load(interval.fC0.fVec) + dc * Sk4f(p1 - p0); 217 Sk4f c = Sk4f::Load(interval.fC0.fVec) + dc * Sk4f(p1 - p0);
217 fIntervals.emplace_back(c, dc * Sk4f(-1), 2 - p1, 2 - p0); 218 fIntervals.emplace_back(c, dc * Sk4f(-1), 2 - p1, 2 - p0);
218 } 219 }
220
221 if (!dx_is_pos) {
222 // When dx is negative, our initial invervals are in (1..0] order.
223 // The loop above appends their flipped counterparts, pivoted in 2: (1..0](2..1]
224 // To achieve the expected monotonic interval order, we need to
225 // swap the two halves: (2..1](1..0]
226 // TODO: we can probably avoid this late swap with some additional l ogic during
227 // the initial interval buildup.
228 SkASSERT(fIntervals.count() == count * 2)
229 for (int i = 0; i < count; ++i) {
230 SkTSwap(fIntervals[i], fIntervals[count + i]);
231 }
232 }
219 } 233 }
220 234
221 SkASSERT(fIntervals.count() > 0); 235 SkASSERT(fIntervals.count() > 0);
222 fCachedInterval = fIntervals.begin(); 236 fCachedInterval = fIntervals.begin();
223 } 237 }
224 238
225 const SkGradientShaderBase::GradientShaderBase4fContext::Interval* 239 const SkGradientShaderBase::GradientShaderBase4fContext::Interval*
226 SkGradientShaderBase:: 240 SkGradientShaderBase::
227 GradientShaderBase4fContext::findInterval(SkScalar fx) const { 241 GradientShaderBase4fContext::findInterval(SkScalar fx) const {
228 SkASSERT(in_range(fx, fIntervals.front().fP0, fIntervals.back().fP1)); 242 SkASSERT(in_range(fx, fIntervals.front().fP0, fIntervals.back().fP1));
(...skipping 28 matching lines...) Expand all
257 } else { 271 } else {
258 SkASSERT(in_range(fx, i->fP1, i1->fP1)); 272 SkASSERT(in_range(fx, i->fP1, i1->fP1));
259 i0 = i + 1; 273 i0 = i + 1;
260 } 274 }
261 } 275 }
262 276
263 SkASSERT(in_range(fx, i0->fP0, i0->fP1)); 277 SkASSERT(in_range(fx, i0->fP0, i0->fP1));
264 return i0; 278 return i0;
265 } 279 }
266 } 280 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698