1589708bf7c706348b763e8277004cb160b202bdbrileya@google.com/* 2589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * Copyright 2012 Google Inc. 3589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * 4589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * Use of this source code is governed by a BSD-style license that can be 5589708bf7c706348b763e8277004cb160b202bdbrileya@google.com * found in the LICENSE file. 6589708bf7c706348b763e8277004cb160b202bdbrileya@google.com */ 7589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 8589708bf7c706348b763e8277004cb160b202bdbrileya@google.com#include "SkTwoPointConicalGradient.h" 9aa64fbfd349789f27b3cc35c1968d9dc0612cf8ecommit-bot@chromium.org#include "SkTwoPointConicalGradient_gpu.h" 10aa64fbfd349789f27b3cc35c1968d9dc0612cf8ecommit-bot@chromium.org 1187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgstruct TwoPtRadialContext { 1287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const TwoPtRadial& fRec; 1387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org float fRelX, fRelY; 1487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const float fIncX, fIncY; 1587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org float fB; 1687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const float fDB; 1787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 1887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org TwoPtRadialContext(const TwoPtRadial& rec, SkScalar fx, SkScalar fy, 1987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkScalar dfx, SkScalar dfy); 2087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkFixed nextT(); 2187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org}; 2287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 23589708bf7c706348b763e8277004cb160b202bdbrileya@google.comstatic int valid_divide(float numer, float denom, float* ratio) { 24589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(ratio); 25589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (0 == denom) { 26589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return 0; 27589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 28589708bf7c706348b763e8277004cb160b202bdbrileya@google.com *ratio = numer / denom; 29589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return 1; 30589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 31589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 32589708bf7c706348b763e8277004cb160b202bdbrileya@google.com// Return the number of distinct real roots, and write them into roots[] in 33589708bf7c706348b763e8277004cb160b202bdbrileya@google.com// ascending order 3444d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.orgstatic int find_quad_roots(float A, float B, float C, float roots[2], bool descendingOrder = false) { 35589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(roots); 36fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 37589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (A == 0) { 38589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return valid_divide(-C, B, roots); 39589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 40fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 41589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float R = B*B - 4*A*C; 42589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (R < 0) { 43589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return 0; 44589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 45589708bf7c706348b763e8277004cb160b202bdbrileya@google.com R = sk_float_sqrt(R); 46589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 47589708bf7c706348b763e8277004cb160b202bdbrileya@google.com#if 1 48589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float Q = B; 49589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (Q < 0) { 50589708bf7c706348b763e8277004cb160b202bdbrileya@google.com Q -= R; 51589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 52589708bf7c706348b763e8277004cb160b202bdbrileya@google.com Q += R; 53589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 54589708bf7c706348b763e8277004cb160b202bdbrileya@google.com#else 55589708bf7c706348b763e8277004cb160b202bdbrileya@google.com // on 10.6 this was much slower than the above branch :( 56589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float Q = B + copysignf(R, B); 57589708bf7c706348b763e8277004cb160b202bdbrileya@google.com#endif 58589708bf7c706348b763e8277004cb160b202bdbrileya@google.com Q *= -0.5f; 59589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (0 == Q) { 60589708bf7c706348b763e8277004cb160b202bdbrileya@google.com roots[0] = 0; 61589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return 1; 62589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 63589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 64589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float r0 = Q / A; 65589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float r1 = C / Q; 66589708bf7c706348b763e8277004cb160b202bdbrileya@google.com roots[0] = r0 < r1 ? r0 : r1; 67589708bf7c706348b763e8277004cb160b202bdbrileya@google.com roots[1] = r0 > r1 ? r0 : r1; 6844d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org if (descendingOrder) { 6944d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org SkTSwap(roots[0], roots[1]); 7044d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org } 71589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return 2; 72589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 73589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 74589708bf7c706348b763e8277004cb160b202bdbrileya@google.comstatic float lerp(float x, float dx, float t) { 75589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return x + t * dx; 76589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 77589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 78589708bf7c706348b763e8277004cb160b202bdbrileya@google.comstatic float sqr(float x) { return x * x; } 79589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 80589708bf7c706348b763e8277004cb160b202bdbrileya@google.comvoid TwoPtRadial::init(const SkPoint& center0, SkScalar rad0, 8144d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org const SkPoint& center1, SkScalar rad1, 8244d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org bool flipped) { 83589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fCenterX = SkScalarToFloat(center0.fX); 84589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fCenterY = SkScalarToFloat(center0.fY); 85589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fDCenterX = SkScalarToFloat(center1.fX) - fCenterX; 86589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fDCenterY = SkScalarToFloat(center1.fY) - fCenterY; 87589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRadius = SkScalarToFloat(rad0); 88589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fDRadius = SkScalarToFloat(rad1) - fRadius; 89589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 90589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fA = sqr(fDCenterX) + sqr(fDCenterY) - sqr(fDRadius); 91589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRadius2 = sqr(fRadius); 92589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRDR = fRadius * fDRadius; 9344d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org 9444d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org fFlipped = flipped; 95589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 96589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 9787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgTwoPtRadialContext::TwoPtRadialContext(const TwoPtRadial& rec, SkScalar fx, SkScalar fy, 9887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkScalar dfx, SkScalar dfy) 9987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org : fRec(rec) 10087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org , fRelX(SkScalarToFloat(fx) - rec.fCenterX) 10187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org , fRelY(SkScalarToFloat(fy) - rec.fCenterY) 10287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org , fIncX(SkScalarToFloat(dfx)) 10387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org , fIncY(SkScalarToFloat(dfy)) 10487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org , fB(-2 * (rec.fDCenterX * fRelX + rec.fDCenterY * fRelY + rec.fRDR)) 10587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org , fDB(-2 * (rec.fDCenterX * fIncX + rec.fDCenterY * fIncY)) {} 10687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 10787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgSkFixed TwoPtRadialContext::nextT() { 108589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float roots[2]; 109fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 11087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org float C = sqr(fRelX) + sqr(fRelY) - fRec.fRadius2; 11187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org int countRoots = find_quad_roots(fRec.fA, fB, C, roots, fRec.fFlipped); 112589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 113589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRelX += fIncX; 114589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRelY += fIncY; 115589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fB += fDB; 116589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 117589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (0 == countRoots) { 11887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org return TwoPtRadial::kDontDrawT; 119589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 120589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 121589708bf7c706348b763e8277004cb160b202bdbrileya@google.com // Prefer the bigger t value if both give a radius(t) > 0 122589708bf7c706348b763e8277004cb160b202bdbrileya@google.com // find_quad_roots returns the values sorted, so we start with the last 123589708bf7c706348b763e8277004cb160b202bdbrileya@google.com float t = roots[countRoots - 1]; 12487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org float r = lerp(fRec.fRadius, fRec.fDRadius, t); 125589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (r <= 0) { 126589708bf7c706348b763e8277004cb160b202bdbrileya@google.com t = roots[0]; // might be the same as roots[countRoots-1] 12787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org r = lerp(fRec.fRadius, fRec.fDRadius, t); 128589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (r <= 0) { 12987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org return TwoPtRadial::kDontDrawT; 130589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 131589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 132589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return SkFloatToFixed(t); 133589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 134589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 13587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgtypedef void (*TwoPointConicalProc)(TwoPtRadialContext* rec, SkPMColor* dstC, 13660040292be58ac553298209fb2e0684a4cb17dccreed@google.com const SkPMColor* cache, int toggle, int count); 137589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 13887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgstatic void twopoint_clamp(TwoPtRadialContext* rec, SkPMColor* SK_RESTRICT dstC, 13960040292be58ac553298209fb2e0684a4cb17dccreed@google.com const SkPMColor* SK_RESTRICT cache, int toggle, 14060040292be58ac553298209fb2e0684a4cb17dccreed@google.com int count) { 141589708bf7c706348b763e8277004cb160b202bdbrileya@google.com for (; count > 0; --count) { 142589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed t = rec->nextT(); 143589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (TwoPtRadial::DontDrawT(t)) { 144589708bf7c706348b763e8277004cb160b202bdbrileya@google.com *dstC++ = 0; 145589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 146589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed index = SkClampMax(t, 0xFFFF); 147589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(index <= 0xFFFF); 14860040292be58ac553298209fb2e0684a4cb17dccreed@google.com *dstC++ = cache[toggle + 14960040292be58ac553298209fb2e0684a4cb17dccreed@google.com (index >> SkGradientShaderBase::kCache32Shift)]; 150589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 15160040292be58ac553298209fb2e0684a4cb17dccreed@google.com toggle = next_dither_toggle(toggle); 152589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 153589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 154589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 15587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgstatic void twopoint_repeat(TwoPtRadialContext* rec, SkPMColor* SK_RESTRICT dstC, 15660040292be58ac553298209fb2e0684a4cb17dccreed@google.com const SkPMColor* SK_RESTRICT cache, int toggle, 15760040292be58ac553298209fb2e0684a4cb17dccreed@google.com int count) { 158589708bf7c706348b763e8277004cb160b202bdbrileya@google.com for (; count > 0; --count) { 159589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed t = rec->nextT(); 160589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (TwoPtRadial::DontDrawT(t)) { 161589708bf7c706348b763e8277004cb160b202bdbrileya@google.com *dstC++ = 0; 162589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 163589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed index = repeat_tileproc(t); 164589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(index <= 0xFFFF); 16560040292be58ac553298209fb2e0684a4cb17dccreed@google.com *dstC++ = cache[toggle + 16660040292be58ac553298209fb2e0684a4cb17dccreed@google.com (index >> SkGradientShaderBase::kCache32Shift)]; 167589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 16860040292be58ac553298209fb2e0684a4cb17dccreed@google.com toggle = next_dither_toggle(toggle); 169589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 170589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 171589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 17287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgstatic void twopoint_mirror(TwoPtRadialContext* rec, SkPMColor* SK_RESTRICT dstC, 17360040292be58ac553298209fb2e0684a4cb17dccreed@google.com const SkPMColor* SK_RESTRICT cache, int toggle, 17460040292be58ac553298209fb2e0684a4cb17dccreed@google.com int count) { 175589708bf7c706348b763e8277004cb160b202bdbrileya@google.com for (; count > 0; --count) { 176589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed t = rec->nextT(); 177589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (TwoPtRadial::DontDrawT(t)) { 178589708bf7c706348b763e8277004cb160b202bdbrileya@google.com *dstC++ = 0; 179589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 180589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed index = mirror_tileproc(t); 181589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(index <= 0xFFFF); 18260040292be58ac553298209fb2e0684a4cb17dccreed@google.com *dstC++ = cache[toggle + 18360040292be58ac553298209fb2e0684a4cb17dccreed@google.com (index >> SkGradientShaderBase::kCache32Shift)]; 184589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 18560040292be58ac553298209fb2e0684a4cb17dccreed@google.com toggle = next_dither_toggle(toggle); 186589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 187589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 188589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 189589708bf7c706348b763e8277004cb160b202bdbrileya@google.comvoid SkTwoPointConicalGradient::init() { 19044d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org fRec.init(fCenter1, fRadius1, fCenter2, fRadius2, fFlippedGrad); 191589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fPtsToUnit.reset(); 192589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 193589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 19498e8b6de04e4c20451fbe3353645e3e384a76550rileya@google.com///////////////////////////////////////////////////////////////////// 19598e8b6de04e4c20451fbe3353645e3e384a76550rileya@google.com 196589708bf7c706348b763e8277004cb160b202bdbrileya@google.comSkTwoPointConicalGradient::SkTwoPointConicalGradient( 1973d3a860d0ba878adb905512a45c500a67532b0a3reed@google.com const SkPoint& start, SkScalar startRadius, 1983d3a860d0ba878adb905512a45c500a67532b0a3reed@google.com const SkPoint& end, SkScalar endRadius, 199addf2edf3da20f053daa3897cfe2c52d7369a7b1reed bool flippedGrad, const Descriptor& desc) 200addf2edf3da20f053daa3897cfe2c52d7369a7b1reed : SkGradientShaderBase(desc) 201addf2edf3da20f053daa3897cfe2c52d7369a7b1reed , fCenter1(start) 202addf2edf3da20f053daa3897cfe2c52d7369a7b1reed , fCenter2(end) 203addf2edf3da20f053daa3897cfe2c52d7369a7b1reed , fRadius1(startRadius) 204addf2edf3da20f053daa3897cfe2c52d7369a7b1reed , fRadius2(endRadius) 205addf2edf3da20f053daa3897cfe2c52d7369a7b1reed , fFlippedGrad(flippedGrad) 206addf2edf3da20f053daa3897cfe2c52d7369a7b1reed{ 207589708bf7c706348b763e8277004cb160b202bdbrileya@google.com // this is degenerate, and should be caught by our caller 208589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(fCenter1 != fCenter2 || fRadius1 != fRadius2); 209589708bf7c706348b763e8277004cb160b202bdbrileya@google.com this->init(); 210589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 211589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 2123fbab82bd30158ccabc708a20419025923e08655commit-bot@chromium.orgbool SkTwoPointConicalGradient::isOpaque() const { 213cb6d97ca718c0335dde678bb64169f6de70b62d6robertphillips@google.com // Because areas outside the cone are left untouched, we cannot treat the 214cb6d97ca718c0335dde678bb64169f6de70b62d6robertphillips@google.com // shader as opaque even if the gradient itself is opaque. 215cb6d97ca718c0335dde678bb64169f6de70b62d6robertphillips@google.com // TODO(junov): Compute whether the cone fills the plane crbug.com/222380 216cb6d97ca718c0335dde678bb64169f6de70b62d6robertphillips@google.com return false; 2173fbab82bd30158ccabc708a20419025923e08655commit-bot@chromium.org} 2183fbab82bd30158ccabc708a20419025923e08655commit-bot@chromium.org 21987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgsize_t SkTwoPointConicalGradient::contextSize() const { 22087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org return sizeof(TwoPointConicalGradientContext); 22187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org} 22287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 223ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.orgSkShader::Context* SkTwoPointConicalGradient::onCreateContext(const ContextRec& rec, 224ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org void* storage) const { 225e901b6de3ef8dea842008a08fc81e92fb1478d61commit-bot@chromium.org return SkNEW_PLACEMENT_ARGS(storage, TwoPointConicalGradientContext, (*this, rec)); 22687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org} 22787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 22887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgSkTwoPointConicalGradient::TwoPointConicalGradientContext::TwoPointConicalGradientContext( 229e901b6de3ef8dea842008a08fc81e92fb1478d61commit-bot@chromium.org const SkTwoPointConicalGradient& shader, const ContextRec& rec) 230e901b6de3ef8dea842008a08fc81e92fb1478d61commit-bot@chromium.org : INHERITED(shader, rec) 23187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org{ 23287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org // we don't have a span16 proc 23387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org fFlags &= ~kHasSpan16_Flag; 23487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 23587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org // in general, we might discard based on computed-radius, so clear 23687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org // this flag (todo: sometimes we can detect that we never discard...) 23787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org fFlags &= ~kOpaqueAlpha_Flag; 23887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org} 23987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 24087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgvoid SkTwoPointConicalGradient::TwoPointConicalGradientContext::shadeSpan( 24187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org int x, int y, SkPMColor* dstCParam, int count) { 24287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkTwoPointConicalGradient& twoPointConicalGradient = 24387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org static_cast<const SkTwoPointConicalGradient&>(fShader); 24487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 24560040292be58ac553298209fb2e0684a4cb17dccreed@google.com int toggle = init_dither_toggle(x, y); 24660040292be58ac553298209fb2e0684a4cb17dccreed@google.com 247589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(count > 0); 248fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 249589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkPMColor* SK_RESTRICT dstC = dstCParam; 250fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 251589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkMatrix::MapXYProc dstProc = fDstToIndexProc; 252100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com 25387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkPMColor* SK_RESTRICT cache = fCache->getCache32(); 254589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 25560040292be58ac553298209fb2e0684a4cb17dccreed@google.com TwoPointConicalProc shadeProc = twopoint_repeat; 25687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org if (SkShader::kClamp_TileMode == twoPointConicalGradient.fTileMode) { 257589708bf7c706348b763e8277004cb160b202bdbrileya@google.com shadeProc = twopoint_clamp; 25887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org } else if (SkShader::kMirror_TileMode == twoPointConicalGradient.fTileMode) { 259589708bf7c706348b763e8277004cb160b202bdbrileya@google.com shadeProc = twopoint_mirror; 260589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 26187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkASSERT(SkShader::kRepeat_TileMode == twoPointConicalGradient.fTileMode); 262589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 263fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 264589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (fDstToIndexClass != kPerspective_MatrixClass) { 265589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkPoint srcPt; 266589708bf7c706348b763e8277004cb160b202bdbrileya@google.com dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, 267589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 268589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkScalar dx, fx = srcPt.fX; 269589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkScalar dy, fy = srcPt.fY; 270fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 271589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (fDstToIndexClass == kFixedStepInX_MatrixClass) { 272589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkFixed fixedX, fixedY; 273589708bf7c706348b763e8277004cb160b202bdbrileya@google.com (void)fDstToIndex.fixedStepInX(SkIntToScalar(y), &fixedX, &fixedY); 274589708bf7c706348b763e8277004cb160b202bdbrileya@google.com dx = SkFixedToScalar(fixedX); 275589708bf7c706348b763e8277004cb160b202bdbrileya@google.com dy = SkFixedToScalar(fixedY); 276589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 277589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkASSERT(fDstToIndexClass == kLinear_MatrixClass); 278589708bf7c706348b763e8277004cb160b202bdbrileya@google.com dx = fDstToIndex.getScaleX(); 279589708bf7c706348b763e8277004cb160b202bdbrileya@google.com dy = fDstToIndex.getSkewY(); 280589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 281589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 28287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org TwoPtRadialContext rec(twoPointConicalGradient.fRec, fx, fy, dx, dy); 28387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org (*shadeProc)(&rec, dstC, cache, toggle, count); 284589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { // perspective case 285139a2359abdeedca1ff836aa24c1a6943d9274f8mike@reedtribe.org SkScalar dstX = SkIntToScalar(x) + SK_ScalarHalf; 286139a2359abdeedca1ff836aa24c1a6943d9274f8mike@reedtribe.org SkScalar dstY = SkIntToScalar(y) + SK_ScalarHalf; 287589708bf7c706348b763e8277004cb160b202bdbrileya@google.com for (; count > 0; --count) { 288589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkPoint srcPt; 289589708bf7c706348b763e8277004cb160b202bdbrileya@google.com dstProc(fDstToIndex, dstX, dstY, &srcPt); 29087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org TwoPtRadialContext rec(twoPointConicalGradient.fRec, srcPt.fX, srcPt.fY, 0, 0); 29187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org (*shadeProc)(&rec, dstC, cache, toggle, 1); 292139a2359abdeedca1ff836aa24c1a6943d9274f8mike@reedtribe.org 293139a2359abdeedca1ff836aa24c1a6943d9274f8mike@reedtribe.org dstX += SK_Scalar1; 29460040292be58ac553298209fb2e0684a4cb17dccreed@google.com toggle = next_dither_toggle(toggle); 295139a2359abdeedca1ff836aa24c1a6943d9274f8mike@reedtribe.org dstC += 1; 296589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 297589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 298589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 299589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 300589708bf7c706348b763e8277004cb160b202bdbrileya@google.comSkShader::BitmapType SkTwoPointConicalGradient::asABitmap( 301589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkBitmap* bitmap, SkMatrix* matrix, SkShader::TileMode* xy) const { 302589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkPoint diff = fCenter2 - fCenter1; 303589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkScalar diffLen = 0; 304589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 305589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (bitmap) { 3061c6d64b78b24083ee9fd7411dac8a4a7e2d03a3crileya@google.com this->getGradientTableBitmap(bitmap); 307589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 308589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (matrix) { 309589708bf7c706348b763e8277004cb160b202bdbrileya@google.com diffLen = diff.length(); 310589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 311589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (matrix) { 312589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (diffLen) { 313589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkScalar invDiffLen = SkScalarInvert(diffLen); 314589708bf7c706348b763e8277004cb160b202bdbrileya@google.com // rotate to align circle centers with the x-axis 315589708bf7c706348b763e8277004cb160b202bdbrileya@google.com matrix->setSinCos(-SkScalarMul(invDiffLen, diff.fY), 316589708bf7c706348b763e8277004cb160b202bdbrileya@google.com SkScalarMul(invDiffLen, diff.fX)); 317589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } else { 318589708bf7c706348b763e8277004cb160b202bdbrileya@google.com matrix->reset(); 319589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 320589708bf7c706348b763e8277004cb160b202bdbrileya@google.com matrix->preTranslate(-fCenter1.fX, -fCenter1.fY); 321589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 322589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (xy) { 323589708bf7c706348b763e8277004cb160b202bdbrileya@google.com xy[0] = fTileMode; 324589708bf7c706348b763e8277004cb160b202bdbrileya@google.com xy[1] = kClamp_TileMode; 325589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 326589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return kTwoPointConical_BitmapType; 327589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 328589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 32944d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org// Returns the original non-sorted version of the gradient 330589708bf7c706348b763e8277004cb160b202bdbrileya@google.comSkShader::GradientType SkTwoPointConicalGradient::asAGradient( 331589708bf7c706348b763e8277004cb160b202bdbrileya@google.com GradientInfo* info) const { 332589708bf7c706348b763e8277004cb160b202bdbrileya@google.com if (info) { 33344d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org commonAsAGradient(info, fFlippedGrad); 334589708bf7c706348b763e8277004cb160b202bdbrileya@google.com info->fPoint[0] = fCenter1; 335589708bf7c706348b763e8277004cb160b202bdbrileya@google.com info->fPoint[1] = fCenter2; 336589708bf7c706348b763e8277004cb160b202bdbrileya@google.com info->fRadius[0] = fRadius1; 337589708bf7c706348b763e8277004cb160b202bdbrileya@google.com info->fRadius[1] = fRadius2; 33844d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org if (fFlippedGrad) { 33944d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org SkTSwap(info->fPoint[0], info->fPoint[1]); 34044d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org SkTSwap(info->fRadius[0], info->fRadius[1]); 34144d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org } 342589708bf7c706348b763e8277004cb160b202bdbrileya@google.com } 343589708bf7c706348b763e8277004cb160b202bdbrileya@google.com return kConical_GradientType; 344589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 345589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 3469fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 347589708bf7c706348b763e8277004cb160b202bdbrileya@google.comSkTwoPointConicalGradient::SkTwoPointConicalGradient( 3488b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer& buffer) 349589708bf7c706348b763e8277004cb160b202bdbrileya@google.com : INHERITED(buffer), 350589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fCenter1(buffer.readPoint()), 351589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fCenter2(buffer.readPoint()), 352589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRadius1(buffer.readScalar()), 353589708bf7c706348b763e8277004cb160b202bdbrileya@google.com fRadius2(buffer.readScalar()) { 3547ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org if (buffer.isVersionLT(SkReadBuffer::kGradientFlippedFlag_Version)) { 35544d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org // V23_COMPATIBILITY_CODE 35644d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org // Sort gradient by radius size for old pictures 35744d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org if (fRadius2 < fRadius1) { 35844d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org SkTSwap(fCenter1, fCenter2); 35944d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org SkTSwap(fRadius1, fRadius2); 36044d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org this->flipGradientColors(); 36144d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org fFlippedGrad = true; 36244d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org } else { 36344d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org fFlippedGrad = false; 36444d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org } 3657ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org } else { 3667ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org fFlippedGrad = buffer.readBool(); 36744d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org } 368589708bf7c706348b763e8277004cb160b202bdbrileya@google.com this->init(); 369589708bf7c706348b763e8277004cb160b202bdbrileya@google.com}; 3709fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 3719fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 3729fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* SkTwoPointConicalGradient::CreateProc(SkReadBuffer& buffer) { 3739fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed DescriptorScope desc; 3749fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (!desc.unflatten(buffer)) { 3759fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 3769fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 3779fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkPoint c1 = buffer.readPoint(); 3789fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkPoint c2 = buffer.readPoint(); 3799fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkScalar r1 = buffer.readScalar(); 3809fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkScalar r2 = buffer.readScalar(); 3819fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 3829fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (buffer.readBool()) { // flipped 3839fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkTSwap(c1, c2); 3849fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkTSwap(r1, r2); 3859fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 3869fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkColor* colors = desc.mutableColors(); 3879fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkScalar* pos = desc.mutablePos(); 3889fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const int last = desc.fCount - 1; 3899fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const int half = desc.fCount >> 1; 3909fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed for (int i = 0; i < half; ++i) { 3919fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkTSwap(colors[i], colors[last - i]); 3929fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (pos) { 3939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkScalar tmp = pos[i]; 3949fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed pos[i] = SK_Scalar1 - pos[last - i]; 3959fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed pos[last - i] = SK_Scalar1 - tmp; 3969fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 3979fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 3989fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (pos) { 3999fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (desc.fCount & 1) { 4009fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed pos[half] = SK_Scalar1 - pos[half]; 4019fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 4029fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 4039fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 4049fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 4059fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return SkGradientShader::CreateTwoPointConical(c1, r1, c2, r2, desc.fColors, desc.fPos, 4069fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed desc.fCount, desc.fTileMode, desc.fGradFlags, 4079fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed desc.fLocalMatrix); 4089fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 409589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 4109fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedvoid SkTwoPointConicalGradient::flatten(SkWriteBuffer& buffer) const { 411589708bf7c706348b763e8277004cb160b202bdbrileya@google.com this->INHERITED::flatten(buffer); 412589708bf7c706348b763e8277004cb160b202bdbrileya@google.com buffer.writePoint(fCenter1); 413589708bf7c706348b763e8277004cb160b202bdbrileya@google.com buffer.writePoint(fCenter2); 414589708bf7c706348b763e8277004cb160b202bdbrileya@google.com buffer.writeScalar(fRadius1); 415589708bf7c706348b763e8277004cb160b202bdbrileya@google.com buffer.writeScalar(fRadius2); 41644d83c1e81b0555efa94f78e2a53b862208cdd06commit-bot@chromium.org buffer.writeBool(fFlippedGrad); 417589708bf7c706348b763e8277004cb160b202bdbrileya@google.com} 418589708bf7c706348b763e8277004cb160b202bdbrileya@google.com 419cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 420cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 4219de5b514d38c5b36066bcdc14fba2f7e5196d372dandov#include "SkGr.h" 4229de5b514d38c5b36066bcdc14fba2f7e5196d372dandov 423b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool SkTwoPointConicalGradient::asFragmentProcessor(GrContext* context, 424b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkPaint& paint, 425b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkMatrix* localMatrix, 426b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrColor* paintColor, 427b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrFragmentProcessor** fp) const { 42849f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(context); 429f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com SkASSERT(fPtsToUnit.isIdentity()); 430dfdb7e5240276493077b7c6e1f3cc8b8a0e195babsalomon@google.com 431b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt *fp = Gr2PtConicalGradientEffect::Create(context, *this, fTileMode, localMatrix); 43283d081ae1d731b5039e99823620f5e287542ee39bsalomon *paintColor = SkColor2GrColorJustAlpha(paint.getColor()); 4339de5b514d38c5b36066bcdc14fba2f7e5196d372dandov return true; 434d7cc651b8da11d52ae90e910b948f5e2d15daaf9rileya@google.com} 435d7cc651b8da11d52ae90e910b948f5e2d15daaf9rileya@google.com 436cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else 437cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 438b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool SkTwoPointConicalGradient::asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix*, 439b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrColor*, GrFragmentProcessor**) const { 440cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com SkDEBUGFAIL("Should not call in GPU-less build"); 4419de5b514d38c5b36066bcdc14fba2f7e5196d372dandov return false; 442cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com} 443cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 444a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com#endif 44576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 4460f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 44776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.comvoid SkTwoPointConicalGradient::toString(SkString* str) const { 44876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("SkTwoPointConicalGradient: ("); 44976f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 45076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("center1: ("); 45176f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendScalar(fCenter1.fX); 45276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(", "); 45376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendScalar(fCenter1.fY); 45476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(") radius1: "); 45576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendScalar(fRadius1); 45676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(" "); 45776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 45876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("center2: ("); 45976f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendScalar(fCenter2.fX); 46076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(", "); 46176f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendScalar(fCenter2.fY); 46276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(") radius2: "); 46376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendScalar(fRadius2); 46476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(" "); 46576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 46676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com this->INHERITED::toString(str); 46776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 46876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(")"); 46976f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com} 47076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 471