0b74269f91
Rename files too. TBR=brettw http://crbug.com/11387 Review URL: http://codereview.chromium.org/113443 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16148 0039d316-1c4b-4281-b951-d872f2087c98
166 linhas
5.9 KiB
C++
166 linhas
5.9 KiB
C++
// Copyright (c) 2006-2008 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/resource_bundle.h"
|
|
#include "base/logging.h"
|
|
#include "third_party/skia/include/core/SkBitmap.h"
|
|
#include "third_party/skia/include/effects/SkGradientShader.h"
|
|
|
|
namespace views {
|
|
|
|
namespace {
|
|
|
|
class GradientPainter : public Painter {
|
|
public:
|
|
GradientPainter(bool horizontal, const SkColor& top, const SkColor& bottom)
|
|
: horizontal_(horizontal) {
|
|
colors_[0] = top;
|
|
colors_[1] = bottom;
|
|
}
|
|
|
|
virtual ~GradientPainter() {
|
|
}
|
|
|
|
void Paint(int w, int h, gfx::Canvas* canvas) {
|
|
SkPaint paint;
|
|
SkPoint p[2];
|
|
p[0].set(SkIntToScalar(0), SkIntToScalar(0));
|
|
if (horizontal_)
|
|
p[1].set(SkIntToScalar(w), SkIntToScalar(0));
|
|
else
|
|
p[1].set(SkIntToScalar(0), SkIntToScalar(h));
|
|
|
|
SkShader* s =
|
|
SkGradientShader::CreateLinear(p, colors_, NULL, 2,
|
|
SkShader::kClamp_TileMode, NULL);
|
|
paint.setStyle(SkPaint::kFill_Style);
|
|
paint.setShader(s);
|
|
// Need to unref shader, otherwise never deleted.
|
|
s->unref();
|
|
|
|
canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
|
|
SkIntToScalar(w), SkIntToScalar(h), paint);
|
|
}
|
|
|
|
private:
|
|
bool horizontal_;
|
|
SkColor colors_[2];
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(GradientPainter);
|
|
};
|
|
|
|
|
|
}
|
|
|
|
// static
|
|
void Painter::PaintPainterAt(int x, int y, int w, int h,
|
|
gfx::Canvas* canvas, Painter* painter) {
|
|
DCHECK(canvas && painter);
|
|
if (w < 0 || h < 0)
|
|
return;
|
|
canvas->save();
|
|
canvas->TranslateInt(x, y);
|
|
painter->Paint(w, h, canvas);
|
|
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);
|
|
}
|
|
|
|
// static
|
|
Painter* Painter::CreateVerticalGradient(SkColor c1, SkColor c2) {
|
|
return new GradientPainter(false, c1, c2);
|
|
}
|
|
|
|
HorizontalPainter::HorizontalPainter(const int image_resource_names[]) {
|
|
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
|
for (int i = 0; i < 3; ++i)
|
|
images_[i] = rb.GetBitmapNamed(image_resource_names[i]);
|
|
height_ = images_[LEFT]->height();
|
|
DCHECK(images_[LEFT]->height() == images_[RIGHT]->height() &&
|
|
images_[LEFT]->height() == images_[CENTER]->height());
|
|
}
|
|
|
|
void HorizontalPainter::Paint(int w, int h, gfx::Canvas* canvas) {
|
|
if (w < (images_[LEFT]->width() + images_[CENTER]->width() +
|
|
images_[RIGHT]->width())) {
|
|
// No room to paint.
|
|
return;
|
|
}
|
|
canvas->DrawBitmapInt(*images_[LEFT], 0, 0);
|
|
canvas->DrawBitmapInt(*images_[RIGHT], w - images_[RIGHT]->width(), 0);
|
|
canvas->TileImageInt(*images_[CENTER],
|
|
images_[LEFT]->width(),
|
|
0,
|
|
w - images_[LEFT]->width() - images_[RIGHT]->width(),
|
|
height_);
|
|
}
|
|
|
|
} // namespace views
|