diff options
author | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-16 19:57:22 +0000 |
---|---|---|
committer | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-16 19:57:22 +0000 |
commit | 09c6dec4e18784861660f716d038035be9540601 (patch) | |
tree | b5e5419aff269cb15c13ea6a3eab0c90a527ef4a /skia | |
parent | 66980a010042f2e44efb21360e662daeae8c5668 (diff) | |
download | chromium_src-09c6dec4e18784861660f716d038035be9540601.zip chromium_src-09c6dec4e18784861660f716d038035be9540601.tar.gz chromium_src-09c6dec4e18784861660f716d038035be9540601.tar.bz2 |
Add file icons to chrome://downloads/ on the Mac. Add Skia helper
CGImageToSkBitmap().
Patch by Robert Sesek <rsesek@bluestatic.org>
Review URL: http://codereview.chromium.org/118488
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18517 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia')
-rw-r--r-- | skia/ext/skia_utils_mac.cc | 83 | ||||
-rw-r--r-- | skia/ext/skia_utils_mac.h | 15 | ||||
-rw-r--r-- | skia/ext/skia_utils_mac.mm | 159 | ||||
-rwxr-xr-x | skia/skia.gyp | 13 |
4 files changed, 182 insertions, 88 deletions
diff --git a/skia/ext/skia_utils_mac.cc b/skia/ext/skia_utils_mac.cc deleted file mode 100644 index fbad62d..0000000 --- a/skia/ext/skia_utils_mac.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "skia/ext/skia_utils_mac.h" - -#include "base/logging.h" -#include "third_party/skia/include/core/SkMatrix.h" -#include "third_party/skia/include/core/SkRect.h" - -namespace gfx { - -CGAffineTransform SkMatrixToCGAffineTransform(const SkMatrix& matrix) { - // CGAffineTransforms don't support perspective transforms, so make sure - // we don't get those. - DCHECK(matrix[SkMatrix::kMPersp0] == 0.0f); - DCHECK(matrix[SkMatrix::kMPersp1] == 0.0f); - DCHECK(matrix[SkMatrix::kMPersp2] == 1.0f); - - return CGAffineTransformMake(matrix[SkMatrix::kMScaleX], - matrix[SkMatrix::kMSkewY], - matrix[SkMatrix::kMSkewX], - matrix[SkMatrix::kMScaleY], - matrix[SkMatrix::kMTransX], - matrix[SkMatrix::kMTransY]); -} - -SkIRect CGRectToSkIRect(const CGRect& rect) { - SkIRect sk_rect = { - SkScalarRound(rect.origin.x), - SkScalarRound(rect.origin.y), - SkScalarRound(rect.origin.x + rect.size.width), - SkScalarRound(rect.origin.y + rect.size.height) - }; - return sk_rect; -} - -SkRect CGRectToSkRect(const CGRect& rect) { - SkRect sk_rect = { - rect.origin.x, - rect.origin.y, - rect.origin.x + rect.size.width, - rect.origin.y + rect.size.height, - }; - return sk_rect; -} - -CGRect SkIRectToCGRect(const SkIRect& rect) { - CGRect cg_rect = { - { rect.fLeft, rect.fTop }, - { rect.fRight - rect.fLeft, rect.fBottom - rect.fTop } - }; - return cg_rect; -} - -CGRect SkRectToCGRect(const SkRect& rect) { - CGRect cg_rect = { - { rect.fLeft, rect.fTop }, - { rect.fRight - rect.fLeft, rect.fBottom - rect.fTop } - }; - return cg_rect; -} - -// Converts CGColorRef to the ARGB layout Skia expects. -SkColor CGColorRefToSkColor(CGColorRef color) { - DCHECK(CGColorGetNumberOfComponents(color) == 4); - const CGFloat *components = CGColorGetComponents(color); - return SkColorSetARGB(SkScalarRound(255.0 * components[3]), // alpha - SkScalarRound(255.0 * components[0]), // red - SkScalarRound(255.0 * components[1]), // green - SkScalarRound(255.0 * components[2])); // blue -} - -// Converts ARGB to CGColorRef. -CGColorRef SkColorToCGColorRef(SkColor color) { - return CGColorCreateGenericRGB(SkColorGetR(color) / 255.0, - SkColorGetG(color) / 255.0, - SkColorGetB(color) / 255.0, - SkColorGetA(color) / 255.0); -} - -} // namespace gfx - diff --git a/skia/ext/skia_utils_mac.h b/skia/ext/skia_utils_mac.h index b678abb..14cd17f 100644 --- a/skia/ext/skia_utils_mac.h +++ b/skia/ext/skia_utils_mac.h @@ -13,6 +13,12 @@ struct SkMatrix; struct SkIRect; struct SkPoint; struct SkRect; +class SkBitmap; +typedef struct _NSSize NSSize; + +#ifdef __OBJC__ +@class NSImage; +#endif namespace gfx { @@ -45,7 +51,14 @@ SkColor CGColorRefToSkColor(CGColorRef color); // Converts ARGB to CGColorRef. CGColorRef SkColorToCGColorRef(SkColor color); +// Converts a CGImage to a SkBitmap. +SkBitmap CGImageToSkBitmap(CGImageRef image); + +#ifdef __OBJC__ +// Draws an NSImage with a given size into a SkBitmap. +SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque); +#endif + } // namespace gfx #endif // SKIA_EXT_SKIA_UTILS_MAC_H_ - diff --git a/skia/ext/skia_utils_mac.mm b/skia/ext/skia_utils_mac.mm new file mode 100644 index 0000000..6880ea8 --- /dev/null +++ b/skia/ext/skia_utils_mac.mm @@ -0,0 +1,159 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "skia/ext/skia_utils_mac.h" + +#import <AppKit/AppKit.h> + +#include "base/logging.h" +#include "base/scoped_cftyperef.h" +#include "base/scoped_ptr.h" +#include "skia/ext/bitmap_platform_device_mac.h" + +namespace gfx { + +CGAffineTransform SkMatrixToCGAffineTransform(const SkMatrix& matrix) { + // CGAffineTransforms don't support perspective transforms, so make sure + // we don't get those. + DCHECK(matrix[SkMatrix::kMPersp0] == 0.0f); + DCHECK(matrix[SkMatrix::kMPersp1] == 0.0f); + DCHECK(matrix[SkMatrix::kMPersp2] == 1.0f); + + return CGAffineTransformMake(matrix[SkMatrix::kMScaleX], + matrix[SkMatrix::kMSkewY], + matrix[SkMatrix::kMSkewX], + matrix[SkMatrix::kMScaleY], + matrix[SkMatrix::kMTransX], + matrix[SkMatrix::kMTransY]); +} + +SkIRect CGRectToSkIRect(const CGRect& rect) { + SkIRect sk_rect = { + SkScalarRound(rect.origin.x), + SkScalarRound(rect.origin.y), + SkScalarRound(rect.origin.x + rect.size.width), + SkScalarRound(rect.origin.y + rect.size.height) + }; + return sk_rect; +} + +SkRect CGRectToSkRect(const CGRect& rect) { + SkRect sk_rect = { + rect.origin.x, + rect.origin.y, + rect.origin.x + rect.size.width, + rect.origin.y + rect.size.height, + }; + return sk_rect; +} + +CGRect SkIRectToCGRect(const SkIRect& rect) { + CGRect cg_rect = { + { rect.fLeft, rect.fTop }, + { rect.fRight - rect.fLeft, rect.fBottom - rect.fTop } + }; + return cg_rect; +} + +CGRect SkRectToCGRect(const SkRect& rect) { + CGRect cg_rect = { + { rect.fLeft, rect.fTop }, + { rect.fRight - rect.fLeft, rect.fBottom - rect.fTop } + }; + return cg_rect; +} + +// Converts CGColorRef to the ARGB layout Skia expects. +SkColor CGColorRefToSkColor(CGColorRef color) { + DCHECK(CGColorGetNumberOfComponents(color) == 4); + const CGFloat *components = CGColorGetComponents(color); + return SkColorSetARGB(SkScalarRound(255.0 * components[3]), // alpha + SkScalarRound(255.0 * components[0]), // red + SkScalarRound(255.0 * components[1]), // green + SkScalarRound(255.0 * components[2])); // blue +} + +// Converts ARGB to CGColorRef. +CGColorRef SkColorToCGColorRef(SkColor color) { + return CGColorCreateGenericRGB(SkColorGetR(color) / 255.0, + SkColorGetG(color) / 255.0, + SkColorGetB(color) / 255.0, + SkColorGetA(color) / 255.0); +} + +SkBitmap CGImageToSkBitmap(CGImageRef image) { + DCHECK(image != NULL); + + int width = CGImageGetWidth(image); + int height = CGImageGetHeight(image); + + scoped_ptr<skia::BitmapPlatformDevice> device( + skia::BitmapPlatformDevice::Create(NULL, width, height, false)); + + CGContextRef context = device->GetBitmapContext(); + + // We need to invert the y-axis of the canvas so that Core Graphics drawing + // happens right-side up. Skia has an upper-left origin and CG has a lower- + // left one. + CGContextScaleCTM(context, 1.0, -1.0); + CGContextTranslateCTM(context, 1, -height); + + // We want to copy transparent pixels from |image|, instead of blending it + // onto uninitialized pixels. + CGContextSetBlendMode(context, kCGBlendModeCopy); + + CGRect rect = CGRectMake(0, 0, width, height); + CGContextDrawImage(context, rect, image); + + // Because |device| will be cleaned up and will take its pixels with it, we + // copy it to the stack and return it. + SkBitmap bitmap = device->accessBitmap(false); + + return bitmap; +} + +SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque) { + SkBitmap bitmap; + bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width, size.height); + if (bitmap.allocPixels() != true) + return bitmap; // Return |bitmap| which should respond true to isNull(). + + bitmap.setIsOpaque(is_opaque); + + scoped_cftyperef<CGColorSpaceRef> color_space( + CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); + void* data = bitmap.getPixels(); + + // Allocate a bitmap context with 4 components per pixel (BGRA). Apple + // recommends these flags for improved CG performance. + scoped_cftyperef<CGContextRef> context( + CGBitmapContextCreate(data, size.width, size.height, 8, size.width*4, + color_space, + kCGImageAlphaPremultipliedFirst | + kCGBitmapByteOrder32Host)); + + // Something went really wrong. Best guess is that the bitmap data is invalid. + DCHECK(context != NULL); + + // Save the current graphics context so that we can restore it later. + NSGraphicsContext* current_context = [NSGraphicsContext currentContext]; + + // Dummy context that we will draw into. + NSGraphicsContext* context_cocoa = + [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]; + + // Done drawing, restore context. + [NSGraphicsContext setCurrentContext:current_context]; + + return bitmap; +} + +} // namespace gfx diff --git a/skia/skia.gyp b/skia/skia.gyp index 912e80a..a3e55b2 100755 --- a/skia/skia.gyp +++ b/skia/skia.gyp @@ -525,7 +525,7 @@ 'ext/SkTypeface_fake.cpp', 'ext/skia_utils.cc', 'ext/skia_utils.h', - 'ext/skia_utils_mac.cc', + 'ext/skia_utils_mac.mm', 'ext/skia_utils_mac.h', 'ext/skia_utils_win.cc', 'ext/skia_utils_win.h', @@ -608,9 +608,14 @@ 'defines': [ 'SK_BUILD_FOR_MAC', ], - 'include_dirs': [ - '../third_party/skia/include/utils/mac', - ], + 'include_dirs': [ + '../third_party/skia/include/utils/mac', + ], + 'link_settings': { + 'libraries': [ + '$(SDKROOT)/System/Library/Frameworks/AppKit.framework', + ], + }, }], [ 'OS == "win"', { 'sources!': [ |