OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrRRectEffect.h" | 8 #include "GrRRectEffect.h" |
9 | 9 |
10 #include "GrConvexPolyEffect.h" | 10 #include "GrConvexPolyEffect.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 | 43 |
44 // The flags are used to indicate which corners are circluar (unflagged corn
ers are assumed to | 44 // The flags are used to indicate which corners are circluar (unflagged corn
ers are assumed to |
45 // be square). | 45 // be square). |
46 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, uint32_t circularCor
nerFlags, | 46 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, uint32_t circularCor
nerFlags, |
47 const SkRRect&); | 47 const SkRRect&); |
48 | 48 |
49 virtual ~CircularRRectEffect() {}; | 49 virtual ~CircularRRectEffect() {}; |
50 | 50 |
51 const char* name() const override { return "CircularRRect"; } | 51 const char* name() const override { return "CircularRRect"; } |
52 | 52 |
53 void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
de; | 53 void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const over
ride; |
54 | 54 |
55 GrGLFragmentProcessor* createGLInstance() const override; | 55 GrGLFragmentProcessor* createGLInstance() const override; |
56 | 56 |
57 const SkRRect& getRRect() const { return fRRect; } | 57 const SkRRect& getRRect() const { return fRRect; } |
58 | 58 |
59 uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } | 59 uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } |
60 | 60 |
61 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 61 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
62 | 62 |
63 private: | 63 private: |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 public: | 132 public: |
133 GLCircularRRectEffect(const GrProcessor&); | 133 GLCircularRRectEffect(const GrProcessor&); |
134 | 134 |
135 virtual void emitCode(GrGLFPBuilder* builder, | 135 virtual void emitCode(GrGLFPBuilder* builder, |
136 const GrFragmentProcessor& fp, | 136 const GrFragmentProcessor& fp, |
137 const char* outputColor, | 137 const char* outputColor, |
138 const char* inputColor, | 138 const char* inputColor, |
139 const TransformedCoordsArray&, | 139 const TransformedCoordsArray&, |
140 const TextureSamplerArray&) override; | 140 const TextureSamplerArray&) override; |
141 | 141 |
142 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 142 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
143 | 143 |
144 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 144 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
145 | 145 |
146 private: | 146 private: |
147 GrGLProgramDataManager::UniformHandle fInnerRectUniform; | 147 GrGLProgramDataManager::UniformHandle fInnerRectUniform; |
148 GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; | 148 GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; |
149 SkRRect fPrevRRect; | 149 SkRRect fPrevRRect; |
150 typedef GrGLFragmentProcessor INHERITED; | 150 typedef GrGLFragmentProcessor INHERITED; |
151 }; | 151 }; |
152 | 152 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 } | 280 } |
281 | 281 |
282 if (kInverseFillAA_GrProcessorEdgeType == crre.getEdgeType()) { | 282 if (kInverseFillAA_GrProcessorEdgeType == crre.getEdgeType()) { |
283 fsBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n"); | 283 fsBuilder->codeAppend("\t\talpha = 1.0 - alpha;\n"); |
284 } | 284 } |
285 | 285 |
286 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, | 286 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, |
287 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st
r()); | 287 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st
r()); |
288 } | 288 } |
289 | 289 |
290 void GLCircularRRectEffect::GenKey(const GrProcessor& processor, const GrGLCaps&
, | 290 void GLCircularRRectEffect::GenKey(const GrProcessor& processor, const GrGLSLCap
s&, |
291 GrProcessorKeyBuilder* b) { | 291 GrProcessorKeyBuilder* b) { |
292 const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); | 292 const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); |
293 GR_STATIC_ASSERT(kGrProcessorEdgeTypeCnt <= 8); | 293 GR_STATIC_ASSERT(kGrProcessorEdgeTypeCnt <= 8); |
294 b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType()); | 294 b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType()); |
295 } | 295 } |
296 | 296 |
297 void GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman, | 297 void GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman, |
298 const GrProcessor& processor) { | 298 const GrProcessor& processor) { |
299 const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); | 299 const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); |
300 const SkRRect& rrect = crre.getRRect(); | 300 const SkRRect& rrect = crre.getRRect(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 SkFAIL("Should have been one of the above cases."); | 368 SkFAIL("Should have been one of the above cases."); |
369 } | 369 } |
370 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); | 370 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); |
371 pdman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); | 371 pdman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); |
372 fPrevRRect = rrect; | 372 fPrevRRect = rrect; |
373 } | 373 } |
374 } | 374 } |
375 | 375 |
376 ////////////////////////////////////////////////////////////////////////////////
//////////////////// | 376 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
377 | 377 |
378 void CircularRRectEffect::getGLProcessorKey(const GrGLCaps& caps, | 378 void CircularRRectEffect::getGLProcessorKey(const GrGLSLCaps& caps, |
379 GrProcessorKeyBuilder* b) const { | 379 GrProcessorKeyBuilder* b) const { |
380 GLCircularRRectEffect::GenKey(*this, caps, b); | 380 GLCircularRRectEffect::GenKey(*this, caps, b); |
381 } | 381 } |
382 | 382 |
383 GrGLFragmentProcessor* CircularRRectEffect::createGLInstance() const { | 383 GrGLFragmentProcessor* CircularRRectEffect::createGLInstance() const { |
384 return SkNEW_ARGS(GLCircularRRectEffect, (*this)); | 384 return SkNEW_ARGS(GLCircularRRectEffect, (*this)); |
385 } | 385 } |
386 | 386 |
387 ////////////////////////////////////////////////////////////////////////////// | 387 ////////////////////////////////////////////////////////////////////////////// |
388 | 388 |
389 class EllipticalRRectEffect : public GrFragmentProcessor { | 389 class EllipticalRRectEffect : public GrFragmentProcessor { |
390 public: | 390 public: |
391 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); | 391 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); |
392 | 392 |
393 virtual ~EllipticalRRectEffect() {}; | 393 virtual ~EllipticalRRectEffect() {}; |
394 | 394 |
395 const char* name() const override { return "EllipticalRRect"; } | 395 const char* name() const override { return "EllipticalRRect"; } |
396 | 396 |
397 void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
de; | 397 void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const over
ride; |
398 | 398 |
399 GrGLFragmentProcessor* createGLInstance() const override; | 399 GrGLFragmentProcessor* createGLInstance() const override; |
400 | 400 |
401 const SkRRect& getRRect() const { return fRRect; } | 401 const SkRRect& getRRect() const { return fRRect; } |
402 | 402 |
403 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 403 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
404 | 404 |
405 private: | 405 private: |
406 EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); | 406 EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); |
407 | 407 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 public: | 489 public: |
490 GLEllipticalRRectEffect(const GrProcessor&); | 490 GLEllipticalRRectEffect(const GrProcessor&); |
491 | 491 |
492 virtual void emitCode(GrGLFPBuilder* builder, | 492 virtual void emitCode(GrGLFPBuilder* builder, |
493 const GrFragmentProcessor& effect, | 493 const GrFragmentProcessor& effect, |
494 const char* outputColor, | 494 const char* outputColor, |
495 const char* inputColor, | 495 const char* inputColor, |
496 const TransformedCoordsArray&, | 496 const TransformedCoordsArray&, |
497 const TextureSamplerArray&) override; | 497 const TextureSamplerArray&) override; |
498 | 498 |
499 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 499 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
500 | 500 |
501 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 501 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
502 | 502 |
503 private: | 503 private: |
504 GrGLProgramDataManager::UniformHandle fInnerRectUniform; | 504 GrGLProgramDataManager::UniformHandle fInnerRectUniform; |
505 GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform; | 505 GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform; |
506 SkRRect fPrevRRect; | 506 SkRRect fPrevRRect; |
507 typedef GrGLFragmentProcessor INHERITED; | 507 typedef GrGLFragmentProcessor INHERITED; |
508 }; | 508 }; |
509 | 509 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 if (kFillAA_GrProcessorEdgeType == erre.getEdgeType()) { | 580 if (kFillAA_GrProcessorEdgeType == erre.getEdgeType()) { |
581 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1
.0);\n"); | 581 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 - approx_dist, 0.0, 1
.0);\n"); |
582 } else { | 582 } else { |
583 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1
.0);\n"); | 583 fsBuilder->codeAppend("\t\tfloat alpha = clamp(0.5 + approx_dist, 0.0, 1
.0);\n"); |
584 } | 584 } |
585 | 585 |
586 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, | 586 fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, |
587 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st
r()); | 587 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_st
r()); |
588 } | 588 } |
589 | 589 |
590 void GLEllipticalRRectEffect::GenKey(const GrProcessor& effect, const GrGLCaps&, | 590 void GLEllipticalRRectEffect::GenKey(const GrProcessor& effect, const GrGLSLCaps
&, |
591 GrProcessorKeyBuilder* b) { | 591 GrProcessorKeyBuilder* b) { |
592 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); | 592 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); |
593 GR_STATIC_ASSERT(kLast_GrProcessorEdgeType < (1 << 3)); | 593 GR_STATIC_ASSERT(kLast_GrProcessorEdgeType < (1 << 3)); |
594 b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3); | 594 b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3); |
595 } | 595 } |
596 | 596 |
597 void GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman, | 597 void GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman, |
598 const GrProcessor& effect) { | 598 const GrProcessor& effect) { |
599 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); | 599 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); |
600 const SkRRect& rrect = erre.getRRect(); | 600 const SkRRect& rrect = erre.getRRect(); |
(...skipping 25 matching lines...) Expand all Loading... |
626 default: | 626 default: |
627 SkFAIL("RRect should always be simple or nine-patch."); | 627 SkFAIL("RRect should always be simple or nine-patch."); |
628 } | 628 } |
629 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); | 629 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); |
630 fPrevRRect = rrect; | 630 fPrevRRect = rrect; |
631 } | 631 } |
632 } | 632 } |
633 | 633 |
634 ////////////////////////////////////////////////////////////////////////////////
//////////////////// | 634 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
635 | 635 |
636 void EllipticalRRectEffect::getGLProcessorKey(const GrGLCaps& caps, | 636 void EllipticalRRectEffect::getGLProcessorKey(const GrGLSLCaps& caps, |
637 GrProcessorKeyBuilder* b) const { | 637 GrProcessorKeyBuilder* b) const { |
638 GLEllipticalRRectEffect::GenKey(*this, caps, b); | 638 GLEllipticalRRectEffect::GenKey(*this, caps, b); |
639 } | 639 } |
640 | 640 |
641 GrGLFragmentProcessor* EllipticalRRectEffect::createGLInstance() const { | 641 GrGLFragmentProcessor* EllipticalRRectEffect::createGLInstance() const { |
642 return SkNEW_ARGS(GLEllipticalRRectEffect, (*this)); | 642 return SkNEW_ARGS(GLEllipticalRRectEffect, (*this)); |
643 } | 643 } |
644 | 644 |
645 ////////////////////////////////////////////////////////////////////////////// | 645 ////////////////////////////////////////////////////////////////////////////// |
646 | 646 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 if (rrect.isNinePatch()) { | 733 if (rrect.isNinePatch()) { |
734 return EllipticalRRectEffect::Create(edgeType, rrect); | 734 return EllipticalRRectEffect::Create(edgeType, rrect); |
735 } | 735 } |
736 return NULL; | 736 return NULL; |
737 } | 737 } |
738 } | 738 } |
739 } | 739 } |
740 | 740 |
741 return NULL; | 741 return NULL; |
742 } | 742 } |
OLD | NEW |