Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: ui/gfx/color_analysis_unittest.cc

Issue 361643002: setConfig is deprecated, use setInfo or allocPixels instead (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: don't call allocPixels+rowbytes yet (skia bug) Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/gfx/color_analysis.cc ('k') | ui/gfx/color_utils.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/color_analysis.h" 5 #include "ui/gfx/color_analysis.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/skia/include/core/SkBitmap.h" 10 #include "third_party/skia/include/core/SkBitmap.h"
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 87 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
88 }; 88 };
89 89
90 const HSL kDefaultLowerBound = {-1, -1, 0.15}; 90 const HSL kDefaultLowerBound = {-1, -1, 0.15};
91 const HSL kDefaultUpperBound = {-1, -1, 0.85}; 91 const HSL kDefaultUpperBound = {-1, -1, 0.85};
92 92
93 // Creates a 1-dimensional png of the pixel colors found in |colors|. 93 // Creates a 1-dimensional png of the pixel colors found in |colors|.
94 scoped_refptr<base::RefCountedMemory> CreateTestPNG( 94 scoped_refptr<base::RefCountedMemory> CreateTestPNG(
95 const std::vector<SkColor>& colors) { 95 const std::vector<SkColor>& colors) {
96 SkBitmap bitmap; 96 SkBitmap bitmap;
97 bitmap.setConfig(SkBitmap::kARGB_8888_Config, colors.size(), 1); 97 bitmap.allocN32Pixels(colors.size(), 1);
98 bitmap.allocPixels();
99 98
100 SkAutoLockPixels lock(bitmap); 99 SkAutoLockPixels lock(bitmap);
101 for (size_t i = 0; i < colors.size(); ++i) { 100 for (size_t i = 0; i < colors.size(); ++i) {
102 bitmap.eraseArea(SkIRect::MakeXYWH(i, 0, 1, 1), colors[i]); 101 bitmap.eraseArea(SkIRect::MakeXYWH(i, 0, 1, 1), colors[i]);
103 } 102 }
104 return gfx::Image::CreateFrom1xBitmap(bitmap).As1xPNGBytes(); 103 return gfx::Image::CreateFrom1xBitmap(bitmap).As1xPNGBytes();
105 } 104 }
106 105
107 class MockKMeanImageSampler : public KMeanImageSampler { 106 class MockKMeanImageSampler : public KMeanImageSampler {
108 public: 107 public:
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 EXPECT_EQ(4 + 10 * kWidth, sampler.GetSample(kWidth, kHeight)); 271 EXPECT_EQ(4 + 10 * kWidth, sampler.GetSample(kWidth, kHeight));
273 } 272 }
274 273
275 TEST_F(ColorAnalysisTest, FindClosestColor) { 274 TEST_F(ColorAnalysisTest, FindClosestColor) {
276 // Empty image returns input color. 275 // Empty image returns input color.
277 SkColor color = FindClosestColor(NULL, 0, 0, SK_ColorRED); 276 SkColor color = FindClosestColor(NULL, 0, 0, SK_ColorRED);
278 EXPECT_EQ(SK_ColorRED, color); 277 EXPECT_EQ(SK_ColorRED, color);
279 278
280 // Single color image returns that color. 279 // Single color image returns that color.
281 SkBitmap bitmap; 280 SkBitmap bitmap;
282 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 281 bitmap.allocN32Pixels(16, 16);
283 bitmap.allocPixels();
284 bitmap.eraseColor(SK_ColorWHITE); 282 bitmap.eraseColor(SK_ColorWHITE);
285 color = FindClosestColor(static_cast<uint8_t*>(bitmap.getPixels()), 283 color = FindClosestColor(static_cast<uint8_t*>(bitmap.getPixels()),
286 bitmap.width(), 284 bitmap.width(),
287 bitmap.height(), 285 bitmap.height(),
288 SK_ColorRED); 286 SK_ColorRED);
289 EXPECT_EQ(SK_ColorWHITE, color); 287 EXPECT_EQ(SK_ColorWHITE, color);
290 288
291 // Write a black pixel into the image. A dark grey input pixel should match 289 // Write a black pixel into the image. A dark grey input pixel should match
292 // the black one in the image. 290 // the black one in the image.
293 uint32_t* pixel = bitmap.getAddr32(0, 0); 291 uint32_t* pixel = bitmap.getAddr32(0, 0);
294 *pixel = SK_ColorBLACK; 292 *pixel = SK_ColorBLACK;
295 color = FindClosestColor(static_cast<uint8_t*>(bitmap.getPixels()), 293 color = FindClosestColor(static_cast<uint8_t*>(bitmap.getPixels()),
296 bitmap.width(), 294 bitmap.width(),
297 bitmap.height(), 295 bitmap.height(),
298 SK_ColorDKGRAY); 296 SK_ColorDKGRAY);
299 EXPECT_EQ(SK_ColorBLACK, color); 297 EXPECT_EQ(SK_ColorBLACK, color);
300 } 298 }
301 299
302 TEST_F(ColorAnalysisTest, CalculateKMeanColorOfBitmap) { 300 TEST_F(ColorAnalysisTest, CalculateKMeanColorOfBitmap) {
303 // Create a 16x16 bitmap to represent a favicon. 301 // Create a 16x16 bitmap to represent a favicon.
304 SkBitmap bitmap; 302 SkBitmap bitmap;
305 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 303 bitmap.allocN32Pixels(16, 16);
306 bitmap.allocPixels();
307 bitmap.eraseARGB(255, 100, 150, 200); 304 bitmap.eraseARGB(255, 100, 150, 200);
308 305
309 SkColor color = CalculateKMeanColorOfBitmap(bitmap); 306 SkColor color = CalculateKMeanColorOfBitmap(bitmap);
310 EXPECT_EQ(255u, SkColorGetA(color)); 307 EXPECT_EQ(255u, SkColorGetA(color));
311 // Color values are not exactly equal due to reversal of premultiplied alpha. 308 // Color values are not exactly equal due to reversal of premultiplied alpha.
312 EXPECT_TRUE(ChannelApproximatelyEqual(100, SkColorGetR(color))); 309 EXPECT_TRUE(ChannelApproximatelyEqual(100, SkColorGetR(color)));
313 EXPECT_TRUE(ChannelApproximatelyEqual(150, SkColorGetG(color))); 310 EXPECT_TRUE(ChannelApproximatelyEqual(150, SkColorGetG(color)));
314 EXPECT_TRUE(ChannelApproximatelyEqual(200, SkColorGetB(color))); 311 EXPECT_TRUE(ChannelApproximatelyEqual(200, SkColorGetB(color)));
315 312
316 // Test a bitmap with an alpha channel. 313 // Test a bitmap with an alpha channel.
317 bitmap.eraseARGB(128, 100, 150, 200); 314 bitmap.eraseARGB(128, 100, 150, 200);
318 color = CalculateKMeanColorOfBitmap(bitmap); 315 color = CalculateKMeanColorOfBitmap(bitmap);
319 316
320 // Alpha channel should be ignored for dominant color calculation. 317 // Alpha channel should be ignored for dominant color calculation.
321 EXPECT_EQ(255u, SkColorGetA(color)); 318 EXPECT_EQ(255u, SkColorGetA(color));
322 EXPECT_TRUE(ChannelApproximatelyEqual(100, SkColorGetR(color))); 319 EXPECT_TRUE(ChannelApproximatelyEqual(100, SkColorGetR(color)));
323 EXPECT_TRUE(ChannelApproximatelyEqual(150, SkColorGetG(color))); 320 EXPECT_TRUE(ChannelApproximatelyEqual(150, SkColorGetG(color)));
324 EXPECT_TRUE(ChannelApproximatelyEqual(200, SkColorGetB(color))); 321 EXPECT_TRUE(ChannelApproximatelyEqual(200, SkColorGetB(color)));
325 } 322 }
326 323
327 TEST_F(ColorAnalysisTest, ComputeColorCovarianceTrivial) { 324 TEST_F(ColorAnalysisTest, ComputeColorCovarianceTrivial) {
328 SkBitmap bitmap; 325 SkBitmap bitmap;
329 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 200); 326 bitmap.setInfo(SkImageInfo::MakeN32Premul(100, 200));
330 327
331 EXPECT_EQ(gfx::Matrix3F::Zeros(), ComputeColorCovariance(bitmap)); 328 EXPECT_EQ(gfx::Matrix3F::Zeros(), ComputeColorCovariance(bitmap));
332 bitmap.allocPixels(); 329 bitmap.allocPixels();
333 bitmap.eraseARGB(255, 50, 150, 200); 330 bitmap.eraseARGB(255, 50, 150, 200);
334 gfx::Matrix3F covariance = ComputeColorCovariance(bitmap); 331 gfx::Matrix3F covariance = ComputeColorCovariance(bitmap);
335 // The answer should be all zeros. 332 // The answer should be all zeros.
336 EXPECT_TRUE(covariance == gfx::Matrix3F::Zeros()); 333 EXPECT_TRUE(covariance == gfx::Matrix3F::Zeros());
337 } 334 }
338 335
339 TEST_F(ColorAnalysisTest, ComputeColorCovarianceWithCanvas) { 336 TEST_F(ColorAnalysisTest, ComputeColorCovarianceWithCanvas) {
(...skipping 14 matching lines...) Expand all
354 expected_covariance.set(2400, 400, -1600, 351 expected_covariance.set(2400, 400, -1600,
355 400, 2400, 400, 352 400, 2400, 400,
356 -1600, 400, 2400); 353 -1600, 400, 2400);
357 EXPECT_EQ(expected_covariance, covariance); 354 EXPECT_EQ(expected_covariance, covariance);
358 } 355 }
359 356
360 TEST_F(ColorAnalysisTest, ApplyColorReductionSingleColor) { 357 TEST_F(ColorAnalysisTest, ApplyColorReductionSingleColor) {
361 // The test runs color reduction on a single-colot image, where results are 358 // The test runs color reduction on a single-colot image, where results are
362 // bound to be uninteresting. This is an important edge case, though. 359 // bound to be uninteresting. This is an important edge case, though.
363 SkBitmap source, result; 360 SkBitmap source, result;
364 source.setConfig(SkBitmap::kARGB_8888_Config, 300, 200); 361 source.allocN32Pixels(300, 200);
365 result.setConfig(SkBitmap::kA8_Config, 300, 200); 362 result.allocPixels(SkImageInfo::MakeA8(300, 200));
366 363
367 source.allocPixels();
368 result.allocPixels();
369 source.eraseARGB(255, 50, 150, 200); 364 source.eraseARGB(255, 50, 150, 200);
370 365
371 gfx::Vector3dF transform(1.0f, .5f, 0.1f); 366 gfx::Vector3dF transform(1.0f, .5f, 0.1f);
372 // This transform, if not scaled, should result in GL=145. 367 // This transform, if not scaled, should result in GL=145.
373 EXPECT_TRUE(ApplyColorReduction(source, transform, false, &result)); 368 EXPECT_TRUE(ApplyColorReduction(source, transform, false, &result));
374 369
375 uint8_t min_gl = 0; 370 uint8_t min_gl = 0;
376 uint8_t max_gl = 0; 371 uint8_t max_gl = 0;
377 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl); 372 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl);
378 EXPECT_EQ(145, min_gl); 373 EXPECT_EQ(145, min_gl);
(...skipping 24 matching lines...) Expand all
403 // Check with images with multiple colors. This is really different only when 398 // Check with images with multiple colors. This is really different only when
404 // the result is scaled. 399 // the result is scaled.
405 gfx::Canvas canvas(gfx::Size(300, 200), 1.0f, true); 400 gfx::Canvas canvas(gfx::Size(300, 200), 1.0f, true);
406 401
407 // The image consists of vertical non-overlapping stripes 150 pixels wide. 402 // The image consists of vertical non-overlapping stripes 150 pixels wide.
408 canvas.FillRect(gfx::Rect(0, 0, 150, 200), SkColorSetRGB(0, 0, 0)); 403 canvas.FillRect(gfx::Rect(0, 0, 150, 200), SkColorSetRGB(0, 0, 0));
409 canvas.FillRect(gfx::Rect(150, 0, 150, 200), SkColorSetRGB(255, 255, 255)); 404 canvas.FillRect(gfx::Rect(150, 0, 150, 200), SkColorSetRGB(255, 255, 255));
410 SkBitmap source = 405 SkBitmap source =
411 skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false); 406 skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
412 SkBitmap result; 407 SkBitmap result;
413 result.setConfig(SkBitmap::kA8_Config, 300, 200); 408 result.allocPixels(SkImageInfo::MakeA8(300, 200));
414 result.allocPixels();
415 409
416 gfx::Vector3dF transform(1.0f, 0.5f, 0.1f); 410 gfx::Vector3dF transform(1.0f, 0.5f, 0.1f);
417 EXPECT_TRUE(ApplyColorReduction(source, transform, true, &result)); 411 EXPECT_TRUE(ApplyColorReduction(source, transform, true, &result));
418 uint8_t min_gl = 0; 412 uint8_t min_gl = 0;
419 uint8_t max_gl = 0; 413 uint8_t max_gl = 0;
420 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl); 414 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl);
421 415
422 EXPECT_EQ(0, min_gl); 416 EXPECT_EQ(0, min_gl);
423 EXPECT_EQ(255, max_gl); 417 EXPECT_EQ(255, max_gl);
424 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(0, 0))); 418 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(0, 0)));
(...skipping 17 matching lines...) Expand all
442 // the result is scaled. 436 // the result is scaled.
443 gfx::Canvas canvas(gfx::Size(300, 200), 1.0f, true); 437 gfx::Canvas canvas(gfx::Size(300, 200), 1.0f, true);
444 438
445 // The image consists of vertical non-overlapping stripes 100 pixels wide. 439 // The image consists of vertical non-overlapping stripes 100 pixels wide.
446 canvas.FillRect(gfx::Rect(0, 0, 100, 200), SkColorSetRGB(100, 0, 0)); 440 canvas.FillRect(gfx::Rect(0, 0, 100, 200), SkColorSetRGB(100, 0, 0));
447 canvas.FillRect(gfx::Rect(100, 0, 100, 200), SkColorSetRGB(0, 255, 0)); 441 canvas.FillRect(gfx::Rect(100, 0, 100, 200), SkColorSetRGB(0, 255, 0));
448 canvas.FillRect(gfx::Rect(200, 0, 100, 200), SkColorSetRGB(0, 0, 128)); 442 canvas.FillRect(gfx::Rect(200, 0, 100, 200), SkColorSetRGB(0, 0, 128));
449 SkBitmap source = 443 SkBitmap source =
450 skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false); 444 skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
451 SkBitmap result; 445 SkBitmap result;
452 result.setConfig(SkBitmap::kA8_Config, 300, 200); 446 result.allocPixels(SkImageInfo::MakeA8(300, 200));
453 result.allocPixels();
454 447
455 gfx::Vector3dF transform(1.0f, 0.5f, 0.1f); 448 gfx::Vector3dF transform(1.0f, 0.5f, 0.1f);
456 EXPECT_TRUE(ApplyColorReduction(source, transform, false, &result)); 449 EXPECT_TRUE(ApplyColorReduction(source, transform, false, &result));
457 uint8_t min_gl = 0; 450 uint8_t min_gl = 0;
458 uint8_t max_gl = 0; 451 uint8_t max_gl = 0;
459 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl); 452 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl);
460 EXPECT_EQ(12, min_gl); 453 EXPECT_EQ(12, min_gl);
461 EXPECT_EQ(127, max_gl); 454 EXPECT_EQ(127, max_gl);
462 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(299, 199))); 455 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(299, 199)));
463 EXPECT_EQ(max_gl, SkColorGetA(result.getColor(150, 0))); 456 EXPECT_EQ(max_gl, SkColorGetA(result.getColor(150, 0)));
464 EXPECT_EQ(100U, SkColorGetA(result.getColor(0, 0))); 457 EXPECT_EQ(100U, SkColorGetA(result.getColor(0, 0)));
465 458
466 EXPECT_TRUE(ApplyColorReduction(source, transform, true, &result)); 459 EXPECT_TRUE(ApplyColorReduction(source, transform, true, &result));
467 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl); 460 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl);
468 EXPECT_EQ(0, min_gl); 461 EXPECT_EQ(0, min_gl);
469 EXPECT_EQ(255, max_gl); 462 EXPECT_EQ(255, max_gl);
470 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(299, 199))); 463 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(299, 199)));
471 EXPECT_EQ(max_gl, SkColorGetA(result.getColor(150, 0))); 464 EXPECT_EQ(max_gl, SkColorGetA(result.getColor(150, 0)));
472 EXPECT_EQ(193U, SkColorGetA(result.getColor(0, 0))); 465 EXPECT_EQ(193U, SkColorGetA(result.getColor(0, 0)));
473 } 466 }
474 467
475 TEST_F(ColorAnalysisTest, ComputePrincipalComponentImageNotComputable) { 468 TEST_F(ColorAnalysisTest, ComputePrincipalComponentImageNotComputable) {
476 SkBitmap source, result; 469 SkBitmap source, result;
477 source.setConfig(SkBitmap::kARGB_8888_Config, 300, 200); 470 source.allocN32Pixels(300, 200);
478 result.setConfig(SkBitmap::kA8_Config, 300, 200); 471 result.allocPixels(SkImageInfo::MakeA8(300, 200));
479 472
480 source.allocPixels();
481 result.allocPixels();
482 source.eraseARGB(255, 50, 150, 200); 473 source.eraseARGB(255, 50, 150, 200);
483 474
484 // This computation should fail since all colors always vary together. 475 // This computation should fail since all colors always vary together.
485 EXPECT_FALSE(ComputePrincipalComponentImage(source, &result)); 476 EXPECT_FALSE(ComputePrincipalComponentImage(source, &result));
486 } 477 }
487 478
488 TEST_F(ColorAnalysisTest, ComputePrincipalComponentImage) { 479 TEST_F(ColorAnalysisTest, ComputePrincipalComponentImage) {
489 gfx::Canvas canvas(gfx::Size(300, 200), 1.0f, true); 480 gfx::Canvas canvas(gfx::Size(300, 200), 1.0f, true);
490 481
491 // The image consists of vertical non-overlapping stripes 100 pixels wide. 482 // The image consists of vertical non-overlapping stripes 100 pixels wide.
492 canvas.FillRect(gfx::Rect(0, 0, 100, 200), SkColorSetRGB(10, 10, 10)); 483 canvas.FillRect(gfx::Rect(0, 0, 100, 200), SkColorSetRGB(10, 10, 10));
493 canvas.FillRect(gfx::Rect(100, 0, 100, 200), SkColorSetRGB(100, 100, 100)); 484 canvas.FillRect(gfx::Rect(100, 0, 100, 200), SkColorSetRGB(100, 100, 100));
494 canvas.FillRect(gfx::Rect(200, 0, 100, 200), SkColorSetRGB(255, 255, 255)); 485 canvas.FillRect(gfx::Rect(200, 0, 100, 200), SkColorSetRGB(255, 255, 255));
495 SkBitmap source = 486 SkBitmap source =
496 skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false); 487 skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
497 SkBitmap result; 488 SkBitmap result;
498 result.setConfig(SkBitmap::kA8_Config, 300, 200); 489 result.allocPixels(SkImageInfo::MakeA8(300, 200));
499 result.allocPixels();
500 490
501 // This computation should fail since all colors always vary together. 491 // This computation should fail since all colors always vary together.
502 EXPECT_TRUE(ComputePrincipalComponentImage(source, &result)); 492 EXPECT_TRUE(ComputePrincipalComponentImage(source, &result));
503 493
504 uint8_t min_gl = 0; 494 uint8_t min_gl = 0;
505 uint8_t max_gl = 0; 495 uint8_t max_gl = 0;
506 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl); 496 Calculate8bitBitmapMinMax(result, &min_gl, &max_gl);
507 497
508 EXPECT_EQ(0, min_gl); 498 EXPECT_EQ(0, min_gl);
509 EXPECT_EQ(255, max_gl); 499 EXPECT_EQ(255, max_gl);
510 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(0, 0))); 500 EXPECT_EQ(min_gl, SkColorGetA(result.getColor(0, 0)));
511 EXPECT_EQ(max_gl, SkColorGetA(result.getColor(299, 199))); 501 EXPECT_EQ(max_gl, SkColorGetA(result.getColor(299, 199)));
512 EXPECT_EQ(93U, SkColorGetA(result.getColor(150, 0))); 502 EXPECT_EQ(93U, SkColorGetA(result.getColor(150, 0)));
513 } 503 }
514 504
515 } // namespace color_utils 505 } // namespace color_utils
OLDNEW
« no previous file with comments | « ui/gfx/color_analysis.cc ('k') | ui/gfx/color_utils.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698