Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "skia/ext/skia_utils_mac.h" | 5 #include "skia/ext/skia_utils_mac.h" |
| 6 | 6 |
| 7 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 } | 241 } |
| 242 | 242 |
| 243 SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque) { | 243 SkBitmap NSImageToSkBitmap(NSImage* image, NSSize size, bool is_opaque) { |
| 244 return NSImageOrNSImageRepToSkBitmap(image, nil, size, is_opaque); | 244 return NSImageOrNSImageRepToSkBitmap(image, nil, size, is_opaque); |
| 245 } | 245 } |
| 246 | 246 |
| 247 SkBitmap NSImageRepToSkBitmap(NSImageRep* image, NSSize size, bool is_opaque) { | 247 SkBitmap NSImageRepToSkBitmap(NSImageRep* image, NSSize size, bool is_opaque) { |
| 248 return NSImageOrNSImageRepToSkBitmap(nil, image, size, is_opaque); | 248 return NSImageOrNSImageRepToSkBitmap(nil, image, size, is_opaque); |
| 249 } | 249 } |
| 250 | 250 |
| 251 NSBitmapImageRep* SkBitmapToNSBitmapImageRep(const SkBitmap& skiaBitmap) { | |
| 252 base::mac::ScopedCFTypeRef<CGColorSpaceRef> color_space( | |
| 253 CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); | |
| 254 | |
| 255 // First convert SkBitmap to CGImageRef. | |
| 256 base::mac::ScopedCFTypeRef<CGImageRef> cgimage( | |
| 257 SkCreateCGImageRefWithColorspace(skiaBitmap, color_space)); | |
| 258 | |
| 259 // Now convert to NSBitmapImageRep. | |
| 260 scoped_nsobject<NSBitmapImageRep> bitmap( | |
|
Robert Sesek
2012/05/05 02:08:34
nit: over-indented
| |
| 261 [[NSBitmapImageRep alloc] initWithCGImage:cgimage]); | |
| 262 return [bitmap.release() autorelease]; | |
| 263 } | |
| 264 | |
| 251 NSImage* SkBitmapToNSImageWithColorSpace(const SkBitmap& skiaBitmap, | 265 NSImage* SkBitmapToNSImageWithColorSpace(const SkBitmap& skiaBitmap, |
| 252 CGColorSpaceRef colorSpace) { | 266 CGColorSpaceRef colorSpace) { |
| 253 if (skiaBitmap.isNull()) | 267 if (skiaBitmap.isNull()) |
| 254 return nil; | 268 return nil; |
| 255 | 269 |
| 256 // First convert SkBitmap to CGImageRef. | 270 // First convert SkBitmap to CGImageRef. |
| 257 base::mac::ScopedCFTypeRef<CGImageRef> cgimage( | 271 base::mac::ScopedCFTypeRef<CGImageRef> cgimage( |
| 258 SkCreateCGImageRefWithColorspace(skiaBitmap, colorSpace)); | 272 SkCreateCGImageRefWithColorspace(skiaBitmap, colorSpace)); |
| 259 | 273 |
| 260 // Now convert to NSImage. | 274 // Now convert to NSImage. |
| 261 scoped_nsobject<NSBitmapImageRep> bitmap( | 275 scoped_nsobject<NSBitmapImageRep> bitmap( |
| 262 [[NSBitmapImageRep alloc] initWithCGImage:cgimage]); | 276 [[NSBitmapImageRep alloc] initWithCGImage:cgimage]); |
| 263 scoped_nsobject<NSImage> image([[NSImage alloc] init]); | 277 scoped_nsobject<NSImage> image([[NSImage alloc] init]); |
| 264 [image addRepresentation:bitmap]; | 278 [image addRepresentation:bitmap]; |
| 265 [image setSize:NSMakeSize(skiaBitmap.width(), skiaBitmap.height())]; | 279 [image setSize:NSMakeSize(skiaBitmap.width(), skiaBitmap.height())]; |
| 266 return [image.release() autorelease]; | 280 return [image.release() autorelease]; |
| 267 } | 281 } |
| 268 | 282 |
| 269 NSImage* SkBitmapToNSImage(const SkBitmap& skiaBitmap) { | 283 NSImage* SkBitmapToNSImage(const SkBitmap& skiaBitmap) { |
| 270 base::mac::ScopedCFTypeRef<CGColorSpaceRef> colorSpace( | 284 base::mac::ScopedCFTypeRef<CGColorSpaceRef> colorSpace( |
| 271 CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); | 285 CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); |
| 272 return SkBitmapToNSImageWithColorSpace(skiaBitmap, colorSpace.get()); | 286 return SkBitmapToNSImageWithColorSpace(skiaBitmap, colorSpace.get()); |
| 273 } | 287 } |
| 274 | 288 |
| 275 NSImage* SkBitmapsToNSImage(const std::vector<const SkBitmap*>& bitmaps) { | |
| 276 if (bitmaps.empty()) | |
| 277 return nil; | |
| 278 | |
| 279 base::mac::ScopedCFTypeRef<CGColorSpaceRef> color_space( | |
| 280 CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); | |
| 281 scoped_nsobject<NSImage> image([[NSImage alloc] init]); | |
| 282 NSSize min_size = NSZeroSize; | |
| 283 | |
| 284 for (std::vector<const SkBitmap*>::const_iterator it = bitmaps.begin(); | |
| 285 it != bitmaps.end(); ++it) { | |
| 286 const SkBitmap& skiaBitmap = **it; | |
| 287 // First convert SkBitmap to CGImageRef. | |
| 288 base::mac::ScopedCFTypeRef<CGImageRef> cgimage( | |
| 289 SkCreateCGImageRefWithColorspace(skiaBitmap, color_space)); | |
| 290 | |
| 291 // Now convert to NSImage. | |
| 292 scoped_nsobject<NSBitmapImageRep> bitmap( | |
| 293 [[NSBitmapImageRep alloc] initWithCGImage:cgimage]); | |
| 294 [image addRepresentation:bitmap]; | |
| 295 | |
| 296 if (min_size.width == 0 || min_size.width > skiaBitmap.width()) { | |
| 297 min_size.width = skiaBitmap.width(); | |
| 298 min_size.height = skiaBitmap.height(); | |
| 299 } | |
| 300 } | |
| 301 | |
| 302 [image setSize:min_size]; | |
| 303 return [image.release() autorelease]; | |
| 304 } | |
| 305 | |
| 306 SkBitmap AppplicationIconAtSize(int size) { | 289 SkBitmap AppplicationIconAtSize(int size) { |
| 307 NSImage* image = [NSImage imageNamed:@"NSApplicationIcon"]; | 290 NSImage* image = [NSImage imageNamed:@"NSApplicationIcon"]; |
| 308 return NSImageToSkBitmap(image, NSMakeSize(size, size), /* is_opaque=*/true); | 291 return NSImageToSkBitmap(image, NSMakeSize(size, size), /* is_opaque=*/true); |
| 309 } | 292 } |
| 310 | 293 |
| 311 | |
| 312 SkiaBitLocker::SkiaBitLocker(SkCanvas* canvas) | 294 SkiaBitLocker::SkiaBitLocker(SkCanvas* canvas) |
| 313 : canvas_(canvas), | 295 : canvas_(canvas), |
| 314 cgContext_(0) { | 296 cgContext_(0) { |
| 315 } | 297 } |
| 316 | 298 |
| 317 SkiaBitLocker::~SkiaBitLocker() { | 299 SkiaBitLocker::~SkiaBitLocker() { |
| 318 releaseIfNeeded(); | 300 releaseIfNeeded(); |
| 319 } | 301 } |
| 320 | 302 |
| 321 // This must be called to balance calls to cgContext | 303 // This must be called to balance calls to cgContext |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 389 // Apply content matrix. | 371 // Apply content matrix. |
| 390 SkMatrix skMatrix = canvas_->getTotalMatrix(); | 372 SkMatrix skMatrix = canvas_->getTotalMatrix(); |
| 391 skMatrix.postTranslate(-SkIntToScalar(pt.fX), -SkIntToScalar(pt.fY)); | 373 skMatrix.postTranslate(-SkIntToScalar(pt.fX), -SkIntToScalar(pt.fY)); |
| 392 CGAffineTransform affine = SkMatrixToCGAffineTransform(skMatrix); | 374 CGAffineTransform affine = SkMatrixToCGAffineTransform(skMatrix); |
| 393 CGContextConcatCTM(cgContext_, affine); | 375 CGContextConcatCTM(cgContext_, affine); |
| 394 | 376 |
| 395 return cgContext_; | 377 return cgContext_; |
| 396 } | 378 } |
| 397 | 379 |
| 398 } // namespace gfx | 380 } // namespace gfx |
| OLD | NEW |