1c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org/*
2c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * Copyright 2014 Google Inc.
3c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org *
4c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * found in the LICENSE file.
6c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org */
7c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org
818fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org#ifndef SkRecording_DEFINED
918fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org#define SkRecording_DEFINED
1018fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
11732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org#include "SkCanvas.h"     // SkCanvas
12732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org#include "SkRefCnt.h"     // SkAutoTUnref
13732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org#include "SkTemplates.h"  // SkAutoTDelete
14732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org#include "SkTypes.h"      // SkNoncopyable
1518fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
1618fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org// These are intentionally left opaque.
1718fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.orgclass SkRecord;
1818fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.orgclass SkRecorder;
1918fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
2018fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.orgnamespace EXPERIMENTAL {
2118fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
2218fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org/** Easy mode interface to SkRecord-based SkCanvas recording.
2318fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *
24732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org *  scoped_ptr<SkRecording> recording(new SkRecording(1920, 1080));
25732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org *  skia::RefPtr<SkCanvas> canvas(skia::SharePtr(recording->canvas()));
2618fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *
2718fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *  canvas->drawThis();
2818fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *  canvas->clipThat();
2918fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *  ...
3018fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *
31732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org *  canvas.clear();  // You must deref the canvas before you may call releasePlayback().
32732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org *  scoped_ptr<const SkPlayback> playback(recording->releasePlayback());
3318fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *  playback->draw(&someCanvas);
3418fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *  playback->draw(&someOtherCanvas);
3518fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *
3618fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org *  SkPlayback is thread safe; SkRecording is not.
3718fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org */
3818fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
3919bce5fc4b17f544b524a2d4bacf5a312af31fcccommit-bot@chromium.orgclass SK_API SkPlayback : SkNoncopyable {
4018fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.orgpublic:
4118fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    // Remember, if you've got an SkPlayback*, you probably own it.  Don't forget to delete it!
4218fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    ~SkPlayback();
4318fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
4418fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    // Draw recorded commands into a canvas.
4518fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    void draw(SkCanvas*) const;
4618fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
4718fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.orgprivate:
4818fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    explicit SkPlayback(const SkRecord*);
4918fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
50732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    SkAutoTDelete<const SkRecord> fRecord;
5118fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
5218fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    friend class SkRecording;
5318fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org};
5418fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
5519bce5fc4b17f544b524a2d4bacf5a312af31fcccommit-bot@chromium.orgclass SK_API SkRecording : SkNoncopyable {
5618fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.orgpublic:
57732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    SkRecording(int width, int height);
58732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    ~SkRecording();
5918fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
6018fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    // Draws issued to this canvas will be replayed by SkPlayback::draw().
61732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    // Any refs held on canvas() must be dropped before you may call releasePlayback().
6218fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org    SkCanvas* canvas();
6318fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
64732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    // Release exclusive ownership of an SkPlayback to the caller.
65732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    // Any refs held on canvas() must be dropped before you may call releasePlayback().
66732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    SkPlayback* releasePlayback();
6718fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
68732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.orgprivate:
69732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    SkAutoTDelete<SkRecord> fRecord;
70732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    SkAutoTUnref<SkRecorder> fRecorder;
7118fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org};
7218fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
7318fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org}  // namespace EXPERIMENTAL
7418fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org
7518fd2b923a5060175ab4e446e73a73cba581c20dcommit-bot@chromium.org#endif//SkRecording_DEFINED
76