blob: 0570a5dbf7dffbacbb47f9779bf25eda9f59aea6 [file] [log] [blame]
// Copyright 2017 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 "chrome/browser/vr/elements/vector_icon.h"
#include <memory>
#include "chrome/browser/vr/elements/ui_texture.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/gfx/scoped_canvas.h"
#include "ui/gfx/vector_icon_types.h"
namespace vr {
class VectorIconTexture : public UiTexture {
public:
VectorIconTexture() {}
~VectorIconTexture() override {}
void SetColor(SkColor color) { SetAndDirty(&color_, color); }
SkColor GetColor() const { return color_; }
void SetIcon(const gfx::VectorIcon* icon) { SetAndDirty(&icon_, icon); }
private:
void Draw(SkCanvas* sk_canvas, const gfx::Size& texture_size) override {
if (icon_ == nullptr || icon_->is_empty())
return;
cc::SkiaPaintCanvas paint_canvas(sk_canvas);
gfx::Canvas gfx_canvas(&paint_canvas, 1.0f);
size_.set_height(texture_size.height());
size_.set_width(texture_size.width());
float icon_size = size_.height();
float icon_corner_offset = (size_.height() - icon_size) / 2;
VectorIcon::DrawVectorIcon(
&gfx_canvas, *icon_, icon_size,
gfx::PointF(icon_corner_offset, icon_corner_offset), color_);
}
gfx::SizeF size_;
const gfx::VectorIcon* icon_ = nullptr;
SkColor color_ = SK_ColorWHITE;
DISALLOW_COPY_AND_ASSIGN(VectorIconTexture);
};
VectorIcon::VectorIcon(int texture_width)
: texture_(std::make_unique<VectorIconTexture>()),
texture_width_(texture_width) {}
VectorIcon::~VectorIcon() {}
void VectorIcon::SetColor(SkColor color) {
texture_->SetColor(color);
}
SkColor VectorIcon::GetColor() const {
return texture_->GetColor();
}
void VectorIcon::SetIcon(const gfx::VectorIcon& icon) {
texture_->SetIcon(&icon);
}
void VectorIcon::SetIcon(const gfx::VectorIcon* icon) {
texture_->SetIcon(icon);
}
UiTexture* VectorIcon::GetTexture() const {
return texture_.get();
}
bool VectorIcon::TextureDependsOnMeasurement() const {
return false;
}
gfx::Size VectorIcon::MeasureTextureSize() {
return gfx::Size(texture_width_, texture_width_);
}
void VectorIcon::DrawVectorIcon(gfx::Canvas* canvas,
const gfx::VectorIcon& icon,
float size_px,
const gfx::PointF& corner,
SkColor color) {
gfx::ScopedCanvas scoped(canvas);
canvas->Translate(
{static_cast<int>(corner.x()), static_cast<int>(corner.y())});
// Don't use CreateVectorIcon() because its icon caching is not thread safe.
// Instead, just redraw the VectorIcon.
PaintVectorIcon(canvas, icon, size_px, color);
}
} // namespace vr