clip_error.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright 2016 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "gm/gm.h"
  8. #include "include/core/SkBlurTypes.h"
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkColor.h"
  11. #include "include/core/SkFont.h"
  12. #include "include/core/SkMaskFilter.h"
  13. #include "include/core/SkPaint.h"
  14. #include "include/core/SkRect.h"
  15. #include "include/core/SkRefCnt.h"
  16. #include "include/core/SkScalar.h"
  17. #include "include/core/SkSize.h"
  18. #include "include/core/SkString.h"
  19. #include "include/core/SkTextBlob.h"
  20. #include "include/core/SkTypeface.h"
  21. #include "src/core/SkBlurMask.h"
  22. #include "tools/ToolUtils.h"
  23. #include <string.h>
  24. #define WIDTH 800
  25. #define HEIGHT 800
  26. static void draw_text(SkCanvas* canvas, sk_sp<SkTextBlob> blob,
  27. const SkPaint& paint, const SkPaint& blurPaint,
  28. const SkPaint& clearPaint) {
  29. canvas->save();
  30. canvas->clipRect(SkRect::MakeLTRB(0, 0, 1081, 665));
  31. canvas->drawRect(SkRect::MakeLTRB(0, 0, 1081, 665), clearPaint);
  32. // draw as blurred to push glyph to be too large for atlas
  33. canvas->drawTextBlob(blob, 0, 256, blurPaint);
  34. canvas->drawTextBlob(blob, 0, 477, paint);
  35. canvas->restore();
  36. }
  37. // This test ensures that glyphs that are too large for the atlas
  38. // are both translated and clipped correctly.
  39. class ClipErrorGM : public skiagm::GM {
  40. public:
  41. ClipErrorGM() {}
  42. protected:
  43. SkString onShortName() override { return SkString("cliperror"); }
  44. SkISize onISize() override { return SkISize::Make(WIDTH, HEIGHT); }
  45. void onDraw(SkCanvas* canvas) override {
  46. SkPaint paint;
  47. paint.setAntiAlias(true);
  48. SkFont font(ToolUtils::create_portable_typeface(), 256);
  49. // setup up maskfilter
  50. const SkScalar kSigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(50));
  51. SkPaint blurPaint(paint);
  52. blurPaint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, kSigma));
  53. const char text[] = "hambur";
  54. auto blob = SkTextBlob::MakeFromText(text, strlen(text), font);
  55. SkPaint clearPaint(paint);
  56. clearPaint.setColor(SK_ColorWHITE);
  57. canvas->save();
  58. canvas->translate(0, 0);
  59. canvas->clipRect(SkRect::MakeLTRB(0, 0, WIDTH, 256));
  60. draw_text(canvas, blob, paint, blurPaint, clearPaint);
  61. canvas->restore();
  62. canvas->save();
  63. canvas->translate(0, 256);
  64. canvas->clipRect(SkRect::MakeLTRB(0, 256, WIDTH, 510));
  65. draw_text(canvas, blob, paint, blurPaint, clearPaint);
  66. canvas->restore();
  67. }
  68. private:
  69. typedef skiagm::GM INHERITED;
  70. };
  71. DEF_GM(return new ClipErrorGM;)