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 3 // found in the LICENSE file. 4 5 #ifndef SKIA_EXT_SKIA_UTILS_MAC_H_ 6 #define SKIA_EXT_SKIA_UTILS_MAC_H_ 7 8 #include <ApplicationServices/ApplicationServices.h> 9 #include <vector> 10 11 #include "third_party/skia/include/core/SkBitmap.h" 12 #include "third_party/skia/include/core/SkColor.h" 13 14 struct SkIRect; 15 struct SkPoint; 16 struct SkRect; 17 class SkCanvas; 18 class SkMatrix; 19 #ifdef __LP64__ 20 typedef CGSize NSSize; 21 #else 22 typedef struct _NSSize NSSize; 23 #endif 24 25 #ifdef __OBJC__ 26 @class NSBitmapImageRep; 27 @class NSImage; 28 @class NSImageRep; 29 @class NSColor; 30 #else 31 class NSBitmapImageRep; 32 class NSImage; 33 class NSImageRep; 34 class NSColor; 35 #endif 36 37 namespace gfx { 38 39 // Converts a Skia point to a CoreGraphics CGPoint. 40 // Both use same in-memory format. 41 inline const CGPoint& SkPointToCGPoint(const SkPoint& point) { 42 return reinterpret_cast<const CGPoint&>(point); 43 } 44 45 // Converts a CoreGraphics point to a Skia CGPoint. 46 // Both use same in-memory format. 47 inline const SkPoint& CGPointToSkPoint(const CGPoint& point) { 48 return reinterpret_cast<const SkPoint&>(point); 49 } 50 51 // Matrix converters. 52 SK_API CGAffineTransform SkMatrixToCGAffineTransform(const SkMatrix& matrix); 53 54 // Rectangle converters. 55 SK_API SkRect CGRectToSkRect(const CGRect& rect); 56 57 // Converts a Skia rect to a CoreGraphics CGRect. 58 CGRect SkIRectToCGRect(const SkIRect& rect); 59 CGRect SkRectToCGRect(const SkRect& rect); 60 61 // Converts CGColorRef to the ARGB layout Skia expects. 62 SK_API SkColor CGColorRefToSkColor(CGColorRef color); 63 64 // Converts ARGB to CGColorRef. 65 SK_API CGColorRef CGColorCreateFromSkColor(SkColor color); 66 67 // Converts NSColor to ARGB. Returns raw rgb values and does no colorspace 68 // conversion. Only valid for colors in calibrated and device color spaces. 69 SK_API SkColor NSDeviceColorToSkColor(NSColor* color); 70 71 // Converts ARGB in the specified color space to NSColor. 72 // Prefer sRGB over calibrated colors. 73 SK_API NSColor* SkColorToCalibratedNSColor(SkColor color); 74 SK_API NSColor* SkColorToDeviceNSColor(SkColor color); 75 SK_API NSColor* SkColorToSRGBNSColor(SkColor color); 76 77 // Converts a CGImage to a SkBitmap. 78 SK_API SkBitmap CGImageToSkBitmap(CGImageRef image); 79 80 // Draws an NSImage with a given size into a SkBitmap. 81 SK_API SkBitmap NSImageToSkBitmapWithColorSpace(NSImage* image, 82 bool is_opaque, 83 CGColorSpaceRef color_space); 84 85 // Draws an NSImageRep with a given size into a SkBitmap. 86 SK_API SkBitmap NSImageRepToSkBitmapWithColorSpace(NSImageRep* image, 87 NSSize size, 88 bool is_opaque, 89 CGColorSpaceRef colorspace); 90 91 // Given an SkBitmap, return an autoreleased NSBitmapImageRep in the generic 92 // color space. 93 SK_API NSBitmapImageRep* SkBitmapToNSBitmapImageRep(const SkBitmap& image); 94 95 SK_API NSBitmapImageRep* SkBitmapToNSBitmapImageRepWithColorSpace( 96 const SkBitmap& skiaBitmap, 97 CGColorSpaceRef colorSpace); 98 99 // Given an SkBitmap and a color space, return an autoreleased NSImage. 100 SK_API NSImage* SkBitmapToNSImageWithColorSpace(const SkBitmap& icon, 101 CGColorSpaceRef colorSpace); 102 103 // Given an SkBitmap, return an autoreleased NSImage in the generic color space. 104 // DEPRECATED, use SkBitmapToNSImageWithColorSpace() instead. 105 // TODO(thakis): Remove this -- http://crbug.com/69432 106 SK_API NSImage* SkBitmapToNSImage(const SkBitmap& icon); 107 108 // Converts a SkCanvas temporarily to a CGContext 109 class SK_API SkiaBitLocker { 110 public: 111 // TODO(ccameron): delete this constructor 112 explicit SkiaBitLocker(SkCanvas* canvas); 113 SkiaBitLocker(SkCanvas* canvas, 114 const SkIRect& userClipRect, 115 SkScalar bitmapScaleFactor = 1); 116 ~SkiaBitLocker(); 117 CGContextRef cgContext(); 118 bool hasEmptyClipRegion() const; 119 120 private: 121 void releaseIfNeeded(); 122 SkIRect computeDirtyRect(); 123 124 SkCanvas* canvas_; 125 126 // If the user specified a clip rect it would draw into then the locker may 127 // skip the step of searching for a rect bounding the pixels that the user 128 // has drawn into. 129 bool userClipRectSpecified_; 130 131 CGContextRef cgContext_; 132 SkBitmap bitmap_; 133 SkIPoint bitmapOffset_; 134 SkScalar bitmapScaleFactor_; 135 136 // True if we are drawing to |canvas_|'s SkBaseDevice's bits directly through 137 // |bitmap_|. Otherwise, the bits in |bitmap_| are our allocation and need to 138 // be copied over to |canvas_|. 139 bool useDeviceBits_; 140 141 // True if |bitmap_| is a dummy 1x1 bitmap allocated for the sake of creating 142 // a non-NULL CGContext (it is invalid to use a NULL CGContext), and will not 143 // be copied to |canvas_|. This will happen if |canvas_|'s clip region is 144 // empty. 145 bool bitmapIsDummy_; 146 }; 147 148 149 } // namespace gfx 150 151 #endif // SKIA_EXT_SKIA_UTILS_MAC_H_ 152