Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: skia/ext/platform_canvas.h

Issue 2011713003: Roll skia to 8cc209111876b7c78b5ec577c9221d8ed5e21024 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « skia/ext/opacity_draw_filter.cc ('k') | skia/ext/platform_canvas.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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_PLATFORM_CANVAS_H_
6 #define SKIA_EXT_PLATFORM_CANVAS_H_
7
8 // The platform-specific device will include the necessary platform headers
9 // to get the surface type.
10 #include "base/basictypes.h"
11 #include "skia/ext/platform_device.h"
12 #include "skia/ext/refptr.h"
13 #include "third_party/skia/include/core/SkBitmap.h"
14 #include "third_party/skia/include/core/SkCanvas.h"
15 #include "third_party/skia/include/core/SkPixelRef.h"
16 #include "third_party/skia/include/core/SkPreConfig.h"
17
18 namespace skia {
19
20 typedef SkCanvas PlatformCanvas;
21
22 //
23 // Note about error handling.
24 //
25 // Creating a canvas can fail at times, most often because we fail to allocate
26 // the backing-store (pixels). This can be from out-of-memory, or something
27 // more opaque, like GDI or cairo reported a failure.
28 //
29 // To allow the caller to handle the failure, every Create... factory takes an
30 // enum as its last parameter. The default value is kCrashOnFailure. If the
31 // caller passes kReturnNullOnFailure, then the caller is responsible to check
32 // the return result.
33 //
34 enum OnFailureType {
35 CRASH_ON_FAILURE,
36 RETURN_NULL_ON_FAILURE
37 };
38
39 #if defined(SK_BUILD_FOR_WIN32)
40 // The shared_section parameter is passed to gfx::PlatformDevice::create.
41 // See it for details.
42 SK_API SkCanvas* CreatePlatformCanvas(int width,
43 int height,
44 bool is_opaque,
45 HANDLE shared_section,
46 OnFailureType failure_type);
47
48 // Draws the top layer of the canvas into the specified HDC. Only works
49 // with a PlatformCanvas with a BitmapPlatformDevice.
50 SK_API void DrawToNativeContext(SkCanvas* canvas,
51 HDC hdc,
52 int x,
53 int y,
54 const RECT* src_rect);
55 #elif defined(SK_BUILD_FOR_MAC)
56 SK_API SkCanvas* CreatePlatformCanvas(CGContextRef context,
57 int width,
58 int height,
59 bool is_opaque,
60 OnFailureType failure_type);
61
62 SK_API SkCanvas* CreatePlatformCanvas(int width,
63 int height,
64 bool is_opaque,
65 uint8_t* context,
66 OnFailureType failure_type);
67 #elif defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_UNIX)
68 // Linux ---------------------------------------------------------------------
69
70 // Construct a canvas from the given memory region. The memory is not cleared
71 // first. @data must be, at least, @height * StrideForWidth(@width) bytes.
72 SK_API SkCanvas* CreatePlatformCanvas(int width,
73 int height,
74 bool is_opaque,
75 uint8_t* data,
76 OnFailureType failure_type);
77 #endif
78
79 static inline SkCanvas* CreatePlatformCanvas(int width,
80 int height,
81 bool is_opaque) {
82 return CreatePlatformCanvas(width, height, is_opaque, 0, CRASH_ON_FAILURE);
83 }
84
85 SK_API SkCanvas* CreateCanvas(const skia::RefPtr<SkBaseDevice>& device,
86 OnFailureType failure_type);
87
88 static inline SkCanvas* CreateBitmapCanvas(int width,
89 int height,
90 bool is_opaque) {
91 return CreatePlatformCanvas(width, height, is_opaque, 0, CRASH_ON_FAILURE);
92 }
93
94 static inline SkCanvas* TryCreateBitmapCanvas(int width,
95 int height,
96 bool is_opaque) {
97 return CreatePlatformCanvas(width, height, is_opaque, 0,
98 RETURN_NULL_ON_FAILURE);
99 }
100
101 // Return the stride (length of a line in bytes) for the given width. Because
102 // we use 32-bits per pixel, this will be roughly 4*width. However, for
103 // alignment reasons we may wish to increase that.
104 SK_API size_t PlatformCanvasStrideForWidth(unsigned width);
105
106 // Returns the SkBaseDevice pointer of the topmost rect with a non-empty
107 // clip. In practice, this is usually either the top layer or nothing, since
108 // we usually set the clip to new layers when we make them.
109 //
110 // This may return NULL, so callers need to check.
111 //
112 // This is different than SkCanvas' getDevice, because that returns the
113 // bottommost device.
114 //
115 // Danger: the resulting device should not be saved. It will be invalidated
116 // by the next call to save() or restore().
117 SK_API SkBaseDevice* GetTopDevice(const SkCanvas& canvas);
118
119 // Returns true if native platform routines can be used to draw on the
120 // given canvas. If this function returns false, BeginPlatformPaint will
121 // return NULL PlatformSurface.
122 SK_API bool SupportsPlatformPaint(const SkCanvas* canvas);
123
124 // Sets the opacity of each pixel in the specified region to be opaque.
125 SK_API void MakeOpaque(SkCanvas* canvas, int x, int y, int width, int height);
126
127 // These calls should surround calls to platform drawing routines, the
128 // surface returned here can be used with the native platform routines.
129 //
130 // Call EndPlatformPaint when you are done and want to use skia operations
131 // after calling the platform-specific BeginPlatformPaint; this will
132 // synchronize the bitmap to OS if necessary.
133 SK_API PlatformSurface BeginPlatformPaint(SkCanvas* canvas);
134 SK_API void EndPlatformPaint(SkCanvas* canvas);
135
136 // Helper class for pairing calls to BeginPlatformPaint and EndPlatformPaint.
137 // Upon construction invokes BeginPlatformPaint, and upon destruction invokes
138 // EndPlatformPaint.
139 class SK_API ScopedPlatformPaint {
140 public:
141 explicit ScopedPlatformPaint(SkCanvas* canvas) : canvas_(canvas) {
142 platform_surface_ = BeginPlatformPaint(canvas);
143 }
144 ~ScopedPlatformPaint() { EndPlatformPaint(canvas_); }
145
146 // Returns the PlatformSurface to use for native platform drawing calls.
147 PlatformSurface GetPlatformSurface() { return platform_surface_; }
148 private:
149 SkCanvas* canvas_;
150 PlatformSurface platform_surface_;
151
152 // Disallow copy and assign
153 ScopedPlatformPaint(const ScopedPlatformPaint&);
154 ScopedPlatformPaint& operator=(const ScopedPlatformPaint&);
155 };
156
157 // PlatformBitmap holds a PlatformSurface that can also be used as an SkBitmap.
158 class SK_API PlatformBitmap {
159 public:
160 PlatformBitmap();
161 ~PlatformBitmap();
162
163 // Returns true if the bitmap was able to allocate its surface.
164 bool Allocate(int width, int height, bool is_opaque);
165
166 // Returns the platform surface, or 0 if Allocate() did not return true.
167 PlatformSurface GetSurface() { return surface_; }
168
169 // Return the skia bitmap, which will be empty if Allocate() did not
170 // return true.
171 //
172 // The resulting SkBitmap holds a refcount on the underlying platform surface,
173 // so the surface will remain allocated so long as the SkBitmap or its copies
174 // stay around.
175 const SkBitmap& GetBitmap() { return bitmap_; }
176
177 private:
178 SkBitmap bitmap_;
179 PlatformSurface surface_; // initialized to 0
180 intptr_t platform_extra_; // platform specific, initialized to 0
181
182 DISALLOW_COPY_AND_ASSIGN(PlatformBitmap);
183 };
184
185 } // namespace skia
186
187 #endif // SKIA_EXT_PLATFORM_CANVAS_H_
OLDNEW
« no previous file with comments | « skia/ext/opacity_draw_filter.cc ('k') | skia/ext/platform_canvas.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698