virtual void onDrawContent(SkCanvas* canvas) { if (fCurrMatrix != canvas->getTotalMatrix()) { fTotalBytesRead = 0; fCurrMatrix = canvas->getTotalMatrix(); } fServer->acceptConnections(); if (fServer->readPacket(readData, this) > 0) { fServer->resumeWrite(); } else { fServer->suspendWrite(); } size_t bytesRead; SkGPipeReader::Status stat; SkCanvas bufferCanvas(fBase); SkCanvas* tempCanvas; while (fTotalBytesRead < fData.count()) { if (fVector) { tempCanvas = canvas; } else { tempCanvas = &bufferCanvas; } SkGPipeReader reader(tempCanvas); stat = reader.playback(fData.begin() + fTotalBytesRead, fData.count() - fTotalBytesRead, &bytesRead); SkASSERT(SkGPipeReader::kError_Status != stat); fTotalBytesRead += bytesRead; } if (fVector) { fTotalBytesRead = 0; } else { canvas->drawBitmap(fBase, 0, 0, NULL); } size_t totalBytesRead = 0; while (totalBytesRead < fBuffer.count()) { SkGPipeReader reader(canvas); stat = reader.playback(fBuffer.begin() + totalBytesRead, fBuffer.count() - totalBytesRead, &bytesRead); SkASSERT(SkGPipeReader::kError_Status != stat); totalBytesRead += bytesRead; } fServer->writePacket(fBuffer.begin(), fBuffer.count(), SkSocket::kPipeReplace_type); this->inval(NULL); }
void ReaderView::draw(SkCanvas* canvas) { canvas->drawColor(fBGColor); SkAutoCanvasRestore acr(canvas, true); //Create a temporary canvas and reader object that draws into the back //bitmap so that the incremental changes or incomplete reads are not shown //on screen SkCanvas bufferCanvas(fBufferBitmaps[fBack]); SkGPipeReader reader(&bufferCanvas); //The file specified by FILE_PATH MUST exist FILE* f = fopen(FILE_PATH, "rb"); SkASSERT(f != NULL); fseek(f, 0, SEEK_END); int size = ftell(f) * sizeof(char); if (size <= fFilePos) { fFilePos = 0; } //Resume from the last read location fseek(f, fFilePos, SEEK_SET); int toBeRead = size - fFilePos; if (size > 0 && toBeRead > 0) { void* block = sk_malloc_throw(toBeRead); fread(block, 1, toBeRead, f); size_t bytesRead; SkGPipeReader::Status fStatus = reader.playback(block, toBeRead, &bytesRead); SkASSERT(SkGPipeReader::kError_Status != fStatus); SkASSERT(toBeRead >= bytesRead); //if the reader reaches a done verb, a frame is complete. //Update the file location and swap the front and back bitmaps to show //the new frame if (SkGPipeReader::kDone_Status == fStatus) { fFilePos += bytesRead; fFront = fFront ^ 0x1; fBack = fBack ^ 0x1; } sk_free(block); } fclose(f); //the front bitmap is always drawn canvas->drawBitmap(fBufferBitmaps[fFront], 0, 0, NULL); this->inval(NULL); }
virtual void onDrawContent(SkCanvas* canvas) { if (fSocket) { if (fSocket->isConnected()) { if (fSync) { int count = 0; while (fSocket->readPacket(readData, this) > 0 && count < MAX_READ_PER_FRAME) ++count; } else fSocket->readPacket(readData, this); } else fSocket->connectToServer(); } size_t bytesRead = 0; SkGPipeReader::Status status; SkCanvas bufferCanvas(fBase); SkCanvas* tempCanvas; while (fTotalBytesRead < fData.count()) { if (fVector) tempCanvas = canvas; else tempCanvas = &bufferCanvas; SkGPipeReader reader(tempCanvas); status = reader.playback(fData.begin() + fTotalBytesRead, fData.count() - fTotalBytesRead, &bytesRead); SkASSERT(SkGPipeReader::kError_Status != status); fTotalBytesRead += bytesRead; } if (fVector) fTotalBytesRead = 0; else canvas->drawBitmap(fBase, 0, 0, NULL); size_t totalBytesRead = 0; while (totalBytesRead < fBuffer.count()) { SkGPipeReader reader(canvas); status = reader.playback(fBuffer.begin() + totalBytesRead, fBuffer.count() - totalBytesRead, &bytesRead); SkASSERT(SkGPipeReader::kError_Status != status); totalBytesRead += bytesRead; } SkNetPipeController controller(canvas); SkGPipeWriter writer; SkCanvas* writerCanvas = writer.startRecording(&controller, SkGPipeWriter::kCrossProcess_Flag); //controller.disablePlayback(); SkPaint p; p.setColor(fPalette->getColor()); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(fBrushSize); p.setStrokeCap(SkPaint::kRound_Cap); p.setStrokeJoin(SkPaint::kRound_Join); p.setAntiAlias(fAA); p.setPathEffect(new SkCornerPathEffect(55))->unref(); writerCanvas->drawPath(fCurrLine, p); writer.endRecording(); controller.writeToSocket(fSocket, fType); if (fType == SkSocket::kPipeAppend_type && fSocket) { fSocket->suspendWrite(); fCurrLine.reset(); } this->inval(NULL); }