| 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 <stdint.h> |
| 8 |
| 7 #include <algorithm> | 9 #include <algorithm> |
| 8 #include <limits> | 10 #include <limits> |
| 9 #include <vector> | 11 #include <vector> |
| 10 | 12 |
| 11 #include "base/logging.h" | 13 #include "base/logging.h" |
| 12 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 13 #include "third_party/skia/include/core/SkBitmap.h" | 15 #include "third_party/skia/include/core/SkBitmap.h" |
| 14 #include "third_party/skia/include/core/SkUnPreMultiply.h" | 16 #include "third_party/skia/include/core/SkUnPreMultiply.h" |
| 15 #include "ui/gfx/codec/png_codec.h" | 17 #include "ui/gfx/codec/png_codec.h" |
| 16 #include "ui/gfx/color_utils.h" | 18 #include "ui/gfx/color_utils.h" |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 } | 181 } |
| 180 | 182 |
| 181 SkColor FindClosestColor(const uint8_t* image, | 183 SkColor FindClosestColor(const uint8_t* image, |
| 182 int width, | 184 int width, |
| 183 int height, | 185 int height, |
| 184 SkColor color) { | 186 SkColor color) { |
| 185 uint8_t in_r = SkColorGetR(color); | 187 uint8_t in_r = SkColorGetR(color); |
| 186 uint8_t in_g = SkColorGetG(color); | 188 uint8_t in_g = SkColorGetG(color); |
| 187 uint8_t in_b = SkColorGetB(color); | 189 uint8_t in_b = SkColorGetB(color); |
| 188 // Search using distance-squared to avoid expensive sqrt() operations. | 190 // Search using distance-squared to avoid expensive sqrt() operations. |
| 189 int best_distance_squared = kint32max; | 191 int best_distance_squared = std::numeric_limits<int32_t>::max(); |
| 190 SkColor best_color = color; | 192 SkColor best_color = color; |
| 191 const uint8_t* byte = image; | 193 const uint8_t* byte = image; |
| 192 for (int i = 0; i < width * height; ++i) { | 194 for (int i = 0; i < width * height; ++i) { |
| 193 uint8_t b = *(byte++); | 195 uint8_t b = *(byte++); |
| 194 uint8_t g = *(byte++); | 196 uint8_t g = *(byte++); |
| 195 uint8_t r = *(byte++); | 197 uint8_t r = *(byte++); |
| 196 uint8_t a = *(byte++); | 198 uint8_t a = *(byte++); |
| 197 // Ignore fully transparent pixels. | 199 // Ignore fully transparent pixels. |
| 198 if (a == 0) | 200 if (a == 0) |
| 199 continue; | 201 continue; |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 gfx::Matrix3F covariance = ComputeColorCovariance(source_bitmap); | 575 gfx::Matrix3F covariance = ComputeColorCovariance(source_bitmap); |
| 574 gfx::Matrix3F eigenvectors = gfx::Matrix3F::Zeros(); | 576 gfx::Matrix3F eigenvectors = gfx::Matrix3F::Zeros(); |
| 575 gfx::Vector3dF eigenvals = covariance.SolveEigenproblem(&eigenvectors); | 577 gfx::Vector3dF eigenvals = covariance.SolveEigenproblem(&eigenvectors); |
| 576 gfx::Vector3dF principal = eigenvectors.get_column(0); | 578 gfx::Vector3dF principal = eigenvectors.get_column(0); |
| 577 if (eigenvals == gfx::Vector3dF() || principal == gfx::Vector3dF()) | 579 if (eigenvals == gfx::Vector3dF() || principal == gfx::Vector3dF()) |
| 578 return false; // This may happen for some edge cases. | 580 return false; // This may happen for some edge cases. |
| 579 return ApplyColorReduction(source_bitmap, principal, true, target_bitmap); | 581 return ApplyColorReduction(source_bitmap, principal, true, target_bitmap); |
| 580 } | 582 } |
| 581 | 583 |
| 582 } // color_utils | 584 } // color_utils |
| OLD | NEW |