@@ -261,7 +261,7 @@ void DisplayListCanvasRecorder::willSave() {
261261SkCanvas::SaveLayerStrategy DisplayListCanvasRecorder::getSaveLayerStrategy (
262262 const SaveLayerRec& rec) {
263263 if (rec.fPaint ) {
264- builder_-> setAttributesFromPaint (* rec.fPaint , kSaveLayerWithPaintFlags );
264+ RecordPaintAttributes ( rec.fPaint , DrawType:: kSaveLayerOpType );
265265 builder_->saveLayer (rec.fBounds , true );
266266 } else {
267267 builder_->saveLayer (rec.fBounds , false );
@@ -273,62 +273,49 @@ void DisplayListCanvasRecorder::didRestore() {
273273}
274274
275275void DisplayListCanvasRecorder::onDrawPaint (const SkPaint& paint) {
276- builder_-> setAttributesFromPaint ( paint, kDrawPaintFlags );
276+ RecordPaintAttributes (& paint, DrawType:: kFillOpType );
277277 builder_->drawPaint ();
278278}
279279void DisplayListCanvasRecorder::onDrawRect (const SkRect& rect,
280280 const SkPaint& paint) {
281- builder_-> setAttributesFromPaint ( paint, kDrawRectFlags );
281+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
282282 builder_->drawRect (rect);
283283}
284284void DisplayListCanvasRecorder::onDrawRRect (const SkRRect& rrect,
285285 const SkPaint& paint) {
286- builder_-> setAttributesFromPaint ( paint, kDrawRRectFlags );
286+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
287287 builder_->drawRRect (rrect);
288288}
289289void DisplayListCanvasRecorder::onDrawDRRect (const SkRRect& outer,
290290 const SkRRect& inner,
291291 const SkPaint& paint) {
292- builder_-> setAttributesFromPaint ( paint, kDrawDRRectFlags );
292+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
293293 builder_->drawDRRect (outer, inner);
294294}
295295void DisplayListCanvasRecorder::onDrawOval (const SkRect& rect,
296296 const SkPaint& paint) {
297- builder_-> setAttributesFromPaint ( paint, kDrawOvalFlags );
297+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
298298 builder_->drawOval (rect);
299299}
300300void DisplayListCanvasRecorder::onDrawArc (const SkRect& rect,
301301 SkScalar startAngle,
302302 SkScalar sweepAngle,
303303 bool useCenter,
304304 const SkPaint& paint) {
305- builder_->setAttributesFromPaint (paint,
306- useCenter //
307- ? kDrawArcWithCenterFlags
308- : kDrawArcNoCenterFlags );
305+ RecordPaintAttributes (&paint, DrawType::kDrawOpType );
309306 builder_->drawArc (rect, startAngle, sweepAngle, useCenter);
310307}
311308void DisplayListCanvasRecorder::onDrawPath (const SkPath& path,
312309 const SkPaint& paint) {
313- builder_-> setAttributesFromPaint ( paint, kDrawPathFlags );
310+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
314311 builder_->drawPath (path);
315312}
316313
317314void DisplayListCanvasRecorder::onDrawPoints (SkCanvas::PointMode mode,
318315 size_t count,
319316 const SkPoint pts[],
320317 const SkPaint& paint) {
321- switch (mode) {
322- case SkCanvas::kPoints_PointMode :
323- builder_->setAttributesFromPaint (paint, kDrawPointsAsPointsFlags );
324- break ;
325- case SkCanvas::kLines_PointMode :
326- builder_->setAttributesFromPaint (paint, kDrawPointsAsLinesFlags );
327- break ;
328- case SkCanvas::kPolygon_PointMode :
329- builder_->setAttributesFromPaint (paint, kDrawPointsAsPolygonFlags );
330- break ;
331- }
318+ RecordPaintAttributes (&paint, DrawType::kStrokeOpType );
332319 if (mode == SkCanvas::PointMode::kLines_PointMode && count == 2 ) {
333320 builder_->drawLine (pts[0 ], pts[1 ]);
334321 } else {
@@ -343,7 +330,7 @@ void DisplayListCanvasRecorder::onDrawPoints(SkCanvas::PointMode mode,
343330void DisplayListCanvasRecorder::onDrawVerticesObject (const SkVertices* vertices,
344331 SkBlendMode mode,
345332 const SkPaint& paint) {
346- builder_-> setAttributesFromPaint ( paint, kDrawVerticesFlags );
333+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
347334 builder_->drawVertices (sk_ref_sp (vertices), mode);
348335}
349336
@@ -353,7 +340,7 @@ void DisplayListCanvasRecorder::onDrawImage2(const SkImage* image,
353340 const SkSamplingOptions& sampling,
354341 const SkPaint* paint) {
355342 if (paint != nullptr ) {
356- builder_-> setAttributesFromPaint (* paint, kDrawImageWithPaintFlags );
343+ RecordPaintAttributes ( paint, DrawType:: kImageOpType );
357344 }
358345 builder_->drawImage (sk_ref_sp (image), SkPoint::Make (dx, dy), sampling,
359346 paint != nullptr );
@@ -366,7 +353,7 @@ void DisplayListCanvasRecorder::onDrawImageRect2(
366353 const SkPaint* paint,
367354 SrcRectConstraint constraint) {
368355 if (paint != nullptr ) {
369- builder_-> setAttributesFromPaint (* paint, kDrawImageRectWithPaintFlags );
356+ RecordPaintAttributes ( paint, DrawType:: kImageRectOpType );
370357 }
371358 builder_->drawImageRect (sk_ref_sp (image), src, dst, sampling,
372359 paint != nullptr , constraint);
@@ -383,7 +370,7 @@ void DisplayListCanvasRecorder::onDrawImageLattice2(const SkImage* image,
383370 if (*paint == default_paint) {
384371 paint = nullptr ;
385372 } else {
386- builder_-> setAttributesFromPaint (* paint, kDrawImageLatticeWithPaintFlags );
373+ RecordPaintAttributes ( paint, DrawType:: kImageOpType );
387374 }
388375 }
389376 builder_->drawImageLattice (sk_ref_sp (image), lattice, dst, filter,
@@ -399,7 +386,7 @@ void DisplayListCanvasRecorder::onDrawAtlas2(const SkImage* image,
399386 const SkRect* cull,
400387 const SkPaint* paint) {
401388 if (paint != nullptr ) {
402- builder_-> setAttributesFromPaint (* paint, kDrawAtlasWithPaintFlags );
389+ RecordPaintAttributes ( paint, DrawType:: kImageOpType );
403390 }
404391 builder_->drawAtlas (sk_ref_sp (image), xform, src, colors, count, mode,
405392 sampling, cull, paint != nullptr );
@@ -409,7 +396,7 @@ void DisplayListCanvasRecorder::onDrawTextBlob(const SkTextBlob* blob,
409396 SkScalar x,
410397 SkScalar y,
411398 const SkPaint& paint) {
412- builder_-> setAttributesFromPaint ( paint, kDrawTextBlobFlags );
399+ RecordPaintAttributes (& paint, DrawType:: kDrawOpType );
413400 builder_->drawTextBlob (sk_ref_sp (blob), x, y);
414401}
415402void DisplayListCanvasRecorder::onDrawShadowRec (const SkPath& path,
@@ -424,9 +411,119 @@ void DisplayListCanvasRecorder::onDrawPicture(const SkPicture* picture,
424411 const SkMatrix* matrix,
425412 const SkPaint* paint) {
426413 if (paint != nullptr ) {
427- builder_-> setAttributesFromPaint (* paint, kDrawPictureWithPaintFlags );
414+ RecordPaintAttributes ( paint, DrawType:: kSaveLayerOpType );
428415 }
429416 builder_->drawPicture (sk_ref_sp (picture), matrix, paint != nullptr );
430417}
431418
419+ void DisplayListCanvasRecorder::RecordPaintAttributes (const SkPaint* paint,
420+ DrawType type) {
421+ int dataNeeded;
422+ switch (type) {
423+ case DrawType::kDrawOpType :
424+ dataNeeded = kDrawMask_ ;
425+ break ;
426+ case DrawType::kFillOpType :
427+ dataNeeded = kPaintMask_ ;
428+ break ;
429+ case DrawType::kStrokeOpType :
430+ dataNeeded = kStrokeMask_ ;
431+ break ;
432+ case DrawType::kImageOpType :
433+ dataNeeded = kImageMask_ ;
434+ break ;
435+ case DrawType::kImageRectOpType :
436+ dataNeeded = kImageRectMask_ ;
437+ break ;
438+ case DrawType::kSaveLayerOpType :
439+ dataNeeded = kSaveLayerMask_ ;
440+ break ;
441+ default :
442+ FML_DCHECK (false );
443+ return ;
444+ }
445+ if (paint == nullptr ) {
446+ paint = new SkPaint ();
447+ }
448+ if ((dataNeeded & kAaNeeded_ ) != 0 && current_aa_ != paint->isAntiAlias ()) {
449+ builder_->setAntiAlias (current_aa_ = paint->isAntiAlias ());
450+ }
451+ if ((dataNeeded & kDitherNeeded_ ) != 0 &&
452+ current_dither_ != paint->isDither ()) {
453+ builder_->setDither (current_dither_ = paint->isDither ());
454+ }
455+ if ((dataNeeded & kColorNeeded_ ) != 0 &&
456+ current_color_ != paint->getColor ()) {
457+ builder_->setColor (current_color_ = paint->getColor ());
458+ }
459+ if ((dataNeeded & kBlendNeeded_ )) {
460+ skstd::optional<SkBlendMode> mode_optional = paint->asBlendMode ();
461+ if (mode_optional) {
462+ SkBlendMode mode = mode_optional.value ();
463+ if (current_blender_ || current_blend_ != mode) {
464+ builder_->setBlendMode (current_blend_ = mode);
465+ current_blender_ = nullptr ;
466+ }
467+ } else {
468+ if (current_blender_.get () != paint->getBlender ()) {
469+ builder_->setBlender (current_blender_ = sk_ref_sp (paint->getBlender ()));
470+ }
471+ }
472+ }
473+ // invert colors is a Flutter::Paint thing, not an SkPaint thing
474+ // if ((dataNeeded & invertColorsNeeded_) != 0 &&
475+ // currentInvertColors_ != paint->???) {
476+ // currentInvertColors_ = paint->invertColors;
477+ // addOp_(currentInvertColors_
478+ // ? _CanvasOp.setInvertColors
479+ // : _CanvasOp.clearInvertColors, 0);
480+ // }
481+ if ((dataNeeded & kPaintStyleNeeded_ ) != 0 ) {
482+ if (current_style_ != paint->getStyle ()) {
483+ builder_->setStyle (current_style_ = paint->getStyle ());
484+ }
485+ if (current_style_ == SkPaint::Style::kStroke_Style ) {
486+ dataNeeded |= kStrokeStyleNeeded_ ;
487+ }
488+ }
489+ if ((dataNeeded & kStrokeStyleNeeded_ ) != 0 ) {
490+ if (current_stroke_width_ != paint->getStrokeWidth ()) {
491+ builder_->setStrokeWidth (current_stroke_width_ = paint->getStrokeWidth ());
492+ }
493+ if (current_cap_ != paint->getStrokeCap ()) {
494+ builder_->setStrokeCap (current_cap_ = paint->getStrokeCap ());
495+ }
496+ if (current_join_ != paint->getStrokeJoin ()) {
497+ builder_->setStrokeJoin (current_join_ = paint->getStrokeJoin ());
498+ }
499+ if (current_miter_limit_ != paint->getStrokeMiter ()) {
500+ builder_->setStrokeMiter (current_miter_limit_ = paint->getStrokeMiter ());
501+ }
502+ }
503+ if ((dataNeeded & kShaderNeeded_ ) != 0 &&
504+ current_shader_.get () != paint->getShader ()) {
505+ builder_->setShader (current_shader_ = sk_ref_sp (paint->getShader ()));
506+ }
507+ if ((dataNeeded & kColorFilterNeeded_ ) != 0 &&
508+ current_color_filter_.get () != paint->getColorFilter ()) {
509+ builder_->setColorFilter (current_color_filter_ =
510+ sk_ref_sp (paint->getColorFilter ()));
511+ }
512+ if ((dataNeeded & kImageFilterNeeded_ ) != 0 &&
513+ current_image_filter_.get () != paint->getImageFilter ()) {
514+ builder_->setImageFilter (current_image_filter_ =
515+ sk_ref_sp (paint->getImageFilter ()));
516+ }
517+ if ((dataNeeded & kPathEffectNeeded_ ) != 0 &&
518+ current_path_effect_.get () != paint->getPathEffect ()) {
519+ builder_->setPathEffect (current_path_effect_ =
520+ sk_ref_sp (paint->getPathEffect ()));
521+ }
522+ if ((dataNeeded & kMaskFilterNeeded_ ) != 0 &&
523+ current_mask_filter_.get () != paint->getMaskFilter ()) {
524+ builder_->setMaskFilter (current_mask_filter_ =
525+ sk_ref_sp (paint->getMaskFilter ()));
526+ }
527+ }
528+
432529} // namespace flutter
0 commit comments