| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "flutter/display_list/display_list_flags.h" | |
| #include "flutter/display_list/display_list_path_effect.h" | |
| namespace flutter { | |
| const DisplayListSpecialGeometryFlags DisplayListAttributeFlags::WithPathEffect( | |
| const DlPathEffect* effect) const { | |
| if (is_geometric() && effect) { | |
| if (effect->asDash()) { | |
| // A dash effect has a very simple impact. It cannot introduce any | |
| // miter joins that weren't already present in the original path | |
| // and it does not grow the bounds of the path, but it can add | |
| // end caps to areas that might not have had them before so all | |
| // we need to do is to indicate the potential for diagonal | |
| // end caps and move on. | |
| return special_flags_.with(kMayHaveCaps_ | kMayHaveDiagonalCaps_); | |
| } else { | |
| // An arbitrary path effect can introduce joins at an arbitrary | |
| // angle and may change the geometry of the end caps | |
| return special_flags_.with(kMayHaveCaps_ | kMayHaveDiagonalCaps_ | | |
| kMayHaveJoins_ | kMayHaveAcuteJoins_); | |
| } | |
| } | |
| return special_flags_; | |
| } | |
| // clang-format off | |
| // Flags common to all primitives that apply colors | |
| #define PAINT_FLAGS (kUsesDither_ | \ | |
| kUsesColor_ | \ | |
| kUsesAlpha_ | \ | |
| kUsesBlend_ | \ | |
| kUsesShader_ | \ | |
| kUsesColorFilter_ | \ | |
| kUsesImageFilter_) | |
| // Flags common to all primitives that stroke or fill | |
| #define STROKE_OR_FILL_FLAGS (kIsDrawnGeometry_ | \ | |
| kUsesAntiAlias_ | \ | |
| kUsesMaskFilter_ | \ | |
| kUsesPathEffect_) | |
| // Flags common to primitives that stroke geometry | |
| #define STROKE_FLAGS (kIsStrokedGeometry_ | \ | |
| kUsesAntiAlias_ | \ | |
| kUsesMaskFilter_ | \ | |
| kUsesPathEffect_) | |
| // Flags common to primitives that render an image with paint attributes | |
| #define IMAGE_FLAGS_BASE (kIsNonGeometric_ | \ | |
| kUsesAlpha_ | \ | |
| kUsesDither_ | \ | |
| kUsesBlend_ | \ | |
| kUsesColorFilter_ | \ | |
| kUsesImageFilter_) | |
| // clang-format on | |
| const DisplayListAttributeFlags DisplayListOpFlags::kSaveLayerFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kSaveLayerWithPaintFlags = | |
| DisplayListAttributeFlags(kIsNonGeometric_ | // | |
| kUsesAlpha_ | // | |
| kUsesBlend_ | // | |
| kUsesColorFilter_ | // | |
| kUsesImageFilter_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawColorFlags = | |
| DisplayListAttributeFlags(kFloodsSurface_ | kIgnoresPaint_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPaintFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | kFloodsSurface_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawHVLineFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_FLAGS | kMayHaveCaps_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawLineFlags = | |
| kDrawHVLineFlags.with(kMayHaveDiagonalCaps_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawRectFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS | | |
| kMayHaveJoins_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawOvalFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawCircleFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawRRectFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawDRRectFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPathFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS | | |
| kMayHaveCaps_ | kMayHaveDiagonalCaps_ | | |
| kMayHaveJoins_ | kMayHaveAcuteJoins_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawArcNoCenterFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS | | |
| kMayHaveCaps_ | kMayHaveDiagonalCaps_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawArcWithCenterFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS | | |
| kMayHaveJoins_ | kMayHaveAcuteJoins_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPointsAsPointsFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_FLAGS | // | |
| kMayHaveCaps_ | kButtCapIsSquare_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPointsAsLinesFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_FLAGS | // | |
| kMayHaveCaps_ | kMayHaveDiagonalCaps_); | |
| // Polygon mode just draws (count-1) separate lines, no joins | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPointsAsPolygonFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_FLAGS | // | |
| kMayHaveCaps_ | kMayHaveDiagonalCaps_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawVerticesFlags = | |
| DisplayListAttributeFlags(kIsNonGeometric_ | // | |
| kUsesDither_ | // | |
| kUsesAlpha_ | // | |
| kUsesShader_ | // | |
| kUsesBlend_ | // | |
| kUsesColorFilter_ | // | |
| kUsesImageFilter_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawImageFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawImageWithPaintFlags = | |
| DisplayListAttributeFlags(IMAGE_FLAGS_BASE | // | |
| kUsesAntiAlias_ | kUsesMaskFilter_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawImageRectFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags | |
| DisplayListOpFlags::kDrawImageRectWithPaintFlags = | |
| DisplayListAttributeFlags(IMAGE_FLAGS_BASE | // | |
| kUsesAntiAlias_ | kUsesMaskFilter_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawImageNineFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags | |
| DisplayListOpFlags::kDrawImageNineWithPaintFlags = | |
| DisplayListAttributeFlags(IMAGE_FLAGS_BASE); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawImageLatticeFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags | |
| DisplayListOpFlags::kDrawImageLatticeWithPaintFlags = | |
| DisplayListAttributeFlags(IMAGE_FLAGS_BASE); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawAtlasFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawAtlasWithPaintFlags = | |
| DisplayListAttributeFlags(IMAGE_FLAGS_BASE); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPictureFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawPictureWithPaintFlags = | |
| kSaveLayerWithPaintFlags; | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawDisplayListFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawTextBlobFlags = | |
| DisplayListAttributeFlags(PAINT_FLAGS | STROKE_OR_FILL_FLAGS | | |
| kMayHaveJoins_) | |
| .without(kUsesAntiAlias_); | |
| const DisplayListAttributeFlags DisplayListOpFlags::kDrawShadowFlags = | |
| DisplayListAttributeFlags(kIgnoresPaint_); | |
| #undef PAINT_FLAGS | |
| #undef STROKE_OR_FILL_FLAGS | |
| #undef STROKE_FLAGS | |
| #undef IMAGE_FLAGS_BASE | |
| } // namespace flutter |