From d7b2885b90c6d248d8188cdb3720ea9150568a89 Mon Sep 17 00:00:00 2001 From: halcanary Date: Mon, 7 Mar 2016 12:39:14 -0800 Subject: [PATCH] SkPDF Create working move constructor for inner classes BUG=chromium:592330,chromium:592702 Review URL: https://codereview.chromium.org/1774633002 --- src/pdf/SkPDFDevice.cpp | 11 ++++++----- src/pdf/SkPDFDevice.h | 20 ++++++++++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 4feb78f334..7a69c631d8 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -1416,15 +1416,15 @@ void SkPDFDevice::drawDevice(const SkDraw& d, SkBaseDevice* device, SkScalar scalarY = SkIntToScalar(y); for (const RectWithData& l : pdfDevice->fLinkToURLs) { SkRect r = l.rect.makeOffset(scalarX, scalarY); - fLinkToURLs.emplace_back(r, l.data); + fLinkToURLs.emplace_back(r, l.data.get()); } for (const RectWithData& l : pdfDevice->fLinkToDestinations) { SkRect r = l.rect.makeOffset(scalarX, scalarY); - fLinkToDestinations.emplace_back(r, l.data); + fLinkToDestinations.emplace_back(r, l.data.get()); } for (const NamedDestination& d : pdfDevice->fNamedDestinations) { SkPoint p = d.point + SkPoint::Make(scalarX, scalarY); - fNamedDestinations.emplace_back(d.nameData, p); + fNamedDestinations.emplace_back(d.nameData.get(), p); } if (pdfDevice->isContentEmpty()) { @@ -1699,12 +1699,13 @@ void SkPDFDevice::appendAnnotations(SkPDFArray* array) const { for (const RectWithData& rectWithURL : fLinkToURLs) { SkRect r; fInitialTransform.mapRect(&r, rectWithURL.rect); - array->appendObject(create_link_to_url(rectWithURL.data, r)); + array->appendObject(create_link_to_url(rectWithURL.data.get(), r)); } for (const RectWithData& linkToDestination : fLinkToDestinations) { SkRect r; fInitialTransform.mapRect(&r, linkToDestination.rect); - array->appendObject(create_link_named_dest(linkToDestination.data, r)); + array->appendObject( + create_link_named_dest(linkToDestination.data.get(), r)); } } diff --git a/src/pdf/SkPDFDevice.h b/src/pdf/SkPDFDevice.h index d38f282bb0..310807d86e 100644 --- a/src/pdf/SkPDFDevice.h +++ b/src/pdf/SkPDFDevice.h @@ -202,18 +202,30 @@ protected: private: struct RectWithData { SkRect rect; - SkData* data; + sk_sp data; RectWithData(const SkRect& rect, SkData* data) : rect(rect), data(SkRef(data)) {} - ~RectWithData() { data->unref(); } + RectWithData(RectWithData&& other) + : rect(other.rect), data(std::move(other.data)) {} + RectWithData& operator=(RectWithData&& other) { + rect = other.rect; + data = std::move(other.data); + return *this; + } }; struct NamedDestination { - SkData* nameData; + sk_sp nameData; SkPoint point; NamedDestination(SkData* nameData, const SkPoint& point) : nameData(SkRef(nameData)), point(point) {} - ~NamedDestination() { nameData->unref(); } + NamedDestination(NamedDestination&& other) + : nameData(std::move(other.nameData)), point(other.point) {} + NamedDestination& operator=(NamedDestination&& other) { + nameData = std::move(other.nameData); + point = other.point; + return *this; + } }; // TODO(vandebo): push most of SkPDFDevice's state into a core object in