{
  "$schema": "../_schema.json",
  "format": "pptx",
  "element": "picture",
  "elementAliases": ["image", "img"],
  "parent": "slide",
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "positional": [
      "/slide[N]/picture[M]"
    ]
  },
  "note": "Aliases: image, img. 'src' (alias 'path') required. Source resolved by ImageSource — file path, URL, data-URI, raw bytes.",
  "extends": [
    "_shared/picture",
    "_shared/picture.docx-pptx",
    "_shared/picture.pptx-xlsx"
  ],
  "properties": {
    "id": {
      "type": "number",
      "description": "cNvPr picture id; @id in /picture[@id=ID]. add honors a caller-supplied id so dump-replay keeps it stable for spTgt animation refs; immutable after creation.",
      "add": true,
      "set": false,
      "get": true,
      "readback": "integer shape id (cNvPr)",
      "enforcement": "report"
    },
    "mediaType": {
      "type": "string",
      "description": "logical media kind derived from VideoFromFile / AudioFromFile presence under the picture. One of `picture`, `video`, `audio`. Surfaces only via the `image`/`video`/`audio`/`media` selectors.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "`picture` | `video` | `audio`",
      "enforcement": "report"
    },
    "x": {
      "type": "length",
      "description": "x offset in EMU/length form (e.g. 2cm). pptx absolute positioning.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop x=0",
        "--prop x=1in"
      ],
      "readback": "length string (FormatEmu)",
      "enforcement": "report"
    },
    "y": {
      "type": "length",
      "description": "y offset in EMU/length form (e.g. 2cm). pptx absolute positioning.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop y=0",
        "--prop y=1in"
      ],
      "readback": "length string (FormatEmu)",
      "enforcement": "report"
    },
    "width": {
      "type": "length",
      "description": "width — EMU/length form (e.g. 1.5cm). Required if not inferred from native ratio.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop width=5",
        "--prop width=3in"
      ],
      "readback": "length string",
      "enforcement": "report"
    },
    "height": {
      "type": "length",
      "description": "height — EMU/length form (e.g. 1.5cm). Required if not inferred from native ratio.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop height=5",
        "--prop height=2in"
      ],
      "readback": "length string",
      "enforcement": "report"
    },
    "rotation": {
      "type": "number",
      "description": "clockwise rotation in degrees. Mirrors shape/connector/group rotation — stored on the same a:xfrm rot attribute (degrees * 60000). Alias: rotate.",
      "add": true,
      "set": true,
      "get": true,
      "aliases": ["rotate"],
      "examples": [
        "--prop rotation=45",
        "--prop rotation=-90"
      ],
      "readback": "decimal degrees (e.g. 45 or 22.5)",
      "enforcement": "report"
    },
    "flipH": {
      "type": "boolean",
      "description": "mirror the picture horizontally (left-right). Mirrors shape/connector flip — stored on the same a:xfrm @flipH attribute. Pass false to clear.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop flipH=true",
        "--prop flipH=false"
      ],
      "readback": "true when @flipH is set (omitted otherwise)",
      "enforcement": "report"
    },
    "flipV": {
      "type": "boolean",
      "description": "mirror the picture vertically (top-bottom). Mirrors shape/connector flip — stored on the same a:xfrm @flipV attribute. Pass false to clear.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop flipV=true",
        "--prop flipV=false"
      ],
      "readback": "true when @flipV is set (omitted otherwise)",
      "enforcement": "report"
    },
    "link": {
      "type": "string",
      "description": "click-hyperlink target attached to the picture's cNvPr (so the whole image is clickable). Accepts absolute URI (https://, mailto:), slide[N] for in-deck jumps, or named actions (firstslide, lastslide, nextslide, previousslide). Pass 'none' or empty to clear.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop link=https://example.com",
        "--prop link='slide[3]'",
        "--prop link=nextslide"
      ],
      "readback": "URL, slide[N], or named action",
      "enforcement": "report"
    },
    "tooltip": {
      "type": "string",
      "description": "hover tooltip text for the click-hyperlink. Applied together with `link` in a single set/add call; standalone tooltip change without link is not supported.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop link=https://example.com --prop tooltip=\"Open homepage\""
      ],
      "readback": "string",
      "enforcement": "report"
    },
    "opacity": {
      "type": "number",
      "description": "picture opacity. Input as a decimal 0.0-1.0 or a percent 2-100. Stored on the blip as a:alphaModFix @amt (value * 100000); readback emits the decimal 0.0-1.0 form.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop opacity=0.5",
        "--prop opacity=80"
      ],
      "readback": "decimal in [0.0, 1.0]",
      "enforcement": "report"
    },
    "brightness": {
      "type": "number",
      "description": "luminance brightness in [-100, 100]. Stored on the blip as a:lum @bright (value * 1000). Combine with `contrast` to mirror PowerPoint's Picture Format → Corrections.",
      "add": false,
      "set": true,
      "get": true,
      "examples": [
        "--prop brightness=40",
        "--prop brightness=-20"
      ],
      "readback": "decimal in [-100, 100]",
      "enforcement": "report"
    },
    "contrast": {
      "type": "number",
      "description": "luminance contrast in [-100, 100]. Stored on the blip as a:lum @contrast (value * 1000). Combine with `brightness`.",
      "add": false,
      "set": true,
      "get": true,
      "examples": [
        "--prop contrast=-30",
        "--prop contrast=20"
      ],
      "readback": "decimal in [-100, 100]",
      "enforcement": "report"
    },
    "shadow": {
      "type": "string",
      "description": "outer shadow as `color-blur-angle-dist-opacity` (mirrors shape `shadow`). Input color is hex (with or without `#`, 6- or 8-digit `RRGGBBAA`) or a scheme name; blur/dist in points; angle in degrees; opacity 0-100. Readback emits `#RRGGBB-blur-angle-dist-opacity` (always `#`-prefixed 6-digit color; the alpha is carried solely by the trailing opacity field, never double-encoded as an alpha byte).",
      "add": false,
      "set": true,
      "get": true,
      "examples": [
        "--prop shadow=000000-10-45-6-50",
        "--prop shadow=accent1-8-90-4-60"
      ],
      "readback": "`#RRGGBB-blur-angle-dist-opacity`",
      "enforcement": "report"
    },
    "glow": {
      "type": "string",
      "description": "outer glow as `color-radius-opacity` (mirrors shape `glow`). color is hex (no `#`) or scheme; radius in points; opacity 0-100.",
      "add": false,
      "set": true,
      "get": true,
      "examples": [
        "--prop glow=FF0000-12-75",
        "--prop glow=accent2-8-50"
      ],
      "readback": "`color-radius-opacity`",
      "enforcement": "report"
    },
    "compressionState": {
      "type": "string",
      "description": "blip compression target (a:blip cstate attribute). PowerPoint's Picture Format → Compress Pictures → target use. Accepted values: email, print, hqprint, screen, none. `none` (the schema default) is suppressed on readback.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop compressionState=email",
        "--prop compressionState=hqprint"
      ],
      "readback": "email | print | hqprint | screen",
      "enforcement": "report"
    }
  }
}
