blob: 135fdb778bc8769b432238978c9aabc3fcf495fb [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_VIZ_COMMON_QUADS_TEXTURE_DRAW_QUAD_H_
#define COMPONENTS_VIZ_COMMON_QUADS_TEXTURE_DRAW_QUAD_H_
#include <array>
#include <optional>
#include "cc/paint/paint_flags.h"
#include "components/viz/common/quads/draw_quad.h"
#include "components/viz/common/resources/resource_id.h"
#include "components/viz/common/viz_common_export.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/video_types.h"
namespace viz {
// The priority for a quads to require being promoted to overlay.
enum class OverlayPriority { kLow, kRegular, kRequired };
class VIZ_COMMON_EXPORT TextureDrawQuad : public DrawQuad {
public:
static constexpr Material kMaterial = Material::kTextureContent;
TextureDrawQuad();
TextureDrawQuad(const TextureDrawQuad& other);
~TextureDrawQuad() override;
void SetNew(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
const gfx::Rect& visible_rect,
bool needs_blending,
ResourceId resource_id,
const gfx::PointF& top_left,
const gfx::PointF& bottom_right,
SkColor4f background,
bool nearest,
bool secure_output,
gfx::ProtectedVideoType video_type);
void SetAll(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
const gfx::Rect& visible_rect,
bool needs_blending,
ResourceId resource_id,
const gfx::PointF& top_left,
const gfx::PointF& bottom_right,
SkColor4f background,
bool nearest,
bool secure_output,
gfx::ProtectedVideoType video_type);
gfx::PointF uv_top_left;
gfx::PointF uv_bottom_right;
SkColor4f background_color = SkColors::kTransparent;
cc::PaintFlags::DynamicRangeLimitMixture dynamic_range_limit;
bool nearest_neighbor : 1;
// True if the quad must only be GPU composited if shown on secure outputs.
bool secure_output_only : 1;
// True if this quad contains a video frame from VideoResourceUpdater instead
// of canvas or webgl content.
bool is_video_frame : 1;
// If true we will treat the alpha in the texture as 1. This works like rgbx
// and not like blend mode 'kSrc' which would copy the alpha.
bool force_rgbx : 1 = false;
// kClear if the contents do not require any special protection. See enum of a
// list of protected content types. Protected contents cannot be displayed via
// regular display path. They need either a protected output or a protected
// hardware overlay.
gfx::ProtectedVideoType protected_video_type : 2;
// The overlay promotion hint.
OverlayPriority overlay_priority_hint = OverlayPriority::kRegular;
// This optional damage is in target render pass coordinate space.
std::optional<gfx::Rect> damage_rect;
struct VIZ_COMMON_EXPORT RoundedDisplayMasksInfo {
static constexpr size_t kMaxRoundedDisplayMasksCount = 2;
static constexpr size_t kOriginRoundedDisplayMaskIndex = 0;
static constexpr size_t kOtherRoundedDisplayMaskIndex = 1;
static RoundedDisplayMasksInfo CreateRoundedDisplayMasksInfo(
int origin_rounded_display_mask_radius,
int other_rounded_display_mask_radius,
bool is_horizontally_positioned = true);
// Returns the bounds of rounded display masks in target space that are
// associated with the `quad`.
static std::array<gfx::RectF, kMaxRoundedDisplayMasksCount>
GetRoundedDisplayMasksBounds(const DrawQuad* quad);
RoundedDisplayMasksInfo();
bool IsEmpty() const;
bool is_horizontally_positioned = true;
// Radii of display's rounded corners masks in pixels.
std::array<uint8_t, kMaxRoundedDisplayMasksCount> radii = {0, 0};
};
// Encodes the radii(in pixels) and position of rounded-display mask textures
// in target space.
//
// Radius at index `kOriginRoundedDisplayMaskIndex` is always drawn at origin,
// whereas radius at index `kOtherRoundedDisplayMaskIndex` is drawn either at
// the upper right corner or lower left corner based on
// `is_horizontally_positioned`.
//
// For example: If the resource in target space has dimensions of (10, 10,
// 100, 50) and both radii has value of 15, the masks are drawn at bounds (10,
// 10, 15, 15) and (95, 10, 15, 15) if `is_horizontally_positioned` is true
// otherwise the masks are drawn at bounds (10, 10, 15, 15) and (10, 45, 15,
// 15).
RoundedDisplayMasksInfo rounded_display_masks_info;
void set_force_rgbx(bool force_rgbx_value = true) {
force_rgbx = force_rgbx_value;
}
static const TextureDrawQuad* MaterialCast(const DrawQuad*);
private:
void ExtendValue(base::trace_event::TracedValue* value) const override;
};
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_QUADS_TEXTURE_DRAW_QUAD_H_