swf2ass/src/StyleList.php

96 lines
3.9 KiB
PHP

<?php
namespace swf2ass;
class StyleList {
/** @var FillStyleRecord[] */
public array $fillStyles;
/** @var LineStyleRecord[] */
public array $lineStyles;
public function __construct($fillStyles = [], $lineStyles = []) {
$this->fillStyles = $fillStyles;
$this->lineStyles = $lineStyles;
}
public static function fromXML(\DOMElement $element): StyleList {
$fillStyles = [];
$lineStyles = [];
foreach ($element->getElementsByTagName("fillStyles")->item(0)->childNodes as $node) {
if ($node instanceof \DOMElement) {
if ($node->nodeName === "Solid") {
$fillStyles[] = new FillStyleRecord(Color::fromXML($node->getElementsByTagName("color")->item(0)->getElementsByTagName("Color")->item(0)));
} else if ($node->nodeName === "LinearGradient") {
$fillStyles[] = new FillStyleRecord(LinearGradient::fromXML($node));
} else if ($node->nodeName === "RadialGradient") {
$fillStyles[] = new FillStyleRecord(RadialGradient::fromXML($node));
} else if ($node->nodeName === "ShiftedRadialGradient") {
$fillStyles[] = new FillStyleRecord(RadialGradient::fromXML($node));
} else if ($node->nodeName === "ClippedBitmap") {
Utils::dump_element($node);
//TODO
$fillStyles[] = new FillStyleRecord(new Color(0, 0, 0, 255 / 2));
} else if ($node->nodeName === "ClippedBitmap2") {
Utils::dump_element($node);
//TODO
$fillStyles[] = new FillStyleRecord(new Color(0, 0, 0, 255 / 2));
} else if ($node->nodeName === "TiledBitmap") {
//TODO
Utils::dump_element($node);
$fillStyles[] = new FillStyleRecord(new Color(0, 0, 0, 255 / 2));
} else if ($node->nodeName === "TiledBitmap2") {
//TODO
Utils::dump_element($node);
$fillStyles[] = new FillStyleRecord(new Color(0, 0, 0, 255 / 2));
} else {
Utils::dump_element($node);
throw new \Exception("Unknown style " . $node->nodeName);
}
}
}
foreach ($element->getElementsByTagName("lineStyles")->item(0)->childNodes as $node) {
if ($node instanceof \DOMElement) {
//$fill = null;
$colors = $node->getElementsByTagName("color");
$colors2 = $node->getElementsByTagName("Color");
$grads = $node->getElementsByTagName("coLinearGradientlor");
$color = null;
if ($colors->count() > 0) {
$color = Color::fromXML($colors->item(0)->getElementsByTagName("Color")->item(0));
} else if ($colors2->count() > 0) {
$color = Color::fromXML($colors2->item(0));
} else if ($grads->count() > 0) {
//TODO: other gradients?
//$fill = new FillStyleRecord(LinearGradient::fromXML($grads->item(0)->getElementsByTagName("LinearGradient")->item(0)));
}
if ($color === null) {
Utils::dump_element($node);
}
$lineStyles[] = new LineStyleRecord(max(Constants::TWIP_SIZE, (int)$node->getAttribute("width")), $color, null);
}
}
return new StyleList($fillStyles, $lineStyles);
}
/**
* @param $i
* @return FillStyleRecord|null
*/
public function getFillStyle($i): ?FillStyleRecord {
return $this->fillStyles[$i] ?? null;
}
/**
* @param $i
* @return LineStyleRecord|null
*/
public function getLineStyle($i): ?LineStyleRecord {
return $this->lineStyles[$i] ?? null;
}
}