OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "chrome/browser/thumbnails/content_analysis.h" | 5 #include "chrome/browser/thumbnails/content_analysis.h" |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include <algorithm> | 10 #include <algorithm> |
8 #include <cmath> | 11 #include <cmath> |
9 #include <deque> | 12 #include <deque> |
10 #include <functional> | 13 #include <functional> |
11 #include <limits> | 14 #include <limits> |
12 #include <numeric> | 15 #include <numeric> |
13 #include <vector> | 16 #include <vector> |
14 | 17 |
15 #include "base/logging.h" | 18 #include "base/logging.h" |
16 #include "skia/ext/convolver.h" | 19 #include "skia/ext/convolver.h" |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 0, intermediate.bytesPerPixel(), | 314 0, intermediate.bytesPerPixel(), |
312 smoothing_filter, | 315 smoothing_filter, |
313 image_size, | 316 image_size, |
314 input_bitmap->getAddr8(0, 0), | 317 input_bitmap->getAddr8(0, 0), |
315 static_cast<int>(input_bitmap->rowBytes()), | 318 static_cast<int>(input_bitmap->rowBytes()), |
316 0, input_bitmap->bytesPerPixel(), false); | 319 0, input_bitmap->bytesPerPixel(), false); |
317 if (smoothed_max < 127) { | 320 if (smoothed_max < 127) { |
318 int bit_shift = 8 - static_cast<int>( | 321 int bit_shift = 8 - static_cast<int>( |
319 std::log10(static_cast<float>(smoothed_max)) / std::log10(2.0f)); | 322 std::log10(static_cast<float>(smoothed_max)) / std::log10(2.0f)); |
320 for (int r = 0; r < image_size.height(); ++r) { | 323 for (int r = 0; r < image_size.height(); ++r) { |
321 uint8* row = input_bitmap->getAddr8(0, r); | 324 uint8_t* row = input_bitmap->getAddr8(0, r); |
322 for (int c = 0; c < image_size.width(); ++c, ++row) { | 325 for (int c = 0; c < image_size.width(); ++c, ++row) { |
323 *row <<= bit_shift; | 326 *row <<= bit_shift; |
324 } | 327 } |
325 } | 328 } |
326 } | 329 } |
327 | 330 |
328 skia::RecursiveFilter gradient_filter( | 331 skia::RecursiveFilter gradient_filter( |
329 kernel_sigma, skia::RecursiveFilter::FIRST_DERIVATIVE); | 332 kernel_sigma, skia::RecursiveFilter::FIRST_DERIVATIVE); |
330 skia::SingleChannelRecursiveGaussianX( | 333 skia::SingleChannelRecursiveGaussianX( |
331 input_bitmap->getAddr8(0, 0), | 334 input_bitmap->getAddr8(0, 0), |
(...skipping 10 matching lines...) Expand all Loading... |
342 0, input_bitmap->bytesPerPixel(), | 345 0, input_bitmap->bytesPerPixel(), |
343 gradient_filter, | 346 gradient_filter, |
344 image_size, | 347 image_size, |
345 intermediate2.getAddr8(0, 0), | 348 intermediate2.getAddr8(0, 0), |
346 static_cast<int>(intermediate2.rowBytes()), | 349 static_cast<int>(intermediate2.rowBytes()), |
347 0, intermediate2.bytesPerPixel(), true); | 350 0, intermediate2.bytesPerPixel(), true); |
348 } | 351 } |
349 | 352 |
350 unsigned grad_max = 0; | 353 unsigned grad_max = 0; |
351 for (int r = 0; r < image_size.height(); ++r) { | 354 for (int r = 0; r < image_size.height(); ++r) { |
352 const uint8* grad_x_row = intermediate.getAddr8(0, r); | 355 const uint8_t* grad_x_row = intermediate.getAddr8(0, r); |
353 const uint8* grad_y_row = intermediate2.getAddr8(0, r); | 356 const uint8_t* grad_y_row = intermediate2.getAddr8(0, r); |
354 for (int c = 0; c < image_size.width(); ++c) { | 357 for (int c = 0; c < image_size.width(); ++c) { |
355 unsigned grad_x = grad_x_row[c]; | 358 unsigned grad_x = grad_x_row[c]; |
356 unsigned grad_y = grad_y_row[c]; | 359 unsigned grad_y = grad_y_row[c]; |
357 grad_max = std::max(grad_max, grad_x * grad_x + grad_y * grad_y); | 360 grad_max = std::max(grad_max, grad_x * grad_x + grad_y * grad_y); |
358 } | 361 } |
359 } | 362 } |
360 | 363 |
361 int bit_shift = 0; | 364 int bit_shift = 0; |
362 if (grad_max > 255) | 365 if (grad_max > 255) |
363 bit_shift = static_cast<int>( | 366 bit_shift = static_cast<int>( |
364 std::log10(static_cast<float>(grad_max)) / std::log10(2.0f)) - 7; | 367 std::log10(static_cast<float>(grad_max)) / std::log10(2.0f)) - 7; |
365 for (int r = 0; r < image_size.height(); ++r) { | 368 for (int r = 0; r < image_size.height(); ++r) { |
366 const uint8* grad_x_row = intermediate.getAddr8(0, r); | 369 const uint8_t* grad_x_row = intermediate.getAddr8(0, r); |
367 const uint8* grad_y_row = intermediate2.getAddr8(0, r); | 370 const uint8_t* grad_y_row = intermediate2.getAddr8(0, r); |
368 uint8* target_row = input_bitmap->getAddr8(0, r); | 371 uint8_t* target_row = input_bitmap->getAddr8(0, r); |
369 for (int c = 0; c < image_size.width(); ++c) { | 372 for (int c = 0; c < image_size.width(); ++c) { |
370 unsigned grad_x = grad_x_row[c]; | 373 unsigned grad_x = grad_x_row[c]; |
371 unsigned grad_y = grad_y_row[c]; | 374 unsigned grad_y = grad_y_row[c]; |
372 target_row[c] = (grad_x * grad_x + grad_y * grad_y) >> bit_shift; | 375 target_row[c] = (grad_x * grad_x + grad_y * grad_y) >> bit_shift; |
373 } | 376 } |
374 } | 377 } |
375 } | 378 } |
376 | 379 |
377 void ExtractImageProfileInformation(const SkBitmap& input_bitmap, | 380 void ExtractImageProfileInformation(const SkBitmap& input_bitmap, |
378 const gfx::Rect& area, | 381 const gfx::Rect& area, |
(...skipping 12 matching lines...) Expand all Loading... |
391 DCHECK_LE(area.bottom(), input_bitmap.height()); | 394 DCHECK_LE(area.bottom(), input_bitmap.height()); |
392 | 395 |
393 // Make sure rows and columns are allocated and initialized to 0. | 396 // Make sure rows and columns are allocated and initialized to 0. |
394 rows->clear(); | 397 rows->clear(); |
395 columns->clear(); | 398 columns->clear(); |
396 rows->resize(area.height(), 0); | 399 rows->resize(area.height(), 0); |
397 columns->resize(area.width(), 0); | 400 columns->resize(area.width(), 0); |
398 | 401 |
399 for (int r = 0; r < area.height(); ++r) { | 402 for (int r = 0; r < area.height(); ++r) { |
400 // Points to the first byte of the row in the rectangle. | 403 // Points to the first byte of the row in the rectangle. |
401 const uint8* image_row = input_bitmap.getAddr8(area.x(), r + area.y()); | 404 const uint8_t* image_row = input_bitmap.getAddr8(area.x(), r + area.y()); |
402 unsigned row_sum = 0; | 405 unsigned row_sum = 0; |
403 for (int c = 0; c < area.width(); ++c, ++image_row) { | 406 for (int c = 0; c < area.width(); ++c, ++image_row) { |
404 row_sum += *image_row; | 407 row_sum += *image_row; |
405 (*columns)[c] += *image_row; | 408 (*columns)[c] += *image_row; |
406 } | 409 } |
407 (*rows)[r] = row_sum; | 410 (*rows)[r] = row_sum; |
408 } | 411 } |
409 | 412 |
410 if (apply_log) { | 413 if (apply_log) { |
411 // Generally for processing we will need to take logarithm of this data. | 414 // Generally for processing we will need to take logarithm of this data. |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 | 682 |
680 // Allocate the target image. | 683 // Allocate the target image. |
681 SkBitmap target; | 684 SkBitmap target; |
682 target.allocPixels(bitmap.info().makeWH(target_column_count, | 685 target.allocPixels(bitmap.info().makeWH(target_column_count, |
683 target_row_count)); | 686 target_row_count)); |
684 | 687 |
685 int target_row = 0; | 688 int target_row = 0; |
686 for (int r = 0; r < bitmap.height(); ++r) { | 689 for (int r = 0; r < bitmap.height(); ++r) { |
687 if (!rows[r]) | 690 if (!rows[r]) |
688 continue; // We can just skip this one. | 691 continue; // We can just skip this one. |
689 uint8* src_row = | 692 uint8_t* src_row = |
690 static_cast<uint8*>(bitmap.getPixels()) + r * bitmap.rowBytes(); | 693 static_cast<uint8_t*>(bitmap.getPixels()) + r * bitmap.rowBytes(); |
691 uint8* insertion_target = static_cast<uint8*>(target.getPixels()) + | 694 uint8_t* insertion_target = static_cast<uint8_t*>(target.getPixels()) + |
692 target_row * target.rowBytes(); | 695 target_row * target.rowBytes(); |
693 int left_copy_pixel = -1; | 696 int left_copy_pixel = -1; |
694 for (int c = 0; c < bitmap.width(); ++c) { | 697 for (int c = 0; c < bitmap.width(); ++c) { |
695 if (left_copy_pixel < 0 && columns[c]) { | 698 if (left_copy_pixel < 0 && columns[c]) { |
696 left_copy_pixel = c; // Next time we will start copying from here. | 699 left_copy_pixel = c; // Next time we will start copying from here. |
697 } else if (left_copy_pixel >= 0 && !columns[c]) { | 700 } else if (left_copy_pixel >= 0 && !columns[c]) { |
698 // This closes a fragment we want to copy. We do it now. | 701 // This closes a fragment we want to copy. We do it now. |
699 size_t bytes_to_copy = (c - left_copy_pixel) * bitmap.bytesPerPixel(); | 702 size_t bytes_to_copy = (c - left_copy_pixel) * bitmap.bytesPerPixel(); |
700 memcpy(insertion_target, | 703 memcpy(insertion_target, |
701 src_row + left_copy_pixel * bitmap.bytesPerPixel(), | 704 src_row + left_copy_pixel * bitmap.bytesPerPixel(), |
702 bytes_to_copy); | 705 bytes_to_copy); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 target_size, | 764 target_size, |
762 &included_rows, | 765 &included_rows, |
763 &included_columns); | 766 &included_columns); |
764 | 767 |
765 // Use the original image and computed inclusion vectors to create a resized | 768 // Use the original image and computed inclusion vectors to create a resized |
766 // image. | 769 // image. |
767 return ComputeDecimatedImage(source_bitmap, included_rows, included_columns); | 770 return ComputeDecimatedImage(source_bitmap, included_rows, included_columns); |
768 } | 771 } |
769 | 772 |
770 } // namespace thumbnailing_utils | 773 } // namespace thumbnailing_utils |
OLD | NEW |