summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-28 20:56:49 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-28 20:56:49 +0000
commit3676406485fd9d45aad8f9ed52b390c0c093b684 (patch)
treed9e66d45dedb69dc256643628b82b3e594f477a6 /views
parent259809616c917c440816b8637e2fbc066fc00eb6 (diff)
downloadchromium_src-3676406485fd9d45aad8f9ed52b390c0c093b684.zip
chromium_src-3676406485fd9d45aad8f9ed52b390c0c093b684.tar.gz
chromium_src-3676406485fd9d45aad8f9ed52b390c0c093b684.tar.bz2
Adds the ability for script to resize the menu.
BUG=23261 TEST=none Review URL: http://codereview.chromium.org/249020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27403 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/painter.cc141
-rw-r--r--views/painter.h62
2 files changed, 91 insertions, 112 deletions
diff --git a/views/painter.cc b/views/painter.cc
index 438c851..c710158 100644
--- a/views/painter.cc
+++ b/views/painter.cc
@@ -1,10 +1,11 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2009 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.
#include "views/painter.h"
#include "app/gfx/canvas.h"
+#include "app/gfx/insets.h"
#include "app/resource_bundle.h"
#include "base/logging.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -54,7 +55,77 @@ class GradientPainter : public Painter {
};
-}
+class ImagePainter : public Painter {
+ public:
+ ImagePainter(const SkBitmap& image, const gfx::Insets& insets)
+ : image_(image),
+ insets_(insets) {
+ DCHECK(image.width() > insets.width() &&
+ image.height() > insets.height());
+ }
+
+ // Paints the images.
+ virtual void Paint(int w, int h, gfx::Canvas* canvas) {
+ if (w == image_.width() && h == image_.height()) {
+ // Early out if the size we're to render at equals the size of the image.
+ canvas->DrawBitmapInt(image_, 0, 0);
+ return;
+ }
+ // Upper left.
+ canvas->DrawBitmapInt(image_, 0, 0, insets_.left(), insets_.top(),
+ 0, 0, insets_.left(), insets_.top(), true);
+ // Top edge.
+ canvas->DrawBitmapInt(
+ image_,
+ insets_.left(), 0, image_.width() - insets_.width(), insets_.top(),
+ insets_.left(), 0, w - insets_.width(), insets_.top(), true);
+ // Upper right.
+ canvas->DrawBitmapInt(
+ image_,
+ image_.width() - insets_.right(), 0, insets_.right(), insets_.top(),
+ w - insets_.right(), 0, insets_.right(), insets_.top(), true);
+ // Right edge.
+ canvas->DrawBitmapInt(
+ image_,
+ image_.width() - insets_.right(), insets_.top(),
+ insets_.right(), image_.height() - insets_.height(),
+ w - insets_.right(), insets_.top(), insets_.right(),
+ h - insets_.height(), true);
+ // Bottom right.
+ canvas->DrawBitmapInt(
+ image_,
+ image_.width() - insets_.right(), image_.height() - insets_.bottom(),
+ insets_.right(), insets_.bottom(),
+ w - insets_.right(), h - insets_.bottom(), insets_.right(),
+ insets_.bottom(), true);
+ // Bottom edge.
+ canvas->DrawBitmapInt(
+ image_,
+ insets_.left(), image_.height() - insets_.bottom(),
+ image_.width() - insets_.width(), insets_.bottom(),
+ insets_.left(), h - insets_.bottom(), w - insets_.width(),
+ insets_.bottom(), true);
+ // Bottom left.
+ canvas->DrawBitmapInt(
+ image_,
+ 0, image_.height() - insets_.bottom(), insets_.left(),
+ insets_.bottom(),
+ 0, h - insets_.bottom(), insets_.left(), insets_.bottom(), true);
+ // Left.
+ canvas->DrawBitmapInt(
+ image_,
+ 0, insets_.top(), insets_.left(), image_.height() - insets_.height(),
+ 0, insets_.top(), insets_.left(), h - insets_.height(), true);
+ }
+
+ private:
+ const SkBitmap image_;
+ const gfx::Insets insets_;
+
+ DISALLOW_COPY_AND_ASSIGN(ImagePainter);
+};
+
+} // namespace
// static
void Painter::PaintPainterAt(int x, int y, int w, int h,
@@ -68,66 +139,6 @@ void Painter::PaintPainterAt(int x, int y, int w, int h,
canvas->restore();
}
-ImagePainter::ImagePainter(const int image_resource_names[],
- bool draw_center)
- : draw_center_(draw_center) {
- DCHECK(image_resource_names);
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- for (int i = 0, max = draw_center ? 9 : 8; i < max; ++i)
- images_.push_back(rb.GetBitmapNamed(image_resource_names[i]));
-}
-
-void ImagePainter::Paint(int w, int h, gfx::Canvas* canvas) {
- canvas->DrawBitmapInt(*images_[BORDER_TOP_LEFT], 0, 0);
- canvas->TileImageInt(*images_[BORDER_TOP],
- images_[BORDER_TOP_LEFT]->width(),
- 0,
- w - images_[BORDER_TOP_LEFT]->width() -
- images_[BORDER_TOP_RIGHT]->width(),
- images_[BORDER_TOP_LEFT]->height());
- canvas->DrawBitmapInt(*images_[BORDER_TOP_RIGHT],
- w - images_[BORDER_TOP_RIGHT]->width(),
- 0);
- canvas->TileImageInt(*images_[BORDER_RIGHT],
- w - images_[BORDER_RIGHT]->width(),
- images_[BORDER_TOP_RIGHT]->height(),
- images_[BORDER_RIGHT]->width(),
- h - images_[BORDER_TOP_RIGHT]->height() -
- images_[BORDER_BOTTOM_RIGHT]->height());
- canvas->DrawBitmapInt(*images_[BORDER_BOTTOM_RIGHT],
- w - images_[BORDER_BOTTOM_RIGHT]->width(),
- h - images_[BORDER_BOTTOM_RIGHT]->height());
- canvas->TileImageInt(*images_[BORDER_BOTTOM],
- images_[BORDER_BOTTOM_LEFT]->width(),
- h - images_[BORDER_BOTTOM]->height(),
- w - images_[BORDER_BOTTOM_LEFT]->width() -
- images_[BORDER_BOTTOM_RIGHT]->width(),
- images_[BORDER_BOTTOM]->height());
- canvas->DrawBitmapInt(*images_[BORDER_BOTTOM_LEFT],
- 0,
- h - images_[BORDER_BOTTOM_LEFT]->height());
- canvas->TileImageInt(*images_[BORDER_LEFT],
- 0,
- images_[BORDER_TOP_LEFT]->height(),
- images_[BORDER_LEFT]->width(),
- h - images_[BORDER_TOP_LEFT]->height() -
- images_[BORDER_BOTTOM_LEFT]->height());
- if (draw_center_) {
- canvas->DrawBitmapInt(*images_[BORDER_CENTER],
- 0,
- 0,
- images_[BORDER_CENTER]->width(),
- images_[BORDER_CENTER]->height(),
- images_[BORDER_TOP_LEFT]->width(),
- images_[BORDER_TOP_LEFT]->height(),
- w - images_[BORDER_TOP_LEFT]->width() -
- images_[BORDER_TOP_RIGHT]->width(),
- h - images_[BORDER_TOP_LEFT]->height() -
- images_[BORDER_TOP_RIGHT]->height(),
- false);
- }
-}
-
// static
Painter* Painter::CreateHorizontalGradient(SkColor c1, SkColor c2) {
return new GradientPainter(true, c1, c2);
@@ -138,6 +149,12 @@ Painter* Painter::CreateVerticalGradient(SkColor c1, SkColor c2) {
return new GradientPainter(false, c1, c2);
}
+// static
+Painter* Painter::CreateImagePainter(const SkBitmap& image,
+ const gfx::Insets& insets) {
+ return new ImagePainter(image, insets);
+}
+
HorizontalPainter::HorizontalPainter(const int image_resource_names[]) {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
for (int i = 0; i < 3; ++i)
diff --git a/views/painter.h b/views/painter.h
index 9cef45f..40e5db3 100644
--- a/views/painter.h
+++ b/views/painter.h
@@ -1,17 +1,16 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2009 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 VIEWS_PAINTER_H_
#define VIEWS_PAINTER_H_
-#include <vector>
-
#include "base/basictypes.h"
#include "third_party/skia/include/core/SkColor.h"
namespace gfx {
class Canvas;
+class Insets;
}
class SkBitmap;
@@ -31,58 +30,21 @@ class Painter {
static Painter* CreateHorizontalGradient(SkColor c1, SkColor c2);
static Painter* CreateVerticalGradient(SkColor c1, SkColor c2);
+ // Creates a painter that divides |image| into nine regions. The four corners
+ // are rendered at the size specified in insets (for example, the upper
+ // left corners is rendered at 0x0 with a size of
+ // insets.left()xinsets.right()). The four edges are stretched to fill the
+ // destination size.
+ // Ownership is passed to the caller.
+ static Painter* CreateImagePainter(const SkBitmap& image,
+ const gfx::Insets& insets);
+
virtual ~Painter() {}
// Paints the painter in the specified region.
virtual void Paint(int w, int h, gfx::Canvas* canvas) = 0;
};
-// ImagePainter paints 8 (or 9) images into a box. The four corner
-// images are drawn at the size of the image, the top/left/bottom/right
-// images are tiled to fit the area, and the center (if rendered) is
-// stretched.
-class ImagePainter : public Painter {
- public:
- enum BorderElements {
- BORDER_TOP_LEFT = 0,
- BORDER_TOP,
- BORDER_TOP_RIGHT,
- BORDER_RIGHT,
- BORDER_BOTTOM_RIGHT,
- BORDER_BOTTOM,
- BORDER_BOTTOM_LEFT,
- BORDER_LEFT,
- BORDER_CENTER
- };
-
- // Constructs a new ImagePainter loading the specified image names.
- // The images must be in the order defined by the BorderElements.
- // If draw_center is false, there must be 8 image names, if draw_center
- // is true, there must be 9 image names with the last giving the name
- // of the center image.
- ImagePainter(const int image_resource_names[],
- bool draw_center);
-
- virtual ~ImagePainter() {}
-
- // Paints the images.
- virtual void Paint(int w, int h, gfx::Canvas* canvas);
-
- // Returns the specified image. The returned image should NOT be deleted.
- SkBitmap* GetImage(BorderElements element) {
- return images_[element];
- }
-
- private:
- bool tile_;
- bool draw_center_;
- bool tile_center_;
- // NOTE: the images are owned by ResourceBundle. Don't free them.
- std::vector<SkBitmap*> images_;
-
- DISALLOW_EVIL_CONSTRUCTORS(ImagePainter);
-};
-
// HorizontalPainter paints 3 images into a box: left, center and right. The
// left and right images are drawn to size at the left/right edges of the
// region. The center is tiled in the remaining space. All images must have the
@@ -114,7 +76,7 @@ class HorizontalPainter : public Painter {
// NOTE: the images are owned by ResourceBundle. Don't free them.
SkBitmap* images_[3];
- DISALLOW_EVIL_CONSTRUCTORS(HorizontalPainter);
+ DISALLOW_COPY_AND_ASSIGN(HorizontalPainter);
};
} // namespace views