| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 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 "SkMagnifierImageFilter.h" | 8 #include "SkMagnifierImageFilter.h" |
| 9 | 9 |
| 10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "GrInvariantOutput.h" | 21 #include "GrInvariantOutput.h" |
| 22 #include "effects/GrSingleTextureEffect.h" | 22 #include "effects/GrSingleTextureEffect.h" |
| 23 #include "glsl/GrGLSLFragmentProcessor.h" | 23 #include "glsl/GrGLSLFragmentProcessor.h" |
| 24 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 24 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 25 #include "glsl/GrGLSLProgramDataManager.h" | 25 #include "glsl/GrGLSLProgramDataManager.h" |
| 26 #include "glsl/GrGLSLUniformHandler.h" | 26 #include "glsl/GrGLSLUniformHandler.h" |
| 27 | 27 |
| 28 class GrMagnifierEffect : public GrSingleTextureEffect { | 28 class GrMagnifierEffect : public GrSingleTextureEffect { |
| 29 | 29 |
| 30 public: | 30 public: |
| 31 static GrFragmentProcessor* Create(GrTexture* texture, | 31 static sk_sp<GrFragmentProcessor> Make(GrTexture* texture, |
| 32 const SkRect& bounds, | 32 const SkRect& bounds, |
| 33 float xOffset, | 33 float xOffset, |
| 34 float yOffset, | 34 float yOffset, |
| 35 float xInvZoom, | 35 float xInvZoom, |
| 36 float yInvZoom, | 36 float yInvZoom, |
| 37 float xInvInset, | 37 float xInvInset, |
| 38 float yInvInset) { | 38 float yInvInset) { |
| 39 return new GrMagnifierEffect(texture, bounds, | 39 return sk_sp<GrFragmentProcessor>(new GrMagnifierEffect(texture, bounds, |
| 40 xOffset, yOffset, | 40 xOffset, yOffset
, |
| 41 xInvZoom, yInvZoom, | 41 xInvZoom, yInvZo
om, |
| 42 xInvInset, yInvInset); | 42 xInvInset, yInvI
nset)); |
| 43 } | 43 } |
| 44 | 44 |
| 45 ~GrMagnifierEffect() override {}; | 45 ~GrMagnifierEffect() override {}; |
| 46 | 46 |
| 47 const char* name() const override { return "Magnifier"; } | 47 const char* name() const override { return "Magnifier"; } |
| 48 | 48 |
| 49 const SkRect& bounds() const { return fBounds; } // Bounds of source imag
e. | 49 const SkRect& bounds() const { return fBounds; } // Bounds of source imag
e. |
| 50 // Offset to apply to zoomed pixels, (srcRect position / texture size). | 50 // Offset to apply to zoomed pixels, (srcRect position / texture size). |
| 51 float xOffset() const { return fXOffset; } | 51 float xOffset() const { return fXOffset; } |
| 52 float yOffset() const { return fYOffset; } | 52 float yOffset() const { return fYOffset; } |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 GrProcessorKeyBuilder* b) const { | 185 GrProcessorKeyBuilder* b) const { |
| 186 GrGLMagnifierEffect::GenKey(*this, caps, b); | 186 GrGLMagnifierEffect::GenKey(*this, caps, b); |
| 187 } | 187 } |
| 188 | 188 |
| 189 GrGLSLFragmentProcessor* GrMagnifierEffect::onCreateGLSLInstance() const { | 189 GrGLSLFragmentProcessor* GrMagnifierEffect::onCreateGLSLInstance() const { |
| 190 return new GrGLMagnifierEffect; | 190 return new GrGLMagnifierEffect; |
| 191 } | 191 } |
| 192 | 192 |
| 193 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrMagnifierEffect); | 193 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrMagnifierEffect); |
| 194 | 194 |
| 195 const GrFragmentProcessor* GrMagnifierEffect::TestCreate(GrProcessorTestData* d)
{ | 195 sk_sp<GrFragmentProcessor> GrMagnifierEffect::TestCreate(GrProcessorTestData* d)
{ |
| 196 GrTexture* texture = d->fTextures[0]; | 196 GrTexture* texture = d->fTextures[0]; |
| 197 const int kMaxWidth = 200; | 197 const int kMaxWidth = 200; |
| 198 const int kMaxHeight = 200; | 198 const int kMaxHeight = 200; |
| 199 const int kMaxInset = 20; | 199 const int kMaxInset = 20; |
| 200 uint32_t width = d->fRandom->nextULessThan(kMaxWidth); | 200 uint32_t width = d->fRandom->nextULessThan(kMaxWidth); |
| 201 uint32_t height = d->fRandom->nextULessThan(kMaxHeight); | 201 uint32_t height = d->fRandom->nextULessThan(kMaxHeight); |
| 202 uint32_t x = d->fRandom->nextULessThan(kMaxWidth - width); | 202 uint32_t x = d->fRandom->nextULessThan(kMaxWidth - width); |
| 203 uint32_t y = d->fRandom->nextULessThan(kMaxHeight - height); | 203 uint32_t y = d->fRandom->nextULessThan(kMaxHeight - height); |
| 204 uint32_t inset = d->fRandom->nextULessThan(kMaxInset); | 204 uint32_t inset = d->fRandom->nextULessThan(kMaxInset); |
| 205 | 205 |
| 206 GrFragmentProcessor* effect = GrMagnifierEffect::Create( | 206 sk_sp<GrFragmentProcessor> effect(GrMagnifierEffect::Make( |
| 207 texture, | 207 texture, |
| 208 SkRect::MakeWH(SkIntToScalar(kMaxWidth), SkIntToScalar(kMaxHeight)), | 208 SkRect::MakeWH(SkIntToScalar(kMaxWidth), SkIntToScalar(kMaxHeight)), |
| 209 (float) width / texture->width(), | 209 (float) width / texture->width(), |
| 210 (float) height / texture->height(), | 210 (float) height / texture->height(), |
| 211 texture->width() / (float) x, | 211 texture->width() / (float) x, |
| 212 texture->height() / (float) y, | 212 texture->height() / (float) y, |
| 213 (float) inset / texture->width(), | 213 (float) inset / texture->width(), |
| 214 (float) inset / texture->height()); | 214 (float) inset / texture->height())); |
| 215 SkASSERT(effect); | 215 SkASSERT(effect); |
| 216 return effect; | 216 return effect; |
| 217 } | 217 } |
| 218 | 218 |
| 219 /////////////////////////////////////////////////////////////////////////////// | 219 /////////////////////////////////////////////////////////////////////////////// |
| 220 | 220 |
| 221 bool GrMagnifierEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 221 bool GrMagnifierEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |
| 222 const GrMagnifierEffect& s = sBase.cast<GrMagnifierEffect>(); | 222 const GrMagnifierEffect& s = sBase.cast<GrMagnifierEffect>(); |
| 223 return (this->fBounds == s.fBounds && | 223 return (this->fBounds == s.fBounds && |
| 224 this->fXOffset == s.fXOffset && | 224 this->fXOffset == s.fXOffset && |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 fSrcRect.height() * inputTexture->height() / bounds.height
() - fSrcRect.y(); | 317 fSrcRect.height() * inputTexture->height() / bounds.height
() - fSrcRect.y(); |
| 318 int boundsY = inputTexture->origin() == kTopLeft_GrSurfaceOrigin | 318 int boundsY = inputTexture->origin() == kTopLeft_GrSurfaceOrigin |
| 319 ? bounds.y() | 319 ? bounds.y() |
| 320 : inputTexture->height() - bounds.height(); | 320 : inputTexture->height() - bounds.height(); |
| 321 SkRect effectBounds = SkRect::MakeXYWH( | 321 SkRect effectBounds = SkRect::MakeXYWH( |
| 322 SkIntToScalar(bounds.x()) / inputTexture->width(), | 322 SkIntToScalar(bounds.x()) / inputTexture->width(), |
| 323 SkIntToScalar(boundsY) / inputTexture->height(), | 323 SkIntToScalar(boundsY) / inputTexture->height(), |
| 324 SkIntToScalar(inputTexture->width()) / bounds.width(), | 324 SkIntToScalar(inputTexture->width()) / bounds.width(), |
| 325 SkIntToScalar(inputTexture->height()) / bounds.height()); | 325 SkIntToScalar(inputTexture->height()) / bounds.height()); |
| 326 // SRGBTODO: Handle sRGB here | 326 // SRGBTODO: Handle sRGB here |
| 327 sk_sp<GrFragmentProcessor> fp(GrMagnifierEffect::Create( | 327 sk_sp<GrFragmentProcessor> fp(GrMagnifierEffect::Make( |
| 328 inputTexture.get(), | 328 inputTexture.get(), |
| 329 effectBounds, | 329 effectBounds, |
| 330 fSrcRect.x() / inputText
ure->width(), | 330 fSrcRect.x() / inputText
ure->width(), |
| 331 yOffset / inputTexture->
height(), | 331 yOffset / inputTexture->
height(), |
| 332 invXZoom, | 332 invXZoom, |
| 333 invYZoom, | 333 invYZoom, |
| 334 bounds.width() * invInse
t, | 334 bounds.width() * invInse
t, |
| 335 bounds.height() * invIns
et)); | 335 bounds.height() * invIns
et)); |
| 336 if (!fp) { | 336 if (!fp) { |
| 337 return nullptr; | 337 return nullptr; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 | 414 |
| 415 #ifndef SK_IGNORE_TO_STRING | 415 #ifndef SK_IGNORE_TO_STRING |
| 416 void SkMagnifierImageFilter::toString(SkString* str) const { | 416 void SkMagnifierImageFilter::toString(SkString* str) const { |
| 417 str->appendf("SkMagnifierImageFilter: ("); | 417 str->appendf("SkMagnifierImageFilter: ("); |
| 418 str->appendf("src: (%f,%f,%f,%f) ", | 418 str->appendf("src: (%f,%f,%f,%f) ", |
| 419 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBotto
m); | 419 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBotto
m); |
| 420 str->appendf("inset: %f", fInset); | 420 str->appendf("inset: %f", fInset); |
| 421 str->append(")"); | 421 str->append(")"); |
| 422 } | 422 } |
| 423 #endif | 423 #endif |
| OLD | NEW |