#include "SkBigPicture.h"
#include "SkData.h"
#include "SkDrawable.h"
-#include "SkImage.h"
#include "SkPictureRecorder.h"
#include "SkPictureUtils.h"
#include "SkRecord.h"
#include "SkRecordedDrawable.h"
#include "SkRecorder.h"
#include "SkTypes.h"
-#include "SkTLogic.h"
-
-namespace SkRecords {
-
- struct OptimizeFor {
- GrContext* fCtx;
-
- // A few ops have a top-level SkImage:
- void operator()(DrawAtlas* op) { this->make_texture(&op->atlas); }
- void operator()(DrawImage* op) { this->make_texture(&op->image); }
- void operator()(DrawImageNine* op) { this->make_texture(&op->image); }
- void operator()(DrawImageRect* op) { this->make_texture(&op->image); }
- void make_texture(sk_sp<const SkImage>* img) const {
- *img = (*img)->makeTextureImage(fCtx);
- }
-
- // Some ops have a paint, some have an optional paint.
- // Either way, get back a pointer.
- static SkPaint* AsPtr(SkPaint& p) { return &p; }
- static SkPaint* AsPtr(SkRecords::Optional<SkPaint>& p) { return p; }
-
- // For all other types of ops, look for images inside the paint.
- template <typename T>
- SK_WHEN(T::kTags & kHasPaint_Tag, void) operator()(T* op) {
- SkMatrix matrix;
- SkShader::TileMode xy[2];
-
- if (auto paint = AsPtr(op->paint))
- if (auto shader = paint->getShader())
- if (auto image = shader->isAImage(&matrix, xy)) {
- paint->setShader(image->makeTextureImage(fCtx)->makeShader(xy[0], xy[1], &matrix));
- }
-
- // TODO: re-build compose shaders
- }
-
- // Control ops, etc. Nothing to do for these.
- template <typename T>
- SK_WHEN(!(T::kTags & kHasPaint_Tag), void) operator()(T*) {}
- };
-
-} // namespace SkRecords
-
-static void optimize_for(GrContext* ctx, SkRecord* record) {
- for (int i = 0; ctx && i < record->count(); i++) {
- record->mutate(i, SkRecords::OptimizeFor{ctx});
- }
-}
SkPictureRecorder::SkPictureRecorder() {
fActivelyRecording = false;
// TODO: delay as much of this work until just before first playback?
SkRecordOptimize(fRecord);
- optimize_for(fGrContextToOptimizeFor, fRecord);
if (fRecord->count() == 0) {
if (finishFlags & kReturnNullForEmpty_FinishFlag) {
fRecorder->restoreToCount(1); // If we were missing any restores, add them now.
SkRecordOptimize(fRecord);
- optimize_for(fGrContextToOptimizeFor, fRecord);
if (fRecord->count() == 0) {
if (finishFlags & kReturnNullForEmpty_FinishFlag) {