Reland "remove SkCanvas::kIsOpaque_SaveLayerFlag"

This reverts the revert 9ff8c8c073.

Original:

    This is a performance-only hint that no one but fuzzers
    is using.  It's even explicitly filtered out in Android.

    The fuzzers have noticed they can trick us into allocating
    uninitialized memory and treating it as opaque, blending
    uninitialized pixels, etc.

    Since no one's using this, we can just kill the bit.

    Bug: skia:7566, chromium:808830

Docs-Preview: https://skia.org/?cl=105282
Change-Id: I4326c663f777aa373ff7ec9f319519da9729350d
Reviewed-on: https://skia-review.googlesource.com/105282
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
This commit is contained in:
Mike Klein 2018-02-07 12:54:27 -05:00 committed by Skia Commit-Bot
parent 4043702b9a
commit e083f7c9f2
8 changed files with 8 additions and 39 deletions

View File

@ -1682,7 +1682,6 @@ documentation purposes, this enum is named rather than anonymous
#Line # sets SaveLayerRec options ## #Line # sets SaveLayerRec options ##
#Code #Code
enum { enum {
kIsOpaque_SaveLayerFlag = 1 << 0,
kPreserveLCDText_SaveLayerFlag = 1 << 1, kPreserveLCDText_SaveLayerFlag = 1 << 1,
kInitWithPrevious_SaveLayerFlag = 1 << 2, kInitWithPrevious_SaveLayerFlag = 1 << 2,
kDontClipToLayer_Legacy_SaveLayerFlag = kDontClipToLayer_PrivateSaveLayerFlag, kDontClipToLayer_Legacy_SaveLayerFlag = kDontClipToLayer_PrivateSaveLayerFlag,
@ -1692,11 +1691,6 @@ documentation purposes, this enum is named rather than anonymous
SaveLayerFlags provides options that may be used in any combination in SaveLayerRec, SaveLayerFlags provides options that may be used in any combination in SaveLayerRec,
defining how Layer allocated by saveLayer operates. defining how Layer allocated by saveLayer operates.
#Const kIsOpaque_SaveLayerFlag 1
Creates Layer without transparency. Flag is ignored if Layer Paint contains
Image_Filter or Color_Filter.
##
#Const kPreserveLCDText_SaveLayerFlag 2 #Const kPreserveLCDText_SaveLayerFlag 2
Creates Layer for LCD text. Flag is ignored if Layer Paint contains Creates Layer for LCD text. Flag is ignored if Layer Paint contains
Image_Filter or Color_Filter. Image_Filter or Color_Filter.
@ -1824,8 +1818,8 @@ Sets fBounds, fPaint, and fBackdrop to nullptr. Clears fSaveLayerFlags.
#Example #Example
SkCanvas::SaveLayerRec rec1; SkCanvas::SaveLayerRec rec1;
rec1.fSaveLayerFlags = SkCanvas::kIsOpaque_SaveLayerFlag; rec1.fSaveLayerFlags = SkCanvas::kPreserveLCDText_SaveLayerFlag;
SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kIsOpaque_SaveLayerFlag); SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kPreserveLCDText_SaveLayerFlag);
SkDebugf("rec1 %c= rec2\n", rec1.fBounds == rec2.fBounds SkDebugf("rec1 %c= rec2\n", rec1.fBounds == rec2.fBounds
&& rec1.fPaint == rec2.fPaint && rec1.fPaint == rec2.fPaint
&& rec1.fBackdrop == rec2.fBackdrop && rec1.fBackdrop == rec2.fBackdrop

View File

@ -1150,9 +1150,6 @@ static void fuzz_canvas(Fuzz* fuzz, SkCanvas* canvas, int depth = 9) {
} }
// _DumpCanvas can't handle this. // _DumpCanvas can't handle this.
// if (make_fuzz_t<bool>(fuzz)) { // if (make_fuzz_t<bool>(fuzz)) {
// saveLayerRec.fSaveLayerFlags |= SkCanvas::kIsOpaque_SaveLayerFlag;
// }
// if (make_fuzz_t<bool>(fuzz)) {
// saveLayerRec.fSaveLayerFlags |= SkCanvas::kPreserveLCDText_SaveLayerFlag; // saveLayerRec.fSaveLayerFlags |= SkCanvas::kPreserveLCDText_SaveLayerFlag;
// } // }

View File

@ -605,11 +605,6 @@ public:
defining how layer allocated by saveLayer() operates. defining how layer allocated by saveLayer() operates.
*/ */
enum { enum {
/** Creates layer without transparency. Flag is ignored if layer SkPaint contains
SkImageFilter or SkColorFilter.
*/
kIsOpaque_SaveLayerFlag = 1 << 0,
/** Creates layer for LCD text. Flag is ignored if layer SkPaint contains /** Creates layer for LCD text. Flag is ignored if layer SkPaint contains
SkImageFilter or SkColorFilter. SkImageFilter or SkColorFilter.
*/ */

View File

@ -1693,7 +1693,6 @@ depth of saved stack
<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0"> <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
enum { enum {
<a href="#SkCanvas_kIsOpaque_SaveLayerFlag">kIsOpaque SaveLayerFlag</a> = 1 << 0,
<a href="#SkCanvas_kPreserveLCDText_SaveLayerFlag">kPreserveLCDText SaveLayerFlag</a> = 1 << 1, <a href="#SkCanvas_kPreserveLCDText_SaveLayerFlag">kPreserveLCDText SaveLayerFlag</a> = 1 << 1,
<a href="#SkCanvas_kInitWithPrevious_SaveLayerFlag">kInitWithPrevious SaveLayerFlag</a> = 1 << 2, <a href="#SkCanvas_kInitWithPrevious_SaveLayerFlag">kInitWithPrevious SaveLayerFlag</a> = 1 << 2,
<a href="#SkCanvas_kDontClipToLayer_Legacy_SaveLayerFlag">kDontClipToLayer Legacy SaveLayerFlag</a> = kDontClipToLayer_PrivateSaveLayerFlag, <a href="#SkCanvas_kDontClipToLayer_Legacy_SaveLayerFlag">kDontClipToLayer Legacy SaveLayerFlag</a> = kDontClipToLayer_PrivateSaveLayerFlag,
@ -1705,10 +1704,6 @@ defining how <a href="#Layer">Layer</a> allocated by <a href="#SkCanvas_saveLaye
### Constants ### Constants
<table> <table>
<tr>
<td><a name="SkCanvas_kIsOpaque_SaveLayerFlag"> <code><strong>SkCanvas::kIsOpaque_SaveLayerFlag </strong></code> </a></td><td>1</td><td>Creates <a href="#Layer">Layer</a> without transparency. Flag is ignored if <a href="#Layer">Layer</a> <a href="SkPaint_Reference#Paint">Paint</a> contains
<a href="undocumented#Image_Filter">Image Filter</a> or <a href="undocumented#Color_Filter">Color Filter</a>.</td>
</tr>
<tr> <tr>
<td><a name="SkCanvas_kPreserveLCDText_SaveLayerFlag"> <code><strong>SkCanvas::kPreserveLCDText_SaveLayerFlag </strong></code> </a></td><td>2</td><td>Creates <a href="#Layer">Layer</a> for LCD text. Flag is ignored if <a href="#Layer">Layer</a> <a href="SkPaint_Reference#Paint">Paint</a> contains <td><a name="SkCanvas_kPreserveLCDText_SaveLayerFlag"> <code><strong>SkCanvas::kPreserveLCDText_SaveLayerFlag </strong></code> </a></td><td>2</td><td>Creates <a href="#Layer">Layer</a> for LCD text. Flag is ignored if <a href="#Layer">Layer</a> <a href="SkPaint_Reference#Paint">Paint</a> contains
<a href="undocumented#Image_Filter">Image Filter</a> or <a href="undocumented#Color_Filter">Color Filter</a>.</td> <a href="undocumented#Image_Filter">Image Filter</a> or <a href="undocumented#Color_Filter">Color Filter</a>.</td>

View File

@ -372,7 +372,7 @@
"stdout": "---\\n-x-\\n---\\n" "stdout": "---\\n-x-\\n---\\n"
}, },
"SkCanvas_SaveLayerRec_SaveLayerRec": { "SkCanvas_SaveLayerRec_SaveLayerRec": {
"code": "void draw(SkCanvas* canvas) {\n SkCanvas::SaveLayerRec rec1;\n rec1.fSaveLayerFlags = SkCanvas::kIsOpaque_SaveLayerFlag;\n SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kIsOpaque_SaveLayerFlag);\n SkDebugf(\"rec1 %c= rec2\\n\", rec1.fBounds == rec2.fBounds\n && rec1.fPaint == rec2.fPaint\n && rec1.fBackdrop == rec2.fBackdrop\n && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');\n}", "code": "void draw(SkCanvas* canvas) {\n SkCanvas::SaveLayerRec rec1;\n rec1.fSaveLayerFlags = SkCanvas::kPreserveLCDText_SaveLayerFlag;\n SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kPreserveLCDText_SaveLayerFlag);\n SkDebugf(\"rec1 %c= rec2\\n\", rec1.fBounds == rec2.fBounds\n && rec1.fPaint == rec2.fPaint\n && rec1.fBackdrop == rec2.fBackdrop\n && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');\n}",
"hash": "ac7c834dce2eac6ef49c15e820e94003", "hash": "ac7c834dce2eac6ef49c15e820e94003",
"file": "SkCanvas_Reference", "file": "SkCanvas_Reference",
"name": "SkCanvas::SaveLayerRec::SaveLayerRec", "name": "SkCanvas::SaveLayerRec::SaveLayerRec",
@ -7231,4 +7231,4 @@ onclick="handleMouseClick()"
></canvas > ></canvas >
</body> </body>
</html> </html>

View File

@ -1036,20 +1036,18 @@ void SkCanvas::DrawDeviceWithFilter(SkBaseDevice* src, const SkImageFilter* filt
} }
} }
static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, bool isOpaque, static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, const SkPaint* paint) {
const SkPaint* paint) {
// need to force L32 for now if we have an image filter. Once filters support other colortypes // need to force L32 for now if we have an image filter. Once filters support other colortypes
// e.g. sRGB or F16, we can remove this check // e.g. sRGB or F16, we can remove this check
// SRGBTODO: Can we remove this check now? // SRGBTODO: Can we remove this check now?
const bool hasImageFilter = paint && paint->getImageFilter(); const bool hasImageFilter = paint && paint->getImageFilter();
SkAlphaType alphaType = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
if ((prev.bytesPerPixel() < 4) || hasImageFilter) { if ((prev.bytesPerPixel() < 4) || hasImageFilter) {
// force to L32 // force to L32
return SkImageInfo::MakeN32(w, h, alphaType); return SkImageInfo::MakeN32Premul(w, h);
} else { } else {
// keep the same characteristics as the prev // keep the same characteristics as the prev
return SkImageInfo::Make(w, h, prev.colorType(), alphaType, prev.refColorSpace()); return SkImageInfo::Make(w, h, prev.colorType(), kPremul_SkAlphaType, prev.refColorSpace());
} }
} }
@ -1107,12 +1105,10 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra
return; return;
} }
bool isOpaque = SkToBool(saveLayerFlags & kIsOpaque_SaveLayerFlag);
SkPixelGeometry geo = fProps.pixelGeometry(); SkPixelGeometry geo = fProps.pixelGeometry();
if (paint) { if (paint) {
// TODO: perhaps add a query to filters so we might preserve opaqueness... // TODO: perhaps add a query to filters so we might preserve opaqueness...
if (paint->getImageFilter() || paint->getColorFilter()) { if (paint->getImageFilter() || paint->getColorFilter()) {
isOpaque = false;
geo = kUnknown_SkPixelGeometry; geo = kUnknown_SkPixelGeometry;
} }
} }
@ -1123,8 +1119,7 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra
return; return;
} }
SkImageInfo info = make_layer_info(priorDevice->imageInfo(), ir.width(), ir.height(), isOpaque, SkImageInfo info = make_layer_info(priorDevice->imageInfo(), ir.width(), ir.height(), paint);
paint);
sk_sp<SkBaseDevice> newDevice; sk_sp<SkBaseDevice> newDevice;
{ {

View File

@ -22,7 +22,6 @@
// matches old SkCanvas::SaveFlags // matches old SkCanvas::SaveFlags
enum LegacySaveFlags { enum LegacySaveFlags {
kHasAlphaLayer_LegacySaveFlags = 0x04,
kClipToLayer_LegacySaveFlags = 0x10, kClipToLayer_LegacySaveFlags = 0x10,
}; };
@ -32,9 +31,6 @@ SkCanvas::SaveLayerFlags SkCanvas::LegacySaveFlagsToSaveLayerFlags(uint32_t flag
if (0 == (flags & kClipToLayer_LegacySaveFlags)) { if (0 == (flags & kClipToLayer_LegacySaveFlags)) {
layerFlags |= SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag; layerFlags |= SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag;
} }
if (0 == (flags & kHasAlphaLayer_LegacySaveFlags)) {
layerFlags |= kIsOpaque_SaveLayerFlag;
}
return layerFlags; return layerFlags;
} }

View File

@ -349,9 +349,6 @@ SkString* SkObjectParser::RegionToString(const SkRegion& region) {
SkString* SkObjectParser::SaveLayerFlagsToString(SkCanvas::SaveLayerFlags saveLayerFlags) { SkString* SkObjectParser::SaveLayerFlagsToString(SkCanvas::SaveLayerFlags saveLayerFlags) {
SkString* mFlags = new SkString("SkCanvas::SaveFlags: "); SkString* mFlags = new SkString("SkCanvas::SaveFlags: ");
if (saveLayerFlags & SkCanvas::kIsOpaque_SaveLayerFlag) {
mFlags->append("kIsOpaque_SaveLayerFlag ");
}
if (saveLayerFlags & SkCanvas::kPreserveLCDText_SaveLayerFlag) { if (saveLayerFlags & SkCanvas::kPreserveLCDText_SaveLayerFlag) {
mFlags->append("kPreserveLCDText_SaveLayerFlag "); mFlags->append("kPreserveLCDText_SaveLayerFlag ");
} }