| Index: services/shape_detection/detection_utils_mac.mm
 | 
| diff --git a/services/shape_detection/detection_utils_mac.mm b/services/shape_detection/detection_utils_mac.mm
 | 
| index 4e87812e99854b24dd7251094ea93cb405a134ac..554cd7e5c804f984ae22d38609e3149146a14d40 100644
 | 
| --- a/services/shape_detection/detection_utils_mac.mm
 | 
| +++ b/services/shape_detection/detection_utils_mac.mm
 | 
| @@ -9,61 +9,31 @@
 | 
|  #include "base/memory/shared_memory.h"
 | 
|  #include "mojo/public/cpp/system/platform_handle.h"
 | 
|  #include "services/shape_detection/barcode_detection_impl.h"
 | 
| +#include "skia/ext/skia_utils_mac.h"
 | 
| +#include "third_party/skia/include/utils/mac/SkCGUtils.h"
 | 
|  
 | 
|  namespace shape_detection {
 | 
|  
 | 
| -// These formats are available but not public until Mac 10.11.
 | 
| -#if !defined(MAC_OS_X_VERSION_10_11) || \
 | 
| -    MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11
 | 
| -const int kCIFormatRGBA8 = 24;
 | 
| -#else
 | 
| -//static_assert(kCIFormatRGBA8 == 24, "RGBA8 format enum index.");
 | 
| -#endif
 | 
| -
 | 
| -base::scoped_nsobject<CIImage> CreateCIImageFromSharedMemory(
 | 
| -    mojo::ScopedSharedBufferHandle frame_data,
 | 
| -    uint32_t width,
 | 
| -    uint32_t height) {
 | 
| +base::scoped_nsobject<CIImage> CreateCIImageFromSkBitmap(
 | 
| +    const SkBitmap& bitmap) {
 | 
|    base::CheckedNumeric<uint32_t> num_pixels =
 | 
| -      base::CheckedNumeric<uint32_t>(width) * height;
 | 
| +      base::CheckedNumeric<uint32_t>(bitmap.width()) * bitmap.height();
 | 
|    base::CheckedNumeric<uint32_t> num_bytes = num_pixels * 4;
 | 
|    if (!num_bytes.IsValid()) {
 | 
|      DLOG(ERROR) << "Data overflow";
 | 
|      return base::scoped_nsobject<CIImage>();
 | 
|    }
 | 
|  
 | 
| -  base::SharedMemoryHandle memory_handle;
 | 
| -  size_t memory_size = 0;
 | 
| -  bool read_only_flag = false;
 | 
| -  const MojoResult result = mojo::UnwrapSharedMemoryHandle(
 | 
| -      std::move(frame_data), &memory_handle, &memory_size, &read_only_flag);
 | 
| -  DCHECK_EQ(MOJO_RESULT_OK, result) << "Failed to unwrap SharedBufferHandle";
 | 
| -  if (!memory_size || memory_size != num_bytes.ValueOrDie()) {
 | 
| -    DLOG(ERROR) << "Invalid image size";
 | 
| -    return base::scoped_nsobject<CIImage>();
 | 
| -  }
 | 
| -
 | 
| -  auto shared_memory =
 | 
| -      base::MakeUnique<base::SharedMemory>(memory_handle, true /* read_only */);
 | 
| -  if (!shared_memory->Map(memory_size)) {
 | 
| -    DLOG(ERROR) << "Failed to map bytes from shared memory";
 | 
| +  // First convert SkBitmap to CGImageRef.
 | 
| +  base::ScopedCFTypeRef<CGImageRef> cg_image(
 | 
| +      SkCreateCGImageRefWithColorspace(bitmap, NULL));
 | 
| +  if (!cg_image) {
 | 
| +    DLOG(ERROR) << "Failed to create CGImageRef";
 | 
|      return base::scoped_nsobject<CIImage>();
 | 
|    }
 | 
|  
 | 
| -  NSData* byte_data = [NSData dataWithBytesNoCopy:shared_memory->memory()
 | 
| -                                           length:num_bytes.ValueOrDie()
 | 
| -                                     freeWhenDone:NO];
 | 
| -
 | 
| -  base::ScopedCFTypeRef<CGColorSpaceRef> colorspace(
 | 
| -      CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
 | 
| -
 | 
| -  // CIImage will return nil if RGBA8 is not supported in a certain version.
 | 
| -  base::scoped_nsobject<CIImage> ci_image([[CIImage alloc]
 | 
| -      initWithBitmapData:byte_data
 | 
| -             bytesPerRow:width * 4
 | 
| -                    size:CGSizeMake(width, height)
 | 
| -                  format:kCIFormatRGBA8
 | 
| -              colorSpace:colorspace]);
 | 
| +  base::scoped_nsobject<CIImage> ci_image(
 | 
| +      [[CIImage alloc] initWithCGImage:cg_image]);
 | 
|    if (!ci_image) {
 | 
|      DLOG(ERROR) << "Failed to create CIImage";
 | 
|      return base::scoped_nsobject<CIImage>();
 | 
| 
 |