// 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 LayoutObjectDrawingRecorder_h
#define LayoutObjectDrawingRecorder_h

#include "core/layout/LayoutObject.h"
#include "core/paint/PaintPhase.h"
#include "platform/geometry/LayoutPoint.h"
#include "platform/geometry/LayoutRect.h"
#include "platform/graphics/paint/DisplayItemCacheSkipper.h"
#include "platform/graphics/paint/DrawingRecorder.h"
#include "wtf/Allocator.h"
#include "wtf/Optional.h"

namespace blink {

class GraphicsContext;

// Convenience wrapper of DrawingRecorder for LayoutObject painters.
class LayoutObjectDrawingRecorder final {
  DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();

 public:
  static bool useCachedDrawingIfPossible(GraphicsContext& context,
                                         const LayoutObject& layoutObject,
                                         DisplayItem::Type displayItemType) {
    if (layoutObject.fullPaintInvalidationReason() ==
        PaintInvalidationDelayedFull)
      return false;
    return DrawingRecorder::useCachedDrawingIfPossible(context, layoutObject,
                                                       displayItemType);
  }

  static bool useCachedDrawingIfPossible(GraphicsContext& context,
                                         const LayoutObject& layoutObject,
                                         PaintPhase phase) {
    return useCachedDrawingIfPossible(
        context, layoutObject, DisplayItem::paintPhaseToDrawingType(phase));
  }

  LayoutObjectDrawingRecorder(GraphicsContext& context,
                              const LayoutObject& layoutObject,
                              DisplayItem::Type displayItemType,
                              const FloatRect& clip) {
    // We may paint a delayed-invalidation object before it's actually
    // invalidated.
    if (layoutObject.fullPaintInvalidationReason() ==
        PaintInvalidationDelayedFull)
      m_cacheSkipper.emplace(context);
    m_drawingRecorder.emplace(context, layoutObject, displayItemType, clip);
  }

  LayoutObjectDrawingRecorder(GraphicsContext& context,
                              const LayoutObject& layoutObject,
                              DisplayItem::Type displayItemType,
                              const LayoutRect& clip)
      : LayoutObjectDrawingRecorder(context,
                                    layoutObject,
                                    displayItemType,
                                    FloatRect(clip)) {}

  LayoutObjectDrawingRecorder(GraphicsContext& context,
                              const LayoutObject& layoutObject,
                              PaintPhase phase,
                              const FloatRect& clip)
      : LayoutObjectDrawingRecorder(context,
                                    layoutObject,
                                    DisplayItem::paintPhaseToDrawingType(phase),
                                    clip) {}

  LayoutObjectDrawingRecorder(GraphicsContext& context,
                              const LayoutObject& layoutObject,
                              PaintPhase phase,
                              const LayoutRect& clip)
      : LayoutObjectDrawingRecorder(context,
                                    layoutObject,
                                    DisplayItem::paintPhaseToDrawingType(phase),
                                    FloatRect(clip)) {}

  LayoutObjectDrawingRecorder(GraphicsContext& context,
                              const LayoutObject& layoutObject,
                              PaintPhase phase,
                              const IntRect& clip)
      : LayoutObjectDrawingRecorder(context,
                                    layoutObject,
                                    DisplayItem::paintPhaseToDrawingType(phase),
                                    FloatRect(clip)) {}

  void setKnownToBeOpaque() {
    ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
    m_drawingRecorder->setKnownToBeOpaque();
  }

 private:
  Optional<DisplayItemCacheSkipper> m_cacheSkipper;
  Optional<DrawingRecorder> m_drawingRecorder;
};

}  // namespace blink

#endif  // LayoutObjectDrawingRecorder_h
