Chromium Code Reviews| 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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 const ConvolutionFilter1D::Fixed* filter_values, | 338 const ConvolutionFilter1D::Fixed* filter_values, |
| 338 int filter_length, | 339 int filter_length, |
| 339 unsigned char* const* source_data_rows, | 340 unsigned char* const* source_data_rows, |
| 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]); |
| 348 #if SIMD_MIPS_DSPR2 | |
| 349 typedef void (*ConvolveHorizontally_pointer)( | |
| 350 const unsigned char* src_data, | |
| 351 const ConvolutionFilter1D& filter, | |
| 352 unsigned char* out_row, | |
| 353 bool has_alpha); | |
|
hubbe
2013/05/10 19:39:09
Just add "has_alpha" to all implementations instea
Stephen White
2013/05/10 20:31:26
+1 to that.
| |
| 354 #else | |
| 347 typedef void (*ConvolveHorizontally_pointer)( | 355 typedef void (*ConvolveHorizontally_pointer)( |
| 348 const unsigned char* src_data, | 356 const unsigned char* src_data, |
| 349 const ConvolutionFilter1D& filter, | 357 const ConvolutionFilter1D& filter, |
| 350 unsigned char* out_row); | 358 unsigned char* out_row); |
| 359 #endif | |
| 351 | 360 |
| 352 struct ConvolveProcs { | 361 struct ConvolveProcs { |
| 353 // This is how many extra pixels may be read by the | 362 // This is how many extra pixels may be read by the |
| 354 // conolve*horizontally functions. | 363 // conolve*horizontally functions. |
| 355 int extra_horizontal_reads; | 364 int extra_horizontal_reads; |
| 356 ConvolveVertically_pointer convolve_vertically; | 365 ConvolveVertically_pointer convolve_vertically; |
| 357 Convolve4RowsHorizontally_pointer convolve_4rows_horizontally; | 366 Convolve4RowsHorizontally_pointer convolve_4rows_horizontally; |
| 358 ConvolveHorizontally_pointer convolve_horizontally; | 367 ConvolveHorizontally_pointer convolve_horizontally; |
| 359 }; | 368 }; |
| 360 | 369 |
| 361 void SetupSIMD(ConvolveProcs *procs) { | 370 void SetupSIMD(ConvolveProcs *procs) { |
| 362 #ifdef SIMD_SSE2 | 371 #ifdef SIMD_SSE2 |
| 363 base::CPU cpu; | 372 base::CPU cpu; |
| 364 if (cpu.has_sse2()) { | 373 if (cpu.has_sse2()) { |
| 365 procs->extra_horizontal_reads = 3; | 374 procs->extra_horizontal_reads = 3; |
| 366 procs->convolve_vertically = &ConvolveVertically_SSE2; | 375 procs->convolve_vertically = &ConvolveVertically_SSE2; |
| 367 procs->convolve_4rows_horizontally = &Convolve4RowsHorizontally_SSE2; | 376 procs->convolve_4rows_horizontally = &Convolve4RowsHorizontally_SSE2; |
| 368 procs->convolve_horizontally = &ConvolveHorizontally_SSE2; | 377 procs->convolve_horizontally = &ConvolveHorizontally_SSE2; |
| 369 } | 378 } |
| 379 #elif defined SIMD_MIPS_DSPR2 | |
|
Stephen White
2013/05/10 20:31:26
You use "#if" above, but "#if defined" here. Plea
Stephen White
2013/05/13 14:08:43
Sorry, my mistake. This should be #elif defined(S
Teodora Novkovic
2013/05/13 16:23:06
Done.
Teodora Novkovic
2013/05/13 16:23:06
Done.
| |
| 380 procs->extra_horizontal_reads = 3; | |
| 381 procs->convolve_vertically = &ConvolveVertically_mips_dspr2; | |
| 382 procs->convolve_horizontally = &ConvolveHorizontally_mips_dspr2; | |
| 370 #endif | 383 #endif |
| 371 } | 384 } |
| 372 | 385 |
| 373 void BGRAConvolve2D(const unsigned char* source_data, | 386 void BGRAConvolve2D(const unsigned char* source_data, |
| 374 int source_byte_row_stride, | 387 int source_byte_row_stride, |
| 375 bool source_has_alpha, | 388 bool source_has_alpha, |
| 376 const ConvolutionFilter1D& filter_x, | 389 const ConvolutionFilter1D& filter_x, |
| 377 const ConvolutionFilter1D& filter_y, | 390 const ConvolutionFilter1D& filter_y, |
| 378 int output_byte_row_stride, | 391 int output_byte_row_stride, |
| 379 unsigned char* output, | 392 unsigned char* output, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 455 src[i] = &source_data[(next_x_row + i) * source_byte_row_stride]; | 468 src[i] = &source_data[(next_x_row + i) * source_byte_row_stride]; |
| 456 out_row[i] = row_buffer.AdvanceRow(); | 469 out_row[i] = row_buffer.AdvanceRow(); |
| 457 } | 470 } |
| 458 simd.convolve_4rows_horizontally(src, filter_x, out_row); | 471 simd.convolve_4rows_horizontally(src, filter_x, out_row); |
| 459 next_x_row += 4; | 472 next_x_row += 4; |
| 460 } else { | 473 } else { |
| 461 // Check if we need to avoid SSE2 for this row. | 474 // Check if we need to avoid SSE2 for this row. |
| 462 if (simd.convolve_horizontally && | 475 if (simd.convolve_horizontally && |
| 463 next_x_row < last_filter_offset + last_filter_length - | 476 next_x_row < last_filter_offset + last_filter_length - |
| 464 avoid_simd_rows) { | 477 avoid_simd_rows) { |
| 478 #if SIMD_MIPS_DSPR2 | |
| 479 simd.convolve_horizontally( | |
| 480 &source_data[next_x_row * source_byte_row_stride], | |
| 481 filter_x, row_buffer.AdvanceRow(), source_has_alpha); | |
| 482 #else | |
| 465 simd.convolve_horizontally( | 483 simd.convolve_horizontally( |
| 466 &source_data[next_x_row * source_byte_row_stride], | 484 &source_data[next_x_row * source_byte_row_stride], |
| 467 filter_x, row_buffer.AdvanceRow()); | 485 filter_x, row_buffer.AdvanceRow()); |
| 486 #endif | |
| 468 } else { | 487 } else { |
| 469 if (source_has_alpha) { | 488 if (source_has_alpha) { |
| 470 ConvolveHorizontally<true>( | 489 ConvolveHorizontally<true>( |
| 471 &source_data[next_x_row * source_byte_row_stride], | 490 &source_data[next_x_row * source_byte_row_stride], |
| 472 filter_x, row_buffer.AdvanceRow()); | 491 filter_x, row_buffer.AdvanceRow()); |
| 473 } else { | 492 } else { |
| 474 ConvolveHorizontally<false>( | 493 ConvolveHorizontally<false>( |
| 475 &source_data[next_x_row * source_byte_row_stride], | 494 &source_data[next_x_row * source_byte_row_stride], |
| 476 filter_x, row_buffer.AdvanceRow()); | 495 filter_x, row_buffer.AdvanceRow()); |
| 477 } | 496 } |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 666 | 685 |
| 667 for (; i < filter_length; ++i) | 686 for (; i < filter_length; ++i) |
| 668 accval += filter_values[i] * source_data[pixel_byte_index]; | 687 accval += filter_values[i] * source_data[pixel_byte_index]; |
| 669 | 688 |
| 670 *target_byte = BringBackTo8(accval, absolute_values); | 689 *target_byte = BringBackTo8(accval, absolute_values); |
| 671 } | 690 } |
| 672 } | 691 } |
| 673 } | 692 } |
| 674 | 693 |
| 675 } // namespace skia | 694 } // namespace skia |
| OLD | NEW |