change SkStreams to work with sk_sp<SkData> instead of SkData*
authorreed <reed@google.com>
Mon, 12 Sep 2016 19:01:44 +0000 (12:01 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 12 Sep 2016 19:01:44 +0000 (12:01 -0700)
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2333713002

Review-Url: https://codereview.chromium.org/2333713002

54 files changed:
bench/AndroidCodecBench.cpp
bench/BitmapRegionDecoderBench.cpp
bench/CodecBench.cpp
bench/ColorCodecBench.cpp
bench/nanobench.cpp
dm/DM.cpp
dm/DMSrcSink.cpp
fuzz/Fuzz.h
fuzz/fuzz.cpp
gyp/skia_for_android_framework_defines.gypi
include/android/SkBitmapRegionDecoder.h
include/codec/SkAndroidCodec.h
include/codec/SkCodec.h
include/core/SkStream.h
public.bzl
samplecode/DecodeFile.h
src/android/SkBitmapRegionDecoder.cpp
src/codec/SkAndroidCodec.cpp
src/codec/SkCodec.cpp
src/codec/SkCodecImageGenerator.cpp
src/codec/SkCodecImageGenerator.h
src/core/SkStream.cpp
src/images/SkImageEncoder.cpp
src/pathops/SkPathOpsOp.cpp
src/ports/SkFontHost_win.cpp
src/ports/SkFontMgr_android.cpp
src/ports/SkFontMgr_custom.cpp
src/ports/SkFontMgr_fontconfig.cpp
src/ports/SkFontMgr_win_dw.cpp
src/ports/SkImageGeneratorWIC.cpp
src/xps/SkXPSDevice.cpp
tests/AnnotationTest.cpp
tests/CachedDecodingPixelRefTest.cpp
tests/CodecPriv.h
tests/CodecTest.cpp
tests/PDFDocumentTest.cpp
tests/PDFGlyphsToUnicodeTest.cpp
tests/PDFJpegEmbedTest.cpp
tests/PDFMetadataAttributeTest.cpp
tests/PDFPrimitivesTest.cpp
tests/PathTest.cpp
tests/PictureTest.cpp
tests/StreamTest.cpp
tests/TypefaceTest.cpp
tools/debugger/SkDrawCommand.cpp
tools/fiddle/fiddle_main.cpp
tools/get_images_from_skps.cpp
tools/skdiff_main.cpp
tools/skdiff_utils.cpp
tools/skdiff_utils.h
tools/skiaserve/Request.cpp
tools/skiaserve/urlhandlers/BreakHandler.cpp
tools/viewer/ImageSlide.cpp
tools/visualize_color_gamut.cpp

index 6443ce6..97e1176 100644 (file)
@@ -29,7 +29,7 @@ bool AndroidCodecBench::isSuitableFor(Backend backend) {
 }
 
 void AndroidCodecBench::onDelayedSetup() {
-    SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(fData.get()));
+    SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(fData));
     SkISize scaledSize = codec->getSampledDimensions(fSampleSize);
 
     fInfo = codec->getInfo().makeWH(scaledSize.width(), scaledSize.height())
@@ -46,7 +46,7 @@ void AndroidCodecBench::onDraw(int n, SkCanvas* canvas) {
     SkAndroidCodec::AndroidOptions options;
     options.fSampleSize = fSampleSize;
     for (int i = 0; i < n; i++) {
-        codec.reset(SkAndroidCodec::NewFromData(fData.get()));
+        codec.reset(SkAndroidCodec::NewFromData(fData));
 #ifdef SK_DEBUG
         const SkCodec::Result result =
 #endif
index 709ad0e..dd60b18 100644 (file)
@@ -36,8 +36,7 @@ bool BitmapRegionDecoderBench::isSuitableFor(Backend backend) {
 }
 
 void BitmapRegionDecoderBench::onDelayedSetup() {
-    fBRD.reset(SkBitmapRegionDecoder::Create(fData.get(),
-                                             SkBitmapRegionDecoder::kAndroidCodec_Strategy));
+    fBRD.reset(SkBitmapRegionDecoder::Create(fData, SkBitmapRegionDecoder::kAndroidCodec_Strategy));
 }
 
 void BitmapRegionDecoderBench::onDraw(int n, SkCanvas* canvas) {
index e3bf1cc..9bd404d 100644 (file)
@@ -26,7 +26,7 @@ CodecBench::CodecBench(SkString baseName, SkData* encoded, SkColorType colorType
             alpha_type_to_str(alphaType));
 #ifdef SK_DEBUG
     // Ensure that we can create an SkCodec from this data.
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData));
     SkASSERT(codec);
 #endif
 }
@@ -40,7 +40,7 @@ bool CodecBench::isSuitableFor(Backend backend) {
 }
 
 void CodecBench::onDelayedSetup() {
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData));
 
     fInfo = codec->getInfo().makeColorType(fColorType)
                             .makeAlphaType(fAlphaType)
@@ -59,7 +59,7 @@ void CodecBench::onDraw(int n, SkCanvas* canvas) {
     }
     for (int i = 0; i < n; i++) {
         colorCount = 256;
-        codec.reset(SkCodec::NewFromData(fData.get()));
+        codec.reset(SkCodec::NewFromData(fData));
 #ifdef SK_DEBUG
         const SkCodec::Result result =
 #endif
index 9f57ddc..9aa5d73 100644 (file)
@@ -40,7 +40,7 @@ bool ColorCodecBench::isSuitableFor(Backend backend) {
 }
 
 void ColorCodecBench::decodeAndXform() {
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded));
     SkASSERT(codec);
 
 #ifdef SK_DEBUG
@@ -52,7 +52,7 @@ void ColorCodecBench::decodeAndXform() {
 
 #if defined(SK_TEST_QCMS)
 void ColorCodecBench::decodeAndXformQCMS() {
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded));
 #ifdef SK_DEBUG
     const SkCodec::Result result =
 #endif
@@ -135,7 +135,7 @@ void ColorCodecBench::xformOnlyQCMS() {
 #endif
 
 void ColorCodecBench::onDelayedSetup() {
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded));
     fSrcData = codec->getICCData();
     sk_sp<SkData> dstData = SkData::MakeFromFileName(
             GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str());
index a2f931e..ae415fa 100644 (file)
@@ -529,7 +529,7 @@ static Target* is_enabled(Benchmark* bench, const Config& config) {
     return target;
 }
 
-static bool valid_brd_bench(SkData* encoded, SkColorType colorType, uint32_t sampleSize,
+static bool valid_brd_bench(sk_sp<SkData> encoded, SkColorType colorType, uint32_t sampleSize,
         uint32_t minOutputSize, int* width, int* height) {
     SkAutoTDelete<SkBitmapRegionDecoder> brd(
             SkBitmapRegionDecoder::Create(encoded, SkBitmapRegionDecoder::kAndroidCodec_Strategy));
@@ -756,7 +756,7 @@ public:
                 continue;
             }
             sk_sp<SkData> encoded(SkData::MakeFromFileName(path.c_str()));
-            SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+            SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
             if (!codec) {
                 // Nothing to time.
                 SkDebugf("Cannot find codec for %s\n", path.c_str());
@@ -840,7 +840,7 @@ public:
                 continue;
             }
             sk_sp<SkData> encoded(SkData::MakeFromFileName(path.c_str()));
-            SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded.get()));
+            SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded));
             if (!codec) {
                 // Nothing to time.
                 SkDebugf("Cannot find codec for %s\n", path.c_str());
@@ -896,7 +896,7 @@ public:
 
                         int width = 0;
                         int height = 0;
-                        if (!valid_brd_bench(encoded.get(), colorType, sampleSize, minOutputSize,
+                        if (!valid_brd_bench(encoded, colorType, sampleSize, minOutputSize,
                                 &width, &height)) {
                             break;
                         }
index a815827..a8fb43b 100644 (file)
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -496,7 +496,7 @@ static void push_codec_srcs(Path path) {
         info("Couldn't read %s.", path.c_str());
         return;
     }
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (nullptr == codec.get()) {
         info("Couldn't create codec for %s.", path.c_str());
         return;
index fcc4a33..c3c8a7b 100644 (file)
@@ -104,8 +104,7 @@ static SkBitmapRegionDecoder* create_brd(Path path) {
     if (!encoded) {
         return NULL;
     }
-    return SkBitmapRegionDecoder::Create(encoded.get(),
-                                         SkBitmapRegionDecoder::kAndroidCodec_Strategy);
+    return SkBitmapRegionDecoder::Create(encoded, SkBitmapRegionDecoder::kAndroidCodec_Strategy);
 }
 
 Error BRDSrc::draw(SkCanvas* canvas) const {
@@ -384,7 +383,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
         return SkStringPrintf("Couldn't read %s.", fPath.c_str());
     }
 
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (nullptr == codec.get()) {
         return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
     }
@@ -632,7 +631,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
 
 SkISize CodecSrc::size() const {
     sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (nullptr == codec) {
         return SkISize::Make(0, 0);
     }
@@ -668,7 +667,7 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const {
     if (!encoded) {
         return SkStringPrintf("Couldn't read %s.", fPath.c_str());
     }
-    SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded));
     if (nullptr == codec.get()) {
         return SkStringPrintf("Couldn't create android codec for %s.", fPath.c_str());
     }
@@ -721,7 +720,7 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const {
 
 SkISize AndroidCodecSrc::size() const {
     sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
-    SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded));
     if (nullptr == codec) {
         return SkISize::Make(0, 0);
     }
@@ -828,7 +827,7 @@ Error ImageGenSrc::draw(SkCanvas* canvas) const {
 
 SkISize ImageGenSrc::size() const {
     sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (nullptr == codec) {
         return SkISize::Make(0, 0);
     }
@@ -873,7 +872,7 @@ Error ColorCodecSrc::draw(SkCanvas* canvas) const {
         return SkStringPrintf("Couldn't read %s.", fPath.c_str());
     }
 
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (nullptr == codec.get()) {
         return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
     }
@@ -979,7 +978,7 @@ Error ColorCodecSrc::draw(SkCanvas* canvas) const {
 
 SkISize ColorCodecSrc::size() const {
     sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (nullptr == codec) {
         return SkISize::Make(0, 0);
     }
index 16a7f98..0ab3c1b 100644 (file)
@@ -14,7 +14,7 @@
 
 class Fuzz : SkNoncopyable {
 public:
-    explicit Fuzz(SkData*);
+    explicit Fuzz(sk_sp<SkData>);
 
     // Returns the total number of "random" bytes available.
     size_t size();
index d2dc787..ec47aa2 100644 (file)
@@ -34,11 +34,11 @@ static int printUsage(const char* name) {
 }
 static uint8_t calculate_option(SkData*);
 
-static int fuzz_api(SkData*);
-static int fuzz_img(SkData*, uint8_t, uint8_t);
-static int fuzz_skp(SkData*);
-static int fuzz_icc(SkData*);
-static int fuzz_color_deserialize(SkData*);
+static int fuzz_api(sk_sp<SkData>);
+static int fuzz_img(sk_sp<SkData>, uint8_t, uint8_t);
+static int fuzz_skp(sk_sp<SkData>);
+static int fuzz_icc(sk_sp<SkData>);
+static int fuzz_color_deserialize(sk_sp<SkData>);
 
 int main(int argc, char** argv) {
     SkCommandLineFlags::Parse(argc, argv);
@@ -54,21 +54,21 @@ int main(int argc, char** argv) {
 
     if (!FLAGS_type.isEmpty()) {
         switch (FLAGS_type[0][0]) {
-            case 'a': return fuzz_api(bytes.get());
+            case 'a': return fuzz_api(bytes);
 
-            case 'c': return fuzz_color_deserialize(bytes.get());
+            case 'c': return fuzz_color_deserialize(bytes);
 
             case 'i':
                 if (FLAGS_type[0][1] == 'c') { //icc
-                    return fuzz_icc(bytes.get());
+                    return fuzz_icc(bytes);
                 }
                 // We only allow one degree of freedom to avoid a search space explosion for afl-fuzz.
                 if (FLAGS_type[0][6] == 's') { // image_scale
-                    return fuzz_img(bytes.get(), option, 0);
+                    return fuzz_img(bytes, option, 0);
                 }
                 // image_mode
-                return fuzz_img(bytes.get(), 0, option);
-            case 's': return fuzz_skp(bytes.get());
+                return fuzz_img(bytes, 0, option);
+            case 's': return fuzz_skp(bytes);
         }
     }
     return printUsage(argv[0]);
@@ -88,7 +88,7 @@ static uint8_t calculate_option(SkData* bytes) {
     return total;
 }
 
-int fuzz_api(SkData* bytes) {
+int fuzz_api(sk_sp<SkData> bytes) {
     const char* name = FLAGS_name.isEmpty() ? "" : FLAGS_name[0];
 
     for (auto r = SkTRegistry<Fuzzable>::Head(); r; r = r->next()) {
@@ -117,7 +117,7 @@ static void dump_png(SkBitmap bitmap) {
     }
 }
 
-int fuzz_img(SkData* bytes, uint8_t scale, uint8_t mode) {
+int fuzz_img(sk_sp<SkData> bytes, uint8_t scale, uint8_t mode) {
     // We can scale 1x, 2x, 4x, 8x, 16x
     scale = scale % 5;
     float fscale = (float)pow(2.0f, scale);
@@ -360,7 +360,7 @@ int fuzz_img(SkData* bytes, uint8_t scale, uint8_t mode) {
     return 0;
 }
 
-int fuzz_skp(SkData* bytes) {
+int fuzz_skp(sk_sp<SkData> bytes) {
     SkMemoryStream stream(bytes);
     SkDebugf("Decoding\n");
     sk_sp<SkPicture> pic(SkPicture::MakeFromStream(&stream));
@@ -381,7 +381,7 @@ int fuzz_skp(SkData* bytes) {
     return 0;
 }
 
-int fuzz_icc(SkData* bytes) {
+int fuzz_icc(sk_sp<SkData> bytes) {
     sk_sp<SkColorSpace> space(SkColorSpace::NewICC(bytes->data(), bytes->size()));
     if (!space) {
         SkDebugf("[terminated] Couldn't decode ICC.\n");
@@ -391,7 +391,7 @@ int fuzz_icc(SkData* bytes) {
     return 0;
 }
 
-int fuzz_color_deserialize(SkData* bytes) {
+int fuzz_color_deserialize(sk_sp<SkData> bytes) {
     sk_sp<SkColorSpace> space(SkColorSpace::Deserialize(bytes->data(), bytes->size()));
     if (!space) {
         SkDebugf("[terminated] Couldn't deserialize Colorspace.\n");
@@ -401,7 +401,7 @@ int fuzz_color_deserialize(SkData* bytes) {
     return 0;
 }
 
-Fuzz::Fuzz(SkData* bytes) : fBytes(SkSafeRef(bytes)), fNextByte(0) {}
+Fuzz::Fuzz(sk_sp<SkData> bytes) : fBytes(bytes), fNextByte(0) {}
 
 void Fuzz::signalBug   () { SkDebugf("Signal bug\n"); raise(SIGSEGV); }
 void Fuzz::signalBoring() { SkDebugf("Signal boring\n"); exit(0); }
index 26f6998..2937f84 100644 (file)
@@ -30,6 +30,7 @@
       'SK_SUPPORT_LEGACY_XFERMODE_PTR',
       'SK_IGNORE_GPU_DITHER',
       'SK_SUPPORT_LEGACY_PICTUREINSTALLPIXELREF',
+      'SK_SUPPORT_LEGACY_STREAM_DATA',
     ],
   },
 }
index 913f947..b8922d4 100644 (file)
@@ -29,8 +29,7 @@ public:
      * @param strategy Strategy used for scaling and subsetting
      * @return         Tries to create an SkBitmapRegionDecoder, returns NULL on failure
      */
-    static SkBitmapRegionDecoder* Create(
-            SkData* data, Strategy strategy);
+    static SkBitmapRegionDecoder* Create(sk_sp<SkData>, Strategy strategy);
 
     /*
      * @param stream   Takes ownership of the stream
index 7fee5be..c7587b6 100644 (file)
@@ -37,10 +37,11 @@ public:
      *
      *  The SkPngChunkReader handles unknown chunks in PNGs.
      *  See SkCodec.h for more details.
-     *
-     *  Will take a ref if it returns a codec, else will not affect the data.
      */
-    static SkAndroidCodec* NewFromData(SkData*, SkPngChunkReader* = NULL);
+    static SkAndroidCodec* NewFromData(sk_sp<SkData>, SkPngChunkReader* = NULL);
+    static SkAndroidCodec* NewFromData(SkData* data, SkPngChunkReader* reader) {
+        return NewFromData(sk_ref_sp(data), reader);
+    }
 
     virtual ~SkAndroidCodec() {}
 
index ced0c63..bee4f3c 100644 (file)
@@ -95,10 +95,11 @@ public:
      *      failure to decode the image.
      *      If the PNG does not contain unknown chunks, the SkPngChunkReader
      *      will not be used or modified.
-     *
-     *  Will take a ref if it returns a codec, else will not affect the data.
      */
-    static SkCodec* NewFromData(SkData*, SkPngChunkReader* = NULL);
+    static SkCodec* NewFromData(sk_sp<SkData>, SkPngChunkReader* = NULL);
+    static SkCodec* NewFromData(SkData* data, SkPngChunkReader* reader) {
+        return NewFromData(sk_ref_sp(data), reader);
+    }
 
     virtual ~SkCodec();
 
index 4bfaeda..48ac577 100644 (file)
@@ -291,11 +291,13 @@ public:
     /** If copyData is true, the stream makes a private copy of the data. */
     SkMemoryStream(const void* data, size_t length, bool copyData = false);
 
+#ifdef SK_SUPPORT_LEGACY_STREAM_DATA
     /** Use the specified data as the memory for this stream.
      *  The stream will call ref() on the data (assuming it is not NULL).
      *  DEPRECATED
      */
     SkMemoryStream(SkData*);
+#endif
 
     /** Creates the stream to read from the specified data */
     SkMemoryStream(sk_sp<SkData>);
@@ -312,17 +314,24 @@ public:
     */
     void setMemoryOwned(const void* data, size_t length);
 
+    sk_sp<SkData> asData() const { return fData; }
+    void setData(sk_sp<SkData>);
+#ifdef SK_SUPPORT_LEGACY_STREAM_DATA
     /** Return the stream's data in a SkData.
      *  The caller must call unref() when it is finished using the data.
      */
-    SkData* copyToData() const;
+    SkData* copyToData() const { return asData().release(); }
 
     /**
      *  Use the specified data as the memory for this stream.
      *  The stream will call ref() on the data (assuming it is not NULL).
      *  The function returns the data parameter as a convenience.
      */
-    SkData* setData(SkData*);
+    SkData* setData(SkData* data) {
+        this->setData(sk_ref_sp(data));
+        return data;
+    }
+#endif
 
     void skipToAlign4();
     const void* getAtPos();
@@ -404,11 +413,18 @@ public:
     void copyTo(void* dst) const;
     void writeToStream(SkWStream* dst) const;
 
+    sk_sp<SkData> snapshotAsData() const;
+    // Return the contents as SkData, and then reset the stream.
+    sk_sp<SkData> detachAsData();
+#ifdef SK_SUPPORT_LEGACY_STREAM_DATA
     /**
      *  Return a copy of the data written so far. This call is responsible for
      *  calling unref() when they are finished with the data.
      */
-    SkData* copyToData() const;
+    SkData* copyToData() const {
+        return snapshotAsData().release();
+    }
+#endif
 
     /** Reset, returning a reader stream with the current content. */
     SkStreamAsset* detachAsStream();
index e3dcade..7a0719e 100644 (file)
@@ -611,6 +611,7 @@ DEFINES_ALL = [
     "SK_SUPPORT_LEGACY_TYPEFACE_PTR",
     "SK_SUPPORT_LEGACY_XFERMODE_PTR",
     "SK_SUPPORT_LEGACY_PICTUREINSTALLPIXELREF",
+    "SK_SUPPORT_LEGACY_STREAM_DATA",
 ]
 
 ################################################################################
index 801d67c..b954af6 100644 (file)
@@ -15,7 +15,7 @@ static inline bool decode_file(const char* filename, SkBitmap* bitmap,
                                bool requireUnpremul = false) {
     SkASSERT(kIndex_8_SkColorType != colorType);
     sk_sp<SkData> data(SkData::MakeFromFileName(filename));
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
     if (!codec) {
         return false;
     }
index 324d1be..6dd48c5 100644 (file)
@@ -12,7 +12,7 @@
 #include "SkCodecPriv.h"
 
 SkBitmapRegionDecoder* SkBitmapRegionDecoder::Create(
-        SkData* data, Strategy strategy) {
+        sk_sp<SkData> data, Strategy strategy) {
     return SkBitmapRegionDecoder::Create(new SkMemoryStream(data),
             strategy);
 }
index db36564..2324243 100644 (file)
@@ -55,7 +55,7 @@ SkAndroidCodec* SkAndroidCodec::NewFromStream(SkStream* stream, SkPngChunkReader
     }
 }
 
-SkAndroidCodec* SkAndroidCodec::NewFromData(SkData* data, SkPngChunkReader* chunkReader) {
+SkAndroidCodec* SkAndroidCodec::NewFromData(sk_sp<SkData> data, SkPngChunkReader* chunkReader) {
     if (!data) {
         return nullptr;
     }
index 2372f4c..b076954 100644 (file)
@@ -107,7 +107,7 @@ SkCodec* SkCodec::NewFromStream(SkStream* stream,
     return nullptr;
 }
 
-SkCodec* SkCodec::NewFromData(SkData* data, SkPngChunkReader* reader) {
+SkCodec* SkCodec::NewFromData(sk_sp<SkData> data, SkPngChunkReader* reader) {
     if (!data) {
         return nullptr;
     }
index 1bae1df..8108f0d 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "SkCodecImageGenerator.h"
 
-SkImageGenerator* SkCodecImageGenerator::NewFromEncodedCodec(SkData* data) {
+SkImageGenerator* SkCodecImageGenerator::NewFromEncodedCodec(sk_sp<SkData> data) {
     SkCodec* codec = SkCodec::NewFromData(data);
     if (nullptr == codec) {
         return nullptr;
@@ -24,10 +24,10 @@ static SkImageInfo make_premul(const SkImageInfo& info) {
     return info;
 }
 
-SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, SkData* data)
+SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData> data)
     : INHERITED(make_premul(codec->getInfo()))
     , fCodec(codec)
-    , fData(SkRef(data))
+    , fData(std::move(data))
 {}
 
 SkData* SkCodecImageGenerator::onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) {
index b125643..22a39aa 100644 (file)
@@ -14,11 +14,11 @@ public:
     /*
      * If this data represents an encoded image that we know how to decode,
      * return an SkCodecImageGenerator.  Otherwise return nullptr.
-     *
-     * Refs the data if an image generator can be returned.  Otherwise does
-     * not affect the data.
      */
-    static SkImageGenerator* NewFromEncodedCodec(SkData* data);
+    static SkImageGenerator* NewFromEncodedCodec(sk_sp<SkData>);
+    static SkImageGenerator* NewFromEncodedCodec(SkData* data) {
+        return NewFromEncodedCodec(sk_ref_sp(data));
+    }
 
 protected:
     SkData* onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) override;
@@ -33,9 +33,8 @@ protected:
 private:
     /*
      * Takes ownership of codec
-     * Refs the data
      */
-    SkCodecImageGenerator(SkCodec* codec, SkData* data);
+    SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData>);
 
     SkAutoTDelete<SkCodec> fCodec;
     sk_sp<SkData> fData;
index e2b3e64..48eb92c 100644 (file)
@@ -306,6 +306,7 @@ SkMemoryStream::SkMemoryStream(sk_sp<SkData> data) : fData(std::move(data)) {
     fOffset = 0;
 }
 
+#ifdef SK_SUPPORT_LEGACY_STREAM_DATA
 SkMemoryStream::SkMemoryStream(SkData* data) {
     if (nullptr == data) {
         fData = SkData::MakeEmpty();
@@ -314,6 +315,7 @@ SkMemoryStream::SkMemoryStream(SkData* data) {
     }
     fOffset = 0;
 }
+#endif
 
 void SkMemoryStream::setMemoryOwned(const void* src, size_t size) {
     fData = SkData::MakeFromMalloc(src, size);
@@ -325,18 +327,13 @@ void SkMemoryStream::setMemory(const void* src, size_t size, bool copyData) {
     fOffset = 0;
 }
 
-SkData* SkMemoryStream::copyToData() const {
-    return SkSafeRef(fData.get());
-}
-
-SkData* SkMemoryStream::setData(SkData* data) {
+void SkMemoryStream::setData(sk_sp<SkData> data) {
     if (nullptr == data) {
         fData = SkData::MakeEmpty();
     } else {
-        fData = sk_ref_sp(data);
+        fData = data;
     }
     fOffset = 0;
-    return data;
 }
 
 void SkMemoryStream::skipToAlign4() {
@@ -642,14 +639,20 @@ void SkDynamicMemoryWStream::padToAlign4()
     write(&zero, padBytes);
 }
 
-SkData* SkDynamicMemoryWStream::copyToData() const {
+sk_sp<SkData> SkDynamicMemoryWStream::snapshotAsData() const {
     if (nullptr == fCopy) {
         auto data = SkData::MakeUninitialized(fBytesWritten);
         // be sure to call copyTo() before we assign to fCopy
         this->copyTo(data->writable_data());
         fCopy = std::move(data);
     }
-    return SkRef(fCopy.get());
+    return fCopy;
+}
+
+sk_sp<SkData> SkDynamicMemoryWStream::detachAsData() {
+    sk_sp<SkData> data = this->snapshotAsData();
+    this->reset();
+    return data;
 }
 
 void SkDynamicMemoryWStream::invalidateCopy() {
@@ -882,7 +885,7 @@ sk_sp<SkData> SkCopyStreamToData(SkStream* stream) {
         size_t bytesRead = stream->read(buffer, bufferSize);
         tempStream.write(buffer, bytesRead);
     } while (!stream->isAtEnd());
-    return sk_sp<SkData>(tempStream.copyToData());
+    return tempStream.detachAsData();
 }
 
 bool SkStreamCopy(SkWStream* out, SkStream* input) {
index 22bbc57..023885f 100644 (file)
@@ -31,7 +31,7 @@ SkData* SkImageEncoder::encodeData(const SkBitmap& bm, int quality) {
     SkDynamicMemoryWStream stream;
     quality = SkMin32(100, SkMax32(0, quality));
     if (this->onEncode(&stream, bm, quality)) {
-        return stream.copyToData();
+        return stream.detachAsData().release();
     }
     return nullptr;
 }
index 9472594..b7a48b0 100644 (file)
@@ -206,7 +206,7 @@ static const bool gOutInverse[kReverseDifference_SkPathOp + 1][2][2] = {
 static void dump_path(FILE* file, const SkPath& path, bool force, bool dumpAsHex) {
     SkDynamicMemoryWStream wStream;
     path.dump(&wStream, force, dumpAsHex);
-    sk_sp<SkData> data(wStream.copyToData());
+    sk_sp<SkData> data(wStream.detachAsData());
     fprintf(file, "%.*s\n", (int) data->size(), data->data());
 }
 
index 45e76c7..ca80bae 100644 (file)
@@ -2458,7 +2458,7 @@ protected:
 
     SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override {
         // could be in base impl
-        return this->createFromStream(new SkMemoryStream(data));
+        return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)));
     }
 
     SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override {
index 8d2bc6b..8a1916a 100644 (file)
@@ -406,7 +406,7 @@ protected:
     }
 
     SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override {
-        return this->createFromStream(new SkMemoryStream(data), ttcIndex);
+        return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)), ttcIndex);
     }
 
     SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override {
index 6588766..97489de 100644 (file)
@@ -261,7 +261,7 @@ protected:
     }
 
     SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override {
-        return this->createFromStream(new SkMemoryStream(data), ttcIndex);
+        return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)), ttcIndex);
     }
 
     SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) const override {
index fd5f1b0..54fa1b3 100644 (file)
@@ -903,7 +903,7 @@ protected:
     }
 
     SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override {
-        return this->createFromStream(new SkMemoryStream(data), ttcIndex);
+        return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)), ttcIndex);
     }
 
     SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override {
index bacac2c..833f95b 100644 (file)
@@ -929,7 +929,7 @@ SkTypeface* SkFontMgr_DirectWrite::onCreateFromStream(SkStreamAsset* stream, int
 }
 
 SkTypeface* SkFontMgr_DirectWrite::onCreateFromData(SkData* data, int ttcIndex) const {
-    return this->createFromStream(new SkMemoryStream(data), ttcIndex);
+    return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)), ttcIndex);
 }
 
 SkTypeface* SkFontMgr_DirectWrite::onCreateFromFile(const char path[], int ttcIndex) const {
index f22cb5a..52d1377 100644 (file)
@@ -31,7 +31,7 @@ SkImageGenerator* SkImageGeneratorWIC::NewFromEncodedWIC(SkData* data) {
     SkTScopedComPtr<IStream> iStream;
     // Note that iStream will take ownership of the new memory stream because
     // we set |deleteOnRelease| to true.
-    hr = SkIStream::CreateFromSkStream(new SkMemoryStream(data), true, &iStream);
+    hr = SkIStream::CreateFromSkStream(new SkMemoryStream(sk_ref_sp(data)), true, &iStream);
     if (FAILED(hr)) {
         return nullptr;
     }
index db15284..566651e 100644 (file)
@@ -662,7 +662,7 @@ HRESULT SkXPSDevice::createXpsImageBrush(
         HRM(E_FAIL, "Unable to encode bitmap as png.");
     }
     SkMemoryStream* read = new SkMemoryStream;
-    read->setData(write.copyToData())->unref();
+    read->setData(write.detachAsData());
     SkTScopedComPtr<IStream> readWrapper;
     HRM(SkIStream::CreateFromSkStream(read, true, &readWrapper),
         "Could not create stream from png data.");
index a4109c5..0a9dfea 100644 (file)
@@ -51,7 +51,7 @@ DEF_TEST(Annotation_PdfLink, reporter) {
     SkAnnotateRectWithURL(canvas, r, data.get());
 
     REPORTER_ASSERT(reporter, doc->close());
-    sk_sp<SkData> out(outStream.copyToData());
+    sk_sp<SkData> out = outStream.detachAsData();
     const char* rawOutput = (const char*)out->data();
 
     REPORTER_ASSERT(reporter, ContainsString(rawOutput, out->size(), "/Annots "));
@@ -69,7 +69,7 @@ DEF_TEST(Annotation_NamedDestination, reporter) {
     SkAnnotateNamedDestination(canvas, p, data.get());
 
     REPORTER_ASSERT(reporter, doc->close());
-    sk_sp<SkData> out(outStream.copyToData());
+    sk_sp<SkData> out = outStream.detachAsData();
     const char* rawOutput = (const char*)out->data();
 
     REPORTER_ASSERT(reporter,
index 1c89895..b6253c7 100644 (file)
@@ -38,11 +38,10 @@ static void make_test_image(SkBitmap* bm) {
 /**
  * encode this bitmap into some data via SkImageEncoder
  */
-static SkData* create_data_from_bitmap(const SkBitmap& bm,
-                                       SkImageEncoder::Type type) {
+static sk_sp<SkData> create_data_from_bitmap(const SkBitmap& bm, SkImageEncoder::Type type) {
     SkDynamicMemoryWStream stream;
     if (SkImageEncoder::EncodeStream(&stream, bm, type, 100)) {
-        return stream.copyToData();
+        return stream.detachAsData();
     }
     return nullptr;
 }
@@ -107,7 +106,7 @@ static void test_three_encodings(skiatest::Reporter* reporter,
     };
     for (size_t i = 0; i < SK_ARRAY_COUNT(types); i++) {
         SkImageEncoder::Type type = types[i];
-        sk_sp<SkData> encoded(create_data_from_bitmap(original, type));
+        sk_sp<SkData> encoded = create_data_from_bitmap(original, type);
         REPORTER_ASSERT(reporter, encoded.get() != nullptr);
         if (nullptr == encoded.get()) {
             continue;
index 4e42731..a5afb09 100644 (file)
@@ -10,9 +10,7 @@
 #include "SkData.h"
 
 inline bool decode_memory(const void* mem, size_t size, SkBitmap* bm) {
-    sk_sp<SkData> data(SkData::MakeWithoutCopy(mem, size));
-
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(SkData::MakeWithoutCopy(mem, size)));
     if (!codec) {
         return false;
     }
index b01750d..348bc64 100644 (file)
@@ -210,7 +210,7 @@ static void check(skiatest::Reporter* r,
     if (isIncomplete) {
         size_t size = stream->getLength();
         sk_sp<SkData> data((SkData::MakeFromStream(stream, 2 * size / 3)));
-        codec.reset(SkCodec::NewFromData(data.get()));
+        codec.reset(SkCodec::NewFromData(data));
     } else {
         codec.reset(SkCodec::NewFromStream(stream.release()));
     }
@@ -339,7 +339,7 @@ static void check(skiatest::Reporter* r,
         if (isIncomplete) {
             size_t size = stream->getLength();
             sk_sp<SkData> data((SkData::MakeFromStream(stream, 2 * size / 3)));
-            androidCodec.reset(SkAndroidCodec::NewFromData(data.get()));
+            androidCodec.reset(SkAndroidCodec::NewFromData(data));
         } else {
             androidCodec.reset(SkAndroidCodec::NewFromStream(stream.release()));
         }
@@ -824,8 +824,7 @@ DEF_TEST(Codec_pngChunkReader, r) {
     ChunkReader chunkReader(r);
 
     // Now read the file with SkCodec.
-    sk_sp<SkData> data(wStream.copyToData());
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get(), &chunkReader));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(wStream.detachAsData(), &chunkReader));
     REPORTER_ASSERT(r, codec);
     if (!codec) {
         return;
@@ -865,8 +864,8 @@ DEF_TEST(Codec_pngChunkReader, r) {
 // Stream that can only peek up to a limit
 class LimitedPeekingMemStream : public SkStream {
 public:
-    LimitedPeekingMemStream(SkData* data, size_t limit)
-        : fStream(data)
+    LimitedPeekingMemStream(sk_sp<SkData> data, size_t limit)
+        : fStream(std::move(data))
         , fLimit(limit) {}
 
     size_t peek(void* buf, size_t bytes) const override {
@@ -948,13 +947,13 @@ DEF_TEST(Codec_webp_peek, r) {
 
     // The limit is less than webp needs to peek or read.
     SkAutoTDelete<SkCodec> codec(SkCodec::NewFromStream(
-                                 new LimitedPeekingMemStream(data.get(), 25)));
+                                 new LimitedPeekingMemStream(data, 25)));
     REPORTER_ASSERT(r, codec);
 
     test_info(r, codec.get(), codec->getInfo(), SkCodec::kSuccess, nullptr);
 
     // Similarly, a stream which does not peek should still succeed.
-    codec.reset(SkCodec::NewFromStream(new LimitedPeekingMemStream(data.get(), 0)));
+    codec.reset(SkCodec::NewFromStream(new LimitedPeekingMemStream(data, 0)));
     REPORTER_ASSERT(r, codec);
 
     test_info(r, codec.get(), codec->getInfo(), SkCodec::kSuccess, nullptr);
@@ -978,7 +977,7 @@ DEF_TEST(Codec_wbmp, r) {
     writeableData[1] = static_cast<uint8_t>(~0x9F);
 
     // SkCodec should support this.
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
     REPORTER_ASSERT(r, codec);
     if (!codec) {
         return;
@@ -1083,7 +1082,7 @@ static void check_round_trip(skiatest::Reporter* r, const SkBitmap& bm1) {
             sk_sp<SkData>(SkImageEncoder::EncodeData(bm1, SkImageEncoder::kPNG_Type, 100));
 
     // Prepare to decode.  The codec should recognize that the PNG is 565.
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
     REPORTER_ASSERT(r, origColorType == codec->getInfo().colorType());
     REPORTER_ASSERT(r, origAlphaType == codec->getInfo().alphaType());
 
index c871375..afc05e4 100644 (file)
@@ -193,8 +193,8 @@ DEF_TEST(SkPDF_pdfa_document, r) {
                                    pdfMetadata, nullptr, /* pdfa = */ true);
     doc->beginPage(64, 64)->drawColor(SK_ColorRED);
     doc->close();
-    sk_sp<SkData> data(buffer.copyToData());
-    buffer.reset();
+    sk_sp<SkData> data(buffer.detachAsData());
+
     static const char* expectations[] = {
         "sRGB IEC61966-2.1",
         "<dc:title><rdf:Alt><rdf:li xml:lang=\"x-default\">test document",
@@ -212,8 +212,7 @@ DEF_TEST(SkPDF_pdfa_document, r) {
                               pdfMetadata, nullptr, /* pdfa = */ true);
     doc->beginPage(64, 64)->drawColor(SK_ColorRED);
     doc->close();
-    data.reset(buffer.copyToData());
-    buffer.reset();
+    data = buffer.detachAsData();
 
     static const char* moreExpectations[] = {
         "/Producer (phoney library)",
index f65ee3e..b3ee2d8 100644 (file)
@@ -15,7 +15,7 @@ static const int kMaximumGlyphCount = SK_MaxU16 + 1;
 
 static bool stream_equals(const SkDynamicMemoryWStream& stream, size_t offset,
                           const char* buffer, size_t len) {
-    sk_sp<SkData> data(stream.copyToData());
+    sk_sp<SkData> data = stream.snapshotAsData();
     if (offset + len > data->size()) {
         return false;
     }
index 93c2044..2e75c39 100644 (file)
@@ -78,9 +78,8 @@ DEF_TEST(SkPDF_JpegEmbedTest, r) {
     canvas->flush();
     document->endPage();
     document->close();
-    sk_sp<SkData> pdfData(pdf.copyToData());
+    sk_sp<SkData> pdfData(pdf.detachAsData());
     SkASSERT(pdfData);
-    pdf.reset();
 
     REPORTER_ASSERT(r, is_subset_of(mandrillData.get(), pdfData.get()));
 
@@ -102,9 +101,8 @@ DEF_TEST(SkPDF_JpegEmbedTest, r) {
     canvas->flush();
     document->endPage();
     document->close();
-    pdfData.reset(pdf.copyToData());
+    pdfData = pdf.detachAsData();
     SkASSERT(pdfData);
-    pdf.reset();
 
     REPORTER_ASSERT(r, is_subset_of(mandrillData.get(), pdfData.get()));
 
index 6e7cc24..01351fa 100644 (file)
@@ -29,7 +29,7 @@ DEF_TEST(SkPDF_Metadata, r) {
                                                 metadata, nullptr, false);
     doc->beginPage(612.0f, 792.0f);
     doc->close();
-    sk_sp<SkData> data(pdf.copyToData());
+    sk_sp<SkData> data = pdf.detachAsData();
     static const char* expectations[] = {
         "/Title (A1)",
         "/Author (A2)",
index c719f48..2d9468e 100644 (file)
@@ -106,7 +106,7 @@ static void TestPDFStream(skiatest::Reporter* reporter) {
         compressedByteStream.writeToStream(&expected);
         compressedByteStream.reset();
         expected.writeText("\nendstream");
-        sk_sp<SkData> expectedResultData2(expected.copyToData());
+        sk_sp<SkData> expectedResultData2(expected.detachAsData());
         SkString result = emit_to_string(*stream);
         #ifndef SK_PDF_LESS_COMPRESSION
         assert_eql(reporter,
index 032b646..483d14e 100644 (file)
@@ -4083,7 +4083,7 @@ static void compare_dump(skiatest::Reporter* reporter, const SkPath& path, bool
         bool dumpAsHex, const char* str) {
     SkDynamicMemoryWStream wStream;
     path.dump(&wStream, force, dumpAsHex);
-    sk_sp<SkData> data(wStream.copyToData());
+    sk_sp<SkData> data = wStream.detachAsData();
     REPORTER_ASSERT(reporter, data->size() == strlen(str));
     if (strlen(str) > 0) {
         REPORTER_ASSERT(reporter, !memcmp(data->data(), str, strlen(str)));
index 7b187b4..6ab57c0 100644 (file)
@@ -632,7 +632,7 @@ static sk_sp<SkData> serialized_picture_from_bitmap(const SkBitmap& bitmap) {
     SkAutoTUnref<SkPixelSerializer> serializer(
             SkImageEncoder::CreatePixelSerializer());
     picture->serialize(&wStream, serializer);
-    return sk_sp<SkData>(wStream.copyToData());
+    return wStream.detachAsData();
 }
 
 struct ErrorContext {
@@ -670,7 +670,7 @@ DEF_TEST(Picture_EncodedData, reporter) {
     if (!SkImageEncoder::EncodeStream(&wStream, original, SkImageEncoder::kPNG_Type, 100)) {
         return;
     }
-    sk_sp<SkData> data(wStream.copyToData());
+    sk_sp<SkData> data = wStream.detachAsData();
 
     SkBitmap bm;
     bool installSuccess = SkDEPRECATED_InstallDiscardablePixelRef(data.get(), &bm);
index 5697782..74e6055 100644 (file)
@@ -117,13 +117,13 @@ static void TestWStream(skiatest::Reporter* reporter) {
     REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
 
     {
-        sk_sp<SkData> data(ds.copyToData());
+        sk_sp<SkData> data = ds.snapshotAsData();
         REPORTER_ASSERT(reporter, 100 * 26 == data->size());
         REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
     }
 
     {
-        // Test that this works after a copyToData.
+        // Test that this works after a snapshot.
         SkAutoTDelete<SkStreamAsset> stream(ds.detachAsStream());
         REPORTER_ASSERT(reporter, ds.getOffset() == 0);
         test_loop_stream(reporter, stream.get(), s, 26, 100);
@@ -174,15 +174,14 @@ static void TestPackedUInt(skiatest::Reporter* reporter) {
 static void TestDereferencingData(SkMemoryStream* memStream) {
     memStream->read(nullptr, 0);
     memStream->getMemoryBase();
-    sk_sp<SkData> data(memStream->copyToData());
+    (void)memStream->asData();
 }
 
 static void TestNullData() {
-    SkData* nullData = nullptr;
-    SkMemoryStream memStream(nullData);
+    SkMemoryStream memStream(nullptr);
     TestDereferencingData(&memStream);
 
-    memStream.setData(nullData);
+    memStream.setData(nullptr);
     TestDereferencingData(&memStream);
 
 }
@@ -404,8 +403,7 @@ static void stream_copy_test(skiatest::Reporter* reporter,
         ERRORF(reporter, "SkStreamCopy failed");
         return;
     }
-    sk_sp<SkData> data(tgt.copyToData());
-    tgt.reset();
+    sk_sp<SkData> data(tgt.detachAsData());
     if (data->size() != N) {
         ERRORF(reporter, "SkStreamCopy incorrect size");
         return;
index 6f803ce..436f129 100644 (file)
@@ -21,12 +21,11 @@ static void TypefaceStyle_test(skiatest::Reporter* reporter,
                                uint16_t weight, uint16_t width, SkData* data)
 {
     sk_sp<SkData> dataCopy;
-    SkData* dataToUse = data;
-    if (!dataToUse->unique()) {
+    if (!data->unique()) {
         dataCopy = SkData::MakeWithCopy(data->data(), data->size());
-        dataToUse = dataCopy.get();
+        data = dataCopy.get();
     }
-    SkSFNTHeader* sfntHeader = static_cast<SkSFNTHeader*>(dataToUse->writable_data());
+    SkSFNTHeader* sfntHeader = static_cast<SkSFNTHeader*>(data->writable_data());
 
     SkSFNTHeader::TableDirectoryEntry* tableEntry =
         SkTAfter<SkSFNTHeader::TableDirectoryEntry>(sfntHeader);
@@ -46,7 +45,7 @@ static void TypefaceStyle_test(skiatest::Reporter* reporter,
     using WidthType = SkOTTableOS2_V0::WidthClass::Value;
     os2Table->usWidthClass.value = static_cast<WidthType>(SkEndian_SwapBE16(width));
 
-    sk_sp<SkTypeface> newTypeface(SkTypeface::MakeFromStream(new SkMemoryStream(dataToUse)));
+    sk_sp<SkTypeface> newTypeface(SkTypeface::MakeFromStream(new SkMemoryStream(sk_ref_sp(data))));
     SkASSERT_RELEASE(newTypeface);
 
     SkFontStyle newStyle = newTypeface->fontStyle();
index d77a554..6ca3fe0 100644 (file)
@@ -707,11 +707,10 @@ bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
     SkDynamicMemoryWStream out;
     SkDrawCommand::WritePNG((const png_bytep) encodedBitmap->bytes(), image.width(), image.height(),
                             out, false);
-    SkData* encoded = out.copyToData();
+    sk_sp<SkData> encoded = out.detachAsData();
     Json::Value jsonData;
     encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
     (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
-    encoded->unref();
     return true;
 }
 
index 0fa6158..f83026f 100644 (file)
@@ -140,7 +140,7 @@ int main() {
             srand(0);
             draw(document->beginPage(options.size.width(), options.size.height()));
             document->close();
-            pdfData.reset(pdfStream.copyToData());
+            pdfData = pdfStream.detachAsData();
         }
     }
     if (options.skp) {
@@ -152,7 +152,7 @@ int main() {
         auto picture = recorder.finishRecordingAsPicture();
         SkDynamicMemoryWStream skpStream;
         picture->serialize(&skpStream);
-        skpData.reset(skpStream.copyToData());
+        skpData = skpStream.detachAsData();
     }
 
     printf("{\n");
index f9ba34b..1ec70b3 100644 (file)
@@ -54,7 +54,7 @@ struct Sniffer : public SkPixelSerializer {
         gSeen.add(digest);
 
         sk_sp<SkData> data(SkData::MakeWithoutCopy(ptr, len));
-        SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+        SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
         if (!codec) {
             // FIXME: This code is currently unreachable because we create an empty generator when
             //        we fail to create a codec.
index 0c60677..ef58b1b 100644 (file)
@@ -345,7 +345,7 @@ static void get_bounds(DiffResource& resource, const char* name) {
     if (resource.fBitmap.empty() && !DiffResource::isStatusFailed(resource.fStatus)) {
         sk_sp<SkData> fileBits(read_file(resource.fFullPath.c_str()));
         if (fileBits) {
-            get_bitmap(fileBits.get(), resource, true);
+            get_bitmap(fileBits, resource, true);
         } else {
             SkDebugf("WARNING: couldn't read %s file <%s>\n", name, resource.fFullPath.c_str());
             resource.fStatus = DiffResource::kCouldNotRead_Status;
@@ -496,8 +496,8 @@ static void create_diff_images (DiffMetricProc dmp,
                 VERBOSE_STATUS("MATCH", ANSI_COLOR_GREEN, baseFiles[i]);
             } else {
                 AutoReleasePixels arp(drp);
-                get_bitmap(baseFileBits.get(), drp->fBase, false);
-                get_bitmap(comparisonFileBits.get(), drp->fComparison, false);
+                get_bitmap(baseFileBits, drp->fBase, false);
+                get_bitmap(comparisonFileBits, drp->fComparison, false);
                 VERBOSE_STATUS("DIFFERENT", ANSI_COLOR_RED, baseFiles[i]);
                 if (DiffResource::kDecoded_Status == drp->fBase.fStatus &&
                     DiffResource::kDecoded_Status == drp->fComparison.fStatus) {
index 3a37733..609d75d 100644 (file)
@@ -33,7 +33,7 @@ sk_sp<SkData> read_file(const char* file_path) {
     return data;
 }
 
-bool get_bitmap(SkData* fileBits, DiffResource& resource, bool sizeOnly) {
+bool get_bitmap(sk_sp<SkData> fileBits, DiffResource& resource, bool sizeOnly) {
     SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fileBits));
     if (!codec) {
         SkDebugf("ERROR: could not create codec for <%s>\n", resource.fFullPath.c_str());
index c535ae2..c799325 100644 (file)
@@ -25,7 +25,7 @@ bool are_buffers_equal(SkData* skdata1, SkData* skdata2);
 sk_sp<SkData> read_file(const char* file_path);
 
 /** Decodes the fileBits into the resource.fBitmap. Returns false on failure. */
-bool get_bitmap(SkData* fileBits, DiffResource& resource, bool sizeOnly);
+bool get_bitmap(sk_sp<SkData> fileBits, DiffResource& resource, bool sizeOnly);
 
 /** Writes the bitmap as a PNG to the path specified. */
 bool write_bitmap(const SkString& path, const SkBitmap& bitmap);
index 22fa211..ea2d17a 100644 (file)
@@ -65,7 +65,7 @@ sk_sp<SkData> Request::writeCanvasToPng(SkCanvas* canvas) {
     SkDynamicMemoryWStream buffer;
     SkDrawCommand::WritePNG((const png_bytep) encodedBitmap->bytes(), bmp->width(), bmp->height(),
                             buffer, true);
-    return sk_sp<SkData>(buffer.copyToData());
+    return buffer.detachAsData();
 }
 
 SkCanvas* Request::getCanvas() {
@@ -117,7 +117,7 @@ sk_sp<SkData> Request::writeOutSkp() {
     SkAutoTUnref<SkPixelSerializer> serializer(SkImageEncoder::CreatePixelSerializer());
     picture->serialize(&outStream, serializer);
 
-    return sk_sp<SkData>(outStream.copyToData());
+    return outStream.detachAsData();
 }
 
 GrContext* Request::getContext() {
@@ -257,7 +257,7 @@ sk_sp<SkData> Request::getJsonOps(int n) {
     SkDynamicMemoryWStream stream;
     stream.writeText(Json::FastWriter().write(root).c_str());
 
-    return sk_sp<SkData>(stream.copyToData());
+    return stream.detachAsData();
 }
 
 sk_sp<SkData> Request::getJsonBatchList(int n) {
@@ -269,7 +269,7 @@ sk_sp<SkData> Request::getJsonBatchList(int n) {
     SkDynamicMemoryWStream stream;
     stream.writeText(Json::FastWriter().write(result).c_str());
 
-    return sk_sp<SkData>(stream.copyToData());
+    return stream.detachAsData();
 }
 
 sk_sp<SkData> Request::getJsonInfo(int n) {
@@ -301,7 +301,7 @@ SkColor Request::getPixel(int x, int y) {
 
     // Convert to format suitable for inspection
     sk_sp<SkData> encodedBitmap = sk_tools::encode_bitmap_for_png(*bitmap);
-    SkASSERT(encodedBitmap.get());
+    SkASSERT(encodedBitmap);
 
     const uint8_t* start = encodedBitmap->bytes() + ((y * bitmap->width() + x) * 4);
     SkColor result = SkColorSetARGB(start[3], start[0], start[1], start[2]);
index 7766adb..f4f741f 100644 (file)
@@ -80,6 +80,5 @@ int BreakHandler::handle(Request* request, MHD_Connection* connection,
     canvas->restoreToCount(saveCount);
     SkDynamicMemoryWStream stream;
     stream.writeText(Json::FastWriter().write(response).c_str());
-    sk_sp<SkData> data(stream.copyToData());
-    return SendData(connection, data.get(), "application/json");
+    return SendData(connection, stream.detachAsData().get(), "application/json");
 }
index 7dcee5d..78fb17b 100644 (file)
@@ -37,7 +37,7 @@ void ImageSlide::draw(SkCanvas* canvas) {
 
 void ImageSlide::load(SkScalar, SkScalar) {
     sk_sp<SkData> encoded = SkData::MakeFromFileName(fPath.c_str());
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
     if (!codec) {
         return;
     }
index cc15601..1bacf5f 100644 (file)
@@ -124,7 +124,7 @@ int main(int argc, char** argv) {
         SkDebugf("Cannot find input image.\n");
         return -1;
     }
-    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
+    SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
     if (!codec) {
         SkDebugf("Invalid input image.\n");
         return -1;