Home | History | Annotate | Download | only in ext
      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