1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63

cc / slim / nine_patch_layer.h [blame]

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_SLIM_NINE_PATCH_LAYER_H_
#define CC_SLIM_NINE_PATCH_LAYER_H_

#include "base/component_export.h"
#include "cc/layers/nine_patch_generator.h"
#include "cc/slim/ui_resource_layer.h"
#include "ui/gfx/geometry/rect.h"

namespace cc::slim {

class COMPONENT_EXPORT(CC_SLIM) NinePatchLayer : public UIResourceLayer {
 public:
  static scoped_refptr<NinePatchLayer> Create();

  // |border| is the space around the center rectangular region in layer space
  // (known as aperture in image space).  |border.x()| and |border.y()| are the
  // size of the left and top boundary, respectively.
  // |border.width()-border.x()| and |border.height()-border.y()| are the size
  // of the right and bottom boundary, respectively.
  // TODO(boliu): Should use gfx::Inset instead of gfx::Rect once this can
  // diverge from cc.
  void SetBorder(const gfx::Rect& border);

  // aperture is in the pixel space of the bitmap resource and refers to
  // the center patch of the ninepatch.  We split off eight rects surrounding
  // it and stick them on the edges of the layer. The corners are unscaled, the
  // top and bottom rects are x-stretched to fit, and the left and right rects
  // are y-stretched to fit.
  void SetAperture(const gfx::Rect& aperture);

  // Set whether to draw the center patch or not.
  void SetFillCenter(bool fill_center);

  // Use nearest neighbor sampling instead of linear (weighted average of 4
  // closest pixels) when sampling from the bitmap.
  void SetNearestNeighbor(bool nearest_neighbor);

  void AppendQuads(viz::CompositorRenderPass& render_pass,
                   FrameData& data,
                   const gfx::Transform& transform_to_root,
                   const gfx::Transform& transform_to_target,
                   const gfx::Rect* clip_in_target,
                   const gfx::Rect& visible_rect,
                   float opacity) override;

 private:
  NinePatchLayer();
  ~NinePatchLayer() override;

  gfx::Rect border_;
  gfx::Rect aperture_;
  bool fill_center_ = false;
  bool nearest_neighbor_ = false;
  cc::NinePatchGenerator quad_generator_;
};

}  // namespace cc::slim

#endif  // CC_SLIM_NINE_PATCH_LAYER_H_