// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CC_PAINT_PAINT_IMAGE_BUILDER_H_ #define CC_PAINT_PAINT_IMAGE_BUILDER_H_ #include "cc/paint/paint_export.h" #include "cc/paint/paint_image.h" #include "cc/paint/paint_image_generator.h" #include "cc/paint/paint_op_buffer.h" #include "cc/paint/skia_paint_image_generator.h" #include "third_party/skia/include/core/SkImage.h" namespace cc { // Class used to construct a paint image. class CC_PAINT_EXPORT PaintImageBuilder { public: static PaintImageBuilder WithDefault(); // Starts with the given images. Everything, including the "contents" of the // image are copied. static PaintImageBuilder WithCopy(PaintImage image); // Starts with the given image's flags. Note that this does _not_ keep the // "contents" of the image. That is, it clears the cached SkImage, the set // SkImage, the set PaintRecord, and any other content type variables. static PaintImageBuilder WithProperties(PaintImage image); PaintImageBuilder(PaintImageBuilder&& other); ~PaintImageBuilder(); PaintImageBuilder&& set_id(PaintImage::Id id) { paint_image_.id_ = id; #if DCHECK_IS_ON() id_set_ = true; #endif return std::move(*this); } PaintImageBuilder&& set_image(sk_sp sk_image, PaintImage::ContentId content_id) { paint_image_.sk_image_ = std::move(sk_image); paint_image_.content_id_ = content_id; return std::move(*this); } PaintImageBuilder&& set_paint_record(sk_sp paint_record, const gfx::Rect& rect, PaintImage::ContentId content_id) { DCHECK_NE(content_id, PaintImage::kInvalidContentId); paint_image_.paint_record_ = std::move(paint_record); paint_image_.paint_record_rect_ = rect; paint_image_.content_id_ = content_id; return std::move(*this); } PaintImageBuilder&& set_paint_image_generator( sk_sp generator) { paint_image_.paint_image_generator_ = std::move(generator); return std::move(*this); } PaintImageBuilder&& set_animation_type(PaintImage::AnimationType type) { paint_image_.animation_type_ = type; return std::move(*this); } PaintImageBuilder&& set_completion_state(PaintImage::CompletionState state) { paint_image_.completion_state_ = state; return std::move(*this); } PaintImageBuilder&& set_is_multipart(bool is_multipart) { paint_image_.is_multipart_ = is_multipart; return std::move(*this); } PaintImageBuilder&& set_frame_index(size_t frame_index) { paint_image_.frame_index_ = frame_index; return std::move(*this); } PaintImageBuilder&& set_repetition_count(int count) { paint_image_.repetition_count_ = count; return std::move(*this); } PaintImageBuilder&& set_reset_animation_sequence_id( PaintImage::AnimationSequenceId id) { paint_image_.reset_animation_sequence_id_ = id; return std::move(*this); } // Makes the PaintImage represent a subset of the original image. The // subset must be non-empty and lie within the image bounds. PaintImageBuilder&& make_subset(const gfx::Rect& subset) { paint_image_ = paint_image_.MakeSubset(subset); return std::move(*this); } PaintImageBuilder&& set_decoding_mode( PaintImage::DecodingMode decoding_mode) { paint_image_.decoding_mode_ = decoding_mode; return std::move(*this); } PaintImage TakePaintImage(); private: PaintImageBuilder(); PaintImageBuilder(PaintImage starting_image, bool clear_contents); PaintImage paint_image_; #if DCHECK_IS_ON() bool id_set_ = false; #endif }; } // namespace cc #endif // CC_PAINT_PAINT_IMAGE_BUILDER_H_