/*
 * Copyright 2017 Google Inc. All Rights Reserved.
 *
 * 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.
 */

#ifndef COBALT_BROWSER_MEMORY_SETTINGS_BUILD_SETTINGS_H_
#define COBALT_BROWSER_MEMORY_SETTINGS_BUILD_SETTINGS_H_

#include "base/optional.h"
#include "cobalt/math/size.h"
#include "starboard/types.h"

namespace cobalt {
namespace browser {
namespace memory_settings {

struct BuildSettings {
  BuildSettings() : has_blitter(false) {}
  bool has_blitter;
  base::optional<int64_t> cobalt_image_cache_size_in_bytes;
  base::optional<int64_t> javascript_garbage_collection_threshold_in_bytes;
  base::optional<int64_t> skia_cache_size_in_bytes;
  base::optional<math::Size> skia_texture_atlas_dimensions;
  base::optional<int64_t> software_surface_cache_size_in_bytes;
};

BuildSettings GetDefaultBuildSettings();

}  // namespace memory_settings
}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_MEMORY_SETTINGS_BUILD_SETTINGS_H_
