// Copyright 2016 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.cloud.vision.v1;

import "google/api/annotations.proto";
import "google/cloud/vision/v1/geometry.proto";

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/cloud/vision/v1;vision";
option java_multiple_files = true;
option java_outer_classname = "TextAnnotationProto";
option java_package = "com.google.cloud.vision.v1";


// TextAnnotation contains a structured representation of OCR extracted text.
// The hierarchy of an OCR extracted text structure is like this:
//     TextAnnotation -> Page -> Block -> Paragraph -> Word -> Symbol
// Each structural component, starting from Page, may further have their own
// properties. Properties describe detected languages, breaks etc.. Please
// refer to the [google.cloud.vision.v1.TextAnnotation.TextProperty][google.cloud.vision.v1.TextAnnotation.TextProperty] message
// definition below for more detail.
message TextAnnotation {
  // Detected language for a structural component.
  message DetectedLanguage {
    // The BCP-47 language code, such as "en-US" or "sr-Latn". For more
    // information, see
    // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
    string language_code = 1;

    // Confidence of detected language. Range [0, 1].
    float confidence = 2;
  }

  // Detected start or end of a structural component.
  message DetectedBreak {
    // Enum to denote the type of break found. New line, space etc.
    enum BreakType {
      // Unknown break label type.
      UNKNOWN = 0;

      // Regular space.
      SPACE = 1;

      // Sure space (very wide).
      SURE_SPACE = 2;

      // Line-wrapping break.
      EOL_SURE_SPACE = 3;

      // End-line hyphen that is not present in text; does
      HYPHEN = 4;

      // not co-occur with SPACE, LEADER_SPACE, or
      // LINE_BREAK.
      // Line break that ends a paragraph.
      LINE_BREAK = 5;
    }

    BreakType type = 1;

    // True if break prepends the element.
    bool is_prefix = 2;
  }

  // Additional information detected on the structural component.
  message TextProperty {
    // A list of detected languages together with confidence.
    repeated DetectedLanguage detected_languages = 1;

    // Detected start or end of a text segment.
    DetectedBreak detected_break = 2;
  }

  // List of pages detected by OCR.
  repeated Page pages = 1;

  // UTF-8 text detected on the pages.
  string text = 2;
}

// Detected page from OCR.
message Page {
  // Additional information detected on the page.
  TextAnnotation.TextProperty property = 1;

  // Page width in pixels.
  int32 width = 2;

  // Page height in pixels.
  int32 height = 3;

  // List of blocks of text, images etc on this page.
  repeated Block blocks = 4;
}

// Logical element on the page.
message Block {
  // Type of a block (text, image etc) as identified by OCR.
  enum BlockType {
    // Unknown block type.
    UNKNOWN = 0;

    // Regular text block.
    TEXT = 1;

    // Table block.
    TABLE = 2;

    // Image block.
    PICTURE = 3;

    // Horizontal/vertical line box.
    RULER = 4;

    // Barcode block.
    BARCODE = 5;
  }

  // Additional information detected for the block.
  TextAnnotation.TextProperty property = 1;

  // The bounding box for the block.
  // The vertices are in the order of top-left, top-right, bottom-right,
  // bottom-left. When a rotation of the bounding box is detected the rotation
  // is represented as around the top-left corner as defined when the text is
  // read in the 'natural' orientation.
  // For example:
  //   * when the text is horizontal it might look like:
  //      0----1
  //      |    |
  //      3----2
  //   * when it's rotated 180 degrees around the top-left corner it becomes:
  //      2----3
  //      |    |
  //      1----0
  //   and the vertice order will still be (0, 1, 2, 3).
  BoundingPoly bounding_box = 2;

  // List of paragraphs in this block (if this blocks is of type text).
  repeated Paragraph paragraphs = 3;

  // Detected block type (text, image etc) for this block.
  BlockType block_type = 4;
}

// Structural unit of text representing a number of words in certain order.
message Paragraph {
  // Additional information detected for the paragraph.
  TextAnnotation.TextProperty property = 1;

  // The bounding box for the paragraph.
  // The vertices are in the order of top-left, top-right, bottom-right,
  // bottom-left. When a rotation of the bounding box is detected the rotation
  // is represented as around the top-left corner as defined when the text is
  // read in the 'natural' orientation.
  // For example:
  //   * when the text is horizontal it might look like:
  //      0----1
  //      |    |
  //      3----2
  //   * when it's rotated 180 degrees around the top-left corner it becomes:
  //      2----3
  //      |    |
  //      1----0
  //   and the vertice order will still be (0, 1, 2, 3).
  BoundingPoly bounding_box = 2;

  // List of words in this paragraph.
  repeated Word words = 3;
}

// A word representation.
message Word {
  // Additional information detected for the word.
  TextAnnotation.TextProperty property = 1;

  // The bounding box for the word.
  // The vertices are in the order of top-left, top-right, bottom-right,
  // bottom-left. When a rotation of the bounding box is detected the rotation
  // is represented as around the top-left corner as defined when the text is
  // read in the 'natural' orientation.
  // For example:
  //   * when the text is horizontal it might look like:
  //      0----1
  //      |    |
  //      3----2
  //   * when it's rotated 180 degrees around the top-left corner it becomes:
  //      2----3
  //      |    |
  //      1----0
  //   and the vertice order will still be (0, 1, 2, 3).
  BoundingPoly bounding_box = 2;

  // List of symbols in the word.
  // The order of the symbols follows the natural reading order.
  repeated Symbol symbols = 3;
}

// A single symbol representation.
message Symbol {
  // Additional information detected for the symbol.
  TextAnnotation.TextProperty property = 1;

  // The bounding box for the symbol.
  // The vertices are in the order of top-left, top-right, bottom-right,
  // bottom-left. When a rotation of the bounding box is detected the rotation
  // is represented as around the top-left corner as defined when the text is
  // read in the 'natural' orientation.
  // For example:
  //   * when the text is horizontal it might look like:
  //      0----1
  //      |    |
  //      3----2
  //   * when it's rotated 180 degrees around the top-left corner it becomes:
  //      2----3
  //      |    |
  //      1----0
  //   and the vertice order will still be (0, 1, 2, 3).
  BoundingPoly bounding_box = 2;

  // The actual UTF-8 representation of the symbol.
  string text = 3;
}
