GrSDFMaskFilter.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright 2018 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 "include/core/SkString.h"
  8. #include "src/core/SkDistanceFieldGen.h"
  9. #include "src/core/SkMaskFilterBase.h"
  10. #include "src/core/SkReadBuffer.h"
  11. #include "src/core/SkSafeMath.h"
  12. #include "src/core/SkWriteBuffer.h"
  13. #include "src/gpu/text/GrSDFMaskFilter.h"
  14. class SK_API GrSDFMaskFilterImpl : public SkMaskFilterBase {
  15. public:
  16. GrSDFMaskFilterImpl();
  17. // overrides from SkMaskFilterBase
  18. // This method is not exported to java.
  19. SkMask::Format getFormat() const override;
  20. // This method is not exported to java.
  21. bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&,
  22. SkIPoint* margin) const override;
  23. void computeFastBounds(const SkRect&, SkRect*) const override;
  24. protected:
  25. private:
  26. SK_FLATTENABLE_HOOKS(GrSDFMaskFilterImpl)
  27. typedef SkMaskFilter INHERITED;
  28. friend void gr_register_sdf_maskfilter_createproc();
  29. };
  30. ///////////////////////////////////////////////////////////////////////////////
  31. GrSDFMaskFilterImpl::GrSDFMaskFilterImpl() {}
  32. SkMask::Format GrSDFMaskFilterImpl::getFormat() const {
  33. return SkMask::kSDF_Format;
  34. }
  35. bool GrSDFMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src,
  36. const SkMatrix& matrix, SkIPoint* margin) const {
  37. if (src.fFormat != SkMask::kA8_Format
  38. && src.fFormat != SkMask::kBW_Format
  39. && src.fFormat != SkMask::kLCD16_Format) {
  40. return false;
  41. }
  42. *dst = SkMask::PrepareDestination(SK_DistanceFieldPad, SK_DistanceFieldPad, src);
  43. dst->fFormat = SkMask::kSDF_Format;
  44. if (margin) {
  45. margin->set(SK_DistanceFieldPad, SK_DistanceFieldPad);
  46. }
  47. if (src.fImage == nullptr) {
  48. return true;
  49. }
  50. if (dst->fImage == nullptr) {
  51. dst->fBounds.setEmpty();
  52. return false;
  53. }
  54. if (src.fFormat == SkMask::kA8_Format) {
  55. return SkGenerateDistanceFieldFromA8Image(dst->fImage, src.fImage,
  56. src.fBounds.width(), src.fBounds.height(),
  57. src.fRowBytes);
  58. } else if (src.fFormat == SkMask::kLCD16_Format) {
  59. return SkGenerateDistanceFieldFromLCD16Mask(dst->fImage, src.fImage,
  60. src.fBounds.width(), src.fBounds.height(),
  61. src.fRowBytes);
  62. } else {
  63. return SkGenerateDistanceFieldFromBWImage(dst->fImage, src.fImage,
  64. src.fBounds.width(), src.fBounds.height(),
  65. src.fRowBytes);
  66. }
  67. }
  68. void GrSDFMaskFilterImpl::computeFastBounds(const SkRect& src,
  69. SkRect* dst) const {
  70. dst->set(src.fLeft - SK_DistanceFieldPad, src.fTop - SK_DistanceFieldPad,
  71. src.fRight + SK_DistanceFieldPad, src.fBottom + SK_DistanceFieldPad);
  72. }
  73. sk_sp<SkFlattenable> GrSDFMaskFilterImpl::CreateProc(SkReadBuffer& buffer) {
  74. return GrSDFMaskFilter::Make();
  75. }
  76. void gr_register_sdf_maskfilter_createproc() { SK_REGISTER_FLATTENABLE(GrSDFMaskFilterImpl); }
  77. ///////////////////////////////////////////////////////////////////////////////
  78. sk_sp<SkMaskFilter> GrSDFMaskFilter::Make() {
  79. return sk_sp<SkMaskFilter>(new GrSDFMaskFilterImpl());
  80. }