Beispiel #1
0
    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);
    }
Beispiel #2
0
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);
}
Beispiel #3
0
    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);
    }