Commit e32d1704 authored by Naoki Fukino's avatar Naoki Fukino Committed by Commit Bot

Consider device scale factor to generate PNG data for ARC intent handler's icon.

We generate data URL for ARC intent handler's icon in 16x16 pixel PNG format.
It is not good enough when the device scale factor is bigger than 1.
We should apply the scale factor when generating PNG data.
The source bitmap which is passed from Android system is big enough.
(48x48 pixels for 1x scale factor, and 96x96 pixels for 2x scale factor.)

Bug: 751362
Change-Id: I370bf32b2c0f4e9e19dc267b03965663546a03bf
Reviewed-on: https://chromium-review.googlesource.com/688524
Commit-Queue: Naoki Fukino <fukino@chromium.org>
Reviewed-by: default avatarYusuke Sato <yusukes@chromium.org>
Reviewed-by: default avatarKazuhiro Inaba <kinaba@chromium.org>
Cr-Commit-Position: refs/heads/master@{#505332}
parent 7a1443f8
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "components/arc/arc_service_manager.h" #include "components/arc/arc_service_manager.h"
#include "components/arc/arc_util.h" #include "components/arc/arc_util.h"
#include "ui/base/layout.h" #include "ui/base/layout.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_skia_operations.h"
...@@ -78,8 +79,27 @@ mojom::IntentHelperInstance* GetInstanceForRequestActivityIcons( ...@@ -78,8 +79,27 @@ mojom::IntentHelperInstance* GetInstanceForRequestActivityIcons(
return instance; return instance;
} }
// Encodes the |image| as PNG data considering scale factor, and returns it as
// data: URL.
scoped_refptr<base::RefCountedData<GURL>> GeneratePNGDataUrl(
const gfx::ImageSkia& image,
ui::ScaleFactor scale_factor) {
float scale = ui::GetScaleForScaleFactor(scale_factor);
std::vector<unsigned char> output;
gfx::PNGCodec::EncodeBGRASkBitmap(image.GetRepresentation(scale).sk_bitmap(),
false /* discard_transparency */, &output);
std::string encoded;
base::Base64Encode(
base::StringPiece(reinterpret_cast<const char*>(output.data()),
output.size()),
&encoded);
return base::WrapRefCounted(
new base::RefCountedData<GURL>(GURL(kPngDataUrlPrefix + encoded)));
}
std::unique_ptr<ActivityIconLoader::ActivityToIconsMap> ResizeAndEncodeIcons( std::unique_ptr<ActivityIconLoader::ActivityToIconsMap> ResizeAndEncodeIcons(
std::vector<mojom::ActivityIconPtr> icons) { std::vector<mojom::ActivityIconPtr> icons,
ui::ScaleFactor scale_factor) {
auto result = std::make_unique<ActivityIconLoader::ActivityToIconsMap>(); auto result = std::make_unique<ActivityIconLoader::ActivityToIconsMap>();
for (size_t i = 0; i < icons.size(); ++i) { for (size_t i = 0; i < icons.size(); ++i) {
static const size_t kBytesPerPixel = 4; static const size_t kBytesPerPixel = 4;
...@@ -109,23 +129,14 @@ std::unique_ptr<ActivityIconLoader::ActivityToIconsMap> ResizeAndEncodeIcons( ...@@ -109,23 +129,14 @@ std::unique_ptr<ActivityIconLoader::ActivityToIconsMap> ResizeAndEncodeIcons(
gfx::Image icon16(icon_small); gfx::Image icon16(icon_small);
gfx::Image icon20(icon_large); gfx::Image icon20(icon_large);
// Encode the icon as PNG data, and then as data: URL.
scoped_refptr<base::RefCountedMemory> img = icon16.As1xPNGBytes();
if (!img)
continue;
std::string encoded;
base::Base64Encode(base::StringPiece(img->front_as<char>(), img->size()),
&encoded);
scoped_refptr<base::RefCountedData<GURL>> dataurl(
new base::RefCountedData<GURL>(GURL(kPngDataUrlPrefix + encoded)));
const std::string activity_name = icon->activity->activity_name.has_value() const std::string activity_name = icon->activity->activity_name.has_value()
? (*icon->activity->activity_name) ? (*icon->activity->activity_name)
: std::string(); : std::string();
result->insert( result->insert(std::make_pair(
std::make_pair(ActivityIconLoader::ActivityName( ActivityIconLoader::ActivityName(icon->activity->package_name,
icon->activity->package_name, activity_name), activity_name),
ActivityIconLoader::Icons(icon16, icon20, dataurl))); ActivityIconLoader::Icons(
icon16, icon20, GeneratePNGDataUrl(icon_small, scale_factor))));
} }
return result; return result;
...@@ -240,7 +251,8 @@ void ActivityIconLoader::OnIconsReady( ...@@ -240,7 +251,8 @@ void ActivityIconLoader::OnIconsReady(
std::vector<mojom::ActivityIconPtr> icons) { std::vector<mojom::ActivityIconPtr> icons) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
base::PostTaskAndReplyWithResult( base::PostTaskAndReplyWithResult(
FROM_HERE, base::Bind(&ResizeAndEncodeIcons, base::Passed(&icons)), FROM_HERE,
base::Bind(&ResizeAndEncodeIcons, base::Passed(&icons), scale_factor_),
base::Bind(&ActivityIconLoader::OnIconsResized, base::Bind(&ActivityIconLoader::OnIconsResized,
weak_ptr_factory_.GetWeakPtr(), base::Passed(&cached_result), weak_ptr_factory_.GetWeakPtr(), base::Passed(&cached_result),
cb)); cb));
......
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