detection_utils_win.cc 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/shape_detection/detection_utils_win.h"
  5. #include <utility>
  6. #include "base/check_op.h"
  7. #include "base/logging.h"
  8. #include "base/numerics/checked_math.h"
  9. #include "base/win/winrt_storage_util.h"
  10. #include "third_party/skia/include/core/SkBitmap.h"
  11. namespace shape_detection {
  12. using Microsoft::WRL::ComPtr;
  13. ComPtr<ISoftwareBitmap> CreateWinBitmapFromSkBitmap(
  14. const SkBitmap& bitmap,
  15. ISoftwareBitmapStatics* bitmap_factory) {
  16. DCHECK(bitmap_factory);
  17. DCHECK_EQ(bitmap.colorType(), kN32_SkColorType);
  18. if (!base::CheckedNumeric<uint32_t>(bitmap.computeByteSize()).IsValid()) {
  19. DLOG(ERROR) << "Data overflow.";
  20. return nullptr;
  21. }
  22. // Create IBuffer from bitmap data.
  23. ComPtr<ABI::Windows::Storage::Streams::IBuffer> buffer;
  24. HRESULT hr = base::win::CreateIBufferFromData(
  25. static_cast<uint8_t*>(bitmap.getPixels()),
  26. static_cast<UINT32>(bitmap.computeByteSize()), &buffer);
  27. if (FAILED(hr)) {
  28. DLOG(ERROR) << "Create IBuffer from bitmap data failed: "
  29. << logging::SystemErrorCodeToString(hr);
  30. return nullptr;
  31. }
  32. ComPtr<ISoftwareBitmap> win_bitmap;
  33. #if SK_PMCOLOR_BYTE_ORDER(R, G, B, A)
  34. const BitmapPixelFormat pixel_format =
  35. ABI::Windows::Graphics::Imaging::BitmapPixelFormat_Rgba8;
  36. #else
  37. const BitmapPixelFormat pixel_format =
  38. ABI::Windows::Graphics::Imaging::BitmapPixelFormat_Bgra8;
  39. #endif
  40. // Create ISoftwareBitmap from SKBitmap that is kN32_SkColorType and copy the
  41. // IBuffer into it.
  42. hr = bitmap_factory->CreateCopyFromBuffer(
  43. buffer.Get(), pixel_format, bitmap.width(), bitmap.height(), &win_bitmap);
  44. if (FAILED(hr)) {
  45. DLOG(ERROR) << "Create ISoftwareBitmap from buffer failed: "
  46. << logging::SystemErrorCodeToString(hr);
  47. return nullptr;
  48. }
  49. return win_bitmap;
  50. }
  51. ComPtr<ISoftwareBitmap> CreateWinBitmapWithPixelFormat(
  52. const SkBitmap& bitmap,
  53. ISoftwareBitmapStatics* bitmap_factory,
  54. BitmapPixelFormat pixel_format) {
  55. ComPtr<ISoftwareBitmap> win_bitmap =
  56. CreateWinBitmapFromSkBitmap(bitmap, bitmap_factory);
  57. // Convert Rgba8/Bgra8 to Gray8/Nv12 SoftwareBitmap.
  58. ComPtr<ISoftwareBitmap> converted_bitmap;
  59. const HRESULT hr = bitmap_factory->Convert(win_bitmap.Get(), pixel_format,
  60. &converted_bitmap);
  61. if (FAILED(hr)) {
  62. DLOG(ERROR) << "Convert Rgba8/Bgra8 to Gray8/Nv12 failed: "
  63. << logging::SystemErrorCodeToString(hr);
  64. return nullptr;
  65. }
  66. return converted_bitmap;
  67. }
  68. } // namespace shape_detection