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()); } }
SkData* onEncode(const SkPixmap& pmap) { if (kAlpha_8_SkColorType == pmap.colorType()) { SkDynamicMemoryWStream stream; stream.write("skiaimgf", 8); stream.write32(pmap.width()); stream.write32(pmap.height()); stream.write16(pmap.colorType()); stream.write16(pmap.alphaType()); stream.write32(0); // no colorspace for now for (int y = 0; y < pmap.height(); ++y) { stream.write(pmap.addr8(0, y), pmap.width()); } return stream.detachAsData().release(); } return nullptr; }
DEF_TEST(StreamPeek_BlockMemoryStream, rep) { const static int kSeed = 1234; SkRandom valueSource(kSeed); SkRandom rand(kSeed << 1); uint8_t buffer[4096]; SkDynamicMemoryWStream dynamicMemoryWStream; for (int i = 0; i < 32; ++i) { // Randomize the length of the blocks. size_t size = rand.nextRangeU(1, sizeof(buffer)); for (size_t j = 0; j < size; ++j) { buffer[j] = valueSource.nextU() & 0xFF; } dynamicMemoryWStream.write(buffer, size); } SkAutoTDelete<SkStreamAsset> asset(dynamicMemoryWStream.detachAsStream()); SkAutoTUnref<SkData> expected(SkData::NewUninitialized(asset->getLength())); uint8_t* expectedPtr = static_cast<uint8_t*>(expected->writable_data()); valueSource.setSeed(kSeed); // reseed. // We want the exact same same "random" string of numbers to put // in expected. i.e.: don't rely on SkDynamicMemoryStream to work // correctly while we are testing SkDynamicMemoryStream. for (size_t i = 0; i < asset->getLength(); ++i) { expectedPtr[i] = valueSource.nextU() & 0xFF; } stream_peek_test(rep, asset, expected); }
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 void TestPDFStream(skiatest::Reporter* reporter) { char streamBytes[] = "Test\nFoo\tBar"; SkAutoTDelete<SkMemoryStream> streamData(new SkMemoryStream( streamBytes, strlen(streamBytes), true)); SkAutoTUnref<SkPDFStream> stream(new SkPDFStream(streamData.get())); ASSERT_EMIT_EQ(reporter, *stream, "<</Length 12>> stream\nTest\nFoo\tBar\nendstream"); stream->insertInt("Attribute", 42); ASSERT_EMIT_EQ(reporter, *stream, "<</Length 12\n/Attribute 42>> stream\n" "Test\nFoo\tBar\nendstream"); { char streamBytes2[] = "This is a longer string, so that compression " "can do something with it. With shorter strings, " "the short circuit logic cuts in and we end up " "with an uncompressed string."; SkAutoDataUnref streamData2(SkData::NewWithCopy(streamBytes2, strlen(streamBytes2))); SkAutoTUnref<SkPDFStream> stream(new SkPDFStream(streamData2.get())); SkDynamicMemoryWStream compressedByteStream; SkFlate::Deflate(streamData2.get(), &compressedByteStream); SkAutoDataUnref compressedData(compressedByteStream.copyToData()); SkDynamicMemoryWStream expected; expected.writeText("<</Filter /FlateDecode\n/Length 116>> stream\n"); expected.write(compressedData->data(), compressedData->size()); expected.writeText("\nendstream"); SkAutoDataUnref expectedResultData2(expected.copyToData()); SkString result = emit_to_string(*stream); ASSERT_EQL(reporter, result, (const char*)expectedResultData2->data(), expectedResultData2->size()); } }
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; } } }
int SkSocket::readPacket(void (*onRead)(int, const void*, size_t, DataType, void*), void* context) { if (!fConnected || !fReady || NULL == onRead || NULL == context || fReadSuspended) return -1; int totalBytesRead = 0; char packet[PACKET_SIZE]; for (int i = 0; i <= fMaxfd; ++i) { if (!FD_ISSET (i, &fMasterSet)) continue; memset(packet, 0, PACKET_SIZE); SkDynamicMemoryWStream stream; int attempts = 0; bool failure = false; int bytesReadInTransfer = 0; int bytesReadInPacket = 0; header h; h.done = false; h.bytes = 0; while (!h.done && fConnected && !failure) { int retval = read(i, packet + bytesReadInPacket, PACKET_SIZE - bytesReadInPacket); ++attempts; if (retval < 0) { #ifdef NONBLOCKING_SOCKETS if (errno == EWOULDBLOCK || errno == EAGAIN) { if (bytesReadInPacket > 0 || bytesReadInTransfer > 0) continue; //incomplete packet or frame, keep tring else break; //nothing to read } #endif //SkDebugf("Read() failed with error: %s\n", strerror(errno)); failure = true; break; } if (retval == 0) { //SkDebugf("Peer closed connection or connection failed\n"); failure = true; break; } SkASSERT(retval > 0); bytesReadInPacket += retval; if (bytesReadInPacket < PACKET_SIZE) { //SkDebugf("Read %d/%d\n", bytesReadInPacket, PACKET_SIZE); continue; //incomplete packet, keep trying } SkASSERT((bytesReadInPacket == PACKET_SIZE) && !failure); memcpy(&h.done, packet, sizeof(bool)); memcpy(&h.bytes, packet + sizeof(bool), sizeof(int)); memcpy(&h.type, packet + sizeof(bool) + sizeof(int), sizeof(DataType)); if (h.bytes > CONTENT_SIZE || h.bytes <= 0) { //SkDebugf("bad packet\n"); failure = true; break; } //SkDebugf("read packet(done:%d, bytes:%d) from fd:%d in %d tries\n", // h.done, h.bytes, fSockfd, attempts); stream.write(packet + HEADER_SIZE, h.bytes); bytesReadInPacket = 0; attempts = 0; bytesReadInTransfer += h.bytes; } if (failure) { onRead(i, NULL, 0, h.type, context); this->onFailedConnection(i); continue; } if (bytesReadInTransfer > 0) { SkData* data = stream.copyToData(); SkASSERT(data->size() == bytesReadInTransfer); onRead(i, data->data(), data->size(), h.type, context); data->unref(); totalBytesRead += bytesReadInTransfer; } } return totalBytesRead; }