441 auto& state = context2d.state();
442
443 attributes->setArray("setTransform"_s, buildArrayForAffineTransform(state.transform));
444 attributes->setDouble("globalAlpha"_s, context2d.globalAlpha());
445 attributes->setInteger("globalCompositeOperation"_s, indexForData(context2d.globalCompositeOperation()));
446 attributes->setDouble("lineWidth"_s, context2d.lineWidth());
447 attributes->setInteger("lineCap"_s, indexForData(convertEnumerationToString(context2d.lineCap())));
448 attributes->setInteger("lineJoin"_s, indexForData(convertEnumerationToString(context2d.lineJoin())));
449 attributes->setDouble("miterLimit"_s, context2d.miterLimit());
450 attributes->setDouble("shadowOffsetX"_s, context2d.shadowOffsetX());
451 attributes->setDouble("shadowOffsetY"_s, context2d.shadowOffsetY());
452 attributes->setDouble("shadowBlur"_s, context2d.shadowBlur());
453 attributes->setInteger("shadowColor"_s, indexForData(context2d.shadowColor()));
454
455 // The parameter to `setLineDash` is itself an array, so we need to wrap the parameters
456 // list in an array to allow spreading.
457 auto setLineDash = JSON::ArrayOf<JSON::Value>::create();
458 setLineDash->addItem(buildArrayForVector(state.lineDash));
459 attributes->setArray("setLineDash"_s, WTFMove(setLineDash));
460
461 attributes->setDouble("lineDashOffset"_s, context2d.lineDashOffset());
462 attributes->setInteger("font"_s, indexForData(context2d.font()));
463 attributes->setInteger("textAlign"_s, indexForData(convertEnumerationToString(context2d.textAlign())));
464 attributes->setInteger("textBaseline"_s, indexForData(convertEnumerationToString(context2d.textBaseline())));
465 attributes->setInteger("direction"_s, indexForData(convertEnumerationToString(context2d.direction())));
466
467 int strokeStyleIndex;
468 if (auto canvasGradient = state.strokeStyle.canvasGradient())
469 strokeStyleIndex = indexForData(canvasGradient.get());
470 else if (auto canvasPattern = state.strokeStyle.canvasPattern())
471 strokeStyleIndex = indexForData(canvasPattern.get());
472 else
473 strokeStyleIndex = indexForData(state.strokeStyle.color());
474 attributes->setInteger("strokeStyle"_s, strokeStyleIndex);
475
476 int fillStyleIndex;
477 if (auto canvasGradient = state.fillStyle.canvasGradient())
478 fillStyleIndex = indexForData(canvasGradient.get());
479 else if (auto canvasPattern = state.fillStyle.canvasPattern())
480 fillStyleIndex = indexForData(canvasPattern.get());
481 else
482 fillStyleIndex = indexForData(state.fillStyle.color());
483 attributes->setInteger("fillStyle"_s, fillStyleIndex);
484
485 attributes->setBoolean("imageSmoothingEnabled"_s, context2d.imageSmoothingEnabled());
486 attributes->setInteger("imageSmoothingQuality"_s, indexForData(convertEnumerationToString(context2d.imageSmoothingQuality())));
487
488 auto setPath = JSON::ArrayOf<JSON::Value>::create();
489 setPath->addItem(indexForData(buildStringFromPath(context2d.getPath()->path())));
490 attributes->setArray("setPath"_s, WTFMove(setPath));
448 for (auto& state : context2d.stateStack()) {
449 RefPtr<JSON::Object> statePayload = JSON::Object::create();
450
451 statePayload->setArray(indexForKey("setTransform"_s), buildArrayForAffineTransform(state.transform));
452 statePayload->setDouble(indexForKey("globalAlpha"_s), context2d.globalAlpha());
453 statePayload->setInteger(indexForKey("globalCompositeOperation"_s), indexForData(context2d.globalCompositeOperation()));
454 statePayload->setDouble(indexForKey("lineWidth"_s), context2d.lineWidth());
455 statePayload->setInteger(indexForKey("lineCap"_s), indexForData(convertEnumerationToString(context2d.lineCap())));
456 statePayload->setInteger(indexForKey("lineJoin"_s), indexForData(convertEnumerationToString(context2d.lineJoin())));
457 statePayload->setDouble(indexForKey("miterLimit"_s), context2d.miterLimit());
458 statePayload->setDouble(indexForKey("shadowOffsetX"_s), context2d.shadowOffsetX());
459 statePayload->setDouble(indexForKey("shadowOffsetY"_s), context2d.shadowOffsetY());
460 statePayload->setDouble(indexForKey("shadowBlur"_s), context2d.shadowBlur());
461 statePayload->setInteger(indexForKey("shadowColor"_s), indexForData(context2d.shadowColor()));
462
463 // The parameter to `setLineDash` is itself an array, so we need to wrap the parameters
464 // list in an array to allow spreading.
465 auto setLineDash = JSON::ArrayOf<JSON::Value>::create();
466 setLineDash->addItem(buildArrayForVector(state.lineDash));
467 statePayload->setArray(indexForKey("setLineDash"_s), WTFMove(setLineDash));
468
469 statePayload->setDouble(indexForKey("lineDashOffset"_s), context2d.lineDashOffset());
470 statePayload->setInteger(indexForKey("font"_s), indexForData(context2d.font()));
471 statePayload->setInteger(indexForKey("textAlign"_s), indexForData(convertEnumerationToString(context2d.textAlign())));
472 statePayload->setInteger(indexForKey("textBaseline"_s), indexForData(convertEnumerationToString(context2d.textBaseline())));
473 statePayload->setInteger(indexForKey("direction"_s), indexForData(convertEnumerationToString(context2d.direction())));
474
475 int strokeStyleIndex;
476 if (auto canvasGradient = state.strokeStyle.canvasGradient())
477 strokeStyleIndex = indexForData(canvasGradient.get());
478 else if (auto canvasPattern = state.strokeStyle.canvasPattern())
479 strokeStyleIndex = indexForData(canvasPattern.get());
480 else
481 strokeStyleIndex = indexForData(state.strokeStyle.color());
482 statePayload->setInteger(indexForKey("strokeStyle"_s), strokeStyleIndex);
483
484 int fillStyleIndex;
485 if (auto canvasGradient = state.fillStyle.canvasGradient())
486 fillStyleIndex = indexForData(canvasGradient.get());
487 else if (auto canvasPattern = state.fillStyle.canvasPattern())
488 fillStyleIndex = indexForData(canvasPattern.get());
489 else
490 fillStyleIndex = indexForData(state.fillStyle.color());
491 statePayload->setInteger(indexForKey("fillStyle"_s), fillStyleIndex);
492
493 statePayload->setBoolean(indexForKey("imageSmoothingEnabled"_s), context2d.imageSmoothingEnabled());
494 statePayload->setInteger(indexForKey("imageSmoothingQuality"_s), indexForData(convertEnumerationToString(context2d.imageSmoothingQuality())));
495
496 auto setPath = JSON::ArrayOf<JSON::Value>::create();
497 setPath->addItem(indexForData(buildStringFromPath(context2d.getPath()->path())));
498 statePayload->setArray(indexForKey("setPath"_s), WTFMove(setPath));
499
500 statesPayload->addItem(WTFMove(statePayload));
501 }