blob: a4994d59f89409dcc3e61a1edd5e51ce2cf0bd66 [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/audio_permission_prompt_texture.h"
#include "base/i18n/case_conversion.h"
#include "cc/paint/skia_paint_canvas.h"
#include "chrome/browser/vr/elements/vector_icon.h"
#include "chrome/grit/generated_resources.h"
#include "components/strings/grit/components_strings.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/render_text.h"
namespace vr {
namespace {
constexpr float kWidth = 0.63f;
constexpr float kHeight = 0.218f;
constexpr float kButtonHeight = 0.064f;
constexpr float kCornerRadius = 0.006f;
constexpr float kPadding = 0.028f;
constexpr float kIconSize = 0.042f;
constexpr float kFontSizePromptText = 0.028f;
constexpr float kTextTopMargin = 0.007f;
constexpr float kTextLeftMargin = 0.010f;
constexpr float kVerticalGap = 0.056f;
constexpr float kButtonsDistance = 0.014f;
constexpr float kFontSizePromptButtonText = 0.024f;
constexpr float kButtonRadius = 0.0035f;
constexpr float kButtonWidth = 0.162f;
constexpr char kPreferredFontNameForButtons[] = "sans-serif-medium";
} // namespace
AudioPermissionPromptTexture::AudioPermissionPromptTexture() = default;
AudioPermissionPromptTexture::~AudioPermissionPromptTexture() = default;
void AudioPermissionPromptTexture::Draw(SkCanvas* sk_canvas,
const gfx::Size& texture_size) {
size_.set_width(texture_size.width());
size_.set_height(texture_size.height());
// background
cc::SkiaPaintCanvas paint_canvas(sk_canvas);
gfx::Canvas gfx_canvas(&paint_canvas, 1.0f);
gfx::Canvas* canvas = &gfx_canvas;
SkPaint back_paint;
back_paint.setColor(background_color());
sk_canvas->drawRoundRect(SkRect::MakeWH(size_.width(), size_.height()),
ToPixels(kCornerRadius), ToPixels(kCornerRadius),
back_paint);
// Icon
gfx::PointF icon_location(ToPixels(kPadding), ToPixels(kPadding));
VectorIcon::DrawVectorIcon(canvas, vector_icons::kMicIcon,
ToPixels(kIconSize), icon_location, icon_color_);
// Prompt description.
auto text = l10n_util::GetStringUTF16(
IDS_VR_SHELL_AUDIO_PERMISSION_PROMPT_DESCRIPTION);
gfx::FontList fonts;
GetDefaultFontList(ToPixels(kFontSizePromptText), text, &fonts);
gfx::Rect prompt_text_size(
ToPixels(kWidth - 2 * kPadding - kTextLeftMargin - kIconSize), 0);
std::vector<std::unique_ptr<gfx::RenderText>> lines =
PrepareDrawStringRect(text, fonts, foreground_color(), &prompt_text_size,
kTextAlignmentNone, kWrappingBehaviorWrap);
canvas->Save();
canvas->Translate(
gfx::Vector2d(ToPixels(kTextLeftMargin + kIconSize + kPadding),
ToPixels(kPadding + kTextTopMargin)));
for (auto& render_text : lines)
render_text->Draw(canvas);
canvas->Restore();
// Buttons
SkPaint paint;
gfx::Rect button_text_size(ToPixels(kButtonWidth), 0);
float radius = ToPixels(kButtonRadius);
// Secondary button area.
// TODO(https://crbug.com/787654): Uppercasing should be conditional.
text = base::i18n::ToUpper(l10n_util::GetStringUTF16(
IDS_VR_SHELL_AUDIO_PERMISSION_PROMPT_ABORT_BUTTON));
GetFontList(kPreferredFontNameForButtons, ToPixels(kFontSizePromptButtonText),
text, &fonts);
lines = PrepareDrawStringRect(
text, fonts, secondary_button_colors_.foreground, &button_text_size,
kTextAlignmentCenter, kWrappingBehaviorWrap);
secondary_button_rect_.SetRect(
ToPixels(kWidth - kPadding - kButtonsDistance - 2 * kButtonWidth),
ToPixels(kPadding + kIconSize + kVerticalGap), ToPixels(kButtonWidth),
ToPixels(kButtonHeight));
paint.setColor(secondary_button_colors_.GetBackgroundColor(
secondary_hovered_, secondary_pressed_));
canvas->Save();
canvas->Translate(
gfx::Vector2d(secondary_button_rect_.x(), secondary_button_rect_.y()));
sk_canvas->drawRoundRect(
SkRect::MakeXYWH(0, 0, ToPixels(kButtonWidth), ToPixels(kButtonHeight)),
radius, radius, paint);
canvas->Translate(gfx::Vector2d(
0, ToPixels(kButtonHeight) / 2 - button_text_size.height() / 2));
for (auto& render_text : lines)
render_text->Draw(canvas);
canvas->Restore();
// Primary button area.
// TODO(https://crbug.com/787654): Uppercasing should be conditional.
text = base::i18n::ToUpper(l10n_util::GetStringUTF16(
IDS_VR_SHELL_AUDIO_PERMISSION_PROMPT_CONTINUE_BUTTON));
GetFontList(kPreferredFontNameForButtons, ToPixels(kFontSizePromptButtonText),
text, &fonts);
button_text_size.set_size(gfx::Size(ToPixels(kButtonWidth), 0));
lines = PrepareDrawStringRect(text, fonts, primary_button_colors_.foreground,
&button_text_size, kTextAlignmentCenter,
kWrappingBehaviorWrap);
primary_button_rect_.SetRect(ToPixels(kWidth - kPadding - kButtonWidth),
ToPixels(kPadding + kIconSize + kVerticalGap),
ToPixels(kButtonWidth), ToPixels(kButtonHeight));
paint.setColor(primary_button_colors_.GetBackgroundColor(primary_hovered_,
primary_pressed_));
canvas->Save();
canvas->Translate(
gfx::Vector2d(primary_button_rect_.x(), primary_button_rect_.y()));
sk_canvas->drawRoundRect(
SkRect::MakeXYWH(0, 0, ToPixels(kButtonWidth), ToPixels(kButtonHeight)),
radius, radius, paint);
canvas->Translate(gfx::Vector2d(
0, ToPixels(kButtonHeight) / 2 - button_text_size.height() / 2));
for (auto& render_text : lines)
render_text->Draw(canvas);
canvas->Restore();
}
float AudioPermissionPromptTexture::ToPixels(float meters) const {
return meters * size_.width() / kWidth;
}
gfx::PointF AudioPermissionPromptTexture::PercentToPixels(
const gfx::PointF& percent) const {
return gfx::PointF(percent.x() * size_.width(), percent.y() * size_.height());
}
bool AudioPermissionPromptTexture::HitsPrimaryButton(
const gfx::PointF& position) const {
return primary_button_rect_.Contains(PercentToPixels(position));
}
bool AudioPermissionPromptTexture::HitsSecondaryButton(
const gfx::PointF& position) const {
return secondary_button_rect_.Contains(PercentToPixels(position));
}
void AudioPermissionPromptTexture::SetPrimaryButtonHovered(bool hovered) {
SetAndDirty(&primary_hovered_, hovered);
}
void AudioPermissionPromptTexture::SetPrimaryButtonPressed(bool pressed) {
SetAndDirty(&primary_pressed_, pressed);
}
void AudioPermissionPromptTexture::SetSecondaryButtonHovered(bool hovered) {
SetAndDirty(&secondary_hovered_, hovered);
}
void AudioPermissionPromptTexture::SetSecondaryButtonPressed(bool pressed) {
SetAndDirty(&secondary_pressed_, pressed);
}
void AudioPermissionPromptTexture::SetPrimaryButtonColors(
const ButtonColors& colors) {
SetAndDirty(&primary_button_colors_, colors);
}
void AudioPermissionPromptTexture::SetSecondaryButtonColors(
const ButtonColors& colors) {
SetAndDirty(&secondary_button_colors_, colors);
}
void AudioPermissionPromptTexture::SetIconColor(SkColor color) {
SetAndDirty(&icon_color_, color);
}
gfx::Size AudioPermissionPromptTexture::GetPreferredTextureSize(
int maximum_width) const {
return gfx::Size(maximum_width, maximum_width * kHeight / kWidth);
}
gfx::SizeF AudioPermissionPromptTexture::GetDrawnSize() const {
return size_;
}
} // namespace vr