/* vim:set ts=2 sw=2 sts=2 et: */

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package mozilla.layers.layerscope;

// ===============================
// Server to Client messages
// ===============================
message FramePacket {
  optional uint64 value = 1;
  optional float  scale = 2;
}

message ColorPacket {
  required uint64 layerref = 1;
  optional uint32 width = 2;
  optional uint32 height = 3;
  optional uint32 color = 4;
}

message TexturePacket {
  enum Filter {
    GOOD = 0;
    LINEAR = 1;
    POINT = 2;
  }
  message Rect {
    optional float x = 1;
    optional float y = 2;
    optional float w = 3;
    optional float h = 4;
  }
  message Size {
    optional int32 w = 1;
    optional int32 h = 2;
  }
  message Matrix {
    optional bool is2D = 1;
    optional bool isId = 2;
    repeated float m = 3;
  }
  message EffectMask {
    optional bool mIs3D = 1;
    optional Size mSize = 2;
    optional Matrix mMaskTransform = 3;
  }

  // Basic info
  required uint64 layerref = 1;
  optional uint32 width = 2;
  optional uint32 height = 3;
  optional uint32 stride = 4;
  optional uint32 name = 5;
  optional uint32 target = 6;
  optional uint32 dataformat = 7;
  optional uint64 glcontext = 8;
  optional bytes data = 9;

  // TextureEffect attributes
  optional Rect mTextureCoords = 10;
  optional bool mPremultiplied = 11;
  optional Filter mFilter = 12;

  // Mask attributes
  optional bool isMask = 20;
  optional EffectMask mask = 21;
}

message LayersPacket {
  message Layer {
    enum LayerType {
      UnknownLayer = 0;
      LayerManager = 1;
      ContainerLayer = 2;
      PaintedLayer = 3;
      CanvasLayer = 4;
      ImageLayer = 5;
      ColorLayer = 6;
      RefLayer = 8;
      ReadbackLayer = 9;
      DisplayItemLayer = 10;
    }
    enum ScrollingDirect {
      VERTICAL = 1;
      HORIZONTAL = 2;
    }
    enum Filter {
      FILTER_FAST = 0; // deprecated
      FILTER_GOOD = 1;
      FILTER_BEST = 2; // deprecated
      FILTER_NEAREST = 3; //deprecated
      FILTER_BILINEAR = 4; //deprecated
      FILTER_GAUSSIAN = 5; //deprecated
      FILTER_SENTINEL = 6; //deprecated
      FILTER_LINEAR = 7;
      FILTER_POINT = 8;
    }
    message Size {
      optional int32 w = 1;
      optional int32 h = 2;
    }
    message Rect {
      optional int32 x = 1;
      optional int32 y = 2;
      optional int32 w = 3;
      optional int32 h = 4;
    }
    message Region {
      repeated Rect r = 1;
    }
    message Matrix {
      optional bool is2D = 1;
      optional bool isId = 2;
      repeated float m = 3;
    }
    message Shadow {
      optional Rect clip = 1;
      optional Matrix transform = 2;
      optional Region vRegion = 3;
    }

    // Basic info
    // Note: Parent's pointer is used to recontruct the layer tree
    required LayerType type = 1;
    required uint64 ptr = 2;
    required uint64 parentPtr = 3;

    // Common info (10 to 99)
    optional Rect clip = 10;
    optional Matrix transform = 11;
    optional Region vRegion = 12; // visible region
    optional Shadow shadow = 13;  // shadow info
    optional float opacity = 14;
    optional bool cOpaque = 15;   // content opaque
    optional bool cAlpha = 16;    // component alpha
    optional ScrollingDirect direct = 17;
    optional uint64 barID = 18;
    optional uint64 mask = 19;    // mask layer
    optional Region hitRegion = 20;
    optional Region dispatchRegion = 21;
    optional Region noActionRegion = 22;
    optional Region hPanRegion = 23;
    optional Region vPanRegion = 24;

    // Specific info (100 to max)
    // Painted Layer
    optional Region valid = 100;
    // Color Layer
    optional uint32 color = 101;
    // Canvas & Image Layer
    optional Filter filter = 102;
    // Ref Layer
    optional uint64 refID = 103;
    // Readback Layer
    optional Size size = 104;
    optional uint32 displayListLogLength = 105;
    optional bytes displayListLog = 106;
  }
  repeated Layer layer = 1;
}

message MetaPacket {
  optional bool composedByHwc = 1;
}

message DrawPacket {
  message Rect {
    required float x = 1;
    required float y = 2;
    required float w = 3;
    required float h = 4;
  }

  required float  offsetX = 1;
  required float  offsetY = 2;
  repeated float  mvMatrix = 3;
  required uint32 totalRects = 4;
  repeated Rect   layerRect = 5;
  required uint64 layerref = 6;
  repeated uint32 texIDs = 7;
  repeated Rect   textureRect = 8;
}

// We only need to use this Packet.
// Other packet definitions are just type defines
message Packet {
  enum DataType {
    FRAMESTART = 1;
    FRAMEEND = 2;
    COLOR = 3;
    TEXTURE = 4;
    LAYERS = 5;
    META = 6;
    DRAW = 7;
  }
  required DataType type = 1;

  optional FramePacket frame = 2;
  optional ColorPacket color = 3;
  optional TexturePacket texture = 4;
  optional LayersPacket layers = 5;
  optional MetaPacket meta = 6;
  optional DrawPacket draw = 7;
}


// ===============================
// Client to Server messages
// ===============================
message CommandPacket {
  enum CmdType {
    NO_OP = 0;
    LAYERS_TREE = 1;
    LAYERS_BUFFER = 2;
  }
  required CmdType type = 1;
  optional bool value = 2;
}
