/*
 * Copyright 2015 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.
 */

// Author: morlovich@google.com (Maksim Orlovich)

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package net_instaweb;

// Cached/pre-computed information useful for mobilization. For now we treat it
// as atomic and aggregate via critical_finder_support_util.
message MobilizeCached {
  // Corresponds to goog.color.Rgb; so colors are actually in 0-255 range.
  message Color {
    optional int32 r = 1;
    optional int32 g = 2;
    optional int32 b = 3;
  }

  optional Color background_color = 1;
  optional Color foreground_color = 2;
  optional string foreground_image_url = 3;
}
