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( |
| 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 |