blob: 3e4ded5cf74e02d452be14a87fcd4574febff1c9 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
yangsu@google.comc5aeccd2011-07-17 14:42:08 +00007#include "SkNetPipeController.h"
8
9SkNetPipeController::SkNetPipeController(SkCanvas* target) : fReader(target) {
10 fBlock = NULL;
11 fBlockSize = fBytesWritten = 0;
12 fPlayback = true;
13 fStatus = SkGPipeReader::kDone_Status;
14 fTotalWritten = 0;
15 fAtomsWritten = 0;
16}
17SkNetPipeController::~SkNetPipeController() {
18 sk_free(fBlock);
19}
20
21int SkNetPipeController::writeToSocket(SkSocket* sockfd, SkSocket::DataType type) {
22 if (NULL != sockfd && fTotalWritten > 4)
23 return sockfd->writePacket(fBlock, fBytesWritten, type);
rmistry@google.comd6176b02012-08-23 18:14:13 +000024 else
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000025 return -1;
26}
27
28void* SkNetPipeController::requestBlock(size_t minRequest, size_t* actual) {
29 sk_free(fBlock);
rmistry@google.comd6176b02012-08-23 18:14:13 +000030
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000031 fBlockSize = minRequest * 4;
32 fBlock = sk_malloc_throw(fBlockSize);
33 fBytesWritten = 0;
34 *actual = fBlockSize;
35 return fBlock;
36}
37
38void SkNetPipeController::notifyWritten(size_t bytes) {
39 SkASSERT(fBytesWritten + bytes <= fBlockSize);
rmistry@google.comd6176b02012-08-23 18:14:13 +000040
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000041 if (fPlayback) {
42 fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes);
43 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000044
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000045 SkASSERT(SkGPipeReader::kError_Status != fStatus);
46 fBytesWritten += bytes;
47 fTotalWritten += bytes;
rmistry@google.comd6176b02012-08-23 18:14:13 +000048
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000049 fAtomsWritten += 1;
rmistry@google.combda03db2012-08-14 20:27:54 +000050}