blob: 4c005b59408f805b714f99dc6cfa3177673500d0 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_COMPOSITOR_LAYER_NINE_PATCH_H_
#define UI_COMPOSITOR_LAYER_NINE_PATCH_H_
#include "base/memory/scoped_refptr.h"
#include "ui/compositor/compositor_export.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/image/image_skia.h"
namespace cc {
class NinePatchLayer;
} // namespace cc
namespace ui {
// A layer that displays a resizable 9-patch bitmap with scalable borders
// and center aperture, backed by a cc::NinePatchLayer.
class COMPOSITOR_EXPORT LayerNinePatch : public Layer {
public:
static constexpr LayerType kType = LAYER_NINE_PATCH;
LayerNinePatch();
LayerNinePatch(const LayerNinePatch&) = delete;
LayerNinePatch& operator=(const LayerNinePatch&) = delete;
~LayerNinePatch() override;
const gfx::Rect& border() const;
const gfx::Rect& aperture() const;
const gfx::Rect& occlusion() const;
// Layer:
bool ShouldSchedulePaint() const override;
// Updates the nine patch layer's image, aperture and border.
void UpdateNinePatchLayerImage(const gfx::ImageSkia& image);
void UpdateNinePatchLayerAperture(const gfx::Rect& aperture_in_dip);
void UpdateNinePatchLayerBorder(const gfx::Rect& border);
// Updates the area completely occluded by another layer, this can be an
// empty rectangle if nothing is occluded.
void UpdateNinePatchOcclusion(const gfx::Rect& occlusion);
private:
// Layer:
void HandleDeviceScaleFactorChange() override;
void Reset() override;
void OnPaintScheduled() override;
// A cached copy of the nine patch layer's image and aperture.
// These are required for device scale factor change.
gfx::ImageSkia nine_patch_layer_image_;
gfx::Rect nine_patch_layer_aperture_;
scoped_refptr<cc::NinePatchLayer> nine_patch_layer_;
};
} // namespace ui
#endif // UI_COMPOSITOR_LAYER_NINE_PATCH_H_