diff options
-rw-r--r-- | app/gfx/canvas_paint.h | 2 | ||||
-rw-r--r-- | app/resource_bundle.h | 2 | ||||
-rw-r--r-- | skia/ext/canvas_paint.h | 2 | ||||
-rw-r--r-- | skia/ext/canvas_paint_mac.h | 104 |
4 files changed, 107 insertions, 3 deletions
diff --git a/app/gfx/canvas_paint.h b/app/gfx/canvas_paint.h index d3a71f8..aa253b9 100644 --- a/app/gfx/canvas_paint.h +++ b/app/gfx/canvas_paint.h @@ -13,9 +13,7 @@ namespace gfx { -#if defined(OS_WIN) || defined(OS_LINUX) typedef skia::CanvasPaintT<Canvas> CanvasPaint; -#endif } // namespace gfx diff --git a/app/resource_bundle.h b/app/resource_bundle.h index 8d0b29a..bba8560 100644 --- a/app/resource_bundle.h +++ b/app/resource_bundle.h @@ -67,7 +67,7 @@ class ResourceBundle { void LoadThemeResources(); // Gets the bitmap with the specified resource_id, first by looking into the - // theme data, than in the current module data if applicable. + // theme data, then in the current module data if applicable. // Returns a pointer to a shared instance of the SkBitmap. This shared bitmap // is owned by the resource bundle and should not be freed. // diff --git a/skia/ext/canvas_paint.h b/skia/ext/canvas_paint.h index 0a8f2d1..4e7b536 100644 --- a/skia/ext/canvas_paint.h +++ b/skia/ext/canvas_paint.h @@ -10,6 +10,8 @@ #if defined(WIN32) #include "skia/ext/canvas_paint_win.h" +#elif defined(__APPLE__) +#include "skia/ext/canvas_paint_mac.h" #elif defined(__linux__) #include "skia/ext/canvas_paint_linux.h" #endif diff --git a/skia/ext/canvas_paint_mac.h b/skia/ext/canvas_paint_mac.h new file mode 100644 index 0000000..9f4ae84 --- /dev/null +++ b/skia/ext/canvas_paint_mac.h @@ -0,0 +1,104 @@ + +// Copyright (c) 2009 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. + +#ifndef SKIA_EXT_CANVAS_PAINT_MAC_H_ +#define SKIA_EXT_CANVAS_PAINT_MAC_H_ + +#include "skia/ext/platform_canvas.h" + +#import <Cocoa/Cocoa.h> + +namespace skia { + +// A class designed to translate skia painting into a region to the current +// graphics context. This class has been adapted from the class with the same +// name in platform_canvas_win.h. On construction, it will set up a context for +// painting into, and on destruction, it will commit it to the current context. +template <class T> +class CanvasPaintT : public T { + public: + // This constructor assumes the result is opaque. + explicit CanvasPaintT(NSRect dirtyRect) + : context_(NULL), + rectangle_(dirtyRect), + composite_alpha_(false) { + init(true); + } + + CanvasPaintT(NSRect dirtyRect, bool opaque) + : context_(NULL), + rectangle_(dirtyRect), + composite_alpha_(false) { + init(opaque); + } + + virtual ~CanvasPaintT() { + if (!is_empty()) { + T::restoreToCount(1); + + // Blit the dirty rect to the current context. + CGImageRef image = CGBitmapContextCreateImage(context_); + CGRect destRect = NSRectToCGRect(rectangle_); + + CGContextRef context = + (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState(context); + CGContextSetBlendMode( + context, composite_alpha_ ? kCGBlendModeNormal : kCGBlendModeCopy); + CGContextDrawImage(context, destRect, image); + CGContextRestoreGState(context); + + CFRelease(image); + } + } + + // If true, the data painted into the CanvasPaintT is blended onto the current + // context, else it is copied. + void set_composite_alpha(bool composite_alpha) { + composite_alpha_ = composite_alpha; + } + + // Returns true if the invalid region is empty. The caller should call this + // function to determine if anything needs painting. + bool is_empty() const { + return rectangle_.size.width == 0 || rectangle_.size.height == 0; + } + + const NSRect& rectangle() const { + return rectangle_; + } + + private: + void init(bool opaque) { + if (!T::initialize(rectangle_.size.width, rectangle_.size.height, + opaque, NULL)) { + // Cause a deliberate crash; + *(char*) 0 = 0; + } + + // Need to translate so that the dirty region appears at the origin of the + // surface. + T::translate(-SkIntToScalar(rectangle_.origin.x), + -SkIntToScalar(rectangle_.origin.y)); + + context_ = T::getTopPlatformDevice().GetBitmapContext(); + } + + CGContext* context_; + NSRect rectangle_; + // See description above setter. + bool composite_alpha_; + + // Disallow copy and assign. + CanvasPaintT(const CanvasPaintT&); + CanvasPaintT& operator=(const CanvasPaintT&); +}; + +typedef CanvasPaintT<PlatformCanvas> PlatformCanvasPaint; + +} // namespace skia + + +#endif // SKIA_EXT_CANVAS_PAINT_MAC_H_ |