Bountiesimage-transform.wit image-transform.cases.json
image / image-transformBuilt by daveRuns on Liberas
Rotate and flip
rotate90, rotate180, rotate270 turn the image clockwise by that angle (rotate90 of a w × h image is h × w, and its pixel (x, y) comes from source (y, h − 1 − x)); flip-horizontal mirrors left to right, flip-vertical top to bottom. An input whose pixels are not width × height × 4 bytes is an error.
package root:component;
world root {
import liberas:image/types@0.1.0;
export liberas:image/transform@0.1.0;
}
package liberas:image@0.1.0 {
interface types {
record image {
width: u32,
height: u32,
pixels: list<u8>,
}
}
interface transform {
use types.{image};
enum op {
rotate90,
rotate180,
rotate270,
flip-horizontal,
flip-vertical,
}
apply: func(input: image, op: op) -> result<image, string>;
}
}
[
{
"args": {
"op": "rotate90",
"input": {
"width": 4,
"height": 4,
"pixels": "LycDA1QuBP95NQf/njwM/zpcBv9fYwf/hGoK/6lxD/9FkQn/apgK/4+fDf+0phJaUMYM/3XNDf+a1BA9v9sV/w=="
}
}
},
{
"args": {
"op": "rotate90",
"input": {
"width": 7,
"height": 5,
"pixels": "lDQEBLk7Bf/eQgj/A0kN/yhQFP9NVx2Vcl4o/59pB//EcAj/6XcL/w5+EP8zhRd4WIwg/32TK/+qngr/z6UL//SsDv8ZsxNbProa/2PBI/+IyC7/tdMN/9raDv//4RE+JOgW/0nvHf9u9ib/k/0x/8AIEP/lDxEhChYU/y8dGf9UJCD/eSsp/54yNLI="
}
}
},
{
"args": {
"op": "rotate180",
"input": {
"width": 4,
"height": 4,
"pixels": "LycDA1QuBP95NQf/njwM/zpcBv9fYwf/hGoK/6lxD/9FkQn/apgK/4+fDf+0phJaUMYM/3XNDf+a1BA9v9sV/w=="
}
}
},
{
"args": {
"op": "rotate180",
"input": {
"width": 7,
"height": 5,
"pixels": "lDQEBLk7Bf/eQgj/A0kN/yhQFP9NVx2Vcl4o/59pB//EcAj/6XcL/w5+EP8zhRd4WIwg/32TK/+qngr/z6UL//SsDv8ZsxNbProa/2PBI/+IyC7/tdMN/9raDv//4RE+JOgW/0nvHf9u9ib/k/0x/8AIEP/lDxEhChYU/y8dGf9UJCD/eSsp/54yNLI="
}
}
},
{
"args": {
"op": "rotate270",
"input": {
"width": 4,
"height": 4,
"pixels": "LycDA1QuBP95NQf/njwM/zpcBv9fYwf/hGoK/6lxD/9FkQn/apgK/4+fDf+0phJaUMYM/3XNDf+a1BA9v9sV/w=="
}
}
},
{
"args": {
"op": "rotate270",
"input": {
"width": 7,
"height": 5,
"pixels": "lDQEBLk7Bf/eQgj/A0kN/yhQFP9NVx2Vcl4o/59pB//EcAj/6XcL/w5+EP8zhRd4WIwg/32TK/+qngr/z6UL//SsDv8ZsxNbProa/2PBI/+IyC7/tdMN/9raDv//4RE+JOgW/0nvHf9u9ib/k/0x/8AIEP/lDxEhChYU/y8dGf9UJCD/eSsp/54yNLI="
}
}
},
{
"args": {
"op": "flip-horizontal",
"input": {
"width": 4,
"height": 4,
"pixels": "LycDA1QuBP95NQf/njwM/zpcBv9fYwf/hGoK/6lxD/9FkQn/apgK/4+fDf+0phJaUMYM/3XNDf+a1BA9v9sV/w=="
}
}
},
{
"args": {
"op": "flip-horizontal",
"input": {
"width": 7,
"height": 5,
"pixels": "lDQEBLk7Bf/eQgj/A0kN/yhQFP9NVx2Vcl4o/59pB//EcAj/6XcL/w5+EP8zhRd4WIwg/32TK/+qngr/z6UL//SsDv8ZsxNbProa/2PBI/+IyC7/tdMN/9raDv//4RE+JOgW/0nvHf9u9ib/k/0x/8AIEP/lDxEhChYU/y8dGf9UJCD/eSsp/54yNLI="
}
}
},
{
"args": {
"op": "flip-vertical",
"input": {
"width": 4,
"height": 4,
"pixels": "LycDA1QuBP95NQf/njwM/zpcBv9fYwf/hGoK/6lxD/9FkQn/apgK/4+fDf+0phJaUMYM/3XNDf+a1BA9v9sV/w=="
}
}
},
{
"args": {
"op": "flip-vertical",
"input": {
"width": 7,
"height": 5,
"pixels": "lDQEBLk7Bf/eQgj/A0kN/yhQFP9NVx2Vcl4o/59pB//EcAj/6XcL/w5+EP8zhRd4WIwg/32TK/+qngr/z6UL//SsDv8ZsxNbProa/2PBI/+IyC7/tdMN/9raDv//4RE+JOgW/0nvHf9u9ib/k/0x/8AIEP/lDxEhChYU/y8dGf9UJCD/eSsp/54yNLI="
}
}
},
{
"args": {
"op": "rotate90",
"input": {
"width": 1,
"height": 1,
"pixels": "ZQ0BAQ=="
}
}
},
{
"args": {
"op": "rotate270",
"input": {
"width": 5,
"height": 8,
"pixels": "jXUJCbJ8Cv/Xgw3//IoS/yGRGf+Yqgz/vbEN/+K4EP8HvxX/LMYcfaPfD//I5hD/7e0T/xL0GGA3+x//rhQS/9MbE//4IhZDHSkb/0IwIv+5SRX/3lAWJgNXGf8oXh7/TWUl/8R+GAnphRn/Dowc/zOTIf9Ymij/z7Mb//S6HP8ZwR//Psgk/2PPK33a6B7//+8f/yT2Iv9J/SdgbgQu/w=="
}
}
},
{
"args": {
"op": "rotate90",
"input": {
"width": 32,
"height": 24,
"pixels": "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"
}
}
},
{
"args": {
"op": "rotate180",
"input": {
"width": 2,
"height": 2,
"pixels": "AQID"
}
}
}
]Verification
- Outputs must match the private reference implementation bit for bit.
- Cases are the spec's 14 vectors plus ones generated from the interface's types: edge values and random ones seeded by your component's hash.
- Components may not import anything but the interfaces of the specs they depend on: no files, no network, no clock.
- Runs on Liberas: the component never leaves the platform, and every call is metered on the ledger.
- A remote call may execute up to 500,000,000 instructions.
- Already built: a component that passes and uses at most 0.9× the current one's fuel on the same cases replaces it, and earns the spec's shares in proportion to the saving.
- Found an input where the current component disagrees with the spec? Submit it as a case (API or `liberas case`): it joins the vectors for good and earns 10% of the spec's shares. A component that then passes replaces the broken one for 25%.