OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 #include "base/debug/trace_event.h" | 5 #include "base/debug/trace_event.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "skia/ext/analysis_canvas.h" | 7 #include "skia/ext/analysis_canvas.h" |
8 #include "third_party/skia/include/core/SkDraw.h" | 8 #include "third_party/skia/include/core/SkDraw.h" |
9 #include "third_party/skia/include/core/SkRRect.h" | 9 #include "third_party/skia/include/core/SkRRect.h" |
10 #include "third_party/skia/include/core/SkShader.h" | 10 #include "third_party/skia/include/core/SkShader.h" |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 if (draw_op_count_ > 1) { | 324 if (draw_op_count_ > 1) { |
325 // We have to reset solid/transparent state to false since we don't | 325 // We have to reset solid/transparent state to false since we don't |
326 // know whether consequent operations will make this false. | 326 // know whether consequent operations will make this false. |
327 is_solid_color_ = false; | 327 is_solid_color_ = false; |
328 is_transparent_ = false; | 328 is_transparent_ = false; |
329 return true; | 329 return true; |
330 } | 330 } |
331 return false; | 331 return false; |
332 } | 332 } |
333 | 333 |
334 void AnalysisCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, | 334 void AnalysisCanvas::OnComplexClip() { |
335 ClipEdgeStyle edge_style) { | 335 // complex clips can make our calls to IsFullQuad invalid (ie have false |
336 | |
337 INHERITED::onClipRect(rect, op, edge_style); | |
338 } | |
339 | |
340 void AnalysisCanvas::onClipPath(const SkPath& path, SkRegion::Op op, | |
341 ClipEdgeStyle edge_style) { | |
342 // clipPaths can make our calls to IsFullQuad invalid (ie have false | |
343 // positives). As a precaution, force the setting to be non-solid | 336 // positives). As a precaution, force the setting to be non-solid |
344 // and non-transparent until we pop this | 337 // and non-transparent until we pop this |
345 if (force_not_solid_stack_level_ == kNoLayer) { | 338 if (force_not_solid_stack_level_ == kNoLayer) { |
346 force_not_solid_stack_level_ = saved_stack_size_; | 339 force_not_solid_stack_level_ = saved_stack_size_; |
347 SetForceNotSolid(true); | 340 SetForceNotSolid(true); |
348 } | 341 } |
349 if (force_not_transparent_stack_level_ == kNoLayer) { | 342 if (force_not_transparent_stack_level_ == kNoLayer) { |
350 force_not_transparent_stack_level_ = saved_stack_size_; | 343 force_not_transparent_stack_level_ = saved_stack_size_; |
351 SetForceNotTransparent(true); | 344 SetForceNotTransparent(true); |
352 } | 345 } |
| 346 } |
353 | 347 |
| 348 void AnalysisCanvas::onClipRect(const SkRect& rect, |
| 349 SkRegion::Op op, |
| 350 ClipEdgeStyle edge_style) { |
| 351 INHERITED::onClipRect(rect, op, edge_style); |
| 352 } |
| 353 |
| 354 void AnalysisCanvas::onClipPath(const SkPath& path, |
| 355 SkRegion::Op op, |
| 356 ClipEdgeStyle edge_style) { |
| 357 OnComplexClip(); |
354 INHERITED::onClipRect(path.getBounds(), op, edge_style); | 358 INHERITED::onClipRect(path.getBounds(), op, edge_style); |
355 } | 359 } |
356 | 360 |
357 void AnalysisCanvas::onClipRRect(const SkRRect& rrect, | 361 void AnalysisCanvas::onClipRRect(const SkRRect& rrect, |
358 SkRegion::Op op, | 362 SkRegion::Op op, |
359 ClipEdgeStyle edge_style) { | 363 ClipEdgeStyle edge_style) { |
360 // clipRRect can make our calls to IsFullQuad invalid (ie have false | 364 OnComplexClip(); |
361 // positives). As a precaution, force the setting to be non-solid | 365 INHERITED::onClipRect(rrect.getBounds(), op, edge_style); |
362 // and non-transparent until we pop this | 366 } |
363 if (force_not_solid_stack_level_ == kNoLayer) { | 367 |
364 force_not_solid_stack_level_ = saved_stack_size_; | 368 void AnalysisCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { |
365 SetForceNotSolid(true); | 369 const ClipEdgeStyle edge_style = kHard_ClipEdgeStyle; |
| 370 if (deviceRgn.isRect()) { |
| 371 onClipRect(SkRect::MakeFromIRect(deviceRgn.getBounds()), op, edge_style); |
| 372 return; |
366 } | 373 } |
367 if (force_not_transparent_stack_level_ == kNoLayer) { | 374 OnComplexClip(); |
368 force_not_transparent_stack_level_ = saved_stack_size_; | 375 INHERITED::onClipRect( |
369 SetForceNotTransparent(true); | 376 SkRect::MakeFromIRect(deviceRgn.getBounds()), op, edge_style); |
370 } | |
371 | |
372 INHERITED::onClipRect(rrect.getBounds(), op, edge_style); | |
373 } | 377 } |
374 | 378 |
375 void AnalysisCanvas::willSave() { | 379 void AnalysisCanvas::willSave() { |
376 ++saved_stack_size_; | 380 ++saved_stack_size_; |
377 INHERITED::willSave(); | 381 INHERITED::willSave(); |
378 } | 382 } |
379 | 383 |
380 SkCanvas::SaveLayerStrategy AnalysisCanvas::willSaveLayer( | 384 SkCanvas::SaveLayerStrategy AnalysisCanvas::willSaveLayer( |
381 const SkRect* bounds, | 385 const SkRect* bounds, |
382 const SkPaint* paint, | 386 const SkPaint* paint, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 force_not_transparent_stack_level_ = kNoLayer; | 435 force_not_transparent_stack_level_ = kNoLayer; |
432 } | 436 } |
433 } | 437 } |
434 | 438 |
435 INHERITED::willRestore(); | 439 INHERITED::willRestore(); |
436 } | 440 } |
437 | 441 |
438 } // namespace skia | 442 } // namespace skia |
439 | 443 |
440 | 444 |
OLD | NEW |