[go: nahoru, domu]

blob: 9eaca49bd3638b6ba5cca73992170dc242782f0d [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_PAINT_PAINT_RECORD_H_
#define CC_PAINT_PAINT_RECORD_H_
#include "cc/paint/paint_export.h"
#include "cc/paint/paint_op_buffer.h"
#include "third_party/skia/include/core/SkPicture.h"
class SkMatrix;
struct SkRect;
namespace cc {
class ImageProvider;
// Contains recorded paint result. It's basically a read-only (except for
// assignment/movement) version of PaintOpBuffer returned from PaintOpBuffer::
// ReleaseAsRecord(). Copy/assignment and movement are cheap, and movement is
// preferred to copy/assignment when possible. On copy/assignment, the new
// PaintRecord shares the same underlying data with the source.
class CC_PAINT_EXPORT PaintRecord {
public:
PaintRecord();
~PaintRecord();
// After move, the source is invalid (with nullptr buffer_) and can't be
// used anymore.
PaintRecord(PaintRecord&&);
PaintRecord& operator=(PaintRecord&&);
PaintRecord(const PaintRecord&);
PaintRecord& operator=(const PaintRecord&);
bool EqualsForTesting(const PaintRecord& other) const {
return buffer_->EqualsForTesting(*other.buffer_);
}
const PaintOpBuffer& buffer() const {
CHECK(buffer_);
return *buffer_;
}
size_t size() const { return buffer_->size(); }
bool empty() const { return buffer_->empty(); }
size_t bytes_used() const { return buffer_->bytes_used(); }
size_t paint_ops_size() const { return buffer_->paint_ops_size(); }
size_t total_op_count() const { return buffer_->total_op_count(); }
int num_slow_paths_up_to_min_for_MSAA() const {
return buffer_->num_slow_paths_up_to_min_for_MSAA();
}
bool HasNonAAPaint() const { return buffer_->HasNonAAPaint(); }
bool HasDiscardableImages() const { return buffer_->HasDiscardableImages(); }
bool has_draw_ops() const { return buffer_->has_draw_ops(); }
bool has_draw_text_ops() const { return buffer_->has_draw_text_ops(); }
bool has_save_layer_ops() const { return buffer_->has_save_layer_ops(); }
bool has_save_layer_alpha_ops() const {
return buffer_->has_save_layer_alpha_ops();
}
bool has_effects_preventing_lcd_text_for_save_layer_alpha() const {
return buffer_->has_effects_preventing_lcd_text_for_save_layer_alpha();
}
const PaintOp& GetFirstOp() const { return buffer_->GetFirstOp(); }
// Given the |bounds| of a PaintOpBuffer that would be transformed by |ctm|
// when rendered, compute the bounds needed to raster the buffer at a fixed
// scale into an auxiliary image instead of rasterizing at scale dynamically.
// This is used to enforce scaling decisions made pre-serialization when
// rasterizing after deserializing the buffer.
static SkRect GetFixedScaleBounds(const SkMatrix& ctm,
const SkRect& bounds,
int max_texture_size);
sk_sp<SkPicture> ToSkPicture(
const SkRect& bounds,
ImageProvider* image_provider = nullptr,
PlaybackParams::CustomDataRasterCallback callback =
PlaybackParams::CustomDataRasterCallback(),
PlaybackParams::ConvertOpCallback convert_op_callback =
PlaybackParams::ConvertOpCallback()) const;
// Replays the paint record into the canvas.
void Playback(SkCanvas* canvas) const { buffer_->Playback(canvas); }
void Playback(SkCanvas* canvas, const PlaybackParams& params) const {
buffer_->Playback(canvas, params);
}
// STL-like container support:
using value_type = PaintOp;
using const_iterator = PaintOpBuffer::Iterator;
const_iterator begin() const;
const_iterator end() const;
private:
friend class PaintOpBuffer;
explicit PaintRecord(sk_sp<PaintOpBuffer> buffer);
// This is never nullptr.
sk_sp<PaintOpBuffer> buffer_;
};
} // namespace cc
#endif // CC_PAINT_PAINT_RECORD_H_