| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "skia/ext/convolver.h" | 8 #include "skia/ext/convolver.h" |
| 9 #include "skia/ext/convolver_SSE2.h" | 9 #include "skia/ext/convolver_SSE2.h" |
| 10 #include "skia/ext/convolver_mips_dspr2.h" |
| 10 #include "third_party/skia/include/core/SkSize.h" | 11 #include "third_party/skia/include/core/SkSize.h" |
| 11 #include "third_party/skia/include/core/SkTypes.h" | 12 #include "third_party/skia/include/core/SkTypes.h" |
| 12 | 13 |
| 13 namespace skia { | 14 namespace skia { |
| 14 | 15 |
| 15 namespace { | 16 namespace { |
| 16 | 17 |
| 17 // Converts the argument to an 8-bit unsigned value by clamping to the range | 18 // Converts the argument to an 8-bit unsigned value by clamping to the range |
| 18 // 0-255. | 19 // 0-255. |
| 19 inline unsigned char ClampTo8(int a) { | 20 inline unsigned char ClampTo8(int a) { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 int pixel_width, | 341 int pixel_width, |
| 341 unsigned char* out_row, | 342 unsigned char* out_row, |
| 342 bool has_alpha); | 343 bool has_alpha); |
| 343 typedef void (*Convolve4RowsHorizontally_pointer)( | 344 typedef void (*Convolve4RowsHorizontally_pointer)( |
| 344 const unsigned char* src_data[4], | 345 const unsigned char* src_data[4], |
| 345 const ConvolutionFilter1D& filter, | 346 const ConvolutionFilter1D& filter, |
| 346 unsigned char* out_row[4]); | 347 unsigned char* out_row[4]); |
| 347 typedef void (*ConvolveHorizontally_pointer)( | 348 typedef void (*ConvolveHorizontally_pointer)( |
| 348 const unsigned char* src_data, | 349 const unsigned char* src_data, |
| 349 const ConvolutionFilter1D& filter, | 350 const ConvolutionFilter1D& filter, |
| 350 unsigned char* out_row); | 351 unsigned char* out_row, |
| 352 bool has_alpha); |
| 351 | 353 |
| 352 struct ConvolveProcs { | 354 struct ConvolveProcs { |
| 353 // This is how many extra pixels may be read by the | 355 // This is how many extra pixels may be read by the |
| 354 // conolve*horizontally functions. | 356 // conolve*horizontally functions. |
| 355 int extra_horizontal_reads; | 357 int extra_horizontal_reads; |
| 356 ConvolveVertically_pointer convolve_vertically; | 358 ConvolveVertically_pointer convolve_vertically; |
| 357 Convolve4RowsHorizontally_pointer convolve_4rows_horizontally; | 359 Convolve4RowsHorizontally_pointer convolve_4rows_horizontally; |
| 358 ConvolveHorizontally_pointer convolve_horizontally; | 360 ConvolveHorizontally_pointer convolve_horizontally; |
| 359 }; | 361 }; |
| 360 | 362 |
| 361 void SetupSIMD(ConvolveProcs *procs) { | 363 void SetupSIMD(ConvolveProcs *procs) { |
| 362 #ifdef SIMD_SSE2 | 364 #ifdef SIMD_SSE2 |
| 363 base::CPU cpu; | 365 base::CPU cpu; |
| 364 if (cpu.has_sse2()) { | 366 if (cpu.has_sse2()) { |
| 365 procs->extra_horizontal_reads = 3; | 367 procs->extra_horizontal_reads = 3; |
| 366 procs->convolve_vertically = &ConvolveVertically_SSE2; | 368 procs->convolve_vertically = &ConvolveVertically_SSE2; |
| 367 procs->convolve_4rows_horizontally = &Convolve4RowsHorizontally_SSE2; | 369 procs->convolve_4rows_horizontally = &Convolve4RowsHorizontally_SSE2; |
| 368 procs->convolve_horizontally = &ConvolveHorizontally_SSE2; | 370 procs->convolve_horizontally = &ConvolveHorizontally_SSE2; |
| 369 } | 371 } |
| 372 #elif defined SIMD_MIPS_DSPR2 |
| 373 procs->extra_horizontal_reads = 3; |
| 374 procs->convolve_vertically = &ConvolveVertically_mips_dspr2; |
| 375 procs->convolve_horizontally = &ConvolveHorizontally_mips_dspr2; |
| 370 #endif | 376 #endif |
| 371 } | 377 } |
| 372 | 378 |
| 373 void BGRAConvolve2D(const unsigned char* source_data, | 379 void BGRAConvolve2D(const unsigned char* source_data, |
| 374 int source_byte_row_stride, | 380 int source_byte_row_stride, |
| 375 bool source_has_alpha, | 381 bool source_has_alpha, |
| 376 const ConvolutionFilter1D& filter_x, | 382 const ConvolutionFilter1D& filter_x, |
| 377 const ConvolutionFilter1D& filter_y, | 383 const ConvolutionFilter1D& filter_y, |
| 378 int output_byte_row_stride, | 384 int output_byte_row_stride, |
| 379 unsigned char* output, | 385 unsigned char* output, |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 } | 463 } |
| 458 simd.convolve_4rows_horizontally(src, filter_x, out_row); | 464 simd.convolve_4rows_horizontally(src, filter_x, out_row); |
| 459 next_x_row += 4; | 465 next_x_row += 4; |
| 460 } else { | 466 } else { |
| 461 // Check if we need to avoid SSE2 for this row. | 467 // Check if we need to avoid SSE2 for this row. |
| 462 if (simd.convolve_horizontally && | 468 if (simd.convolve_horizontally && |
| 463 next_x_row < last_filter_offset + last_filter_length - | 469 next_x_row < last_filter_offset + last_filter_length - |
| 464 avoid_simd_rows) { | 470 avoid_simd_rows) { |
| 465 simd.convolve_horizontally( | 471 simd.convolve_horizontally( |
| 466 &source_data[next_x_row * source_byte_row_stride], | 472 &source_data[next_x_row * source_byte_row_stride], |
| 467 filter_x, row_buffer.AdvanceRow()); | 473 filter_x, row_buffer.AdvanceRow(), source_has_alpha); |
| 468 } else { | 474 } else { |
| 469 if (source_has_alpha) { | 475 if (source_has_alpha) { |
| 470 ConvolveHorizontally<true>( | 476 ConvolveHorizontally<true>( |
| 471 &source_data[next_x_row * source_byte_row_stride], | 477 &source_data[next_x_row * source_byte_row_stride], |
| 472 filter_x, row_buffer.AdvanceRow()); | 478 filter_x, row_buffer.AdvanceRow()); |
| 473 } else { | 479 } else { |
| 474 ConvolveHorizontally<false>( | 480 ConvolveHorizontally<false>( |
| 475 &source_data[next_x_row * source_byte_row_stride], | 481 &source_data[next_x_row * source_byte_row_stride], |
| 476 filter_x, row_buffer.AdvanceRow()); | 482 filter_x, row_buffer.AdvanceRow()); |
| 477 } | 483 } |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 float v = sigmasq * kernel_weights[tail_length + ii] / ii; | 707 float v = sigmasq * kernel_weights[tail_length + ii] / ii; |
| 702 kernel_weights[tail_length + ii] = v; | 708 kernel_weights[tail_length + ii] = v; |
| 703 kernel_weights[tail_length - ii] = -v; | 709 kernel_weights[tail_length - ii] = -v; |
| 704 } | 710 } |
| 705 } | 711 } |
| 706 | 712 |
| 707 filter->AddFilter(0, &kernel_weights[0], kernel_weights.size()); | 713 filter->AddFilter(0, &kernel_weights[0], kernel_weights.size()); |
| 708 } | 714 } |
| 709 | 715 |
| 710 } // namespace skia | 716 } // namespace skia |
| OLD | NEW |