| 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 "SkLightingImageFilter.h" | 8 #include "SkLightingImageFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 SkScalarIsFinite(point.fZ)); | 270 SkScalarIsFinite(point.fZ)); |
| 271 return point; | 271 return point; |
| 272 }; | 272 }; |
| 273 | 273 |
| 274 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { | 274 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { |
| 275 buffer.writeScalar(point.fX); | 275 buffer.writeScalar(point.fX); |
| 276 buffer.writeScalar(point.fY); | 276 buffer.writeScalar(point.fY); |
| 277 buffer.writeScalar(point.fZ); | 277 buffer.writeScalar(point.fZ); |
| 278 }; | 278 }; |
| 279 | 279 |
| 280 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { | 280 enum BoundaryMode { |
| 281 kTopLeft_BoundaryMode, |
| 282 kTop_BoundaryMode, |
| 283 kTopRight_BoundaryMode, |
| 284 kLeft_BoundaryMode, |
| 285 kInterior_BoundaryMode, |
| 286 kRight_BoundaryMode, |
| 287 kBottomLeft_BoundaryMode, |
| 288 kBottom_BoundaryMode, |
| 289 kBottomRight_BoundaryMode, |
| 290 |
| 291 kBoundaryModeCount, |
| 292 }; |
| 293 |
| 294 class SkLightingImageFilterInternal : public SkLightingImageFilter { |
| 295 protected: |
| 296 SkLightingImageFilterInternal(SkLight* light, |
| 297 SkScalar surfaceScale, |
| 298 SkImageFilter* input, |
| 299 const CropRect* cropRect) |
| 300 : INHERITED(light, surfaceScale, input, cropRect) {} |
| 301 |
| 302 #if SK_SUPPORT_GPU |
| 303 bool canFilterImageGPU() const override { return true; } |
| 304 bool filterImageGPU(Proxy*, const SkBitmap& src, const Context&, |
| 305 SkBitmap* result, SkIPoint* offset) const override; |
| 306 virtual GrFragmentProcessor* getFragmentProcessor(GrTexture*, |
| 307 const SkMatrix&, |
| 308 const SkIRect& bounds, |
| 309 BoundaryMode boundaryMode)
const = 0; |
| 310 #endif |
| 311 private: |
| 312 #if SK_SUPPORT_GPU |
| 313 void drawRect(GrContext* context, |
| 314 GrTexture* src, |
| 315 GrTexture* dst, |
| 316 const SkMatrix& matrix, |
| 317 const GrClip& clip, |
| 318 const SkRect& dstRect, |
| 319 BoundaryMode boundaryMode, |
| 320 const SkIRect& bounds) const; |
| 321 #endif |
| 322 typedef SkLightingImageFilter INHERITED; |
| 323 }; |
| 324 |
| 325 #if SK_SUPPORT_GPU |
| 326 void SkLightingImageFilterInternal::drawRect(GrContext* context, |
| 327 GrTexture* src, |
| 328 GrTexture* dst, |
| 329 const SkMatrix& matrix, |
| 330 const GrClip& clip, |
| 331 const SkRect& dstRect, |
| 332 BoundaryMode boundaryMode, |
| 333 const SkIRect& bounds) const { |
| 334 SkRect srcRect = dstRect.makeOffset(SkIntToScalar(bounds.x()), SkIntToScalar
(bounds.y())); |
| 335 GrFragmentProcessor* fp = this->getFragmentProcessor(src, matrix, bounds, bo
undaryMode); |
| 336 GrPaint paint; |
| 337 paint.addColorProcessor(fp)->unref(); |
| 338 context->drawNonAARectToRect(dst->asRenderTarget(), clip, paint, SkMatrix::I
(), |
| 339 dstRect, srcRect); |
| 340 } |
| 341 |
| 342 bool SkLightingImageFilterInternal::filterImageGPU(Proxy* proxy, |
| 343 const SkBitmap& src, |
| 344 const Context& ctx, |
| 345 SkBitmap* result, |
| 346 SkIPoint* offset) const { |
| 347 SkBitmap input = src; |
| 348 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 349 if (this->getInput(0) && |
| 350 !this->getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffse
t)) { |
| 351 return false; |
| 352 } |
| 353 SkIRect bounds; |
| 354 if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) { |
| 355 return false; |
| 356 } |
| 357 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(bounds.width()), |
| 358 SkIntToScalar(bounds.height())); |
| 359 GrTexture* srcTexture = input.getTexture(); |
| 360 GrContext* context = srcTexture->getContext(); |
| 361 |
| 362 GrSurfaceDesc desc; |
| 363 desc.fFlags = kRenderTarget_GrSurfaceFlag, |
| 364 desc.fWidth = bounds.width(); |
| 365 desc.fHeight = bounds.height(); |
| 366 desc.fConfig = kRGBA_8888_GrPixelConfig; |
| 367 |
| 368 SkAutoTUnref<GrTexture> dst( |
| 369 context->refScratchTexture(desc, GrContext::kApprox_ScratchTexMatch)); |
| 370 if (!dst) { |
| 371 return false; |
| 372 } |
| 373 |
| 374 // setup new clip |
| 375 GrClip clip(dstRect); |
| 376 |
| 377 offset->fX = bounds.left(); |
| 378 offset->fY = bounds.top(); |
| 379 SkMatrix matrix(ctx.ctm()); |
| 380 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.to
p())); |
| 381 bounds.offset(-srcOffset); |
| 382 SkRect topLeft = SkRect::MakeXYWH(0, 0, 1, 1); |
| 383 SkRect top = SkRect::MakeXYWH(1, 0, dstRect.width() - 2, 1); |
| 384 SkRect topRight = SkRect::MakeXYWH(dstRect.width() - 1, 0, 1, 1); |
| 385 SkRect left = SkRect::MakeXYWH(0, 1, 1, dstRect.height() - 2); |
| 386 SkRect interior = dstRect.makeInset(1, 1); |
| 387 SkRect right = SkRect::MakeXYWH(dstRect.width() - 1, 1, 1, dstRect.height()
- 2); |
| 388 SkRect bottomLeft = SkRect::MakeXYWH(0, dstRect.height() - 1, 1, 1); |
| 389 SkRect bottom = SkRect::MakeXYWH(1, dstRect.height() - 1, dstRect.width() -
2, 1); |
| 390 SkRect bottomRight = SkRect::MakeXYWH(dstRect.width() - 1, dstRect.height()
- 1, 1, 1); |
| 391 this->drawRect(context, srcTexture, dst, matrix, clip, topLeft, kTopLeft_Bou
ndaryMode, bounds); |
| 392 this->drawRect(context, srcTexture, dst, matrix, clip, top, kTop_BoundaryMod
e, bounds); |
| 393 this->drawRect(context, srcTexture, dst, matrix, clip, topRight, kTopRight_B
oundaryMode, |
| 394 bounds); |
| 395 this->drawRect(context, srcTexture, dst, matrix, clip, left, kLeft_BoundaryM
ode, bounds); |
| 396 this->drawRect(context, srcTexture, dst, matrix, clip, interior, kInterior_B
oundaryMode, |
| 397 bounds); |
| 398 this->drawRect(context, srcTexture, dst, matrix, clip, right, kRight_Boundar
yMode, bounds); |
| 399 this->drawRect(context, srcTexture, dst, matrix, clip, bottomLeft, kBottomLe
ft_BoundaryMode, |
| 400 bounds); |
| 401 this->drawRect(context, srcTexture, dst, matrix, clip, bottom, kBottom_Bound
aryMode, bounds); |
| 402 this->drawRect(context, srcTexture, dst, matrix, clip, bottomRight, kBottomR
ight_BoundaryMode, |
| 403 bounds); |
| 404 WrapTexture(dst, bounds.width(), bounds.height(), result); |
| 405 return true; |
| 406 } |
| 407 #endif |
| 408 |
| 409 class SkDiffuseLightingImageFilter : public SkLightingImageFilterInternal { |
| 281 public: | 410 public: |
| 282 static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, SkScalar
kd, SkImageFilter*, | 411 static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, SkScalar
kd, SkImageFilter*, |
| 283 const CropRect*); | 412 const CropRect*); |
| 284 | 413 |
| 285 SK_TO_STRING_OVERRIDE() | 414 SK_TO_STRING_OVERRIDE() |
| 286 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
lter) | 415 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
lter) |
| 287 SkScalar kd() const { return fKD; } | 416 SkScalar kd() const { return fKD; } |
| 288 | 417 |
| 289 protected: | 418 protected: |
| 290 SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, | 419 SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, |
| 291 SkScalar kd, SkImageFilter* input, const CropRe
ct* cropRect); | 420 SkScalar kd, SkImageFilter* input, const CropRe
ct* cropRect); |
| 292 void flatten(SkWriteBuffer& buffer) const override; | 421 void flatten(SkWriteBuffer& buffer) const override; |
| 293 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 422 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
| 294 SkBitmap* result, SkIPoint* offset) const overrid
e; | 423 SkBitmap* result, SkIPoint* offset) const override; |
| 295 #if SK_SUPPORT_GPU | 424 #if SK_SUPPORT_GPU |
| 296 virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const Sk
Matrix&, | 425 GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, |
| 297 const SkIRect& bounds) const override; | 426 const SkIRect& bounds, BoundaryMod
e) const override; |
| 298 #endif | 427 #endif |
| 299 | 428 |
| 300 private: | 429 private: |
| 301 friend class SkLightingImageFilter; | 430 friend class SkLightingImageFilter; |
| 302 typedef SkLightingImageFilter INHERITED; | 431 typedef SkLightingImageFilterInternal INHERITED; |
| 303 SkScalar fKD; | 432 SkScalar fKD; |
| 304 }; | 433 }; |
| 305 | 434 |
| 306 class SkSpecularLightingImageFilter : public SkLightingImageFilter { | 435 class SkSpecularLightingImageFilter : public SkLightingImageFilterInternal { |
| 307 public: | 436 public: |
| 308 static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, | 437 static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, |
| 309 SkScalar ks, SkScalar shininess, SkImageFilter*
, const CropRect*); | 438 SkScalar ks, SkScalar shininess, SkImageFilter*
, const CropRect*); |
| 310 | 439 |
| 311 SK_TO_STRING_OVERRIDE() | 440 SK_TO_STRING_OVERRIDE() |
| 312 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
ilter) | 441 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
ilter) |
| 313 | 442 |
| 314 SkScalar ks() const { return fKS; } | 443 SkScalar ks() const { return fKS; } |
| 315 SkScalar shininess() const { return fShininess; } | 444 SkScalar shininess() const { return fShininess; } |
| 316 | 445 |
| 317 protected: | 446 protected: |
| 318 SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala
r ks, | 447 SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala
r ks, |
| 319 SkScalar shininess, SkImageFilter* input, cons
t CropRect*); | 448 SkScalar shininess, SkImageFilter* input, cons
t CropRect*); |
| 320 void flatten(SkWriteBuffer& buffer) const override; | 449 void flatten(SkWriteBuffer& buffer) const override; |
| 321 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 450 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
| 322 SkBitmap* result, SkIPoint* offset) const overrid
e; | 451 SkBitmap* result, SkIPoint* offset) const override; |
| 323 #if SK_SUPPORT_GPU | 452 #if SK_SUPPORT_GPU |
| 324 virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const Sk
Matrix&, | 453 GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, |
| 325 const SkIRect& bounds) const override; | 454 const SkIRect& bounds, BoundaryMod
e) const override; |
| 326 #endif | 455 #endif |
| 327 | 456 |
| 328 private: | 457 private: |
| 329 SkScalar fKS; | 458 SkScalar fKS; |
| 330 SkScalar fShininess; | 459 SkScalar fShininess; |
| 331 friend class SkLightingImageFilter; | 460 friend class SkLightingImageFilter; |
| 332 typedef SkLightingImageFilter INHERITED; | 461 typedef SkLightingImageFilterInternal INHERITED; |
| 333 }; | 462 }; |
| 334 | 463 |
| 335 #if SK_SUPPORT_GPU | 464 #if SK_SUPPORT_GPU |
| 336 | 465 |
| 337 class GrLightingEffect : public GrSingleTextureEffect { | 466 class GrLightingEffect : public GrSingleTextureEffect { |
| 338 public: | 467 public: |
| 339 GrLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceS
cale, const SkMatrix& matrix); | 468 GrLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceS
cale, |
| 469 const SkMatrix& matrix, BoundaryMode boundaryMode); |
| 340 virtual ~GrLightingEffect(); | 470 virtual ~GrLightingEffect(); |
| 341 | 471 |
| 342 const SkLight* light() const { return fLight; } | 472 const SkLight* light() const { return fLight; } |
| 343 SkScalar surfaceScale() const { return fSurfaceScale; } | 473 SkScalar surfaceScale() const { return fSurfaceScale; } |
| 344 const SkMatrix& filterMatrix() const { return fFilterMatrix; } | 474 const SkMatrix& filterMatrix() const { return fFilterMatrix; } |
| 475 BoundaryMode boundaryMode() const { return fBoundaryMode; } |
| 345 | 476 |
| 346 protected: | 477 protected: |
| 347 bool onIsEqual(const GrFragmentProcessor&) const override; | 478 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 348 | 479 |
| 349 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { | 480 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { |
| 350 // lighting shaders are complicated. We just throw up our hands. | 481 // lighting shaders are complicated. We just throw up our hands. |
| 351 inout->mulByUnknownFourComponents(); | 482 inout->mulByUnknownFourComponents(); |
| 352 } | 483 } |
| 353 | 484 |
| 354 private: | 485 private: |
| 355 typedef GrSingleTextureEffect INHERITED; | 486 typedef GrSingleTextureEffect INHERITED; |
| 356 const SkLight* fLight; | 487 const SkLight* fLight; |
| 357 SkScalar fSurfaceScale; | 488 SkScalar fSurfaceScale; |
| 358 SkMatrix fFilterMatrix; | 489 SkMatrix fFilterMatrix; |
| 490 BoundaryMode fBoundaryMode; |
| 359 }; | 491 }; |
| 360 | 492 |
| 361 class GrDiffuseLightingEffect : public GrLightingEffect { | 493 class GrDiffuseLightingEffect : public GrLightingEffect { |
| 362 public: | 494 public: |
| 363 static GrFragmentProcessor* Create(GrTexture* texture, | 495 static GrFragmentProcessor* Create(GrTexture* texture, |
| 364 const SkLight* light, | 496 const SkLight* light, |
| 365 SkScalar surfaceScale, | 497 SkScalar surfaceScale, |
| 366 const SkMatrix& matrix, | 498 const SkMatrix& matrix, |
| 367 SkScalar kd) { | 499 SkScalar kd, |
| 500 BoundaryMode boundaryMode) { |
| 368 return SkNEW_ARGS(GrDiffuseLightingEffect, (texture, | 501 return SkNEW_ARGS(GrDiffuseLightingEffect, (texture, |
| 369 light, | 502 light, |
| 370 surfaceScale, | 503 surfaceScale, |
| 371 matrix, | 504 matrix, |
| 372 kd)); | 505 kd, |
| 506 boundaryMode)); |
| 373 } | 507 } |
| 374 | 508 |
| 375 const char* name() const override { return "DiffuseLighting"; } | 509 const char* name() const override { return "DiffuseLighting"; } |
| 376 | 510 |
| 377 void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
de; | 511 void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
de; |
| 378 | 512 |
| 379 GrGLFragmentProcessor* createGLInstance() const override; | 513 GrGLFragmentProcessor* createGLInstance() const override; |
| 380 | 514 |
| 381 SkScalar kd() const { return fKD; } | 515 SkScalar kd() const { return fKD; } |
| 382 | 516 |
| 383 private: | 517 private: |
| 384 bool onIsEqual(const GrFragmentProcessor&) const override; | 518 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 385 | 519 |
| 386 GrDiffuseLightingEffect(GrTexture* texture, | 520 GrDiffuseLightingEffect(GrTexture* texture, |
| 387 const SkLight* light, | 521 const SkLight* light, |
| 388 SkScalar surfaceScale, | 522 SkScalar surfaceScale, |
| 389 const SkMatrix& matrix, | 523 const SkMatrix& matrix, |
| 390 SkScalar kd); | 524 SkScalar kd, |
| 525 BoundaryMode boundaryMode); |
| 391 | 526 |
| 392 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 527 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 393 typedef GrLightingEffect INHERITED; | 528 typedef GrLightingEffect INHERITED; |
| 394 SkScalar fKD; | 529 SkScalar fKD; |
| 395 }; | 530 }; |
| 396 | 531 |
| 397 class GrSpecularLightingEffect : public GrLightingEffect { | 532 class GrSpecularLightingEffect : public GrLightingEffect { |
| 398 public: | 533 public: |
| 399 static GrFragmentProcessor* Create(GrTexture* texture, | 534 static GrFragmentProcessor* Create(GrTexture* texture, |
| 400 const SkLight* light, | 535 const SkLight* light, |
| 401 SkScalar surfaceScale, | 536 SkScalar surfaceScale, |
| 402 const SkMatrix& matrix, | 537 const SkMatrix& matrix, |
| 403 SkScalar ks, | 538 SkScalar ks, |
| 404 SkScalar shininess) { | 539 SkScalar shininess, |
| 540 BoundaryMode boundaryMode) { |
| 405 return SkNEW_ARGS(GrSpecularLightingEffect, (texture, | 541 return SkNEW_ARGS(GrSpecularLightingEffect, (texture, |
| 406 light, | 542 light, |
| 407 surfaceScale, | 543 surfaceScale, |
| 408 matrix, | 544 matrix, |
| 409 ks, | 545 ks, |
| 410 shininess)); | 546 shininess, |
| 547 boundaryMode)); |
| 411 } | 548 } |
| 412 | 549 |
| 413 const char* name() const override { return "SpecularLighting"; } | 550 const char* name() const override { return "SpecularLighting"; } |
| 414 | 551 |
| 415 void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
de; | 552 void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
de; |
| 416 | 553 |
| 417 GrGLFragmentProcessor* createGLInstance() const override; | 554 GrGLFragmentProcessor* createGLInstance() const override; |
| 418 | 555 |
| 419 SkScalar ks() const { return fKS; } | 556 SkScalar ks() const { return fKS; } |
| 420 SkScalar shininess() const { return fShininess; } | 557 SkScalar shininess() const { return fShininess; } |
| 421 | 558 |
| 422 private: | 559 private: |
| 423 bool onIsEqual(const GrFragmentProcessor&) const override; | 560 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 424 | 561 |
| 425 GrSpecularLightingEffect(GrTexture* texture, | 562 GrSpecularLightingEffect(GrTexture* texture, |
| 426 const SkLight* light, | 563 const SkLight* light, |
| 427 SkScalar surfaceScale, | 564 SkScalar surfaceScale, |
| 428 const SkMatrix& matrix, | 565 const SkMatrix& matrix, |
| 429 SkScalar ks, | 566 SkScalar ks, |
| 430 SkScalar shininess); | 567 SkScalar shininess, |
| 568 BoundaryMode boundaryMode); |
| 431 | 569 |
| 432 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 570 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 433 typedef GrLightingEffect INHERITED; | 571 typedef GrLightingEffect INHERITED; |
| 434 SkScalar fKS; | 572 SkScalar fKS; |
| 435 SkScalar fShininess; | 573 SkScalar fShininess; |
| 436 }; | 574 }; |
| 437 | 575 |
| 438 /////////////////////////////////////////////////////////////////////////////// | 576 /////////////////////////////////////////////////////////////////////////////// |
| 439 | 577 |
| 440 class GrGLLight { | 578 class GrGLLight { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 UniformHandle fColorUni; | 612 UniformHandle fColorUni; |
| 475 | 613 |
| 476 typedef SkRefCnt INHERITED; | 614 typedef SkRefCnt INHERITED; |
| 477 }; | 615 }; |
| 478 | 616 |
| 479 /////////////////////////////////////////////////////////////////////////////// | 617 /////////////////////////////////////////////////////////////////////////////// |
| 480 | 618 |
| 481 class GrGLDistantLight : public GrGLLight { | 619 class GrGLDistantLight : public GrGLLight { |
| 482 public: | 620 public: |
| 483 virtual ~GrGLDistantLight() {} | 621 virtual ~GrGLDistantLight() {} |
| 484 virtual void setData(const GrGLProgramDataManager&, | 622 void setData(const GrGLProgramDataManager&, const SkLight* light) const over
ride; |
| 485 const SkLight* light) const override; | |
| 486 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 623 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |
| 487 | 624 |
| 488 private: | 625 private: |
| 489 typedef GrGLLight INHERITED; | 626 typedef GrGLLight INHERITED; |
| 490 UniformHandle fDirectionUni; | 627 UniformHandle fDirectionUni; |
| 491 }; | 628 }; |
| 492 | 629 |
| 493 /////////////////////////////////////////////////////////////////////////////// | 630 /////////////////////////////////////////////////////////////////////////////// |
| 494 | 631 |
| 495 class GrGLPointLight : public GrGLLight { | 632 class GrGLPointLight : public GrGLLight { |
| 496 public: | 633 public: |
| 497 virtual ~GrGLPointLight() {} | 634 virtual ~GrGLPointLight() {} |
| 498 virtual void setData(const GrGLProgramDataManager&, | 635 void setData(const GrGLProgramDataManager&, const SkLight* light) const over
ride; |
| 499 const SkLight* light) const override; | |
| 500 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 636 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |
| 501 | 637 |
| 502 private: | 638 private: |
| 503 typedef GrGLLight INHERITED; | 639 typedef GrGLLight INHERITED; |
| 504 UniformHandle fLocationUni; | 640 UniformHandle fLocationUni; |
| 505 }; | 641 }; |
| 506 | 642 |
| 507 /////////////////////////////////////////////////////////////////////////////// | 643 /////////////////////////////////////////////////////////////////////////////// |
| 508 | 644 |
| 509 class GrGLSpotLight : public GrGLLight { | 645 class GrGLSpotLight : public GrGLLight { |
| 510 public: | 646 public: |
| 511 virtual ~GrGLSpotLight() {} | 647 virtual ~GrGLSpotLight() {} |
| 512 virtual void setData(const GrGLProgramDataManager&, | 648 void setData(const GrGLProgramDataManager&, const SkLight* light) const over
ride; |
| 513 const SkLight* light) const override; | |
| 514 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 649 void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |
| 515 void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight) override; | 650 void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight) override; |
| 516 | 651 |
| 517 private: | 652 private: |
| 518 typedef GrGLLight INHERITED; | 653 typedef GrGLLight INHERITED; |
| 519 | 654 |
| 520 SkString fLightColorFunc; | 655 SkString fLightColorFunc; |
| 521 UniformHandle fLocationUni; | 656 UniformHandle fLocationUni; |
| 522 UniformHandle fExponentUni; | 657 UniformHandle fExponentUni; |
| 523 UniformHandle fCosOuterConeAngleUni; | 658 UniformHandle fCosOuterConeAngleUni; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 | 823 |
| 689 private: | 824 private: |
| 690 typedef SkLight INHERITED; | 825 typedef SkLight INHERITED; |
| 691 SkPoint3 fLocation; | 826 SkPoint3 fLocation; |
| 692 }; | 827 }; |
| 693 | 828 |
| 694 /////////////////////////////////////////////////////////////////////////////// | 829 /////////////////////////////////////////////////////////////////////////////// |
| 695 | 830 |
| 696 class SkSpotLight : public SkLight { | 831 class SkSpotLight : public SkLight { |
| 697 public: | 832 public: |
| 698 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cutoffAngle, SkColor color) | 833 SkSpotLight(const SkPoint3& location, |
| 834 const SkPoint3& target, |
| 835 SkScalar specularExponent, |
| 836 SkScalar cutoffAngle, |
| 837 SkColor color) |
| 699 : INHERITED(color), | 838 : INHERITED(color), |
| 700 fLocation(location), | 839 fLocation(location), |
| 701 fTarget(target), | 840 fTarget(target), |
| 702 fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp
ecularExponentMax)) | 841 fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp
ecularExponentMax)) |
| 703 { | 842 { |
| 704 fS = target - location; | 843 fS = target - location; |
| 705 fS.normalize(); | 844 fS.normalize(); |
| 706 fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); | 845 fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); |
| 707 const SkScalar antiAliasThreshold = 0.016f; | 846 const SkScalar antiAliasThreshold = 0.016f; |
| 708 fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; | 847 fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; |
| 709 fConeScale = SkScalarInvert(antiAliasThreshold); | 848 fConeScale = SkScalarInvert(antiAliasThreshold); |
| 710 } | 849 } |
| 711 | 850 |
| 712 SkLight* transform(const SkMatrix& matrix) const override { | 851 SkLight* transform(const SkMatrix& matrix) const override { |
| 713 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); | 852 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); |
| 714 matrix.mapPoints(&location2, 1); | 853 matrix.mapPoints(&location2, 1); |
| 715 // Use X scale and Y scale on Z and average the result | 854 // Use X scale and Y scale on Z and average the result |
| 716 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); | 855 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); |
| 717 matrix.mapVectors(&locationZ, 1); | 856 matrix.mapVectors(&locationZ, 1); |
| 718 SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX,
locationZ.fY)); | 857 SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX,
locationZ.fY)); |
| 719 SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY); | 858 SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY); |
| 720 matrix.mapPoints(&target2, 1); | 859 matrix.mapPoints(&target2, 1); |
| 721 SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ); | 860 SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ); |
| 722 matrix.mapVectors(&targetZ, 1); | 861 matrix.mapVectors(&targetZ, 1); |
| 723 SkPoint3 target(target2.fX, target2.fY, SkScalarAve(targetZ.fX, targetZ.
fY)); | 862 SkPoint3 target(target2.fX, target2.fY, SkScalarAve(targetZ.fX, targetZ.
fY)); |
| 724 SkPoint3 s = target - location; | 863 SkPoint3 s = target - location; |
| 725 s.normalize(); | 864 s.normalize(); |
| 726 return new SkSpotLight(location, target, fSpecularExponent, fCosOuterCon
eAngle, fCosInnerConeAngle, fConeScale, s, color()); | 865 return new SkSpotLight(location, |
| 866 target, |
| 867 fSpecularExponent, |
| 868 fCosOuterConeAngle, |
| 869 fCosInnerConeAngle, |
| 870 fConeScale, |
| 871 s, |
| 872 color()); |
| 727 } | 873 } |
| 728 | 874 |
| 729 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { | 875 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { |
| 730 SkPoint3 direction(fLocation.fX - SkIntToScalar(x), | 876 SkPoint3 direction(fLocation.fX - SkIntToScalar(x), |
| 731 fLocation.fY - SkIntToScalar(y), | 877 fLocation.fY - SkIntToScalar(y), |
| 732 fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceS
cale)); | 878 fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceS
cale)); |
| 733 direction.normalize(); | 879 direction.normalize(); |
| 734 return direction; | 880 return direction; |
| 735 }; | 881 }; |
| 736 SkPoint3 lightColor(const SkPoint3& surfaceToLight) const { | 882 SkPoint3 lightColor(const SkPoint3& surfaceToLight) const { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 fCosOuterConeAngle = buffer.readScalar(); | 916 fCosOuterConeAngle = buffer.readScalar(); |
| 771 fCosInnerConeAngle = buffer.readScalar(); | 917 fCosInnerConeAngle = buffer.readScalar(); |
| 772 fConeScale = buffer.readScalar(); | 918 fConeScale = buffer.readScalar(); |
| 773 fS = readPoint3(buffer); | 919 fS = readPoint3(buffer); |
| 774 buffer.validate(SkScalarIsFinite(fSpecularExponent) && | 920 buffer.validate(SkScalarIsFinite(fSpecularExponent) && |
| 775 SkScalarIsFinite(fCosOuterConeAngle) && | 921 SkScalarIsFinite(fCosOuterConeAngle) && |
| 776 SkScalarIsFinite(fCosInnerConeAngle) && | 922 SkScalarIsFinite(fCosInnerConeAngle) && |
| 777 SkScalarIsFinite(fConeScale)); | 923 SkScalarIsFinite(fConeScale)); |
| 778 } | 924 } |
| 779 protected: | 925 protected: |
| 780 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) | 926 SkSpotLight(const SkPoint3& location, |
| 927 const SkPoint3& target, |
| 928 SkScalar specularExponent, |
| 929 SkScalar cosOuterConeAngle, |
| 930 SkScalar cosInnerConeAngle, |
| 931 SkScalar coneScale, |
| 932 const SkPoint3& s, |
| 933 const SkPoint3& color) |
| 781 : INHERITED(color), | 934 : INHERITED(color), |
| 782 fLocation(location), | 935 fLocation(location), |
| 783 fTarget(target), | 936 fTarget(target), |
| 784 fSpecularExponent(specularExponent), | 937 fSpecularExponent(specularExponent), |
| 785 fCosOuterConeAngle(cosOuterConeAngle), | 938 fCosOuterConeAngle(cosOuterConeAngle), |
| 786 fCosInnerConeAngle(cosInnerConeAngle), | 939 fCosInnerConeAngle(cosInnerConeAngle), |
| 787 fConeScale(coneScale), | 940 fConeScale(coneScale), |
| 788 fS(s) | 941 fS(s) |
| 789 { | 942 { |
| 790 } | 943 } |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 return NULL; | 1106 return NULL; |
| 954 } | 1107 } |
| 955 // According to the spec, kd can be any non-negative number : | 1108 // According to the spec, kd can be any non-negative number : |
| 956 // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement | 1109 // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement |
| 957 if (kd < 0) { | 1110 if (kd < 0) { |
| 958 return NULL; | 1111 return NULL; |
| 959 } | 1112 } |
| 960 return SkNEW_ARGS(SkDiffuseLightingImageFilter, (light, surfaceScale, kd, in
put, cropRect)); | 1113 return SkNEW_ARGS(SkDiffuseLightingImageFilter, (light, surfaceScale, kd, in
put, cropRect)); |
| 961 } | 1114 } |
| 962 | 1115 |
| 963 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect) | 1116 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, |
| 964 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 1117 SkScalar surfaceScale
, |
| 1118 SkScalar kd, |
| 1119 SkImageFilter* input, |
| 1120 const CropRect* cropR
ect) |
| 1121 : INHERITED(light, surfaceScale, input, cropRect), |
| 965 fKD(kd) | 1122 fKD(kd) |
| 966 { | 1123 { |
| 967 } | 1124 } |
| 968 | 1125 |
| 969 SkFlattenable* SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buffer) { | 1126 SkFlattenable* SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buffer) { |
| 970 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); | 1127 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); |
| 971 SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); | 1128 SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); |
| 972 SkScalar surfaceScale = buffer.readScalar(); | 1129 SkScalar surfaceScale = buffer.readScalar(); |
| 973 SkScalar kd = buffer.readScalar(); | 1130 SkScalar kd = buffer.readScalar(); |
| 974 return Create(light, surfaceScale, kd, common.getInput(0), &common.cropRect(
)); | 1131 return Create(light, surfaceScale, kd, common.getInput(0), &common.cropRect(
)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 } | 1170 } |
| 1014 | 1171 |
| 1015 SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); | 1172 SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); |
| 1016 | 1173 |
| 1017 DiffuseLightingType lightingType(fKD); | 1174 DiffuseLightingType lightingType(fKD); |
| 1018 offset->fX = bounds.left(); | 1175 offset->fX = bounds.left(); |
| 1019 offset->fY = bounds.top(); | 1176 offset->fY = bounds.top(); |
| 1020 bounds.offset(-srcOffset); | 1177 bounds.offset(-srcOffset); |
| 1021 switch (transformedLight->type()) { | 1178 switch (transformedLight->type()) { |
| 1022 case SkLight::kDistant_LightType: | 1179 case SkLight::kDistant_LightType: |
| 1023 lightBitmap<DiffuseLightingType, SkDistantLight>(lightingType, trans
formedLight, src, dst, surfaceScale(), bounds); | 1180 lightBitmap<DiffuseLightingType, SkDistantLight>(lightingType, |
| 1181 transformedLight, |
| 1182 src, |
| 1183 dst, |
| 1184 surfaceScale(), |
| 1185 bounds); |
| 1024 break; | 1186 break; |
| 1025 case SkLight::kPoint_LightType: | 1187 case SkLight::kPoint_LightType: |
| 1026 lightBitmap<DiffuseLightingType, SkPointLight>(lightingType, transfo
rmedLight, src, dst, surfaceScale(), bounds); | 1188 lightBitmap<DiffuseLightingType, SkPointLight>(lightingType, |
| 1189 transformedLight, |
| 1190 src, |
| 1191 dst, |
| 1192 surfaceScale(), |
| 1193 bounds); |
| 1027 break; | 1194 break; |
| 1028 case SkLight::kSpot_LightType: | 1195 case SkLight::kSpot_LightType: |
| 1029 lightBitmap<DiffuseLightingType, SkSpotLight>(lightingType, transfor
medLight, src, dst, surfaceScale(), bounds); | 1196 lightBitmap<DiffuseLightingType, SkSpotLight>(lightingType, |
| 1197 transformedLight, |
| 1198 src, |
| 1199 dst, |
| 1200 surfaceScale(), |
| 1201 bounds); |
| 1030 break; | 1202 break; |
| 1031 } | 1203 } |
| 1032 | 1204 |
| 1033 return true; | 1205 return true; |
| 1034 } | 1206 } |
| 1035 | 1207 |
| 1036 #ifndef SK_IGNORE_TO_STRING | 1208 #ifndef SK_IGNORE_TO_STRING |
| 1037 void SkDiffuseLightingImageFilter::toString(SkString* str) const { | 1209 void SkDiffuseLightingImageFilter::toString(SkString* str) const { |
| 1038 str->appendf("SkDiffuseLightingImageFilter: ("); | 1210 str->appendf("SkDiffuseLightingImageFilter: ("); |
| 1039 str->appendf("kD: %f\n", fKD); | 1211 str->appendf("kD: %f\n", fKD); |
| 1040 str->append(")"); | 1212 str->append(")"); |
| 1041 } | 1213 } |
| 1042 #endif | 1214 #endif |
| 1043 | 1215 |
| 1044 #if SK_SUPPORT_GPU | 1216 #if SK_SUPPORT_GPU |
| 1045 bool SkDiffuseLightingImageFilter::asFragmentProcessor(GrFragmentProcessor** fp, | 1217 GrFragmentProcessor* SkDiffuseLightingImageFilter::getFragmentProcessor( |
| 1046 GrTexture* texture, | 1218 GrTexture* texture, |
| 1047 const SkMatrix& matrix, | 1219 const SkMatrix& matrix, |
| 1048 const SkIRect&) const { | 1220 const SkIRect&, |
| 1049 if (fp) { | 1221 BoundaryMode boundaryMode |
| 1050 SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); | 1222 ) const { |
| 1051 *fp = GrDiffuseLightingEffect::Create(texture, light(), scale, matrix, k
d()); | 1223 SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); |
| 1052 } | 1224 return GrDiffuseLightingEffect::Create(texture, light(), scale, matrix, kd()
, boundaryMode); |
| 1053 return true; | |
| 1054 } | 1225 } |
| 1055 #endif | 1226 #endif |
| 1056 | 1227 |
| 1057 /////////////////////////////////////////////////////////////////////////////// | 1228 /////////////////////////////////////////////////////////////////////////////// |
| 1058 | 1229 |
| 1059 SkImageFilter* SkSpecularLightingImageFilter::Create(SkLight* light, SkScalar su
rfaceScale, | 1230 SkImageFilter* SkSpecularLightingImageFilter::Create(SkLight* light, SkScalar su
rfaceScale, |
| 1060 SkScalar ks, SkScalar shininess, SkImageFilter* input, const Cro
pRect* cropRect) { | 1231 SkScalar ks, SkScalar shininess, SkImageFilter* input, const Cro
pRect* cropRect) { |
| 1061 if (NULL == light) { | 1232 if (NULL == light) { |
| 1062 return NULL; | 1233 return NULL; |
| 1063 } | 1234 } |
| 1064 if (!SkScalarIsFinite(surfaceScale) || !SkScalarIsFinite(ks) || !SkScalarIsF
inite(shininess)) { | 1235 if (!SkScalarIsFinite(surfaceScale) || !SkScalarIsFinite(ks) || !SkScalarIsF
inite(shininess)) { |
| 1065 return NULL; | 1236 return NULL; |
| 1066 } | 1237 } |
| 1067 // According to the spec, ks can be any non-negative number : | 1238 // According to the spec, ks can be any non-negative number : |
| 1068 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement | 1239 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement |
| 1069 if (ks < 0) { | 1240 if (ks < 0) { |
| 1070 return NULL; | 1241 return NULL; |
| 1071 } | 1242 } |
| 1072 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 1243 return SkNEW_ARGS(SkSpecularLightingImageFilter, |
| 1073 (light, surfaceScale, ks, shininess, input, cropRect)); | 1244 (light, surfaceScale, ks, shininess, input, cropRect)); |
| 1074 } | 1245 } |
| 1075 | 1246 |
| 1076 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, SkS
calar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const
CropRect* cropRect) | 1247 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, |
| 1077 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 1248 SkScalar surfaceSca
le, |
| 1249 SkScalar ks, |
| 1250 SkScalar shininess, |
| 1251 SkImageFilter* inpu
t, |
| 1252 const CropRect* cro
pRect) |
| 1253 : INHERITED(light, surfaceScale, input, cropRect), |
| 1078 fKS(ks), | 1254 fKS(ks), |
| 1079 fShininess(shininess) | 1255 fShininess(shininess) |
| 1080 { | 1256 { |
| 1081 } | 1257 } |
| 1082 | 1258 |
| 1083 SkFlattenable* SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buffer) { | 1259 SkFlattenable* SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buffer) { |
| 1084 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); | 1260 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); |
| 1085 SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); | 1261 SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); |
| 1086 SkScalar surfaceScale = buffer.readScalar(); | 1262 SkScalar surfaceScale = buffer.readScalar(); |
| 1087 SkScalar ks = buffer.readScalar(); | 1263 SkScalar ks = buffer.readScalar(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 return false; | 1305 return false; |
| 1130 } | 1306 } |
| 1131 | 1307 |
| 1132 SpecularLightingType lightingType(fKS, fShininess); | 1308 SpecularLightingType lightingType(fKS, fShininess); |
| 1133 offset->fX = bounds.left(); | 1309 offset->fX = bounds.left(); |
| 1134 offset->fY = bounds.top(); | 1310 offset->fY = bounds.top(); |
| 1135 bounds.offset(-srcOffset); | 1311 bounds.offset(-srcOffset); |
| 1136 SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); | 1312 SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); |
| 1137 switch (transformedLight->type()) { | 1313 switch (transformedLight->type()) { |
| 1138 case SkLight::kDistant_LightType: | 1314 case SkLight::kDistant_LightType: |
| 1139 lightBitmap<SpecularLightingType, SkDistantLight>(lightingType, tran
sformedLight, src, dst, surfaceScale(), bounds); | 1315 lightBitmap<SpecularLightingType, SkDistantLight>(lightingType, |
| 1316 transformedLight, |
| 1317 src, |
| 1318 dst, |
| 1319 surfaceScale(), |
| 1320 bounds); |
| 1140 break; | 1321 break; |
| 1141 case SkLight::kPoint_LightType: | 1322 case SkLight::kPoint_LightType: |
| 1142 lightBitmap<SpecularLightingType, SkPointLight>(lightingType, transf
ormedLight, src, dst, surfaceScale(), bounds); | 1323 lightBitmap<SpecularLightingType, SkPointLight>(lightingType, |
| 1324 transformedLight, |
| 1325 src, |
| 1326 dst, |
| 1327 surfaceScale(), |
| 1328 bounds); |
| 1143 break; | 1329 break; |
| 1144 case SkLight::kSpot_LightType: | 1330 case SkLight::kSpot_LightType: |
| 1145 lightBitmap<SpecularLightingType, SkSpotLight>(lightingType, transfo
rmedLight, src, dst, surfaceScale(), bounds); | 1331 lightBitmap<SpecularLightingType, SkSpotLight>(lightingType, |
| 1332 transformedLight, |
| 1333 src, |
| 1334 dst, |
| 1335 surfaceScale(), |
| 1336 bounds); |
| 1146 break; | 1337 break; |
| 1147 } | 1338 } |
| 1148 return true; | 1339 return true; |
| 1149 } | 1340 } |
| 1150 | 1341 |
| 1151 #ifndef SK_IGNORE_TO_STRING | 1342 #ifndef SK_IGNORE_TO_STRING |
| 1152 void SkSpecularLightingImageFilter::toString(SkString* str) const { | 1343 void SkSpecularLightingImageFilter::toString(SkString* str) const { |
| 1153 str->appendf("SkSpecularLightingImageFilter: ("); | 1344 str->appendf("SkSpecularLightingImageFilter: ("); |
| 1154 str->appendf("kS: %f shininess: %f", fKS, fShininess); | 1345 str->appendf("kS: %f shininess: %f", fKS, fShininess); |
| 1155 str->append(")"); | 1346 str->append(")"); |
| 1156 } | 1347 } |
| 1157 #endif | 1348 #endif |
| 1158 | 1349 |
| 1159 #if SK_SUPPORT_GPU | 1350 #if SK_SUPPORT_GPU |
| 1160 bool SkSpecularLightingImageFilter::asFragmentProcessor(GrFragmentProcessor** fp
, | 1351 GrFragmentProcessor* SkSpecularLightingImageFilter::getFragmentProcessor( |
| 1161 GrTexture* texture, | 1352 GrTexture* texture, |
| 1162 const SkMatrix& matrix, | 1353 const SkMatrix& matrix, |
| 1163 const SkIRect&) const { | 1354 const SkIRect&, |
| 1164 if (fp) { | 1355 BoundaryMode boundaryMo
de) const { |
| 1165 SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); | 1356 SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); |
| 1166 *fp = GrSpecularLightingEffect::Create(texture, light(), scale, matrix,
ks(), shininess()); | 1357 return GrSpecularLightingEffect::Create(texture, light(), scale, matrix, ks(
), shininess(), |
| 1167 } | 1358 boundaryMode); |
| 1168 return true; | |
| 1169 } | 1359 } |
| 1170 #endif | 1360 #endif |
| 1171 | 1361 |
| 1172 /////////////////////////////////////////////////////////////////////////////// | 1362 /////////////////////////////////////////////////////////////////////////////// |
| 1173 | 1363 |
| 1174 #if SK_SUPPORT_GPU | 1364 #if SK_SUPPORT_GPU |
| 1175 | 1365 |
| 1176 namespace { | 1366 namespace { |
| 1177 SkPoint3 random_point3(SkRandom* random) { | 1367 SkPoint3 random_point3(SkRandom* random) { |
| 1178 return SkPoint3(SkScalarToFloat(random->nextSScalar1()), | 1368 return SkPoint3(SkScalarToFloat(random->nextSScalar1()), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1195 random->nextUScalar1(), | 1385 random->nextUScalar1(), |
| 1196 random->nextUScalar1(), | 1386 random->nextUScalar1(), |
| 1197 random->nextU())); | 1387 random->nextU())); |
| 1198 } | 1388 } |
| 1199 default: | 1389 default: |
| 1200 SkFAIL("Unexpected value."); | 1390 SkFAIL("Unexpected value."); |
| 1201 return NULL; | 1391 return NULL; |
| 1202 } | 1392 } |
| 1203 } | 1393 } |
| 1204 | 1394 |
| 1395 SkString emitNormalFunc(BoundaryMode mode, |
| 1396 const char* pointToNormalName, |
| 1397 const char* sobelFuncName) { |
| 1398 SkString result; |
| 1399 switch (mode) { |
| 1400 case kTopLeft_BoundaryMode: |
| 1401 result.printf("\treturn %s(%s(0.0, 0.0, m[4], m[5], m[7], m[8], %g),\n" |
| 1402 "\t %s(0.0, 0.0, m[4], m[7], m[5], m[8], %g),\n" |
| 1403 "\t surfaceScale);\n", |
| 1404 pointToNormalName, sobelFuncName, gTwoThirds, |
| 1405 sobelFuncName, gTwoThirds); |
| 1406 break; |
| 1407 case kTop_BoundaryMode: |
| 1408 result.printf("\treturn %s(%s(0.0, 0.0, m[3], m[5], m[6], m[8], %g),\n" |
| 1409 "\t %s(0.0, 0.0, m[4], m[7], m[5], m[8], %g),\n" |
| 1410 "\t surfaceScale);\n", |
| 1411 pointToNormalName, sobelFuncName, gOneThird, |
| 1412 sobelFuncName, gOneHalf); |
| 1413 break; |
| 1414 case kTopRight_BoundaryMode: |
| 1415 result.printf("\treturn %s(%s( 0.0, 0.0, m[3], m[4], m[6], m[7], %g),\n
" |
| 1416 "\t %s(m[3], m[6], m[4], m[7], 0.0, 0.0, %g),\n
" |
| 1417 "\t surfaceScale);\n", |
| 1418 pointToNormalName, sobelFuncName, gTwoThirds, |
| 1419 sobelFuncName, gTwoThirds); |
| 1420 break; |
| 1421 case kLeft_BoundaryMode: |
| 1422 result.printf("\treturn %s(%s(m[1], m[2], m[4], m[5], m[7], m[8], %g),\n
" |
| 1423 "\t %s( 0.0, 0.0, m[1], m[7], m[2], m[8], %g),\n
" |
| 1424 "\t surfaceScale);\n", |
| 1425 pointToNormalName, sobelFuncName, gOneHalf, |
| 1426 sobelFuncName, gOneThird); |
| 1427 break; |
| 1428 case kInterior_BoundaryMode: |
| 1429 result.printf("\treturn %s(%s(m[0], m[2], m[3], m[5], m[6], m[8], %g),\n
" |
| 1430 "\t %s(m[0], m[6], m[1], m[7], m[2], m[8], %g),\n
" |
| 1431 "\t surfaceScale);\n", |
| 1432 pointToNormalName, sobelFuncName, gOneQuarter, |
| 1433 sobelFuncName, gOneQuarter); |
| 1434 break; |
| 1435 case kRight_BoundaryMode: |
| 1436 result.printf("\treturn %s(%s(m[0], m[1], m[3], m[4], m[6], m[7], %g),\n
" |
| 1437 "\t %s(m[0], m[6], m[1], m[7], 0.0, 0.0, %g),\n
" |
| 1438 "\t surfaceScale);\n", |
| 1439 pointToNormalName, sobelFuncName, gOneHalf, |
| 1440 sobelFuncName, gOneThird); |
| 1441 break; |
| 1442 case kBottomLeft_BoundaryMode: |
| 1443 result.printf("\treturn %s(%s(m[1], m[2], m[4], m[5], 0.0, 0.0, %g),\n
" |
| 1444 "\t %s( 0.0, 0.0, m[1], m[4], m[2], m[5], %g),\n
" |
| 1445 "\t surfaceScale);\n", |
| 1446 pointToNormalName, sobelFuncName, gTwoThirds, |
| 1447 sobelFuncName, gTwoThirds); |
| 1448 break; |
| 1449 case kBottom_BoundaryMode: |
| 1450 result.printf("\treturn %s(%s(m[0], m[2], m[3], m[5], 0.0, 0.0, %g),\n
" |
| 1451 "\t %s(m[0], m[3], m[1], m[4], m[2], m[5], %g),\n
" |
| 1452 "\t surfaceScale);\n", |
| 1453 pointToNormalName, sobelFuncName, gOneThird, |
| 1454 sobelFuncName, gOneHalf); |
| 1455 break; |
| 1456 case kBottomRight_BoundaryMode: |
| 1457 result.printf("\treturn %s(%s(m[0], m[1], m[3], m[4], 0.0, 0.0, %g),\n
" |
| 1458 "\t %s(m[0], m[3], m[1], m[4], 0.0, 0.0, %g),\n
" |
| 1459 "\t surfaceScale);\n", |
| 1460 pointToNormalName, sobelFuncName, gTwoThirds, |
| 1461 sobelFuncName, gTwoThirds); |
| 1462 break; |
| 1463 default: |
| 1464 SkASSERT(false); |
| 1465 break; |
| 1466 } |
| 1467 return result; |
| 1468 } |
| 1469 |
| 1205 } | 1470 } |
| 1206 | 1471 |
| 1207 class GrGLLightingEffect : public GrGLFragmentProcessor { | 1472 class GrGLLightingEffect : public GrGLFragmentProcessor { |
| 1208 public: | 1473 public: |
| 1209 GrGLLightingEffect(const GrProcessor&); | 1474 GrGLLightingEffect(const GrProcessor&); |
| 1210 virtual ~GrGLLightingEffect(); | 1475 virtual ~GrGLLightingEffect(); |
| 1211 | 1476 |
| 1212 virtual void emitCode(GrGLFPBuilder*, | 1477 void emitCode(GrGLFPBuilder*, |
| 1213 const GrFragmentProcessor&, | 1478 const GrFragmentProcessor&, |
| 1214 const char* outputColor, | 1479 const char* outputColor, |
| 1215 const char* inputColor, | 1480 const char* inputColor, |
| 1216 const TransformedCoordsArray&, | 1481 const TransformedCoordsArray&, |
| 1217 const TextureSamplerArray&) override; | 1482 const TextureSamplerArray&) override; |
| 1218 | 1483 |
| 1219 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder* b); | 1484 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder* b); |
| 1220 | 1485 |
| 1221 /** | 1486 /** |
| 1222 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); | 1487 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); |
| 1223 */ | 1488 */ |
| 1224 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1489 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
| 1225 | 1490 |
| 1226 protected: | 1491 protected: |
| 1227 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; | 1492 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; |
| 1228 | 1493 |
| 1229 private: | 1494 private: |
| 1230 typedef GrGLFragmentProcessor INHERITED; | 1495 typedef GrGLFragmentProcessor INHERITED; |
| 1231 | 1496 |
| 1232 UniformHandle fImageIncrementUni; | 1497 UniformHandle fImageIncrementUni; |
| 1233 UniformHandle fSurfaceScaleUni; | 1498 UniformHandle fSurfaceScaleUni; |
| 1234 GrGLLight* fLight; | 1499 GrGLLight* fLight; |
| 1500 BoundaryMode fBoundaryMode; |
| 1235 }; | 1501 }; |
| 1236 | 1502 |
| 1237 /////////////////////////////////////////////////////////////////////////////// | 1503 /////////////////////////////////////////////////////////////////////////////// |
| 1238 | 1504 |
| 1239 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1505 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
| 1240 public: | 1506 public: |
| 1241 GrGLDiffuseLightingEffect(const GrProcessor&); | 1507 GrGLDiffuseLightingEffect(const GrProcessor&); |
| 1242 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; | 1508 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; |
| 1243 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1509 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
| 1244 | 1510 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1261 | 1527 |
| 1262 UniformHandle fKSUni; | 1528 UniformHandle fKSUni; |
| 1263 UniformHandle fShininessUni; | 1529 UniformHandle fShininessUni; |
| 1264 }; | 1530 }; |
| 1265 | 1531 |
| 1266 /////////////////////////////////////////////////////////////////////////////// | 1532 /////////////////////////////////////////////////////////////////////////////// |
| 1267 | 1533 |
| 1268 GrLightingEffect::GrLightingEffect(GrTexture* texture, | 1534 GrLightingEffect::GrLightingEffect(GrTexture* texture, |
| 1269 const SkLight* light, | 1535 const SkLight* light, |
| 1270 SkScalar surfaceScale, | 1536 SkScalar surfaceScale, |
| 1271 const SkMatrix& matrix) | 1537 const SkMatrix& matrix, |
| 1538 BoundaryMode boundaryMode) |
| 1272 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) | 1539 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) |
| 1273 , fLight(light) | 1540 , fLight(light) |
| 1274 , fSurfaceScale(surfaceScale) | 1541 , fSurfaceScale(surfaceScale) |
| 1275 , fFilterMatrix(matrix) { | 1542 , fFilterMatrix(matrix) |
| 1543 , fBoundaryMode(boundaryMode) { |
| 1276 fLight->ref(); | 1544 fLight->ref(); |
| 1277 if (light->requiresFragmentPosition()) { | 1545 if (light->requiresFragmentPosition()) { |
| 1278 this->setWillReadFragmentPosition(); | 1546 this->setWillReadFragmentPosition(); |
| 1279 } | 1547 } |
| 1280 } | 1548 } |
| 1281 | 1549 |
| 1282 GrLightingEffect::~GrLightingEffect() { | 1550 GrLightingEffect::~GrLightingEffect() { |
| 1283 fLight->unref(); | 1551 fLight->unref(); |
| 1284 } | 1552 } |
| 1285 | 1553 |
| 1286 bool GrLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 1554 bool GrLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |
| 1287 const GrLightingEffect& s = sBase.cast<GrLightingEffect>(); | 1555 const GrLightingEffect& s = sBase.cast<GrLightingEffect>(); |
| 1288 return fLight->isEqual(*s.fLight) && | 1556 return fLight->isEqual(*s.fLight) && |
| 1289 fSurfaceScale == s.fSurfaceScale; | 1557 fSurfaceScale == s.fSurfaceScale && |
| 1558 fBoundaryMode == s.fBoundaryMode; |
| 1290 } | 1559 } |
| 1291 | 1560 |
| 1292 /////////////////////////////////////////////////////////////////////////////// | 1561 /////////////////////////////////////////////////////////////////////////////// |
| 1293 | 1562 |
| 1294 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, | 1563 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, |
| 1295 const SkLight* light, | 1564 const SkLight* light, |
| 1296 SkScalar surfaceScale, | 1565 SkScalar surfaceScale, |
| 1297 const SkMatrix& matrix, | 1566 const SkMatrix& matrix, |
| 1298 SkScalar kd) | 1567 SkScalar kd, |
| 1299 : INHERITED(texture, light, surfaceScale, matrix), fKD(kd) { | 1568 BoundaryMode boundaryMode) |
| 1569 : INHERITED(texture, light, surfaceScale, matrix, boundaryMode), fKD(kd) { |
| 1300 this->initClassID<GrDiffuseLightingEffect>(); | 1570 this->initClassID<GrDiffuseLightingEffect>(); |
| 1301 } | 1571 } |
| 1302 | 1572 |
| 1303 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ | 1573 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ |
| 1304 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); | 1574 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); |
| 1305 return INHERITED::onIsEqual(sBase) && | 1575 return INHERITED::onIsEqual(sBase) && |
| 1306 this->kd() == s.kd(); | 1576 this->kd() == s.kd(); |
| 1307 } | 1577 } |
| 1308 | 1578 |
| 1309 void GrDiffuseLightingEffect::getGLProcessorKey(const GrGLCaps& caps, | 1579 void GrDiffuseLightingEffect::getGLProcessorKey(const GrGLCaps& caps, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1321 GrContext* context, | 1591 GrContext* context, |
| 1322 const GrDrawTargetCaps&, | 1592 const GrDrawTargetCaps&, |
| 1323 GrTexture* textures[]) { | 1593 GrTexture* textures[]) { |
| 1324 SkScalar surfaceScale = random->nextSScalar1(); | 1594 SkScalar surfaceScale = random->nextSScalar1(); |
| 1325 SkScalar kd = random->nextUScalar1(); | 1595 SkScalar kd = random->nextUScalar1(); |
| 1326 SkAutoTUnref<SkLight> light(create_random_light(random)); | 1596 SkAutoTUnref<SkLight> light(create_random_light(random)); |
| 1327 SkMatrix matrix; | 1597 SkMatrix matrix; |
| 1328 for (int i = 0; i < 9; i++) { | 1598 for (int i = 0; i < 9; i++) { |
| 1329 matrix[i] = random->nextUScalar1(); | 1599 matrix[i] = random->nextUScalar1(); |
| 1330 } | 1600 } |
| 1601 BoundaryMode mode = static_cast<BoundaryMode>(random->nextU() % kBoundaryMod
eCount); |
| 1331 return GrDiffuseLightingEffect::Create(textures[GrProcessorUnitTest::kAlphaT
extureIdx], | 1602 return GrDiffuseLightingEffect::Create(textures[GrProcessorUnitTest::kAlphaT
extureIdx], |
| 1332 light, surfaceScale, matrix, kd); | 1603 light, surfaceScale, matrix, kd, mode
); |
| 1333 } | 1604 } |
| 1334 | 1605 |
| 1335 | 1606 |
| 1336 /////////////////////////////////////////////////////////////////////////////// | 1607 /////////////////////////////////////////////////////////////////////////////// |
| 1337 | 1608 |
| 1338 GrGLLightingEffect::GrGLLightingEffect(const GrProcessor& fp) { | 1609 GrGLLightingEffect::GrGLLightingEffect(const GrProcessor& fp) { |
| 1339 const GrLightingEffect& m = fp.cast<GrLightingEffect>(); | 1610 const GrLightingEffect& m = fp.cast<GrLightingEffect>(); |
| 1340 fLight = m.light()->createGLLight(); | 1611 fLight = m.light()->createGLLight(); |
| 1612 fBoundaryMode = m.boundaryMode(); |
| 1341 } | 1613 } |
| 1342 | 1614 |
| 1343 GrGLLightingEffect::~GrGLLightingEffect() { | 1615 GrGLLightingEffect::~GrGLLightingEffect() { |
| 1344 delete fLight; | 1616 delete fLight; |
| 1345 } | 1617 } |
| 1346 | 1618 |
| 1347 void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder, | 1619 void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder, |
| 1348 const GrFragmentProcessor&, | 1620 const GrFragmentProcessor&, |
| 1349 const char* outputColor, | 1621 const char* outputColor, |
| 1350 const char* inputColor, | 1622 const char* inputColor, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1381 static const GrGLShaderVar gPointToNormalArgs[] = { | 1653 static const GrGLShaderVar gPointToNormalArgs[] = { |
| 1382 GrGLShaderVar("x", kFloat_GrSLType), | 1654 GrGLShaderVar("x", kFloat_GrSLType), |
| 1383 GrGLShaderVar("y", kFloat_GrSLType), | 1655 GrGLShaderVar("y", kFloat_GrSLType), |
| 1384 GrGLShaderVar("scale", kFloat_GrSLType), | 1656 GrGLShaderVar("scale", kFloat_GrSLType), |
| 1385 }; | 1657 }; |
| 1386 SkString pointToNormalName; | 1658 SkString pointToNormalName; |
| 1387 fsBuilder->emitFunction(kVec3f_GrSLType, | 1659 fsBuilder->emitFunction(kVec3f_GrSLType, |
| 1388 "pointToNormal", | 1660 "pointToNormal", |
| 1389 SK_ARRAY_COUNT(gPointToNormalArgs), | 1661 SK_ARRAY_COUNT(gPointToNormalArgs), |
| 1390 gPointToNormalArgs, | 1662 gPointToNormalArgs, |
| 1391 "\treturn normalize(vec3(-x * scale, y * scale, 1));
\n", | 1663 "\treturn normalize(vec3(-x * scale, -y * scale, 1))
;\n", |
| 1392 &pointToNormalName); | 1664 &pointToNormalName); |
| 1393 | 1665 |
| 1394 static const GrGLShaderVar gInteriorNormalArgs[] = { | 1666 static const GrGLShaderVar gInteriorNormalArgs[] = { |
| 1395 GrGLShaderVar("m", kFloat_GrSLType, 9), | 1667 GrGLShaderVar("m", kFloat_GrSLType, 9), |
| 1396 GrGLShaderVar("surfaceScale", kFloat_GrSLType), | 1668 GrGLShaderVar("surfaceScale", kFloat_GrSLType), |
| 1397 }; | 1669 }; |
| 1398 SkString interiorNormalBody; | 1670 SkString normalBody = emitNormalFunc(fBoundaryMode, |
| 1399 interiorNormalBody.appendf("\treturn %s(%s(m[0], m[2], m[3], m[5], m[6], m[8
], 0.25),\n" | 1671 pointToNormalName.c_str(), |
| 1400 "\t %s(m[0], m[6], m[1], m[7], m[2], m[8],
0.25),\n" | 1672 sobelFuncName.c_str()); |
| 1401 "\t surfaceScale);\n", | 1673 SkString normalName; |
| 1402 pointToNormalName.c_str(), | |
| 1403 sobelFuncName.c_str(), | |
| 1404 sobelFuncName.c_str()); | |
| 1405 SkString interiorNormalName; | |
| 1406 fsBuilder->emitFunction(kVec3f_GrSLType, | 1674 fsBuilder->emitFunction(kVec3f_GrSLType, |
| 1407 "interiorNormal", | 1675 "normal", |
| 1408 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1676 SK_ARRAY_COUNT(gInteriorNormalArgs), |
| 1409 gInteriorNormalArgs, | 1677 gInteriorNormalArgs, |
| 1410 interiorNormalBody.c_str(), | 1678 normalBody.c_str(), |
| 1411 &interiorNormalName); | 1679 &normalName); |
| 1412 | 1680 |
| 1413 fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); | 1681 fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |
| 1414 fsBuilder->codeAppend("\t\tfloat m[9];\n"); | 1682 fsBuilder->codeAppend("\t\tfloat m[9];\n"); |
| 1415 | 1683 |
| 1416 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 1684 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
| 1417 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); | 1685 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); |
| 1418 | 1686 |
| 1419 int index = 0; | 1687 int index = 0; |
| 1420 for (int dy = -1; dy <= 1; dy++) { | 1688 for (int dy = 1; dy >= -1; dy--) { |
| 1421 for (int dx = -1; dx <= 1; dx++) { | 1689 for (int dx = -1; dx <= 1; dx++) { |
| 1422 SkString texCoords; | 1690 SkString texCoords; |
| 1423 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 1691 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); |
| 1424 fsBuilder->codeAppendf("\t\tm[%d] = ", index++); | 1692 fsBuilder->codeAppendf("\t\tm[%d] = ", index++); |
| 1425 fsBuilder->appendTextureLookup(samplers[0], texCoords.c_str()); | 1693 fsBuilder->appendTextureLookup(samplers[0], texCoords.c_str()); |
| 1426 fsBuilder->codeAppend(".a;\n"); | 1694 fsBuilder->codeAppend(".a;\n"); |
| 1427 } | 1695 } |
| 1428 } | 1696 } |
| 1429 fsBuilder->codeAppend("\t\tvec3 surfaceToLight = "); | 1697 fsBuilder->codeAppend("\t\tvec3 surfaceToLight = "); |
| 1430 SkString arg; | 1698 SkString arg; |
| 1431 arg.appendf("%s * m[4]", surfScale); | 1699 arg.appendf("%s * m[4]", surfScale); |
| 1432 fLight->emitSurfaceToLight(builder, arg.c_str()); | 1700 fLight->emitSurfaceToLight(builder, arg.c_str()); |
| 1433 fsBuilder->codeAppend(";\n"); | 1701 fsBuilder->codeAppend(";\n"); |
| 1434 fsBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", | 1702 fsBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", |
| 1435 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); | 1703 outputColor, lightFunc.c_str(), normalName.c_str(), s
urfScale); |
| 1436 fLight->emitLightColor(builder, "surfaceToLight"); | 1704 fLight->emitLightColor(builder, "surfaceToLight"); |
| 1437 fsBuilder->codeAppend(");\n"); | 1705 fsBuilder->codeAppend(");\n"); |
| 1438 SkString modulate; | 1706 SkString modulate; |
| 1439 GrGLSLMulVarBy4f(&modulate, outputColor, inputColor); | 1707 GrGLSLMulVarBy4f(&modulate, outputColor, inputColor); |
| 1440 fsBuilder->codeAppend(modulate.c_str()); | 1708 fsBuilder->codeAppend(modulate.c_str()); |
| 1441 } | 1709 } |
| 1442 | 1710 |
| 1443 void GrGLLightingEffect::GenKey(const GrProcessor& proc, | 1711 void GrGLLightingEffect::GenKey(const GrProcessor& proc, |
| 1444 const GrGLCaps& caps, GrProcessorKeyBuilder* b)
{ | 1712 const GrGLCaps& caps, GrProcessorKeyBuilder* b)
{ |
| 1445 b->add32(proc.cast<GrLightingEffect>().light()->type()); | 1713 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
| 1714 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); |
| 1446 } | 1715 } |
| 1447 | 1716 |
| 1448 void GrGLLightingEffect::setData(const GrGLProgramDataManager& pdman, | 1717 void GrGLLightingEffect::setData(const GrGLProgramDataManager& pdman, |
| 1449 const GrProcessor& proc) { | 1718 const GrProcessor& proc) { |
| 1450 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1719 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
| 1451 GrTexture* texture = lighting.texture(0); | 1720 GrTexture* texture = lighting.texture(0); |
| 1452 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1721 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
| 1453 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); | 1722 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); |
| 1454 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1723 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |
| 1455 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); | 1724 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1493 pdman.set1f(fKDUni, diffuse.kd()); | 1762 pdman.set1f(fKDUni, diffuse.kd()); |
| 1494 } | 1763 } |
| 1495 | 1764 |
| 1496 /////////////////////////////////////////////////////////////////////////////// | 1765 /////////////////////////////////////////////////////////////////////////////// |
| 1497 | 1766 |
| 1498 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, | 1767 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, |
| 1499 const SkLight* light, | 1768 const SkLight* light, |
| 1500 SkScalar surfaceScale, | 1769 SkScalar surfaceScale, |
| 1501 const SkMatrix& matrix, | 1770 const SkMatrix& matrix, |
| 1502 SkScalar ks, | 1771 SkScalar ks, |
| 1503 SkScalar shininess) | 1772 SkScalar shininess, |
| 1504 : INHERITED(texture, light, surfaceScale, matrix), | 1773 BoundaryMode boundaryMode) |
| 1774 : INHERITED(texture, light, surfaceScale, matrix, boundaryMode), |
| 1505 fKS(ks), | 1775 fKS(ks), |
| 1506 fShininess(shininess) { | 1776 fShininess(shininess) { |
| 1507 this->initClassID<GrSpecularLightingEffect>(); | 1777 this->initClassID<GrSpecularLightingEffect>(); |
| 1508 } | 1778 } |
| 1509 | 1779 |
| 1510 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ | 1780 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ |
| 1511 const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); | 1781 const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); |
| 1512 return INHERITED::onIsEqual(sBase) && | 1782 return INHERITED::onIsEqual(sBase) && |
| 1513 this->ks() == s.ks() && | 1783 this->ks() == s.ks() && |
| 1514 this->shininess() == s.shininess(); | 1784 this->shininess() == s.shininess(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1530 const GrDrawTargetCaps
&, | 1800 const GrDrawTargetCaps
&, |
| 1531 GrTexture* textures[])
{ | 1801 GrTexture* textures[])
{ |
| 1532 SkScalar surfaceScale = random->nextSScalar1(); | 1802 SkScalar surfaceScale = random->nextSScalar1(); |
| 1533 SkScalar ks = random->nextUScalar1(); | 1803 SkScalar ks = random->nextUScalar1(); |
| 1534 SkScalar shininess = random->nextUScalar1(); | 1804 SkScalar shininess = random->nextUScalar1(); |
| 1535 SkAutoTUnref<SkLight> light(create_random_light(random)); | 1805 SkAutoTUnref<SkLight> light(create_random_light(random)); |
| 1536 SkMatrix matrix; | 1806 SkMatrix matrix; |
| 1537 for (int i = 0; i < 9; i++) { | 1807 for (int i = 0; i < 9; i++) { |
| 1538 matrix[i] = random->nextUScalar1(); | 1808 matrix[i] = random->nextUScalar1(); |
| 1539 } | 1809 } |
| 1810 BoundaryMode mode = static_cast<BoundaryMode>(random->nextU() % kBoundaryMod
eCount); |
| 1540 return GrSpecularLightingEffect::Create(textures[GrProcessorUnitTest::kAlpha
TextureIdx], | 1811 return GrSpecularLightingEffect::Create(textures[GrProcessorUnitTest::kAlpha
TextureIdx], |
| 1541 light, surfaceScale, matrix, ks, shi
niness); | 1812 light, surfaceScale, matrix, ks, shi
niness, mode); |
| 1542 } | 1813 } |
| 1543 | 1814 |
| 1544 /////////////////////////////////////////////////////////////////////////////// | 1815 /////////////////////////////////////////////////////////////////////////////// |
| 1545 | 1816 |
| 1546 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc) | 1817 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc) |
| 1547 : INHERITED(proc) { | 1818 : INHERITED(proc) { |
| 1548 } | 1819 } |
| 1549 | 1820 |
| 1550 void GrGLSpecularLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
funcName) { | 1821 void GrGLSpecularLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
funcName) { |
| 1551 const char* ks; | 1822 const char* ks; |
| 1552 const char* shininess; | 1823 const char* shininess; |
| 1553 | 1824 |
| 1554 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1825 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 1555 kFloat_GrSLType, kDefault_GrSLPrecision, "KS",
&ks); | 1826 kFloat_GrSLType, kDefault_GrSLPrecision, "KS",
&ks); |
| 1556 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, | 1827 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, |
| 1557 kFloat_GrSLType, kDefault_GrSLPrecision,
"Shininess", &shininess); | 1828 kFloat_GrSLType, |
| 1829 kDefault_GrSLPrecision, |
| 1830 "Shininess", |
| 1831 &shininess); |
| 1558 | 1832 |
| 1559 static const GrGLShaderVar gLightArgs[] = { | 1833 static const GrGLShaderVar gLightArgs[] = { |
| 1560 GrGLShaderVar("normal", kVec3f_GrSLType), | 1834 GrGLShaderVar("normal", kVec3f_GrSLType), |
| 1561 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1835 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), |
| 1562 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1836 GrGLShaderVar("lightColor", kVec3f_GrSLType) |
| 1563 }; | 1837 }; |
| 1564 SkString lightBody; | 1838 SkString lightBody; |
| 1565 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); | 1839 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); |
| 1566 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); | 1840 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); |
| 1567 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); | 1841 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 | 1986 |
| 1713 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1987 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 1714 } | 1988 } |
| 1715 | 1989 |
| 1716 #endif | 1990 #endif |
| 1717 | 1991 |
| 1718 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1992 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1719 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1993 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1720 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1994 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1721 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1995 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |