blob: 1dabde80325264266b103b8413a3effe706ae905 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/base64.h"
#include "base/files/file_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "chrome/common/search/chrome_colors_icon_template.h"
#include "chrome/common/search/selected_colors_info.h"
#include "chrome/common/themes/autogenerated_theme_util.h"
// Template for color info line.
// $1 - color id
// $2 - red value of primary color
// $3 - green value of primary color
// $4 - blue value of primary color
// $5 - color label
// $6 - icon data
const char kColorInfoLineTemplate[] =
" ColorInfo($1, SkColorSetRGB($2, $3, $4), \"$5\", "
"\"data:image/svg+xml;base64,$6\")";
// Template for the generated file content.
// $1 - lines for updated color info.
// $2 - number of colors.
const char kFileContentTemplate[] =
"// Generated from generate_colors_info.cc. Do not edit!\n"
"\n"
"#ifndef CHROME_COMMON_SEARCH_GENERATED_COLORS_INFO_H_\n"
"#define CHROME_COMMON_SEARCH_GENERATED_COLORS_INFO_H_\n"
"\n"
"#include <stdint.h>\n"
"\n"
"#include \"chrome/common/search/selected_colors_info.h\"\n"
"#include \"third_party/skia/include/core/SkColor.h\"\n"
"\n"
"namespace chrome_colors {\n"
"\n"
"// List of preselected colors with icon data to show in Chrome Colors"
" menu.\n"
"constexpr ColorInfo kGeneratedColorsInfo[] = {\n"
"$1\n"
"};\n"
"\n"
"const size_t kNumColorsInfo = $2;"
"\n"
"} // namespace chrome_colors\n"
"\n"
"#endif // CHROME_COMMON_SEARCH_GENERATED_COLORS_INFO_H_\n";
// Returns hex string representation for the |color| in "#FFFFFF" format.
std::string SkColorToHexString(SkColor color) {
return base::StringPrintf("\"#%02X%02X%02X\"", SkColorGetR(color),
SkColorGetG(color), SkColorGetB(color));
}
// Returns icon data for the given |color| as encoded svg.
// The returned string can be later directly set in JS with the following
// format: "data:image/svg+xml;base64<ENCODED_SVG>"
std::string GenerateIconDataForColor(SkColor color) {
AutogeneratedThemeColors colors = GetAutogeneratedThemeColors(color);
std::vector<std::string> subst;
subst.push_back(SkColorToHexString(colors.frame_color));
subst.push_back(SkColorToHexString(colors.active_tab_color));
subst.push_back(SkColorToHexString(colors.active_tab_text_color));
std::string svg_base64;
base::Base64Encode(
base::ReplaceStringPlaceholders(kChromeColorsIconTemplate, subst, NULL),
&svg_base64);
return svg_base64;
}
// Generates color info line in the following format:
// ColorInfo(ID, SkColorSetRGB(R, G, B), LABEL, ICON_DATA)
std::string GenerateColorLine(chrome_colors::ColorInfo color_info) {
std::vector<std::string> subst;
subst.push_back(base::NumberToString(color_info.id));
subst.push_back(base::NumberToString(SkColorGetR(color_info.color)));
subst.push_back(base::NumberToString(SkColorGetG(color_info.color)));
subst.push_back(base::NumberToString(SkColorGetB(color_info.color)));
subst.push_back(color_info.label);
subst.push_back(GenerateIconDataForColor(color_info.color));
return base::ReplaceStringPlaceholders(kColorInfoLineTemplate, subst, NULL);
}
// Generates 'generated_colors_info.h' that contains selected colors from
// |chrome_colors::kSelectedColorsInfo| along with generated icon data.
void GenerateColorsInfoFile(std::string output_dir) {
std::vector<std::string> updated_color_info;
int colors_num = 0;
for (chrome_colors::ColorInfo color_info :
chrome_colors::kSelectedColorsInfo) {
updated_color_info.push_back(GenerateColorLine(color_info));
colors_num++;
}
std::vector<std::string> subst;
subst.push_back(base::JoinString(updated_color_info, ",\n"));
subst.push_back(base::NumberToString(colors_num));
std::string output =
base::ReplaceStringPlaceholders(kFileContentTemplate, subst, NULL);
base::FilePath output_path = base::FilePath::FromUTF8Unsafe(output_dir);
base::FilePath directory = output_path.DirName();
if (!base::DirectoryExists(directory))
base::CreateDirectory(directory);
if (base::WriteFile(output_path, output.c_str(),
static_cast<uint32_t>(output.size())) <= 0) {
LOG(ERROR) << "Failed to write output to " << output_path;
}
}
int main(int argc, char* argv[]) {
GenerateColorsInfoFile(argv[1]);
return 0;
}