diff options
Diffstat (limited to 'chromium/third_party/skia/experimental/DrawingBoard/SkNetPipeController.cpp')
-rw-r--r-- | chromium/third_party/skia/experimental/DrawingBoard/SkNetPipeController.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/chromium/third_party/skia/experimental/DrawingBoard/SkNetPipeController.cpp b/chromium/third_party/skia/experimental/DrawingBoard/SkNetPipeController.cpp new file mode 100644 index 00000000000..3e4ded5cf74 --- /dev/null +++ b/chromium/third_party/skia/experimental/DrawingBoard/SkNetPipeController.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "SkNetPipeController.h" + +SkNetPipeController::SkNetPipeController(SkCanvas* target) : fReader(target) { + fBlock = NULL; + fBlockSize = fBytesWritten = 0; + fPlayback = true; + fStatus = SkGPipeReader::kDone_Status; + fTotalWritten = 0; + fAtomsWritten = 0; +} +SkNetPipeController::~SkNetPipeController() { + sk_free(fBlock); +} + +int SkNetPipeController::writeToSocket(SkSocket* sockfd, SkSocket::DataType type) { + if (NULL != sockfd && fTotalWritten > 4) + return sockfd->writePacket(fBlock, fBytesWritten, type); + else + return -1; +} + +void* SkNetPipeController::requestBlock(size_t minRequest, size_t* actual) { + sk_free(fBlock); + + fBlockSize = minRequest * 4; + fBlock = sk_malloc_throw(fBlockSize); + fBytesWritten = 0; + *actual = fBlockSize; + return fBlock; +} + +void SkNetPipeController::notifyWritten(size_t bytes) { + SkASSERT(fBytesWritten + bytes <= fBlockSize); + + if (fPlayback) { + fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes); + } + + SkASSERT(SkGPipeReader::kError_Status != fStatus); + fBytesWritten += bytes; + fTotalWritten += bytes; + + fAtomsWritten += 1; +} |