15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef UI_WM_CORE_IMAGE_GRID_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UI_WM_CORE_IMAGE_GRID_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_delegate.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/wm/wm_export.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Image;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace wm {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An ImageGrid is a 3x3 array of ui::Layers, each containing an image.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// As the grid is resized, its images fill the requested space:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - corner images are not scaled
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - top and bottom images are scaled horizontally
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - left and right images are scaled vertically
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - the center image is scaled in both directions
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If one of the non-center images is smaller than the largest images in its
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// row or column, it will be aligned with the outside of the grid.  For
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// example, given 4x4 top-left and top-right images and a 1x2 top images:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   +--------+---------------------+--------+
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   |        |         top         |        |
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | top-   +---------------------+  top-  +
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | left   |                     | right  |
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   +----+---+                     +---+----+
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   |    |                             |    |
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   ...
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This may seem odd at first, but it lets ImageGrid be used to draw shadows
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with curved corners that extend inwards beyond a window's borders.  In the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// below example, the top-left corner image is overlaid on top of the window's
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// top-left corner:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   +---------+-----------------------
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   |    ..xxx|XXXXXXXXXXXXXXXXXX
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   |  .xXXXXX|XXXXXXXXXXXXXXXXXX_____
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | .xXX    |                    ^ window's top edge
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | .xXX    |
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   +---------+
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | xXX|
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | xXX|< window's left edge
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   | xXX|
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   ...
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass WM_EXPORT ImageGrid {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper class for use by tests.
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  class WM_EXPORT TestAPI {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestAPI(ImageGrid* grid) : grid_(grid) {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect top_left_clip_rect() const {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return grid_->top_left_painter_->clip_rect_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect top_right_clip_rect() const {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return grid_->top_right_painter_->clip_rect_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect bottom_left_clip_rect() const {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return grid_->bottom_left_painter_->clip_rect_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect bottom_right_clip_rect() const {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return grid_->bottom_right_painter_->clip_rect_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns |layer|'s bounds after applying the layer's current transform.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RectF GetTransformedLayerBounds(const ui::Layer& layer);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImageGrid* grid_;  // not owned
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TestAPI);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImageGrid();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ImageGrid();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* layer() { return layer_.get(); }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int top_image_height() const { return top_image_height_; }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bottom_image_height() const { return bottom_image_height_; }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int left_image_width() const { return left_image_width_; }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int right_image_width() const { return right_image_width_; }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visible to allow independent layer animations and for testing.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* top_left_layer() const { return top_left_layer_.get(); }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* top_layer() const { return top_layer_.get(); }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* top_right_layer() const { return top_right_layer_.get(); }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* left_layer() const { return left_layer_.get(); }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* center_layer() const { return center_layer_.get(); }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* right_layer() const { return right_layer_.get(); }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* bottom_left_layer() const { return bottom_left_layer_.get(); }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* bottom_layer() const { return bottom_layer_.get(); }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* bottom_right_layer() const { return bottom_right_layer_.get(); }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the grid to display the passed-in images (any of which can be NULL).
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ownership of the images remains with the caller.  May be called more than
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once to switch images.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetImages(const gfx::Image* top_left_image,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* top_image,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* top_right_image,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* left_image,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* center_image,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* right_image,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* bottom_left_image,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* bottom_image,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gfx::Image* bottom_right_image);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(const gfx::Size& size);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the grid to a position and size such that the inner edges of the top,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bottom, left and right images will be flush with |content_bounds_in_dip|.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetContentBounds(const gfx::Rect& content_bounds_in_dip);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate responsible for painting a specific image on a layer.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ImagePainter : public ui::LayerDelegate {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ImagePainter(const gfx::ImageSkia& image) : image_(image) {}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~ImagePainter() {}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clips |layer| to |clip_rect|.  Triggers a repaint if the clipping
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rectangle has changed.  An empty rectangle disables clipping.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SetClipRect(const gfx::Rect& clip_rect, ui::Layer* layer);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ui::LayerDelegate implementation:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnDelegatedFrameDamage(
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const gfx::Rect& damage_rect_in_dip) OVERRIDE;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual base::Closure PrepareForLayerBoundsChange() OVERRIDE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class TestAPI;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::ImageSkia image_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect clip_rect_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ImagePainter);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  enum ImageType {
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    HORIZONTAL,
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    VERTICAL,
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NONE,
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets |layer_ptr| and |painter_ptr| to display |image| and adds the
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // passed-in layer to |layer_|.  If image is NULL resets |layer_ptr| and
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |painter_ptr| and removes any existing layer from |layer_|.
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If |type| is either HORIZONTAL or VERTICAL, it may resize the image to
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // guarantee that it has minimum size in order for scaling work properly
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // with fractional device scale factors. crbug.com/376519.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetImage(const gfx::Image* image,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                scoped_ptr<ui::Layer>* layer_ptr,
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                scoped_ptr<ImagePainter>* painter_ptr,
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                ImageType type);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layer that contains all of the image layers.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> layer_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The grid's dimensions.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Heights and widths of the images displayed by |top_layer_|,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |bottom_layer_|, |left_layer_|, and |right_layer_|.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int top_image_height_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bottom_image_height_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int left_image_width_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int right_image_width_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Heights of the tallest images in the top and bottom rows and the widest
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // images in the left and right columns.  Note that we may have less actual
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // space than this available if the images are large and |size_| is small.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base_top_row_height_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base_bottom_row_height_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base_left_column_width_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base_right_column_width_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layers used to display the various images.  Children of |layer_|.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Positions for which no images were supplied are NULL.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> top_left_layer_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> top_layer_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> top_right_layer_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> left_layer_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> center_layer_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> right_layer_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> bottom_left_layer_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> bottom_layer_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Layer> bottom_right_layer_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegates responsible for painting the above layers.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Positions for which no images were supplied are NULL.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> top_left_painter_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> top_painter_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> top_right_painter_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> left_painter_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> center_painter_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> right_painter_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> bottom_left_painter_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> bottom_painter_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImagePainter> bottom_right_painter_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ImageGrid);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace wm
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // UI_WM_CORE_IMAGE_GRID_H_
224