1ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips/*
2ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips * Copyright 2014 Google Inc.
3ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips *
4ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips * Use of this source code is governed by a BSD-style license that can be
5ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips * found in the LICENSE file.
6ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips */
7ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
8ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips#ifndef SkPicturePlayback_DEFINED
9ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips#define SkPicturePlayback_DEFINED
10ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
111ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips#include "SkPictureFlat.h"  // for DrawType
12ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
13ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipsclass SkBitmap;
14ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipsclass SkCanvas;
15ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipsclass SkPaint;
16ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipsclass SkPictureData;
17ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
18c26d991bf2d85bb1843a21b0a4f861212b0eacedrobertphillips// The basic picture playback class replays the provided picture into a canvas.
1999e20891a080f39113bd7a5dc202730f2a13fa07robertphillipsclass SkPicturePlayback final : SkNoncopyable {
20ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipspublic:
21c6ad9eefa0f8d0c2ede9884b446c65dde9b04dd1mtklein    SkPicturePlayback(const SkPictureData* data)
22c6ad9eefa0f8d0c2ede9884b446c65dde9b04dd1mtklein        : fPictureData(data)
2346616af01b412ea984a516fda1ed8ec08e689f29mtklein        , fCurOffset(0) {
24ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    }
25ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
26d921dbb9b88327eef7b1fbd42e9d88bace4a65ffreed    void draw(SkCanvas* canvas, SkPicture::AbortCallback*, SkReadBuffer* buffer);
27ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
28c26d991bf2d85bb1843a21b0a4f861212b0eacedrobertphillips    // TODO: remove the curOp calls after cleaning up GrGatherDevice
29ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    // Return the ID of the operation currently being executed when playing
30ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    // back. 0 indicates no call is active.
31ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    size_t curOpID() const { return fCurOffset; }
32ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    void resetOpID() { fCurOffset = 0; }
33ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
34ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipsprotected:
35ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    const SkPictureData* fPictureData;
36ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
37ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    // The offset of the current operation when within the draw method
38ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    size_t fCurOffset;
39ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
409ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips    void handleOp(SkReadBuffer* reader,
4146616af01b412ea984a516fda1ed8ec08e689f29mtklein                  DrawType op,
4246616af01b412ea984a516fda1ed8ec08e689f29mtklein                  uint32_t size,
433afef1f75f710b8f183113cdc5188416f7d01f28robertphillips                  SkCanvas* canvas,
443afef1f75f710b8f183113cdc5188416f7d01f28robertphillips                  const SkMatrix& initialMatrix);
453afef1f75f710b8f183113cdc5188416f7d01f28robertphillips
469ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips    static DrawType ReadOpAndSize(SkReadBuffer* reader, uint32_t* size);
471ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips
481ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips    class AutoResetOpID {
491ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips    public:
501ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips        AutoResetOpID(SkPicturePlayback* playback) : fPlayback(playback) { }
511ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips        ~AutoResetOpID() {
5249f085dddff10473b6ebf832a974288300224e60bsalomon            if (fPlayback) {
531ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips                fPlayback->resetOpID();
541ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips            }
551ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips        }
561ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips
571ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips    private:
581ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips        SkPicturePlayback* fPlayback;
591ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips    };
601ad00e4b245d464c16ba78bdaa377281f29972cdrobertphillips
61ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillipsprivate:
62ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    typedef SkNoncopyable INHERITED;
63ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips};
64ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips
65ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips#endif
66