syntax = "proto2";
option go_package = "image";

package appengine;

message ImagesServiceError {
  enum ErrorCode {
    UNSPECIFIED_ERROR = 1;
    BAD_TRANSFORM_DATA = 2;
    NOT_IMAGE = 3;
    BAD_IMAGE_DATA = 4;
    IMAGE_TOO_LARGE = 5;
    INVALID_BLOB_KEY = 6;
    ACCESS_DENIED = 7;
    OBJECT_NOT_FOUND = 8;
  }
}

message ImagesServiceTransform {
  enum Type {
    RESIZE = 1;
    ROTATE = 2;
    HORIZONTAL_FLIP = 3;
    VERTICAL_FLIP = 4;
    CROP = 5;
    IM_FEELING_LUCKY = 6;
  }
}

message Transform {
  optional int32 width = 1;
  optional int32 height = 2;
  optional bool crop_to_fit = 11 [default = false];
  optional float crop_offset_x = 12 [default = 0.5];
  optional float crop_offset_y = 13 [default = 0.5];

  optional int32 rotate = 3 [default = 0];

  optional bool horizontal_flip = 4 [default = false];

  optional bool vertical_flip = 5 [default = false];

  optional float crop_left_x = 6 [default = 0.0];
  optional float crop_top_y = 7 [default = 0.0];
  optional float crop_right_x = 8 [default = 1.0];
  optional float crop_bottom_y = 9 [default = 1.0];

  optional bool autolevels = 10 [default = false];

  optional bool allow_stretch = 14 [default = false];
}

message ImageData {
  required bytes content = 1 [ctype=CORD];
  optional string blob_key = 2;

  optional int32 width = 3;
  optional int32 height = 4;
}

message InputSettings {
  enum ORIENTATION_CORRECTION_TYPE {
    UNCHANGED_ORIENTATION = 0;
    CORRECT_ORIENTATION = 1;
  }
  optional ORIENTATION_CORRECTION_TYPE correct_exif_orientation = 1
      [default=UNCHANGED_ORIENTATION];
  optional bool parse_metadata = 2 [default=false];
  optional int32 transparent_substitution_rgb = 3;
}

message OutputSettings {
  enum MIME_TYPE {
    PNG = 0;
    JPEG = 1;
    WEBP = 2;
  }

  optional MIME_TYPE mime_type = 1 [default=PNG];
  optional int32 quality = 2;
}

message ImagesTransformRequest {
  required ImageData image = 1;
  repeated Transform transform = 2;
  required OutputSettings output = 3;
  optional InputSettings input = 4;
}

message ImagesTransformResponse {
  required ImageData image = 1;
  optional string source_metadata = 2;
}

message CompositeImageOptions {
  required int32 source_index = 1;
  required int32 x_offset = 2;
  required int32 y_offset = 3;
  required float opacity = 4;

  enum ANCHOR {
    TOP_LEFT = 0;
    TOP = 1;
    TOP_RIGHT = 2;
    LEFT = 3;
    CENTER = 4;
    RIGHT = 5;
    BOTTOM_LEFT = 6;
    BOTTOM = 7;
    BOTTOM_RIGHT = 8;
  }

  required ANCHOR anchor = 5;
}

message ImagesCanvas {
  required int32 width = 1;
  required int32 height = 2;
  required OutputSettings output = 3;
  optional int32 color = 4 [default=-1];
}

message ImagesCompositeRequest {
  repeated ImageData image = 1;
  repeated CompositeImageOptions options = 2;
  required ImagesCanvas canvas = 3;
}

message ImagesCompositeResponse {
  required ImageData image = 1;
}

message ImagesHistogramRequest {
  required ImageData image = 1;
}

message ImagesHistogram {
  repeated int32 red = 1;
  repeated int32 green = 2;
  repeated int32 blue = 3;
}

message ImagesHistogramResponse {
  required ImagesHistogram histogram = 1;
}

message ImagesGetUrlBaseRequest {
  required string blob_key = 1;

  optional bool create_secure_url = 2 [default = false];
}

message ImagesGetUrlBaseResponse {
  required string url = 1;
}

message ImagesDeleteUrlBaseRequest {
  required string blob_key = 1;
}

message ImagesDeleteUrlBaseResponse {
}