You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
5.5 KiB
210 lines
5.5 KiB
<?php
|
|
|
|
namespace monoformat {
|
|
|
|
include_once("monoformat_bithelpers.php");
|
|
|
|
trait FlagStruct {
|
|
public static function fromJSON(array $json) {
|
|
$myClass = static::class;
|
|
$reflect = new \ReflectionClass($myClass);
|
|
$properties = $reflect->getProperties(\ReflectionProperty::IS_PUBLIC);
|
|
$result = new $myClass();
|
|
foreach ($properties as $property) {
|
|
$name = $property->getName();
|
|
if (array_key_exists($name, $json)) {
|
|
$result->$name = (bool) $json[$name];
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public function toJSON(): array {
|
|
$result = [];
|
|
$myClass = static::class;
|
|
$reflect = new \ReflectionClass($myClass);
|
|
$properties = $reflect->getProperties(\ReflectionProperty::IS_PUBLIC);
|
|
foreach ($properties as $property) {
|
|
$name = $property->getName();
|
|
$result[$name] = $this->$name;
|
|
}
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
enum SectionType : int {
|
|
case AlwaysDrawn = 1;
|
|
case TimeBasedDrawn = 2;
|
|
case MultiTimeBasedDrawn = 3;
|
|
case ExpiryDate = 31;
|
|
case CustomFont = 32;
|
|
|
|
public static function fromName(string $name): SectionType {
|
|
foreach (self::cases() as $case) {
|
|
if ($case->name === $name) {
|
|
return $case;
|
|
}
|
|
}
|
|
throw new \ValueError("$name is not a valid backing value for enum " . self::class);
|
|
}
|
|
}
|
|
|
|
enum ElementType : int {
|
|
case Image = 1;
|
|
case Animation = 2;
|
|
case HScrollImage = 3;
|
|
case VScrollImage = 4;
|
|
case Line = 5;
|
|
case Box = 6;
|
|
case ClippedText = 16;
|
|
case HScrollText = 17;
|
|
//case VScrollText = 18;
|
|
case CurrentTime = 32;
|
|
|
|
public static function fromName(string $name): SectionType {
|
|
foreach (self::cases() as $case) {
|
|
if ($case->name === $name) {
|
|
return $case;
|
|
}
|
|
}
|
|
throw new \ValueError("$name is not a valid backing value for enum " . self::class);
|
|
}
|
|
}
|
|
|
|
class ScrollFlags {
|
|
use FlagStruct;
|
|
|
|
public bool $endless = false;
|
|
public bool $invertDirection = false;
|
|
public bool $padBefore = false;
|
|
public bool $padAfter = false;
|
|
|
|
public static function fromBitField(int $bitfield): ScrollFlags {
|
|
$result = new ScrollFlags();
|
|
$result->endless = isBitSet($bitfield, 0);
|
|
$result->invertDirection = isBitSet($bitfield, 1);
|
|
$result->padBefore = isBitSet($bitfield, 2);
|
|
$result->padAfter = isBitSet($bitfield, 3);
|
|
return $result;
|
|
}
|
|
|
|
public function toBitField(): int {
|
|
$result = 0;
|
|
maybeSetBit($result, 0, $this->endless);
|
|
maybeSetBit($result, 1, $this->invertDirection);
|
|
maybeSetBit($result, 2, $this->padBefore);
|
|
maybeSetBit($result, 3, $this->padAfter);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
enum LineStyle : int {
|
|
case Solid = 0;
|
|
|
|
public static function fromName(string $name): SectionType {
|
|
foreach (self::cases() as $case) {
|
|
if ($case->name === $name) {
|
|
return $case;
|
|
}
|
|
}
|
|
throw new \ValueError("$name is not a valid backing value for enum " . self::class);
|
|
}
|
|
}
|
|
|
|
class LineFlags {
|
|
use FlagStruct;
|
|
|
|
public bool $dark = false;
|
|
|
|
public static function fromBitField(int $bitfield): LineFlags {
|
|
$result = new LineFlags();
|
|
$result->dark = isBitSet($bitfield, 0);
|
|
return $result;
|
|
}
|
|
|
|
public function toBitField(): int {
|
|
$result = 0;
|
|
maybeSetBit($result, 0, $this->dark);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
enum FillPatternStyle : int {
|
|
case Solid = 0;
|
|
|
|
public static function fromName(string $name): SectionType {
|
|
foreach (self::cases() as $case) {
|
|
if ($case->name === $name) {
|
|
return $case;
|
|
}
|
|
}
|
|
throw new \ValueError("$name is not a valid backing value for enum " . self::class);
|
|
}
|
|
}
|
|
|
|
class FillFlags {
|
|
use FlagStruct;
|
|
|
|
public bool $dark = false;
|
|
|
|
public static function fromBitField(int $bitfield): FillFlags {
|
|
$result = new FillFlags();
|
|
$result->dark = isBitSet($bitfield, 0);
|
|
return $result;
|
|
}
|
|
|
|
public function toBitField(): int {
|
|
$result = 0;
|
|
maybeSetBit($result, 0, $this->dark);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
class TextFlags {
|
|
use FlagStruct;
|
|
|
|
public bool $dark = false;
|
|
|
|
public static function fromBitField(int $bitfield): TextFlags {
|
|
$result = new TextFlags();
|
|
$result->dark = isBitSet($bitfield, 0);
|
|
return $result;
|
|
}
|
|
|
|
public function toBitField(): int {
|
|
$result = 0;
|
|
maybeSetBit($result, 0, $this->dark);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
class TimeDisplayFlags {
|
|
use FlagStruct;
|
|
|
|
public bool $use12h = false;
|
|
public bool $showHours = false;
|
|
public bool $showMinutes = false;
|
|
public bool $showSeconds = false;
|
|
|
|
public static function fromBitField(int $bitfield): TimeDisplayFlags {
|
|
$result = new TimeDisplayFlags();
|
|
$result->use12h = isBitSet($bitfield, 0);
|
|
$result->showHours = isBitSet($bitfield, 1);
|
|
$result->showMinutes = isBitSet($bitfield, 2);
|
|
$result->showSeconds = isBitSet($bitfield, 3);
|
|
return $result;
|
|
}
|
|
|
|
public function toBitField(): int {
|
|
$result = 0;
|
|
maybeSetBit($result, 0, $this->use12h);
|
|
maybeSetBit($result, 1, $this->showHours);
|
|
maybeSetBit($result, 2, $this->showMinutes);
|
|
maybeSetBit($result, 3, $this->showSeconds);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
} // namespace monoformat
|
|
|
|
?>
|
|
|