bool SkPdfNativeObject::applyFlateDecodeFilter() { if (!SkFlate::HaveFlate()) { SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNoFlateLibrary_SkPdfIssue, "forgot to link with flate library?", NULL, NULL); return false; } const unsigned char* old = fStr.fBuffer; bool deleteOld = isStreamOwned(); SkMemoryStream skstream(fStr.fBuffer, fStr.fBytes >> 2, false); SkDynamicMemoryWStream uncompressedData; if (SkFlate::Inflate(&skstream, &uncompressedData)) { fStr.fBytes = (uncompressedData.bytesWritten() << 2) + kOwnedStreamBit + kUnfilteredStreamBit; fStr.fBuffer = (const unsigned char*)new unsigned char[uncompressedData.bytesWritten()]; uncompressedData.copyTo((void*)fStr.fBuffer); if (deleteOld) { delete[] old; } return true; } else { SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kBadStream_SkPdfIssue, "inflate failed", this, NULL); return false; } }
void SkParsePath::ToSVGString(const SkPath& path, SkString* str) { SkDynamicMemoryWStream stream; SkPath::Iter iter(path, false); SkPoint pts[4]; for (;;) { switch (iter.next(pts, false)) { case SkPath::kMove_Verb: append_scalars(&stream, 'M', &pts[0].fX, 2); break; case SkPath::kLine_Verb: append_scalars(&stream, 'L', &pts[1].fX, 2); break; case SkPath::kQuad_Verb: append_scalars(&stream, 'Q', &pts[1].fX, 4); break; case SkPath::kCubic_Verb: append_scalars(&stream, 'C', &pts[1].fX, 6); break; case SkPath::kClose_Verb: stream.write("Z", 1); break; case SkPath::kDone_Verb: str->resize(stream.getOffset()); stream.copyTo(str->writable_str()); return; } } }
static void TestWStream(skiatest::Reporter* reporter) { SkDynamicMemoryWStream ds; const char s[] = "abcdefghijklmnopqrstuvwxyz"; int i; for (i = 0; i < 100; i++) { REPORTER_ASSERT(reporter, ds.write(s, 26)); } REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26); char* dst = new char[100 * 26 + 1]; dst[100*26] = '*'; ds.copyTo(dst); REPORTER_ASSERT(reporter, dst[100*26] == '*'); // char* p = dst; for (i = 0; i < 100; i++) { REPORTER_ASSERT(reporter, memcmp(&dst[i * 26], s, 26) == 0); } { SkData* data = ds.copyToData(); REPORTER_ASSERT(reporter, 100 * 26 == data->size()); REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0); data->unref(); } delete[] dst; }
static SkString emit_to_string(T& obj) { SkDynamicMemoryWStream buffer; obj.emitObject(&buffer); SkString tmp(buffer.bytesWritten()); buffer.copyTo(tmp.writable_str()); return tmp; }
static void TestWStream(skiatest::Reporter* reporter) { SkDynamicMemoryWStream ds; const char s[] = "abcdefghijklmnopqrstuvwxyz"; int i; for (i = 0; i < 100; i++) { REPORTER_ASSERT(reporter, ds.write(s, 26)); } REPORTER_ASSERT(reporter, ds.bytesWritten() == 100 * 26); char* dst = new char[100 * 26 + 1]; dst[100*26] = '*'; ds.copyTo(dst); REPORTER_ASSERT(reporter, dst[100*26] == '*'); for (i = 0; i < 100; i++) { REPORTER_ASSERT(reporter, memcmp(&dst[i * 26], s, 26) == 0); } { std::unique_ptr<SkStreamAsset> stream(ds.detachAsStream()); REPORTER_ASSERT(reporter, 100 * 26 == stream->getLength()); REPORTER_ASSERT(reporter, ds.bytesWritten() == 0); test_loop_stream(reporter, stream.get(), s, 26, 100); std::unique_ptr<SkStreamAsset> stream2(stream->duplicate()); test_loop_stream(reporter, stream2.get(), s, 26, 100); std::unique_ptr<SkStreamAsset> stream3(stream->fork()); REPORTER_ASSERT(reporter, stream3->isAtEnd()); char tmp; size_t bytes = stream->read(&tmp, 1); REPORTER_ASSERT(reporter, 0 == bytes); stream3->rewind(); test_loop_stream(reporter, stream3.get(), s, 26, 100); } for (i = 0; i < 100; i++) { REPORTER_ASSERT(reporter, ds.write(s, 26)); } REPORTER_ASSERT(reporter, ds.bytesWritten() == 100 * 26); { // Test that this works after a snapshot. std::unique_ptr<SkStreamAsset> stream(ds.detachAsStream()); REPORTER_ASSERT(reporter, ds.bytesWritten() == 0); test_loop_stream(reporter, stream.get(), s, 26, 100); std::unique_ptr<SkStreamAsset> stream2(stream->duplicate()); test_loop_stream(reporter, stream2.get(), s, 26, 100); } delete[] dst; SkString tmpDir = skiatest::GetTmpDir(); if (!tmpDir.isEmpty()) { test_filestreams(reporter, tmpDir.c_str()); } }
static SkString emit_to_string(T& obj, Catalog* catPtr = nullptr) { Catalog catalog; SkDynamicMemoryWStream buffer; if (!catPtr) { catPtr = &catalog; } obj.emitObject(&buffer, catPtr->numbers, catPtr->substitutes); SkString tmp(buffer.bytesWritten()); buffer.copyTo(tmp.writable_str()); return tmp; }
static void apply_paint_typeface(const SkPaint& paint, Json::Value* target, bool sendBinaries) { SkTypeface* typeface = paint.getTypeface(); if (typeface != nullptr) { if (sendBinaries) { Json::Value jsonTypeface; SkDynamicMemoryWStream buffer; typeface->serialize(&buffer); void* data = sk_malloc_throw(buffer.bytesWritten()); buffer.copyTo(data); Json::Value bytes; encode_data(data, buffer.bytesWritten(), &bytes); jsonTypeface[SKJSONCANVAS_ATTRIBUTE_BYTES] = bytes; free(data); (*target)[SKJSONCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface; } } }
void SkParsePath::ToSVGString(const SkPath& path, SkString* str) { SkDynamicMemoryWStream stream; SkPath::Iter iter(path, false); SkPoint pts[4]; for (;;) { switch (iter.next(pts, false)) { case SkPath::kConic_Verb: { const SkScalar tol = SK_Scalar1 / 1024; // how close to a quad SkAutoConicToQuads quadder; const SkPoint* quadPts = quadder.computeQuads(pts, iter.conicWeight(), tol); for (int i = 0; i < quadder.countQuads(); ++i) { append_scalars(&stream, 'Q', &quadPts[i*2 + 1].fX, 4); } } break; case SkPath::kMove_Verb: append_scalars(&stream, 'M', &pts[0].fX, 2); break; case SkPath::kLine_Verb: append_scalars(&stream, 'L', &pts[1].fX, 2); break; case SkPath::kQuad_Verb: append_scalars(&stream, 'Q', &pts[1].fX, 4); break; case SkPath::kCubic_Verb: append_scalars(&stream, 'C', &pts[1].fX, 6); break; case SkPath::kClose_Verb: stream.write("Z", 1); break; case SkPath::kDone_Verb: str->resize(stream.getOffset()); stream.copyTo(str->writable_str()); return; } } }
static void testPngComments(const SkPixmap& src, SkPngEncoder::Options& options, skiatest::Reporter* r) { std::vector<std::string> commentStrings; pushComment(commentStrings, "key", "text"); pushComment(commentStrings, "test", "something"); pushComment(commentStrings, "have some", "spaces in both"); std::string longKey(PNG_KEYWORD_MAX_LENGTH, 'x'); #ifdef SK_DEBUG commentStrings.push_back(longKey); #else // We call SkDEBUGFAILF it the key is too long so we'll only test this in release mode. commentStrings.push_back(longKey + "x"); #endif commentStrings.push_back(""); std::vector<const char*> commentPointers; std::vector<size_t> commentSizes; for(auto& str : commentStrings) { commentPointers.push_back(str.c_str()); commentSizes.push_back(str.length() + 1); } options.fComments = SkDataTable::MakeCopyArrays((void const *const *)commentPointers.data(), commentSizes.data(), commentStrings.size()); SkDynamicMemoryWStream dst; bool success = SkPngEncoder::Encode(&dst, src, options); REPORTER_ASSERT(r, success); std::vector<char> output(dst.bytesWritten()); dst.copyTo(output.data()); // Each chunk is of the form length (4 bytes), chunk type (tEXt), data, // checksum (4 bytes). Make sure we find all of them in the encoded // results. const char kExpected1[] = "\x00\x00\x00\x08tEXtkey\x00text\x9e\xe7\x66\x51"; const char kExpected2[] = "\x00\x00\x00\x0etEXttest\x00something\x29\xba\xef\xac"; const char kExpected3[] = "\x00\x00\x00\x18tEXthave some\x00spaces in both\x8d\x69\x34\x2d"; std::string longKeyRecord = "tEXt" + longKey; // A snippet of our long key comment std::string tooLongRecord = "tExt" + longKey + "x"; // A snippet whose key is too long auto search1 = std::search(output.begin(), output.end(), kExpected1, kExpected1 + sizeof(kExpected1)); auto search2 = std::search(output.begin(), output.end(), kExpected2, kExpected2 + sizeof(kExpected2)); auto search3 = std::search(output.begin(), output.end(), kExpected3, kExpected3 + sizeof(kExpected3)); auto search4 = std::search(output.begin(), output.end(), longKeyRecord.begin(), longKeyRecord.end()); auto search5 = std::search(output.begin(), output.end(), tooLongRecord.begin(), tooLongRecord.end()); REPORTER_ASSERT(r, search1 != output.end()); REPORTER_ASSERT(r, search2 != output.end()); REPORTER_ASSERT(r, search3 != output.end()); REPORTER_ASSERT(r, search4 != output.end()); REPORTER_ASSERT(r, search5 == output.end()); // Comments test ends }
extern "C" void JpegStub_getCompressedImage(JpegStub* stub, void* buff) { SkDynamicMemoryWStream* stream = (SkDynamicMemoryWStream*)stub->mInternalStream; stream->copyTo(buff); }