| Index: skia/ext/skia_utils_mac.mm
|
| diff --git a/skia/ext/skia_utils_mac.mm b/skia/ext/skia_utils_mac.mm
|
| index c78121abd8593b40f2d9305d899380f6fe8ffb56..2ecb3f20049da926bffda6282d928e2f096086ce 100644
|
| --- a/skia/ext/skia_utils_mac.mm
|
| +++ b/skia/ext/skia_utils_mac.mm
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/mac/scoped_cftyperef.h"
|
| +#include "base/memory/scoped_nsobject.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "skia/ext/bitmap_platform_device_mac.h"
|
| #include "third_party/skia/include/utils/mac/SkCGUtils.h"
|
| @@ -116,15 +117,20 @@ SkBitmap CGImageToSkBitmap(CGImageRef image) {
|
| }
|
|
|
| SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque) {
|
| + return NSImageRepToSkBitmap([image bestRepresentationForDevice:nil],
|
| + size, is_opaque);
|
| +}
|
| +
|
| +SkBitmap NSImageRepToSkBitmap(NSImageRep* image, NSSize size, bool is_opaque) {
|
| SkBitmap bitmap;
|
| bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width, size.height);
|
| - if (bitmap.allocPixels() != true)
|
| + if (!bitmap.allocPixels())
|
| return bitmap; // Return |bitmap| which should respond true to isNull().
|
|
|
| bitmap.setIsOpaque(is_opaque);
|
|
|
| base::mac::ScopedCFTypeRef<CGColorSpaceRef> color_space(
|
| - CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));
|
| + CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));
|
| void* data = bitmap.getPixels();
|
|
|
| // Allocate a bitmap context with 4 components per pixel (BGRA). Apple
|
| @@ -145,21 +151,18 @@ SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque) {
|
| #undef HAS_ARGB_SHIFTS
|
|
|
| // Something went really wrong. Best guess is that the bitmap data is invalid.
|
| - DCHECK(context != NULL);
|
| + DCHECK(context);
|
|
|
| // Save the current graphics context so that we can restore it later.
|
| [NSGraphicsContext saveGraphicsState];
|
|
|
| // Dummy context that we will draw into.
|
| NSGraphicsContext* context_cocoa =
|
| - [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO];
|
| + [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO];
|
| [NSGraphicsContext setCurrentContext:context_cocoa];
|
|
|
| // This will stretch any images to |size| if it does not fit or is non-square.
|
| - [image drawInRect:NSMakeRect(0, 0, size.width, size.height)
|
| - fromRect:NSZeroRect
|
| - operation:NSCompositeCopy
|
| - fraction:1.0];
|
| + [image drawInRect:NSMakeRect(0, 0, size.width, size.height)];
|
|
|
| // Done drawing, restore context.
|
| [NSGraphicsContext restoreGraphicsState];
|
| @@ -173,13 +176,12 @@ NSImage* SkBitmapToNSImageWithColorSpace(const SkBitmap& skiaBitmap,
|
| return nil;
|
|
|
| // First convert SkBitmap to CGImageRef.
|
| - CGImageRef cgimage =
|
| - SkCreateCGImageRefWithColorspace(skiaBitmap, colorSpace);
|
| + base::mac::ScopedCFTypeRef<CGImageRef> cgimage(
|
| + SkCreateCGImageRefWithColorspace(skiaBitmap, colorSpace));
|
|
|
| // Now convert to NSImage.
|
| - NSBitmapImageRep* bitmap = [[[NSBitmapImageRep alloc]
|
| - initWithCGImage:cgimage] autorelease];
|
| - CFRelease(cgimage);
|
| + scoped_nsobject<NSBitmapImageRep> bitmap(
|
| + [[NSBitmapImageRep alloc] initWithCGImage:cgimage]);
|
| NSImage* image = [[[NSImage alloc] init] autorelease];
|
| [image addRepresentation:bitmap];
|
| [image setSize:NSMakeSize(skiaBitmap.width(), skiaBitmap.height())];
|
| @@ -192,6 +194,37 @@ NSImage* SkBitmapToNSImage(const SkBitmap& skiaBitmap) {
|
| return SkBitmapToNSImageWithColorSpace(skiaBitmap, colorSpace.get());
|
| }
|
|
|
| +NSImage* SkBitmapsToNSImage(const std::vector<const SkBitmap*>& bitmaps) {
|
| + if (bitmaps.empty())
|
| + return nil;
|
| +
|
| + base::mac::ScopedCFTypeRef<CGColorSpaceRef> color_space(
|
| + CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));
|
| + NSImage* image = [[[NSImage alloc] init] autorelease];
|
| + NSSize min_size = NSZeroSize;
|
| +
|
| + for (std::vector<const SkBitmap*>::const_iterator it = bitmaps.begin();
|
| + it != bitmaps.end(); ++it) {
|
| + const SkBitmap& skiaBitmap = **it;
|
| + // First convert SkBitmap to CGImageRef.
|
| + base::mac::ScopedCFTypeRef<CGImageRef> cgimage(
|
| + SkCreateCGImageRefWithColorspace(skiaBitmap, color_space));
|
| +
|
| + // Now convert to NSImage.
|
| + scoped_nsobject<NSBitmapImageRep> bitmap(
|
| + [[NSBitmapImageRep alloc] initWithCGImage:cgimage]);
|
| + [image addRepresentation:bitmap];
|
| +
|
| + if (min_size.width == 0 || min_size.width > skiaBitmap.width()) {
|
| + min_size.width = skiaBitmap.width();
|
| + min_size.height = skiaBitmap.height();
|
| + }
|
| + }
|
| +
|
| + [image setSize:min_size];
|
| + return image;
|
| +}
|
| +
|
| SkBitmap AppplicationIconAtSize(int size) {
|
| NSImage* image = [NSImage imageNamed:@"NSApplicationIcon"];
|
| return NSImageToSkBitmap(image, NSMakeSize(size, size), /* is_opaque=*/true);
|
|
|