SkPDF Create working move constructor for inner classes
BUG=chromium:592330,chromium:592702
Review URL: https://codereview.chromium.org/1774633002
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 4feb78f..7a69c63 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1416,15 +1416,15 @@
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 @@
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 d38f282..310807d 100644
--- a/src/pdf/SkPDFDevice.h
+++ b/src/pdf/SkPDFDevice.h
@@ -202,18 +202,30 @@
private:
struct RectWithData {
SkRect rect;
- SkData* data;
+ sk_sp<SkData> 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<SkData> 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