13f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org/* 23f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org * Copyright 2013 The Android Open Source Project 33f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org * 43f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 53f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org * found in the LICENSE file. 63f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org */ 73f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 83f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "SkBicubicImageFilter.h" 93f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "SkBitmap.h" 103f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "SkColorPriv.h" 118b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h" 128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h" 133f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "SkMatrix.h" 143f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "SkRect.h" 153f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "SkUnPreMultiply.h" 163f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 173f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#if SK_SUPPORT_GPU 183aad3b01afc77993ff051c02e49186294e312980humper@google.com#include "effects/GrBicubicEffect.h" 193f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "GrContext.h" 203f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#include "GrTexture.h" 213f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#endif 223f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 233aad3b01afc77993ff051c02e49186294e312980humper@google.com#define DS(x) SkDoubleToScalar(x) 243aad3b01afc77993ff051c02e49186294e312980humper@google.com 253aad3b01afc77993ff051c02e49186294e312980humper@google.comstatic const SkScalar gMitchellCoefficients[16] = { 263aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 1.0 / 18.0), DS(-9.0 / 18.0), DS( 15.0 / 18.0), DS( -7.0 / 18.0), 273aad3b01afc77993ff051c02e49186294e312980humper@google.com DS(16.0 / 18.0), DS( 0.0 / 18.0), DS(-36.0 / 18.0), DS( 21.0 / 18.0), 283aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 1.0 / 18.0), DS( 9.0 / 18.0), DS( 27.0 / 18.0), DS(-21.0 / 18.0), 293aad3b01afc77993ff051c02e49186294e312980humper@google.com DS( 0.0 / 18.0), DS( 0.0 / 18.0), DS( -6.0 / 18.0), DS( 7.0 / 18.0), 303aad3b01afc77993ff051c02e49186294e312980humper@google.com}; 313aad3b01afc77993ff051c02e49186294e312980humper@google.com 323f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.orgSkBicubicImageFilter::SkBicubicImageFilter(const SkSize& scale, const SkScalar coefficients[16], SkImageFilter* input) 333f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org : INHERITED(input), 343f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org fScale(scale) { 353f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org memcpy(fCoefficients, coefficients, sizeof(fCoefficients)); 363f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 373f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 383f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.orgSkBicubicImageFilter* SkBicubicImageFilter::CreateMitchell(const SkSize& scale, 393f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkImageFilter* input) { 403aad3b01afc77993ff051c02e49186294e312980humper@google.com return SkNEW_ARGS(SkBicubicImageFilter, (scale, gMitchellCoefficients, input)); 413f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 423f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 438b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgSkBicubicImageFilter::SkBicubicImageFilter(SkReadBuffer& buffer) 44ce33d60187718e7bb01944ee130c9f5d9fb335eccommit-bot@chromium.org : INHERITED(1, buffer) { 45025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org SkDEBUGCODE(bool success =) buffer.readScalarArray(fCoefficients, 16); 46025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org SkASSERT(success); 473f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org fScale.fWidth = buffer.readScalar(); 483f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org fScale.fHeight = buffer.readScalar(); 49c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org buffer.validate(SkScalarIsFinite(fScale.fWidth) && 50c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkScalarIsFinite(fScale.fHeight) && 51c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org (fScale.fWidth >= 0) && 52c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org (fScale.fHeight >= 0)); 533f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 543f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 558b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkBicubicImageFilter::flatten(SkWriteBuffer& buffer) const { 563f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org this->INHERITED::flatten(buffer); 573f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org buffer.writeScalarArray(fCoefficients, 16); 583f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org buffer.writeScalar(fScale.fWidth); 593f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org buffer.writeScalar(fScale.fHeight); 603f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 613f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 623f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.orgSkBicubicImageFilter::~SkBicubicImageFilter() { 633f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 643f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 653f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.orginline SkPMColor cubicBlend(const SkScalar c[16], SkScalar t, SkPMColor c0, SkPMColor c1, SkPMColor c2, SkPMColor c3) { 663f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar t2 = t * t, t3 = t2 * t; 673f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar cc[4]; 683f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org // FIXME: For the fractx case, this should be refactored out of this function. 693f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org cc[0] = c[0] + SkScalarMul(c[1], t) + SkScalarMul(c[2], t2) + SkScalarMul(c[3], t3); 703f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org cc[1] = c[4] + SkScalarMul(c[5], t) + SkScalarMul(c[6], t2) + SkScalarMul(c[7], t3); 713f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org cc[2] = c[8] + SkScalarMul(c[9], t) + SkScalarMul(c[10], t2) + SkScalarMul(c[11], t3); 723f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org cc[3] = c[12] + SkScalarMul(c[13], t) + SkScalarMul(c[14], t2) + SkScalarMul(c[15], t3); 73a041b954ffd318ebbbee9aab1c11f8c563954a1frobertphillips@google.com SkScalar a = SkScalarClampMax(SkScalarMul(cc[0], SkGetPackedA32(c0)) + SkScalarMul(cc[1], SkGetPackedA32(c1)) + SkScalarMul(cc[2], SkGetPackedA32(c2)) + SkScalarMul(cc[3], SkGetPackedA32(c3)), 255); 743f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar r = SkScalarMul(cc[0], SkGetPackedR32(c0)) + SkScalarMul(cc[1], SkGetPackedR32(c1)) + SkScalarMul(cc[2], SkGetPackedR32(c2)) + SkScalarMul(cc[3], SkGetPackedR32(c3)); 753f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar g = SkScalarMul(cc[0], SkGetPackedG32(c0)) + SkScalarMul(cc[1], SkGetPackedG32(c1)) + SkScalarMul(cc[2], SkGetPackedG32(c2)) + SkScalarMul(cc[3], SkGetPackedG32(c3)); 763f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar b = SkScalarMul(cc[0], SkGetPackedB32(c0)) + SkScalarMul(cc[1], SkGetPackedB32(c1)) + SkScalarMul(cc[2], SkGetPackedB32(c2)) + SkScalarMul(cc[3], SkGetPackedB32(c3)); 7791274b99722d9be62e077ab979c630c23cdd04b1skia.committer@gmail.com return SkPackARGB32(SkScalarRoundToInt(a), 7891274b99722d9be62e077ab979c630c23cdd04b1skia.committer@gmail.com SkScalarRoundToInt(SkScalarClampMax(r, a)), 7991274b99722d9be62e077ab979c630c23cdd04b1skia.committer@gmail.com SkScalarRoundToInt(SkScalarClampMax(g, a)), 80a041b954ffd318ebbbee9aab1c11f8c563954a1frobertphillips@google.com SkScalarRoundToInt(SkScalarClampMax(b, a))); 813f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 823f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 833f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.orgbool SkBicubicImageFilter::onFilterImage(Proxy* proxy, 843f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org const SkBitmap& source, 854cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org const Context& ctx, 863f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkBitmap* result, 87ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkIPoint* offset) const { 8868400767be5f72e4b9750ccc8bcf0078d42869a7senorblanco@chromium.org SkBitmap src = source; 896776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org SkIPoint srcOffset = SkIPoint::Make(0, 0); 904cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcOffset)) { 9168400767be5f72e4b9750ccc8bcf0078d42869a7senorblanco@chromium.org return false; 9268400767be5f72e4b9750ccc8bcf0078d42869a7senorblanco@chromium.org } 9368400767be5f72e4b9750ccc8bcf0078d42869a7senorblanco@chromium.org 9428fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org if (src.colorType() != kN32_SkColorType) { 953f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org return false; 963f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org } 973f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 983f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkAutoLockPixels alp(src); 993f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org if (!src.getPixels()) { 1003f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org return false; 1013f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org } 1023f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1033f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkRect dstRect = SkRect::MakeWH(SkScalarMul(SkIntToScalar(src.width()), fScale.fWidth), 1043f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalarMul(SkIntToScalar(src.height()), fScale.fHeight)); 1053f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkIRect dstIRect; 1063f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org dstRect.roundOut(&dstIRect); 1074b681bc95b14e081f1cc5b68cb755d57fc8eb977commit-bot@chromium.org if (dstIRect.isEmpty()) { 1084b681bc95b14e081f1cc5b68cb755d57fc8eb977commit-bot@chromium.org return false; 1094b681bc95b14e081f1cc5b68cb755d57fc8eb977commit-bot@chromium.org } 110c77392ed58ec78ab19fa0e3ff99fb8110854fba2reed if (!result->allocPixels(src.info().makeWH(dstIRect.width(), dstIRect.height()))) { 1113f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org return false; 1123f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org } 1133f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1143f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkRect srcRect; 1153f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org src.getBounds(&srcRect); 1166776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org srcRect.offset(SkPoint::Make(SkIntToScalar(srcOffset.fX), SkIntToScalar(srcOffset.fY))); 1173f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkMatrix inverse; 1183f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org inverse.setRectToRect(dstRect, srcRect, SkMatrix::kFill_ScaleToFit); 1194b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org inverse.postTranslate(-0.5f, -0.5f); 1203f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1213f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org for (int y = dstIRect.fTop; y < dstIRect.fBottom; ++y) { 1223f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor* dptr = result->getAddr32(dstIRect.fLeft, y); 1233f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org for (int x = dstIRect.fLeft; x < dstIRect.fRight; ++x) { 1243f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPoint srcPt, dstPt = SkPoint::Make(SkIntToScalar(x), SkIntToScalar(y)); 1253f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org inverse.mapPoints(&srcPt, &dstPt, 1); 1263f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar fractx = srcPt.fX - SkScalarFloorToScalar(srcPt.fX); 1273f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkScalar fracty = srcPt.fY - SkScalarFloorToScalar(srcPt.fY); 1283f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int sx = SkScalarFloorToInt(srcPt.fX); 1293f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int sy = SkScalarFloorToInt(srcPt.fY); 1303f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int x0 = SkClampMax(sx - 1, src.width() - 1); 1313f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int x1 = SkClampMax(sx , src.width() - 1); 1323f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int x2 = SkClampMax(sx + 1, src.width() - 1); 1333f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int x3 = SkClampMax(sx + 2, src.width() - 1); 1343f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int y0 = SkClampMax(sy - 1, src.height() - 1); 1353f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int y1 = SkClampMax(sy , src.height() - 1); 1363f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int y2 = SkClampMax(sy + 1, src.height() - 1); 1373f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org int y3 = SkClampMax(sy + 2, src.height() - 1); 1383f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s00 = *src.getAddr32(x0, y0); 1393f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s10 = *src.getAddr32(x1, y0); 1403f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s20 = *src.getAddr32(x2, y0); 1413f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s30 = *src.getAddr32(x3, y0); 1423f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s0 = cubicBlend(fCoefficients, fractx, s00, s10, s20, s30); 1433f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s01 = *src.getAddr32(x0, y1); 1443f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s11 = *src.getAddr32(x1, y1); 1453f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s21 = *src.getAddr32(x2, y1); 1463f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s31 = *src.getAddr32(x3, y1); 1473f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s1 = cubicBlend(fCoefficients, fractx, s01, s11, s21, s31); 1483f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s02 = *src.getAddr32(x0, y2); 1493f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s12 = *src.getAddr32(x1, y2); 1503f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s22 = *src.getAddr32(x2, y2); 1513f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s32 = *src.getAddr32(x3, y2); 1523f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s2 = cubicBlend(fCoefficients, fractx, s02, s12, s22, s32); 1533f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s03 = *src.getAddr32(x0, y3); 1543f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s13 = *src.getAddr32(x1, y3); 1553f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s23 = *src.getAddr32(x2, y3); 1563f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s33 = *src.getAddr32(x3, y3); 1573f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org SkPMColor s3 = cubicBlend(fCoefficients, fractx, s03, s13, s23, s33); 1583f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org *dptr++ = cubicBlend(fCoefficients, fracty, s0, s1, s2, s3); 1593f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org } 1603f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org } 1616776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org offset->fX = dstIRect.fLeft; 1626776b82d466fa93ccffd251fdf556fe058395444senorblanco@chromium.org offset->fY = dstIRect.fTop; 1633f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org return true; 1643f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 1653f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1663f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 1673f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1683f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#if SK_SUPPORT_GPU 1693f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1704cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.orgbool SkBicubicImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, 171ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org SkBitmap* result, SkIPoint* offset) const { 1726aa6fec0e332c9246958245bad5fc881fefee68fsenorblanco@chromium.org SkBitmap srcBM = src; 1734cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &srcBM, offset)) { 174c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org return false; 175c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org } 176b8d00db075b5ea09e353508a26ef5ced50722a6ccommit-bot@chromium.org GrTexture* srcTexture = srcBM.getTexture(); 1773f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org GrContext* context = srcTexture->getContext(); 1783f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 179c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org SkRect dstRect = SkRect::MakeWH(srcBM.width() * fScale.fWidth, 180c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org srcBM.height() * fScale.fHeight); 1813f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1823f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org GrTextureDesc desc; 1833f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; 1843f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org desc.fWidth = SkScalarCeilToInt(dstRect.width()); 1853f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org desc.fHeight = SkScalarCeilToInt(dstRect.height()); 186c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org desc.fConfig = kSkia8888_GrPixelConfig; 1873f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 1883f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org GrAutoScratchTexture ast(context, desc); 189c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org SkAutoTUnref<GrTexture> dst(ast.detach()); 190c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org if (!dst) { 191c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org return false; 1923f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org } 193c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org GrContext::AutoRenderTarget art(context, dst->asRenderTarget()); 1943f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org GrPaint paint; 19542dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org paint.addColorEffect(GrBicubicEffect::Create(srcTexture, fCoefficients))->unref(); 196c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org SkRect srcRect; 197c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org srcBM.getBounds(&srcRect); 198c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org context->drawRectToRect(paint, dstRect, srcRect); 1996aa6fec0e332c9246958245bad5fc881fefee68fsenorblanco@chromium.org WrapTexture(dst, desc.fWidth, desc.fHeight, result); 2006aa6fec0e332c9246958245bad5fc881fefee68fsenorblanco@chromium.org return true; 2013f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org} 2023f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org#endif 2033f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org 2043f2d45aff69260fcf39d4eea8586387ed44402bbsenorblanco@chromium.org/////////////////////////////////////////////////////////////////////////////// 205