blob: fee1c0b63ab76c97c8a520a108787aa3a3fc89e4 [file] [log] [blame]
// Copyright 2014 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 RecordingImageBufferSurface_h
#define RecordingImageBufferSurface_h
#include <memory>
#include "platform/graphics/GraphicsContext.h"
#include "platform/graphics/ImageBufferSurface.h"
#include "platform/wtf/Allocator.h"
#include "platform/wtf/Noncopyable.h"
#include "public/platform/WebThread.h"
#include "third_party/skia/include/core/SkRefCnt.h"
namespace blink {
class ImageBuffer;
class UnacceleratedImageBufferSurface;
class PLATFORM_EXPORT RecordingImageBufferSurface : public ImageBufferSurface {
WTF_MAKE_NONCOPYABLE(RecordingImageBufferSurface);
USING_FAST_MALLOC(RecordingImageBufferSurface);
public:
enum AllowFallback : bool { kDisallowFallback, kAllowFallback };
// If |AllowFallback| is kDisallowFallback the buffer surface should only be
// used for one frame and should not be used for any operations which need a
// raster surface, (i.e. WritePixels()).
// Only GetRecord() should be used to access the resulting frame.
RecordingImageBufferSurface(const IntSize&,
AllowFallback,
const CanvasColorParams& = CanvasColorParams());
~RecordingImageBufferSurface() override;
// Implementation of ImageBufferSurface interfaces
PaintCanvas* Canvas() override;
void DisableDeferral(DisableDeferralReason) override;
sk_sp<PaintRecord> GetRecord() override;
void Flush(FlushReason) override;
void DidDraw(const FloatRect&) override;
bool IsValid() const override { return true; }
bool IsRecording() const override { return !fallback_surface_; }
bool WritePixels(const SkImageInfo& orig_info,
const void* pixels,
size_t row_bytes,
int x,
int y) override;
void WillOverwriteCanvas() override;
void FinalizeFrame() override;
void DoPaintInvalidation(const FloatRect&) override;
void SetImageBuffer(ImageBuffer*) override;
scoped_refptr<StaticBitmapImage> NewImageSnapshot(AccelerationHint,
SnapshotReason) override;
void Draw(GraphicsContext&,
const FloatRect& dest_rect,
const FloatRect& src_rect,
SkBlendMode) override;
bool IsExpensiveToPaint() override;
void SetHasExpensiveOp() override { current_frame_has_expensive_op_ = true; }
// Passthroughs to fallback surface
bool Restore() override;
WebLayer* Layer() const override;
bool IsAccelerated() const override;
void SetIsHidden(bool) override;
// This enum is used in a UMA histogram.
enum FallbackReason {
kFallbackReasonUnknown =
0, // This value should never appear in production histograms
kFallbackReasonCanvasNotClearedBetweenFrames = 1,
kFallbackReasonRunawayStateStack = 2,
kFallbackReasonWritePixels = 3,
kFallbackReasonFlushInitialClear = 4,
kFallbackReasonFlushForDrawImageOfWebGL = 5,
kFallbackReasonSnapshotForGetImageData = 6,
kFallbackReasonSnapshotForPaint = 8,
kFallbackReasonSnapshotForToDataURL = 9,
kFallbackReasonSnapshotForToBlob = 10,
kFallbackReasonSnapshotForCanvasListenerCapture = 11,
kFallbackReasonSnapshotForDrawImage = 12,
kFallbackReasonSnapshotForCreatePattern = 13,
kFallbackReasonExpensiveOverdrawHeuristic = 14,
kFallbackReasonTextureBackedPattern = 15,
kFallbackReasonDrawImageOfVideo = 16,
kFallbackReasonDrawImageOfAnimated2dCanvas = 17,
kFallbackReasonSubPixelTextAntiAliasingSupport = 18,
kFallbackReasonDrawImageWithTextureBackedSourceImage = 19,
kFallbackReasonSnapshotForTransferToImageBitmap = 20,
kFallbackReasonSnapshotForUnitTests =
21, // This value should never appear in production histograms
kFallbackReasonSnapshotGetCopiedImage = 22,
kFallbackReasonSnapshotWebGLDrawImageIntoBuffer = 23,
kFallbackReasonSnapshotForWebGLTexImage2D = 24,
kFallbackReasonSnapshotForWebGLTexSubImage2D = 25,
kFallbackReasonSnapshotForWebGLTexImage3D = 26,
kFallbackReasonSnapshotForWebGLTexSubImage3D = 27,
kFallbackReasonSnapshotForCopyToClipboard = 28,
kFallbackReasonSnapshotForCreateImageBitmap = 29,
kFallbackReasonCount,
};
private:
void FallBackToRasterCanvas(FallbackReason);
void InitializeCurrentFrame();
bool FinalizeFrameInternal(FallbackReason*);
int ApproximateOpCount();
const AllowFallback allow_fallback_;
std::unique_ptr<PaintRecorder> current_frame_;
sk_sp<PaintRecord> previous_frame_;
std::unique_ptr<UnacceleratedImageBufferSurface> fallback_surface_;
ImageBuffer* image_buffer_;
int initial_save_count_;
int current_frame_pixel_count_;
int previous_frame_pixel_count_;
bool frame_was_cleared_;
bool did_record_draw_commands_in_current_frame_;
bool current_frame_has_expensive_op_;
bool previous_frame_has_expensive_op_;
};
} // namespace blink
#endif