Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SDFMaskFilter.cpp
Go to the documentation of this file.
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
9
12#include "include/core/SkRect.h"
14#include "src/core/SkMask.h"
16
17class SkMatrix;
18class SkReadBuffer;
19
20#if !defined(SK_DISABLE_SDF_TEXT)
21
22namespace sktext::gpu {
23
25public:
27
28 // overrides from SkMaskFilterBase
29 // This method is not exported to java.
30 SkMask::Format getFormat() const override;
31 // This method is not exported to java.
32 bool filterMask(SkMaskBuilder* dst, const SkMask& src, const SkMatrix&,
33 SkIPoint* margin) const override;
35 void computeFastBounds(const SkRect&, SkRect*) const override;
36
37private:
39};
40
41///////////////////////////////////////////////////////////////////////////////
42
44
48
50 const SkMatrix& matrix, SkIPoint* margin) const {
51 if (src.fFormat != SkMask::kA8_Format
52 && src.fFormat != SkMask::kBW_Format
53 && src.fFormat != SkMask::kLCD16_Format) {
54 return false;
55 }
56
58 dst->format() = SkMask::kSDF_Format;
59
60 if (margin) {
62 }
63
64 if (src.fImage == nullptr) {
65 return true;
66 }
67 if (dst->fImage == nullptr) {
68 dst->bounds().setEmpty();
69 return false;
70 }
71
72 if (src.fFormat == SkMask::kA8_Format) {
73 return SkGenerateDistanceFieldFromA8Image(dst->image(), src.fImage,
74 src.fBounds.width(), src.fBounds.height(),
75 src.fRowBytes);
76 } else if (src.fFormat == SkMask::kLCD16_Format) {
77 return SkGenerateDistanceFieldFromLCD16Mask(dst->image(), src.fImage,
78 src.fBounds.width(), src.fBounds.height(),
79 src.fRowBytes);
80 } else {
81 return SkGenerateDistanceFieldFromBWImage(dst->image(), src.fImage,
82 src.fBounds.width(), src.fBounds.height(),
83 src.fRowBytes);
84 }
85}
86
88 SkRect* dst) const {
89 dst->setLTRB(src.fLeft - SK_DistanceFieldPad, src.fTop - SK_DistanceFieldPad,
90 src.fRight + SK_DistanceFieldPad, src.fBottom + SK_DistanceFieldPad);
91}
92
93sk_sp<SkFlattenable> SDFMaskFilterImpl::CreateProc(SkReadBuffer& buffer) {
94 return SDFMaskFilter::Make();
95}
96
97///////////////////////////////////////////////////////////////////////////////
98
102
103} // namespace sktext::gpu
104
105#endif // !defined(SK_DISABLE_SDF_TEXT)
bool SkGenerateDistanceFieldFromBWImage(unsigned char *distanceField, const unsigned char *image, int width, int height, size_t rowBytes)
bool SkGenerateDistanceFieldFromA8Image(unsigned char *distanceField, const unsigned char *image, int width, int height, size_t rowBytes)
bool SkGenerateDistanceFieldFromLCD16Mask(unsigned char *distanceField, const unsigned char *image, int w, int h, size_t rowBytes)
#define SK_DistanceFieldPad
#define SK_FLATTENABLE_HOOKS(type)
void computeFastBounds(const SkRect &, SkRect *) const override
SkMask::Format getFormat() const override
bool filterMask(SkMaskBuilder *dst, const SkMask &src, const SkMatrix &, SkIPoint *margin) const override
SkMaskFilterBase::Type type() const override
static sk_sp< SkMaskFilter > Make()
static const uint8_t buffer[]
void set(int32_t x, int32_t y)
static SkMaskBuilder PrepareDestination(int radiusX, int radiusY, const SkMask &src)
Definition SkMask.cpp:61
Format
Definition SkMask.h:26
@ kA8_Format
8bits per pixel mask (e.g. antialiasing)
Definition SkMask.h:28
@ kLCD16_Format
565 alpha for r/g/b
Definition SkMask.h:31
@ kSDF_Format
8bits representing signed distance field
Definition SkMask.h:32
@ kBW_Format
1bit per pixel mask (e.g. monochrome)
Definition SkMask.h:27