replace detach/getStream apis on dynamicwstream with SkData
http://codereview.appspot.com/4657046/
git-svn-id: http://skia.googlecode.com/svn/trunk@1714 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 67bc64a..8ead3c8 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -18,6 +18,7 @@
#include "SkColor.h"
#include "SkClipStack.h"
+#include "SkData.h"
#include "SkDraw.h"
#include "SkGlyphCache.h"
#include "SkPaint.h"
@@ -1080,6 +1081,9 @@
return mediaBox;
}
+/**
+ * Can this return SkData instead of SkStream?
+ */
SkStream* SkPDFDevice::content() const {
SkDynamicMemoryWStream data;
if (fInitialTransform.getType() != SkMatrix::kIdentity_Mask) {
@@ -1104,12 +1108,14 @@
translation);
gsState.updateMatrix(entry->fState.fMatrix);
gsState.updateDrawingState(entry->fState);
- data.write(entry->fContent.getStream(), entry->fContent.getOffset());
+
+ SkAutoDataUnref copy(entry->fContent.copyToData());
+ data.write(copy.data(), copy.size());
}
gsState.drainStack();
SkMemoryStream* result = new SkMemoryStream;
- result->setMemoryOwned(data.detach(), data.getOffset());
+ result->setData(data.copyToData())->unref();
return result;
}
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
index f570a1f..d0d31e3 100755
--- a/src/pdf/SkPDFFont.cpp
+++ b/src/pdf/SkPDFFont.cpp
@@ -16,6 +16,7 @@
#include <ctype.h>
+#include "SkData.h"
#include "SkFontHost.h"
#include "SkGlyphCache.h"
#include "SkPaint.h"
@@ -140,6 +141,7 @@
// Make as few copies as possible given these constraints.
SkDynamicMemoryWStream dynamicStream;
SkRefPtr<SkMemoryStream> staticStream;
+ SkData* data = NULL;
const uint8_t* src;
size_t srcLen;
if ((srcLen = srcStream->getLength()) > 0) {
@@ -168,11 +170,15 @@
dynamicStream.write(buf, amount);
amount = 0;
dynamicStream.write(&amount, 1); // NULL terminator.
- // getStream makes another copy, but we couldn't do any better.
- src = (const uint8_t*)dynamicStream.getStream();
- srcLen = dynamicStream.getOffset() - 1;
+ data = dynamicStream.copyToData();
+ src = data->bytes();
+ srcLen = data->size() - 1;
}
+ // this handles releasing the data we may have gotten from dynamicStream.
+ // if data is null, it is a no-op
+ SkAutoDataUnref aud(data);
+
if (parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) {
SkMemoryStream* result =
new SkMemoryStream(*headerLen + *dataLen + *trailerLen);
@@ -616,7 +622,7 @@
append_cmap_footer(&cmap);
SkRefPtr<SkMemoryStream> cmapStream = new SkMemoryStream();
cmapStream->unref(); // SkRefPtr and new took a reference.
- cmapStream->setMemoryOwned(cmap.detach(), cmap.getOffset());
+ cmapStream->setData(cmap.copyToData())->unref();
SkRefPtr<SkPDFStream> pdfCmap = new SkPDFStream(cmapStream.get());
fResources.push(pdfCmap.get()); // Pass reference from new.
insert("ToUnicode", new SkPDFObjRef(pdfCmap.get()))->unref();
@@ -792,7 +798,7 @@
}
SkRefPtr<SkMemoryStream> glyphStream = new SkMemoryStream();
glyphStream->unref(); // SkRefPtr and new both took a ref.
- glyphStream->setMemoryOwned(content.detach(), content.getOffset());
+ glyphStream->setData(content.copyToData())->unref();
SkRefPtr<SkPDFStream> glyphDescription =
new SkPDFStream(glyphStream.get());
diff --git a/src/pdf/SkPDFStream.cpp b/src/pdf/SkPDFStream.cpp
index b1bd5ff..11afa32 100644
--- a/src/pdf/SkPDFStream.cpp
+++ b/src/pdf/SkPDFStream.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include "SkData.h"
#include "SkFlate.h"
#include "SkPDFCatalog.h"
#include "SkPDFStream.h"
@@ -45,10 +46,12 @@
this->INHERITED::emitObject(stream, catalog, false);
stream->writeText(" stream\n");
- if (fPlainData.get())
+ if (fPlainData.get()) {
stream->write(fPlainData->getMemoryBase(), fLength);
- else
- stream->write(fCompressedData.getStream(), fLength);
+ } else {
+ SkAutoDataUnref data(fCompressedData.copyToData());
+ stream->write(data.data(), fLength);
+ }
stream->writeText("\nendstream");
}