| OLD | NEW |
| 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 <limits.h> | 7 #include <limits.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <memory> |
| 12 #include <vector> | 13 #include <vector> |
| 13 | 14 |
| 14 #include "base/logging.h" | 15 #include "base/logging.h" |
| 15 #include "base/memory/scoped_ptr.h" | |
| 16 #include "third_party/skia/include/core/SkBitmap.h" | 16 #include "third_party/skia/include/core/SkBitmap.h" |
| 17 #include "third_party/skia/include/core/SkUnPreMultiply.h" | 17 #include "third_party/skia/include/core/SkUnPreMultiply.h" |
| 18 #include "ui/gfx/codec/png_codec.h" | 18 #include "ui/gfx/codec/png_codec.h" |
| 19 #include "ui/gfx/color_utils.h" | 19 #include "ui/gfx/color_utils.h" |
| 20 | 20 |
| 21 namespace color_utils { | 21 namespace color_utils { |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 // RGBA KMean Constants | 24 // RGBA KMean Constants |
| 25 const uint32_t kNumberOfClusters = 4; | 25 const uint32_t kNumberOfClusters = 4; |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 } | 390 } |
| 391 | 391 |
| 392 SkColor CalculateKMeanColorOfBitmap(const SkBitmap& bitmap, | 392 SkColor CalculateKMeanColorOfBitmap(const SkBitmap& bitmap, |
| 393 const HSL& lower_bound, | 393 const HSL& lower_bound, |
| 394 const HSL& upper_bound, | 394 const HSL& upper_bound, |
| 395 KMeanImageSampler* sampler) { | 395 KMeanImageSampler* sampler) { |
| 396 // SkBitmap uses pre-multiplied alpha but the KMean clustering function | 396 // SkBitmap uses pre-multiplied alpha but the KMean clustering function |
| 397 // above uses non-pre-multiplied alpha. Transform the bitmap before we | 397 // above uses non-pre-multiplied alpha. Transform the bitmap before we |
| 398 // analyze it because the function reads each pixel multiple times. | 398 // analyze it because the function reads each pixel multiple times. |
| 399 int pixel_count = bitmap.width() * bitmap.height(); | 399 int pixel_count = bitmap.width() * bitmap.height(); |
| 400 scoped_ptr<uint32_t[]> image(new uint32_t[pixel_count]); | 400 std::unique_ptr<uint32_t[]> image(new uint32_t[pixel_count]); |
| 401 UnPreMultiply(bitmap, image.get(), pixel_count); | 401 UnPreMultiply(bitmap, image.get(), pixel_count); |
| 402 | 402 |
| 403 return CalculateKMeanColorOfBuffer(reinterpret_cast<uint8_t*>(image.get()), | 403 return CalculateKMeanColorOfBuffer(reinterpret_cast<uint8_t*>(image.get()), |
| 404 bitmap.width(), | 404 bitmap.width(), |
| 405 bitmap.height(), | 405 bitmap.height(), |
| 406 lower_bound, | 406 lower_bound, |
| 407 upper_bound, | 407 upper_bound, |
| 408 sampler); | 408 sampler); |
| 409 } | 409 } |
| 410 | 410 |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 gfx::Matrix3F covariance = ComputeColorCovariance(source_bitmap); | 576 gfx::Matrix3F covariance = ComputeColorCovariance(source_bitmap); |
| 577 gfx::Matrix3F eigenvectors = gfx::Matrix3F::Zeros(); | 577 gfx::Matrix3F eigenvectors = gfx::Matrix3F::Zeros(); |
| 578 gfx::Vector3dF eigenvals = covariance.SolveEigenproblem(&eigenvectors); | 578 gfx::Vector3dF eigenvals = covariance.SolveEigenproblem(&eigenvectors); |
| 579 gfx::Vector3dF principal = eigenvectors.get_column(0); | 579 gfx::Vector3dF principal = eigenvectors.get_column(0); |
| 580 if (eigenvals == gfx::Vector3dF() || principal == gfx::Vector3dF()) | 580 if (eigenvals == gfx::Vector3dF() || principal == gfx::Vector3dF()) |
| 581 return false; // This may happen for some edge cases. | 581 return false; // This may happen for some edge cases. |
| 582 return ApplyColorReduction(source_bitmap, principal, true, target_bitmap); | 582 return ApplyColorReduction(source_bitmap, principal, true, target_bitmap); |
| 583 } | 583 } |
| 584 | 584 |
| 585 } // color_utils | 585 } // color_utils |
| OLD | NEW |