Commit 55b4e097 authored by Matthew Mourgos's avatar Matthew Mourgos Committed by Commit Bot

CrOS: Create function for generating standard icons.

This CL creates the function CreateStandardIconImage() to be used for
taking the original icon and returning a standard icon.

The general idea of the new function is as follows:
1. Check if the original icon is already circle shaped. If it is, then
   return the original icon.
2. Find the scale required to resize and fit the original icon inside of
   a new circle background.
3. Scale down the icon and draw it over a background circle. Return this
   icon as the generated standard icon.

Bug: 1110496
Change-Id: If37fba67a3f937f863c0df2600979fc0e0d02512
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2300225Reviewed-by: default avatarNancy Wang <nancylingwang@chromium.org>
Commit-Queue: Matthew Mourgos <mmourgos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#793529}
parent 88f73a23
...@@ -1654,6 +1654,8 @@ static_library("ui") { ...@@ -1654,6 +1654,8 @@ static_library("ui") {
"app_list/chrome_app_list_model_updater.h", "app_list/chrome_app_list_model_updater.h",
"app_list/extension_app_utils.cc", "app_list/extension_app_utils.cc",
"app_list/extension_app_utils.h", "app_list/extension_app_utils.h",
"app_list/icon_standardizer.cc",
"app_list/icon_standardizer.h",
"app_list/internal_app/internal_app_metadata.cc", "app_list/internal_app/internal_app_metadata.cc",
"app_list/internal_app/internal_app_metadata.h", "app_list/internal_app/internal_app_metadata.h",
"app_list/md_icon_normalizer.cc", "app_list/md_icon_normalizer.cc",
......
...@@ -11,4 +11,6 @@ tby@chromium.org ...@@ -11,4 +11,6 @@ tby@chromium.org
per-file app_launch_event_logger*=charleszhao@chromium.org per-file app_launch_event_logger*=charleszhao@chromium.org
per-file icon_standardizer*=mmourgos@chromium.org
# COMPONENT: UI>Shell>Launcher # COMPONENT: UI>Shell>Launcher
This diff is collapsed.
// Copyright 2020 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 CHROME_BROWSER_UI_APP_LIST_ICON_STANDARDIZER_H_
#define CHROME_BROWSER_UI_APP_LIST_ICON_STANDARDIZER_H_
namespace gfx {
class ImageSkia;
} // namespace gfx
// TODO(mmourgos): Look into possibly moving this code to ui/gfx/image.
namespace app_list {
// Takes an icon image and returns a standardized version of that icon. This
// function consists of the following steps:
// 1. Check if the original icon is already circle shaped. If it is, then
// return the original input icon.
// 2. Find the scale required to resize and fit the original icon inside of
// a new circle background.
// 3. Scale down the icon and draw it over a background circle. Return the newly
// generated icon as the standard icon.
gfx::ImageSkia CreateStandardIconImage(const gfx::ImageSkia& image);
} // namespace app_list
#endif // CHROME_BROWSER_UI_APP_LIST_ICON_STANDARDIZER_H_
// Copyright 2020 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/ui/app_list/icon_standardizer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_operations.h"
using CreateStandardIconTest = testing::Test;
// Test that a square icon gets scaled down and drawn on top of a circular
// background when converted to a standard icon.
TEST_F(CreateStandardIconTest, SquareIconToStandardIcon) {
const int test_width = 64;
const int test_height = 64;
SkBitmap square_icon_bitmap;
square_icon_bitmap.allocN32Pixels(test_width, test_height);
square_icon_bitmap.eraseColor(SK_ColorRED);
gfx::ImageSkia standard_icon = app_list::CreateStandardIconImage(
gfx::ImageSkia::CreateFrom1xBitmap(square_icon_bitmap));
// Create |test_standard_bitmap| which will be a manually created standard
// icon, with background circle and a scaled down square icon inside.
SkBitmap test_standard_bitmap;
test_standard_bitmap.allocN32Pixels(test_width, test_height);
test_standard_bitmap.eraseColor(SK_ColorTRANSPARENT);
SkCanvas canvas(test_standard_bitmap);
SkPaint paint_background_circle;
paint_background_circle.setAntiAlias(true);
paint_background_circle.setColor(SK_ColorWHITE);
paint_background_circle.setStyle(SkPaint::kFill_Style);
canvas.drawCircle(
SkPoint::Make((test_width - 1) / 2.0f, (test_width - 1) / 2.0f),
test_width / 2.0f - 1, paint_background_circle);
const SkBitmap scaled_bitmap = skia::ImageOperations::Resize(
square_icon_bitmap, skia::ImageOperations::RESIZE_BEST, 41, 41);
canvas.drawBitmap(scaled_bitmap, 11, 11);
// Test that |standard_icon| has an identical bitmap to
// |test_standard_bitmap|.
const size_t size = standard_icon.bitmap()->computeByteSize();
bool bitmaps_equal = true;
uint8_t* first_data =
reinterpret_cast<uint8_t*>(standard_icon.bitmap()->getPixels());
uint8_t* second_data =
reinterpret_cast<uint8_t*>(test_standard_bitmap.getPixels());
for (size_t i = 0; i < size; ++i) {
if (first_data[i] != second_data[i]) {
bitmaps_equal = false;
break;
}
}
EXPECT_TRUE(bitmaps_equal);
}
// Test that a circular icon stays the same when converted to a standard icon.
TEST_F(CreateStandardIconTest, CircularIconToStandardIcon) {
const int test_width = 64;
const int test_height = 64;
// Create a bitmap with a red circle as a placeholder circular icon.
SkBitmap circle_icon_bitmap;
circle_icon_bitmap.allocN32Pixels(test_width, test_height);
circle_icon_bitmap.eraseColor(SK_ColorTRANSPARENT);
SkCanvas canvas(circle_icon_bitmap);
SkPaint paint_cirlce_icon;
paint_cirlce_icon.setAntiAlias(true);
paint_cirlce_icon.setColor(SK_ColorRED);
paint_cirlce_icon.setStyle(SkPaint::kFill_Style);
canvas.drawCircle(SkPoint::Make(test_width / 2, test_width / 2),
test_width / 2, paint_cirlce_icon);
// Get the standard icon version of the red circle icon.
gfx::ImageSkia standard_icon = app_list::CreateStandardIconImage(
gfx::ImageSkia(gfx::ImageSkiaRep(circle_icon_bitmap, 2.0f)));
// Test that |standard_icon| has an identical bitmap to |circle_icon_bitmap|.
const size_t size = standard_icon.bitmap()->computeByteSize();
bool bitmaps_equal = true;
uint8_t* first_data =
reinterpret_cast<uint8_t*>(standard_icon.bitmap()->getPixels());
uint8_t* second_data =
reinterpret_cast<uint8_t*>(circle_icon_bitmap.getPixels());
for (size_t i = 0; i < size; ++i) {
if (first_data[i] != second_data[i]) {
bitmaps_equal = false;
break;
}
}
EXPECT_TRUE(bitmaps_equal);
}
...@@ -4575,6 +4575,7 @@ test("unit_tests") { ...@@ -4575,6 +4575,7 @@ test("unit_tests") {
"../browser/ui/app_list/arc/arc_vpn_provider_unittest.cc", "../browser/ui/app_list/arc/arc_vpn_provider_unittest.cc",
"../browser/ui/app_list/arc/mock_arc_app_list_prefs_observer.cc", "../browser/ui/app_list/arc/mock_arc_app_list_prefs_observer.cc",
"../browser/ui/app_list/arc/mock_arc_app_list_prefs_observer.h", "../browser/ui/app_list/arc/mock_arc_app_list_prefs_observer.h",
"../browser/ui/app_list/icon_standardizer_unittest.cc",
"../browser/ui/app_list/md_icon_normalizer_unittest.cc", "../browser/ui/app_list/md_icon_normalizer_unittest.cc",
"../browser/ui/app_list/search/answer_card/answer_card_result_unittest.cc", "../browser/ui/app_list/search/answer_card/answer_card_result_unittest.cc",
"../browser/ui/app_list/search/answer_card/answer_card_search_provider_unittest.cc", "../browser/ui/app_list/search/answer_card/answer_card_search_provider_unittest.cc",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment