Commit 4897c88d authored by thakis@chromium.org's avatar thakis@chromium.org

Add padding for 16->[17,24] resizing, not just 16->24

BUG=138550

Review URL: https://chromiumcodereview.appspot.com/10834196

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@150222 0039d316-1c4b-4281-b951-d872f2087c98
parent 35440913
...@@ -24,8 +24,29 @@ size_t BiggestCandidate(const std::vector<SkBitmap>& bitmaps) { ...@@ -24,8 +24,29 @@ size_t BiggestCandidate(const std::vector<SkBitmap>& bitmaps) {
return max_index; return max_index;
} }
SkBitmap PadWithBorder(SkBitmap contents, int desired_size, int source_size) {
SkBitmap bitmap;
bitmap.setConfig(
SkBitmap::kARGB_8888_Config, desired_size, desired_size);
bitmap.allocPixels();
bitmap.eraseARGB(0, 0, 0, 0);
{
SkCanvas canvas(bitmap);
int shift = (desired_size - source_size) / 2;
SkRect dest(SkRect::MakeXYWH(shift, shift, source_size, source_size));
canvas.drawBitmapRect(contents, NULL, dest);
}
return bitmap;
}
SkBitmap SelectCandidate(const std::vector<SkBitmap>& bitmaps, SkBitmap SelectCandidate(const std::vector<SkBitmap>& bitmaps,
int desired_size) { int desired_size,
ui::ScaleFactor scale_factor) {
float scale = GetScaleFactorScale(scale_factor);
desired_size = static_cast<int>(desired_size * scale + 0.5f);
// Try to find an exact match. // Try to find an exact match.
for (size_t i = 0; i < bitmaps.size(); ++i) { for (size_t i = 0; i < bitmaps.size(); ++i) {
if (bitmaps[i].width() == desired_size && if (bitmaps[i].width() == desired_size &&
...@@ -35,37 +56,30 @@ SkBitmap SelectCandidate(const std::vector<SkBitmap>& bitmaps, ...@@ -35,37 +56,30 @@ SkBitmap SelectCandidate(const std::vector<SkBitmap>& bitmaps,
} }
// If that failed, the following special rules apply: // If that failed, the following special rules apply:
// 1. Integer multiples are built using nearest neighbor sampling. // 1. 17px-24px images are built from 16px images by adding
// TODO(thakis): Implement. // a transparent border.
if (desired_size > 16 * scale && desired_size <= 24 * scale) {
// 2. 24px images are built from 16px images by adding a transparent border. int source_size = static_cast<int>(16 * scale + 0.5f);
if (desired_size == 24 || desired_size == 48) {
int source_size = desired_size == 24 ? 16 : 32;
for (size_t i = 0; i < bitmaps.size(); ++i) { for (size_t i = 0; i < bitmaps.size(); ++i) {
if (bitmaps[i].width() == source_size && if (bitmaps[i].width() == source_size &&
bitmaps[i].height() == source_size) { bitmaps[i].height() == source_size) {
SkBitmap bitmap; return PadWithBorder(bitmaps[i], desired_size, source_size);
bitmap.setConfig( }
SkBitmap::kARGB_8888_Config, desired_size, desired_size); }
bitmap.allocPixels(); // Try again, with upsizing the base variant.
bitmap.eraseARGB(0, 0, 0, 0); for (size_t i = 0; i < bitmaps.size(); ++i) {
if (bitmaps[i].width() * scale == source_size &&
{ bitmaps[i].height() * scale == source_size) {
SkCanvas canvas(bitmap); return PadWithBorder(bitmaps[i], desired_size, source_size);
canvas.drawBitmap(bitmaps[i],
SkIntToScalar(source_size / 4),
SkIntToScalar(source_size / 4));
}
return bitmap;
} }
} }
} }
// 2. Integer multiples are built using nearest neighbor sampling.
// TODO(thakis): Implement.
// 3. Else, use Lancosz scaling: // 3. Else, use Lancosz scaling:
// a) If available, from the next bigger integer multiple variant. // b) If available, from the next bigger variant.
// TODO(thakis): Implement.
// b) Else, from the next bigger variant.
int lancosz_candidate = -1; int lancosz_candidate = -1;
int min_area = INT_MAX; int min_area = INT_MAX;
for (size_t i = 0; i < bitmaps.size(); ++i) { for (size_t i = 0; i < bitmaps.size(); ++i) {
...@@ -105,10 +119,9 @@ gfx::ImageSkia SelectFaviconFrames( ...@@ -105,10 +119,9 @@ gfx::ImageSkia SelectFaviconFrames(
} }
for (size_t i = 0; i < scale_factors.size(); ++i) { for (size_t i = 0; i < scale_factors.size(); ++i) {
int size = static_cast<int>(
desired_size * GetScaleFactorScale(scale_factors[i]) + 0.5f);
multi_image.AddRepresentation(gfx::ImageSkiaRep( multi_image.AddRepresentation(gfx::ImageSkiaRep(
SelectCandidate(bitmaps, size), scale_factors[i])); SelectCandidate(bitmaps, desired_size, scale_factors[i]),
scale_factors[i]));
} }
return multi_image; return multi_image;
......
...@@ -158,11 +158,44 @@ TEST(SelectFaviconFramesTest, _24_48) { ...@@ -158,11 +158,44 @@ TEST(SelectFaviconFramesTest, _24_48) {
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 0, 0))); EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 0, 0)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 3, 4))); EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 3, 4)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 4, 4))); EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 4, 4)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 19, 19)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 20, 19)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 23, 23)));
EXPECT_EQ(SK_ColorBLUE, GetColor2x(image)); EXPECT_EQ(SK_ColorBLUE, GetColor2x(image));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 0, 0))); EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 0, 0)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 7, 8))); EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 7, 8)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 8, 8))); EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 8, 8)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 39, 39)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 40, 39)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 47, 47)));
}
TEST(SelectFaviconFramesTest, _48_From_16) {
vector<SkBitmap> bitmaps;
bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 16, 16));
gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x2x(), 24);
EXPECT_EQ(2u, image.image_reps().size());
ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P));
ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_200P));
EXPECT_EQ(24, image.width());
EXPECT_EQ(24, image.height());
EXPECT_EQ(SK_ColorGREEN, GetColor1x(image));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 0, 0)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 3, 4)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 4, 4)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 19, 19)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 20, 19)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 23, 23)));
EXPECT_EQ(SK_ColorGREEN, GetColor2x(image));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 0, 0)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 7, 8)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 8, 8)));
EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 39, 39)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 40, 39)));
EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 47, 47)));
} }
} }
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