Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Unified Diff: ui/gfx/vector_icons/aggregate_vector_icons.py

Issue 2251643011: Move Ash-specific vector icons to ash/common/resources (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix sources again Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/vector_icons/BUILD.gn ('k') | ui/gfx/vector_icons/system_menu_keyboard.icon » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/vector_icons/aggregate_vector_icons.py
diff --git a/ui/gfx/vector_icons/aggregate_vector_icons.py b/ui/gfx/vector_icons/aggregate_vector_icons.py
index b40c29bb232b77d8f988458a6dc9e8ad787aec12..6b028fee7abcc09078d165555cabb2bfa934e546 100644
--- a/ui/gfx/vector_icons/aggregate_vector_icons.py
+++ b/ui/gfx/vector_icons/aggregate_vector_icons.py
@@ -7,20 +7,11 @@ import glob
import optparse
import os
import shlex
+import sys
import textwrap
-def AggregateVectorIcons(working_directory, file_list, output_cc, output_h):
- """Compiles all .icon files in a directory into two C++ files.
-
- Args:
- working_directory: The path to the directory that holds the .icon files
- and C++ templates.
- file_list: A file containing the list of vector icon files to process.
- Used for GN only (this argument defaults to None for GYP).
- output_cc: The path that should be used to write the .cc file.
- output_h: The path that should be used to write the .h file.
- """
-
+def AggregateVectorIconsLegacy(working_directory, file_list, output_cc,
+ output_h):
icon_list = []
if file_list is None:
# TODO(GYP_GONE): |file_list| is only None for GYP builds (where response
@@ -79,6 +70,139 @@ def AggregateVectorIcons(working_directory, file_list, output_cc, output_h):
output_cc.close()
+def Error(msg):
+ print >> sys.stderr, msg
+ sys.exit(1)
+
+
+def CamelCase(name, suffix):
+ words = name.split('_')
+ words = [w.capitalize() for w in words]
+ return 'k' + ''.join(words) + suffix
+
+
+def AggregateVectorIcons(working_directory, file_list, output_cc, output_h,
+ use_legacy_template):
+ """Compiles all .icon files in a directory into two C++ files.
+
+ Args:
+ working_directory: The path to the directory that holds the .icon files
+ and C++ templates.
+ file_list: A file containing the list of vector icon files to process.
+ Used for GN only (this argument defaults to None for GYP).
+ output_cc: The path that should be used to write the .cc file.
+ output_h: The path that should be used to write the .h file.
+ use_legacy_template: If True, |output_cc| and |output_h| are generated
+ using .template files which make use of the VectorIconId enum.
+ """
+
+ # TODO(tdanderson): Remove this code once all vector icons map to VectorIcon
+ # constants rather than VectorIconId values.
+ if use_legacy_template:
+ AggregateVectorIconsLegacy(working_directory, file_list, output_cc,
+ output_h)
+ return
+
+ # For each file in |file_list|, place it in |path_map| if its extension is
+ # .icon or place it in |path_map_1x| if its extension is .1x.icon. The
+ # two dictionaries map the icon's name to its path, e.g.,
+ # path_map['cat'] = 'foo/bar/cat.icon'.
+ icon_list = []
+ with open(file_list, 'r') as f:
+ file_list_contents = f.read()
+ icon_list = shlex.split(file_list_contents)
+
+ path_map = {}
+ path_map_1x = {}
+
+ for icon_path in icon_list:
+ (icon_name, extension) = os.path.splitext(os.path.basename(icon_path))
+ (icon_name, scale_factor) = os.path.splitext(icon_name)
+
+ if (scale_factor and scale_factor != ".1x") or (extension != ".icon"):
+ Error("Only filenames " + icon_name + ".icon or " + icon_name +
+ ".1x.icon are allowed.")
+
+ if not scale_factor and icon_name not in path_map:
+ path_map[icon_name] = icon_path
+ elif scale_factor and icon_name not in path_map_1x:
+ path_map_1x[icon_name] = icon_path
+ else:
+ Error("A vector icon with name '" + icon_name + "' already exists.")
+
+ for icon_1x in path_map_1x:
+ if icon_1x not in path_map:
+ Error("The file " + icon_1x + ".icon must be provided.")
+
+ # Generate the file vector_icons.h which declares a variable for each
+ # icon in |path_map|. The variable name is derived from the icon name by
+ # converting to camel case, prepending 'k', and appending 'Icon'. For
+ # example, the icon 'foo_bar' will have the variable name kFooBarIcon.
+ input_header_template = open(os.path.join(working_directory,
+ "vector_icons.h.template"))
+ header_template_contents = input_header_template.readlines()
+ input_header_template.close()
+
+ output_header = open(output_h, "w")
+ for line in header_template_contents:
+ if not "TEMPLATE_PLACEHOLDER" in line:
+ output_header.write(line)
+ continue
+
+ for icon in path_map:
+ (icon_name, extension) = os.path.splitext(
+ os.path.basename(path_map[icon]))
+ (icon_name, scale_factor) = os.path.splitext(icon_name)
+ output_header.write(
+ "VECTOR_ICON_TEMPLATE_H({})\n".format(CamelCase(icon_name, "Icon")))
+ output_header.close()
+
+ # Copy the vector icon drawing commands from the .icon and .1x.icon files
+ # and use them to generate vector_icons.cc, which defines the variables
+ # declared in vector_icons.h.
+ input_cc_template = open(
+ os.path.join(working_directory, "vector_icons.cc.template"))
+ cc_template_contents = input_cc_template.readlines()
+ input_cc_template.close()
+
+ output_cc = open(output_cc, "w")
+ for line in cc_template_contents:
+ if not "TEMPLATE_PLACEHOLDER" in line:
+ output_cc.write(line)
+ continue;
+
+ for icon in path_map:
+ (icon_name, extension) = os.path.splitext(
+ os.path.basename(path_map[icon]))
+ (icon_name, scale_factor) = os.path.splitext(icon_name)
+
+ # Store the vector-drawing commands for foo_bar.icon in the temporary
+ # variable kFooBarPath.
+ icon_file = open(path_map[icon])
+ vector_commands = "".join(icon_file.readlines())
+ icon_file.close()
+ output_cc.write("PATH_ELEMENT_TEMPLATE({}, {})\n".format(
+ CamelCase(icon_name, "Path"), vector_commands))
+
+ # Store the vector-drawing commands for foo_bar.1x.icon in the temporary
+ # variable kFooBarPath1x, if the file exists.
+ vector_commands_1x = None
+ if (icon in path_map_1x):
+ icon_file = open(path_map_1x[icon])
+ vector_commands_1x = "".join(icon_file.readlines())
+ icon_file.close()
+ output_cc.write("PATH_ELEMENT_TEMPLATE({}, {})\n".format(
+ CamelCase(icon_name, "Path1x"), vector_commands_1x))
+
+ # Define the value of kFooBarIcon.
+ third_arg = "nullptr" if vector_commands_1x is None else CamelCase(
+ icon_name, "Path1x")
+ output_cc.write("VECTOR_ICON_TEMPLATE({}, {}, {})\n".format(CamelCase(
+ icon_name, "Icon"), CamelCase(icon_name, "Path"), third_arg))
+
+ output_cc.close()
+
+
def main():
parser = optparse.OptionParser()
parser.add_option("--working_directory",
@@ -92,13 +216,20 @@ def main():
help="The path to output the CC file to.")
parser.add_option("--output_h",
help="The path to output the header file to.")
+ parser.add_option("--use_legacy_template",
+ action="store_true",
+ help="When set, the VectorIconId enum is populated "
+ "with values corresponding to .icon files in "
+ "the current working directory.",
+ default=False)
(options, args) = parser.parse_args()
AggregateVectorIcons(options.working_directory,
options.file_list,
options.output_cc,
- options.output_h)
+ options.output_h,
+ options.use_legacy_template)
if __name__ == "__main__":
« no previous file with comments | « ui/gfx/vector_icons/BUILD.gn ('k') | ui/gfx/vector_icons/system_menu_keyboard.icon » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698