diff options
author | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-25 06:35:51 +0000 |
---|---|---|
committer | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-25 06:35:51 +0000 |
commit | 207bcfea74b849277178f179c6dd3199c60045ec (patch) | |
tree | 2b7614471aed72820d137eac6e7a898a3c577a38 /skia | |
parent | fd2e29ba7ff227bbda7a7e61e7cf562a8647c905 (diff) | |
download | chromium_src-207bcfea74b849277178f179c6dd3199c60045ec.zip chromium_src-207bcfea74b849277178f179c6dd3199c60045ec.tar.gz chromium_src-207bcfea74b849277178f179c6dd3199c60045ec.tar.bz2 |
Temporary change to test perf regression
This change tests which part of this review:
http://codereview.chromium.org/6897013/
is causing a performance regression. This change will be reverted later tonight.
BUG=None
TEST=None
Review URL: http://codereview.chromium.org/6880170
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82833 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia')
-rw-r--r-- | skia/ext/skia_utils_mac.h | 10 | ||||
-rw-r--r-- | skia/ext/skia_utils_mac.mm | 59 |
2 files changed, 56 insertions, 13 deletions
diff --git a/skia/ext/skia_utils_mac.h b/skia/ext/skia_utils_mac.h index 0551643..04d4a1d 100644 --- a/skia/ext/skia_utils_mac.h +++ b/skia/ext/skia_utils_mac.h @@ -7,6 +7,7 @@ #pragma once #include <CoreGraphics/CGColor.h> +#include <vector> #include "third_party/skia/include/core/SkColor.h" @@ -23,8 +24,10 @@ typedef struct _NSSize NSSize; #ifdef __OBJC__ @class NSImage; +@class NSImageRep; #else class NSImage; +class NSImageRep; #endif namespace gfx { @@ -64,6 +67,9 @@ SkBitmap CGImageToSkBitmap(CGImageRef image); // Draws an NSImage with a given size into a SkBitmap. SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque); +// Draws an NSImageRep with a given size into a SkBitmap. +SkBitmap NSImageRepToSkBitmap(NSImageRep* image, NSSize size, bool is_opaque); + // Given an SkBitmap and a color space, return an autoreleased NSImage. NSImage* SkBitmapToNSImageWithColorSpace(const SkBitmap& icon, CGColorSpaceRef colorSpace); @@ -73,6 +79,10 @@ NSImage* SkBitmapToNSImageWithColorSpace(const SkBitmap& icon, // TODO(thakis): Remove this -- http://crbug.com/69432 NSImage* SkBitmapToNSImage(const SkBitmap& icon); +// Given a vector of SkBitmaps, return an NSImage with each bitmap added +// as a representation. +NSImage* SkBitmapsToNSImage(const std::vector<const SkBitmap*>& bitmaps); + // Returns |[NSImage imageNamed:@"NSApplicationIcon"]| as SkBitmap. SkBitmap AppplicationIconAtSize(int size); diff --git a/skia/ext/skia_utils_mac.mm b/skia/ext/skia_utils_mac.mm index c78121a..2ecb3f2 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); |