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

Side by Side Diff: skia/ext/platform_canvas_unittest.cc

Issue 7019013: Removal of dependencies on PlatformDevice classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Addressing comments. Created 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 // TODO(awalker): clean up the const/non-const reference handling in this test 5 // TODO(awalker): clean up the const/non-const reference handling in this test
6 6
7 #include "build/build_config.h" 7 #include "build/build_config.h"
8 8
9 #if defined(OS_MACOSX) 9 #if defined(OS_MACOSX)
10 #import <ApplicationServices/ApplicationServices.h> 10 #import <ApplicationServices/ApplicationServices.h>
(...skipping 13 matching lines...) Expand all
24 24
25 namespace { 25 namespace {
26 26
27 // Return true if the canvas is filled to canvas_color, and contains a single 27 // Return true if the canvas is filled to canvas_color, and contains a single
28 // rectangle filled to rect_color. This function ignores the alpha channel, 28 // rectangle filled to rect_color. This function ignores the alpha channel,
29 // since Windows will sometimes clear the alpha channel when drawing, and we 29 // since Windows will sometimes clear the alpha channel when drawing, and we
30 // will fix that up later in cases it's necessary. 30 // will fix that up later in cases it's necessary.
31 bool VerifyRect(const PlatformCanvas& canvas, 31 bool VerifyRect(const PlatformCanvas& canvas,
32 uint32_t canvas_color, uint32_t rect_color, 32 uint32_t canvas_color, uint32_t rect_color,
33 int x, int y, int w, int h) { 33 int x, int y, int w, int h) {
34 PlatformDevice& device = canvas.getTopPlatformDevice(); 34 SkDevice& device = canvas.getTopDevice();
35 const SkBitmap& bitmap = device.accessBitmap(false); 35 const SkBitmap& bitmap = device.accessBitmap(false);
36 SkAutoLockPixels lock(bitmap); 36 SkAutoLockPixels lock(bitmap);
37 37
38 // For masking out the alpha values. 38 // For masking out the alpha values.
39 uint32_t alpha_mask = 0xFF << SK_A32_SHIFT; 39 uint32_t alpha_mask = 0xFF << SK_A32_SHIFT;
40 40
41 for (int cur_y = 0; cur_y < bitmap.height(); cur_y++) { 41 for (int cur_y = 0; cur_y < bitmap.height(); cur_y++) {
42 for (int cur_x = 0; cur_x < bitmap.width(); cur_x++) { 42 for (int cur_x = 0; cur_x < bitmap.width(); cur_x++) {
43 if (cur_x >= x && cur_x < x + w && 43 if (cur_x >= x && cur_x < x + w &&
44 cur_y >= y && cur_y < y + h) { 44 cur_y >= y && cur_y < y + h) {
(...skipping 18 matching lines...) Expand all
63 static uint32_t alpha_mask = 0xFF << SK_A32_SHIFT; 63 static uint32_t alpha_mask = 0xFF << SK_A32_SHIFT;
64 return (*bitmap.getAddr32(x, y) | alpha_mask) == (color | alpha_mask); 64 return (*bitmap.getAddr32(x, y) | alpha_mask) == (color | alpha_mask);
65 } 65 }
66 66
67 // Return true if canvas has something that passes for a rounded-corner 67 // Return true if canvas has something that passes for a rounded-corner
68 // rectangle. Basically, we're just checking to make sure that the pixels in the 68 // rectangle. Basically, we're just checking to make sure that the pixels in the
69 // middle are of rect_color and pixels in the corners are of canvas_color. 69 // middle are of rect_color and pixels in the corners are of canvas_color.
70 bool VerifyRoundedRect(const PlatformCanvas& canvas, 70 bool VerifyRoundedRect(const PlatformCanvas& canvas,
71 uint32_t canvas_color, uint32_t rect_color, 71 uint32_t canvas_color, uint32_t rect_color,
72 int x, int y, int w, int h) { 72 int x, int y, int w, int h) {
73 PlatformDevice& device = canvas.getTopPlatformDevice(); 73 SkDevice& device = canvas.getTopDevice();
74 const SkBitmap& bitmap = device.accessBitmap(false); 74 const SkBitmap& bitmap = device.accessBitmap(false);
75 SkAutoLockPixels lock(bitmap); 75 SkAutoLockPixels lock(bitmap);
76 76
77 // Check corner points first. They should be of canvas_color. 77 // Check corner points first. They should be of canvas_color.
78 if (!IsOfColor(bitmap, x, y, canvas_color)) return false; 78 if (!IsOfColor(bitmap, x, y, canvas_color)) return false;
79 if (!IsOfColor(bitmap, x + w, y, canvas_color)) return false; 79 if (!IsOfColor(bitmap, x + w, y, canvas_color)) return false;
80 if (!IsOfColor(bitmap, x, y + h, canvas_color)) return false; 80 if (!IsOfColor(bitmap, x, y + h, canvas_color)) return false;
81 if (!IsOfColor(bitmap, x + w, y, canvas_color)) return false; 81 if (!IsOfColor(bitmap, x + w, y, canvas_color)) return false;
82 82
83 // Check middle points. They should be of rect_color. 83 // Check middle points. They should be of rect_color.
(...skipping 12 matching lines...) Expand all
96 return VerifyRect(canvas, SK_ColorWHITE, SK_ColorBLACK, x, y, w, h); 96 return VerifyRect(canvas, SK_ColorWHITE, SK_ColorBLACK, x, y, w, h);
97 } 97 }
98 98
99 // Check that every pixel in the canvas is a single color. 99 // Check that every pixel in the canvas is a single color.
100 bool VerifyCanvasColor(const PlatformCanvas& canvas, uint32_t canvas_color) { 100 bool VerifyCanvasColor(const PlatformCanvas& canvas, uint32_t canvas_color) {
101 return VerifyRect(canvas, canvas_color, 0, 0, 0, 0, 0); 101 return VerifyRect(canvas, canvas_color, 0, 0, 0, 0, 0);
102 } 102 }
103 103
104 #if defined(OS_WIN) 104 #if defined(OS_WIN)
105 void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) { 105 void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) {
106 HDC dc = canvas.beginPlatformPaint(); 106 HDC dc = skia::BeginPlatformPaint(&canvas);
107 107
108 RECT inner_rc; 108 RECT inner_rc;
109 inner_rc.left = x; 109 inner_rc.left = x;
110 inner_rc.top = y; 110 inner_rc.top = y;
111 inner_rc.right = x + w; 111 inner_rc.right = x + w;
112 inner_rc.bottom = y + h; 112 inner_rc.bottom = y + h;
113 FillRect(dc, &inner_rc, reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH))) ; 113 FillRect(dc, &inner_rc, reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH))) ;
114 114
115 canvas.endPlatformPaint(); 115 skia::EndPlatformPaint(&canvas);
116 } 116 }
117 #elif defined(OS_MACOSX) 117 #elif defined(OS_MACOSX)
118 void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) { 118 void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) {
119 CGContextRef context = canvas.beginPlatformPaint(); 119 CGContextRef context = skia::BeginPlatformPaint(&canvas);
120 120
121 CGRect inner_rc = CGRectMake(x, y, w, h); 121 CGRect inner_rc = CGRectMake(x, y, w, h);
122 // RGBA opaque black 122 // RGBA opaque black
123 CGColorRef black = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 1.0); 123 CGColorRef black = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 1.0);
124 CGContextSetFillColorWithColor(context, black); 124 CGContextSetFillColorWithColor(context, black);
125 CGColorRelease(black); 125 CGColorRelease(black);
126 CGContextFillRect(context, inner_rc); 126 CGContextFillRect(context, inner_rc);
127 127
128 canvas.endPlatformPaint(); 128 skia::EndPlatformPaint(&canvas);
129 } 129 }
130 #else 130 #else
131 void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) { 131 void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) {
132 notImplemented(); 132 notImplemented();
133 } 133 }
134 #endif 134 #endif
135 135
136 // Clips the contents of the canvas to the given rectangle. This will be 136 // Clips the contents of the canvas to the given rectangle. This will be
137 // intersected with any existing clip. 137 // intersected with any existing clip.
138 void AddClip(PlatformCanvas& canvas, int x, int y, int w, int h) { 138 void AddClip(PlatformCanvas& canvas, int x, int y, int w, int h) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 // Create the canvas initialized to opaque white. 237 // Create the canvas initialized to opaque white.
238 PlatformCanvas canvas(16, 16, true); 238 PlatformCanvas canvas(16, 16, true);
239 239
240 // Make a layer and fill it completely to make sure that the bounds are 240 // Make a layer and fill it completely to make sure that the bounds are
241 // correct. 241 // correct.
242 canvas.drawColor(SK_ColorWHITE); 242 canvas.drawColor(SK_ColorWHITE);
243 { 243 {
244 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 244 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
245 DrawNativeRect(canvas, 0, 0, 100, 100); 245 DrawNativeRect(canvas, 0, 0, 100, 100);
246 #if defined(OS_WIN) 246 #if defined(OS_WIN)
247 canvas.getTopPlatformDevice().makeOpaque(0, 0, 100, 100); 247 platform_util::MakeOpaque(&canvas.getTopDevice(), 0, 0, 100, 100);
248 #endif 248 #endif
249 } 249 }
250 EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX, kLayerY, kLayerW, kLayerH)); 250 EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX, kLayerY, kLayerW, kLayerH));
251 251
252 // Make a layer and fill it partially to make sure the translation is correct. 252 // Make a layer and fill it partially to make sure the translation is correct.
253 canvas.drawColor(SK_ColorWHITE); 253 canvas.drawColor(SK_ColorWHITE);
254 { 254 {
255 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 255 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
256 DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH); 256 DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH);
257 #if defined(OS_WIN) 257 #if defined(OS_WIN)
258 canvas.getTopPlatformDevice().makeOpaque(kInnerX, kInnerY, 258 platform_util::MakeOpaque(&canvas.getTopDevice(), kInnerX, kInnerY,
alokp 2011/05/19 18:15:15 platform_util?
Jeff Timanus 2011/05/19 20:38:29 Corrected. Thanks for catching that.
259 kInnerW, kInnerH); 259 kInnerW, kInnerH);
260 #endif 260 #endif
261 } 261 }
262 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH)); 262 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH));
263 263
264 // Add a clip on the layer and fill to make sure clip is correct. 264 // Add a clip on the layer and fill to make sure clip is correct.
265 canvas.drawColor(SK_ColorWHITE); 265 canvas.drawColor(SK_ColorWHITE);
266 { 266 {
267 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 267 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
268 canvas.save(); 268 canvas.save();
269 AddClip(canvas, kInnerX, kInnerY, kInnerW, kInnerH); 269 AddClip(canvas, kInnerX, kInnerY, kInnerW, kInnerH);
270 DrawNativeRect(canvas, 0, 0, 100, 100); 270 DrawNativeRect(canvas, 0, 0, 100, 100);
271 #if defined(OS_WIN) 271 #if defined(OS_WIN)
272 canvas.getTopPlatformDevice().makeOpaque( 272 platform_util::MakeOpaque(&canvas.getTopDevice(),
273 kInnerX, kInnerY, kInnerW, kInnerH); 273 kInnerX, kInnerY, kInnerW, kInnerH);
274 #endif 274 #endif
275 canvas.restore(); 275 canvas.restore();
276 } 276 }
277 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH)); 277 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH));
278 278
279 // Add a clip and then make the layer to make sure the clip is correct. 279 // Add a clip and then make the layer to make sure the clip is correct.
280 canvas.drawColor(SK_ColorWHITE); 280 canvas.drawColor(SK_ColorWHITE);
281 canvas.save(); 281 canvas.save();
282 AddClip(canvas, kInnerX, kInnerY, kInnerW, kInnerH); 282 AddClip(canvas, kInnerX, kInnerY, kInnerW, kInnerH);
283 { 283 {
284 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 284 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
285 DrawNativeRect(canvas, 0, 0, 100, 100); 285 DrawNativeRect(canvas, 0, 0, 100, 100);
286 #if defined(OS_WIN) 286 #if defined(OS_WIN)
287 canvas.getTopPlatformDevice().makeOpaque(0, 0, 100, 100); 287 platform_util::MakeOpaque(&canvas.getTopDevice(), 0, 0, 100, 100);
288 #endif 288 #endif
289 } 289 }
290 canvas.restore(); 290 canvas.restore();
291 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH)); 291 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH));
292 } 292 }
293 293
294 // Test that translation + make layer works properly. 294 // Test that translation + make layer works properly.
295 TEST(PlatformCanvas, TranslateLayer) { 295 TEST(PlatformCanvas, TranslateLayer) {
296 // Create the canvas initialized to opaque white. 296 // Create the canvas initialized to opaque white.
297 PlatformCanvas canvas(16, 16, true); 297 PlatformCanvas canvas(16, 16, true);
298 298
299 // Make a layer and fill it completely to make sure that the bounds are 299 // Make a layer and fill it completely to make sure that the bounds are
300 // correct. 300 // correct.
301 canvas.drawColor(SK_ColorWHITE); 301 canvas.drawColor(SK_ColorWHITE);
302 canvas.save(); 302 canvas.save();
303 canvas.translate(1, 1); 303 canvas.translate(1, 1);
304 { 304 {
305 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 305 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
306 DrawNativeRect(canvas, 0, 0, 100, 100); 306 DrawNativeRect(canvas, 0, 0, 100, 100);
307 #if defined(OS_WIN) 307 #if defined(OS_WIN)
308 canvas.getTopPlatformDevice().makeOpaque(0, 0, 100, 100); 308 platform_util::MakeOpaque(&canvas.getTopDevice(), 0, 0, 100, 100);
309 #endif 309 #endif
310 } 310 }
311 canvas.restore(); 311 canvas.restore();
312 EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX + 1, kLayerY + 1, 312 EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX + 1, kLayerY + 1,
313 kLayerW, kLayerH)); 313 kLayerW, kLayerH));
314 314
315 // Translate then make the layer. 315 // Translate then make the layer.
316 canvas.drawColor(SK_ColorWHITE); 316 canvas.drawColor(SK_ColorWHITE);
317 canvas.save(); 317 canvas.save();
318 canvas.translate(1, 1); 318 canvas.translate(1, 1);
319 { 319 {
320 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 320 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
321 DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH); 321 DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH);
322 #if defined(OS_WIN) 322 #if defined(OS_WIN)
323 canvas.getTopPlatformDevice().makeOpaque(kInnerX, kInnerY, 323 platform_util::MakeOpaque(&canvas.getTopDevice(), kInnerX, kInnerY,
324 kInnerW, kInnerH); 324 kInnerW, kInnerH);
325 #endif 325 #endif
326 } 326 }
327 canvas.restore(); 327 canvas.restore();
328 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 1, kInnerY + 1, 328 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 1, kInnerY + 1,
329 kInnerW, kInnerH)); 329 kInnerW, kInnerH));
330 330
331 // Make the layer then translate. 331 // Make the layer then translate.
332 canvas.drawColor(SK_ColorWHITE); 332 canvas.drawColor(SK_ColorWHITE);
333 canvas.save(); 333 canvas.save();
334 { 334 {
335 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 335 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
336 canvas.translate(1, 1); 336 canvas.translate(1, 1);
337 DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH); 337 DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH);
338 #if defined(OS_WIN) 338 #if defined(OS_WIN)
339 canvas.getTopPlatformDevice().makeOpaque(kInnerX, kInnerY, 339 platform_util::MakeOpaque(&canvas.getTopDevice(), kInnerX, kInnerY,
340 kInnerW, kInnerH); 340 kInnerW, kInnerH);
341 #endif 341 #endif
342 } 342 }
343 canvas.restore(); 343 canvas.restore();
344 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 1, kInnerY + 1, 344 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 1, kInnerY + 1,
345 kInnerW, kInnerH)); 345 kInnerW, kInnerH));
346 346
347 // Translate both before and after, and have a clip. 347 // Translate both before and after, and have a clip.
348 canvas.drawColor(SK_ColorWHITE); 348 canvas.drawColor(SK_ColorWHITE);
349 canvas.save(); 349 canvas.save();
350 canvas.translate(1, 1); 350 canvas.translate(1, 1);
351 { 351 {
352 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 352 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
353 canvas.drawColor(SK_ColorWHITE); 353 canvas.drawColor(SK_ColorWHITE);
354 canvas.translate(1, 1); 354 canvas.translate(1, 1);
355 AddClip(canvas, kInnerX + 1, kInnerY + 1, kInnerW - 1, kInnerH - 1); 355 AddClip(canvas, kInnerX + 1, kInnerY + 1, kInnerW - 1, kInnerH - 1);
356 DrawNativeRect(canvas, 0, 0, 100, 100); 356 DrawNativeRect(canvas, 0, 0, 100, 100);
357 #if defined(OS_WIN) 357 #if defined(OS_WIN)
358 canvas.getTopPlatformDevice().makeOpaque(kLayerX, kLayerY, 358 platform_util::MakeOpaque(&canvas.getTopDevice(), kLayerX, kLayerY,
359 kLayerW, kLayerH); 359 kLayerW, kLayerH);
360 #endif 360 #endif
361 } 361 }
362 canvas.restore(); 362 canvas.restore();
363 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 3, kInnerY + 3, 363 EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 3, kInnerY + 3,
364 kInnerW - 1, kInnerH - 1)); 364 kInnerW - 1, kInnerH - 1));
365 365
366 // TODO(dglazkov): Figure out why this fails on Mac (antialiased clipping?), 366 // TODO(dglazkov): Figure out why this fails on Mac (antialiased clipping?),
367 // modify test and remove this guard. 367 // modify test and remove this guard.
368 #if !defined(OS_MACOSX) 368 #if !defined(OS_MACOSX)
369 // Translate both before and after, and have a path clip. 369 // Translate both before and after, and have a path clip.
370 canvas.drawColor(SK_ColorWHITE); 370 canvas.drawColor(SK_ColorWHITE);
371 canvas.save(); 371 canvas.save();
372 canvas.translate(1, 1); 372 canvas.translate(1, 1);
373 { 373 {
374 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); 374 LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH);
375 canvas.drawColor(SK_ColorWHITE); 375 canvas.drawColor(SK_ColorWHITE);
376 canvas.translate(1, 1); 376 canvas.translate(1, 1);
377 377
378 SkPath path; 378 SkPath path;
379 SkRect rect; 379 SkRect rect;
380 rect.iset(kInnerX - 1, kInnerY - 1, 380 rect.iset(kInnerX - 1, kInnerY - 1,
381 kInnerX + kInnerW, kInnerY + kInnerH); 381 kInnerX + kInnerW, kInnerY + kInnerH);
382 path.addRoundRect(rect, kRadius, kRadius); 382 path.addRoundRect(rect, kRadius, kRadius);
383 canvas.clipPath(path); 383 canvas.clipPath(path);
384 384
385 DrawNativeRect(canvas, 0, 0, 100, 100); 385 DrawNativeRect(canvas, 0, 0, 100, 100);
386 #if defined(OS_WIN) 386 #if defined(OS_WIN)
387 canvas.getTopPlatformDevice().makeOpaque(kLayerX, kLayerY, 387 platform_util::MakeOpaque(&canvas.getTopDevice(), kLayerX, kLayerY,
388 kLayerW, kLayerH); 388 kLayerW, kLayerH);
389 #endif 389 #endif
390 } 390 }
391 canvas.restore(); 391 canvas.restore();
392 EXPECT_TRUE(VerifyRoundedRect(canvas, SK_ColorWHITE, SK_ColorBLACK, 392 EXPECT_TRUE(VerifyRoundedRect(canvas, SK_ColorWHITE, SK_ColorBLACK,
393 kInnerX + 1, kInnerY + 1, kInnerW, kInnerH)); 393 kInnerX + 1, kInnerY + 1, kInnerW, kInnerH));
394 #endif 394 #endif
395 } 395 }
396 396
397 } // namespace skia 397 } // namespace skia
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698