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

#include <stddef.h>
#include <stdint.h>

#include <memory>
#include <string>
#include <utility>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "cc/blink/cc_blink_export.h"
#include "cc/layers/layer_client.h"
#include "third_party/WebKit/public/platform/WebColor.h"
#include "third_party/WebKit/public/platform/WebDoublePoint.h"
#include "third_party/WebKit/public/platform/WebFloatPoint.h"
#include "third_party/WebKit/public/platform/WebLayer.h"
#include "third_party/WebKit/public/platform/WebPoint.h"
#include "third_party/WebKit/public/platform/WebRect.h"
#include "third_party/WebKit/public/platform/WebSize.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebVector.h"
#include "third_party/skia/include/core/SkMatrix44.h"

namespace blink {
struct WebFloatRect;
}

namespace base {
namespace trace_event {
class ConvertableToTraceFormat;
}
}

namespace cc {
class FilterOperations;
class Layer;
}

namespace cc_blink {

class WebLayerImpl : public blink::WebLayer {
 public:
  CC_BLINK_EXPORT WebLayerImpl();
  CC_BLINK_EXPORT explicit WebLayerImpl(scoped_refptr<cc::Layer>);
  ~WebLayerImpl() override;

  CC_BLINK_EXPORT cc::Layer* layer() const;

  // If set to true, content opaqueness cannot be changed using setOpaque.
  // However, it can still be modified using SetContentsOpaque on the
  // cc::Layer.
  CC_BLINK_EXPORT void SetContentsOpaqueIsFixed(bool fixed);

  // WebLayer implementation.
  int id() const override;
  void invalidateRect(const blink::WebRect&) override;
  void invalidate() override;
  void addChild(blink::WebLayer* child) override;
  void insertChild(blink::WebLayer* child, size_t index) override;
  void replaceChild(blink::WebLayer* reference,
                    blink::WebLayer* new_layer) override;
  void removeFromParent() override;
  void removeAllChildren() override;
  void setBounds(const blink::WebSize& bounds) override;
  blink::WebSize bounds() const override;
  void setMasksToBounds(bool masks_to_bounds) override;
  bool masksToBounds() const override;
  void setMaskLayer(blink::WebLayer* mask) override;
  void setReplicaLayer(blink::WebLayer* replica) override;
  void setOpacity(float opacity) override;
  float opacity() const override;
  void setBlendMode(blink::WebBlendMode blend_mode) override;
  blink::WebBlendMode blendMode() const override;
  void setIsRootForIsolatedGroup(bool root) override;
  bool isRootForIsolatedGroup() override;
  void setOpaque(bool opaque) override;
  bool opaque() const override;
  void setPosition(const blink::WebFloatPoint& position) override;
  blink::WebFloatPoint position() const override;
  void setTransform(const SkMatrix44& transform) override;
  void setTransformOrigin(const blink::WebFloatPoint3D& point) override;
  blink::WebFloatPoint3D transformOrigin() const override;
  SkMatrix44 transform() const override;
  void setDrawsContent(bool draws_content) override;
  bool drawsContent() const override;
  void setDoubleSided(bool double_sided) override;
  void setShouldFlattenTransform(bool flatten) override;
  void setRenderingContext(int context) override;
  void setUseParentBackfaceVisibility(bool visible) override;
  void setBackgroundColor(blink::WebColor color) override;
  blink::WebColor backgroundColor() const override;
  void setFilters(const cc::FilterOperations& filters) override;
  void setBackgroundFilters(const cc::FilterOperations& filters) override;
  bool hasActiveAnimationForTesting() override;
  void setScrollPositionDouble(blink::WebDoublePoint position) override;
  blink::WebDoublePoint scrollPositionDouble() const override;
  void setScrollClipLayer(blink::WebLayer* clip_layer) override;
  bool scrollable() const override;
  void setUserScrollable(bool horizontal, bool vertical) override;
  bool userScrollableHorizontal() const override;
  bool userScrollableVertical() const override;
  void addMainThreadScrollingReasons(
      uint32_t main_thread_scrolling_reasons) override;
  void clearMainThreadScrollingReasons(
      uint32_t main_thread_scrolling_reasons_to_clear) override;
  uint32_t mainThreadScrollingReasons() override;
  bool shouldScrollOnMainThread() const override;
  void setNonFastScrollableRegion(
      const blink::WebVector<blink::WebRect>& region) override;
  blink::WebVector<blink::WebRect> nonFastScrollableRegion() const override;
  void setTouchEventHandlerRegion(
      const blink::WebVector<blink::WebRect>& region) override;
  blink::WebVector<blink::WebRect> touchEventHandlerRegion() const override;
  void setIsContainerForFixedPositionLayers(bool is_container) override;
  bool isContainerForFixedPositionLayers() const override;
  void setPositionConstraint(
      const blink::WebLayerPositionConstraint& constraint) override;
  blink::WebLayerPositionConstraint positionConstraint() const override;
  void setScrollClient(blink::WebLayerScrollClient* client) override;
  void setLayerClient(cc::LayerClient* client) override;
  const cc::Layer* ccLayer() const override;
  cc::Layer* ccLayer() override;
  void setElementId(uint64_t id) override;
  uint64_t elementId() const override;
  void setCompositorMutableProperties(uint32_t properties) override;
  uint32_t compositorMutableProperties() const override;
  void setHasWillChangeTransformHint(bool has_will_change) override;

  void setScrollParent(blink::WebLayer* parent) override;
  void setClipParent(blink::WebLayer* parent) override;

 protected:
  scoped_refptr<cc::Layer> layer_;

  bool contents_opaque_is_fixed_;

 private:
  DISALLOW_COPY_AND_ASSIGN(WebLayerImpl);
};

}  // namespace cc_blink

#endif  // CC_BLINK_WEB_LAYER_IMPL_H_
