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

Unified Diff: third_party/WebKit/Source/devtools/scripts/spritesheet_assembler/SVGSpriteSheet.js

Issue 2671413004: DevTools: introduce spritesheet assembler. (Closed)
Patch Set: rebaseline tests Created 3 years, 10 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
Index: third_party/WebKit/Source/devtools/scripts/spritesheet_assembler/SVGSpriteSheet.js
diff --git a/third_party/WebKit/Source/devtools/scripts/spritesheet_assembler/SVGSpriteSheet.js b/third_party/WebKit/Source/devtools/scripts/spritesheet_assembler/SVGSpriteSheet.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5d99f9c2796a01cd4518464ae5141c81d284067
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/scripts/spritesheet_assembler/SVGSpriteSheet.js
@@ -0,0 +1,83 @@
+var postsvg = require('postsvg');
+var renameId = require('postsvg-rename-id');
+
+class SVGSpriteSheet {
+ /**
+ * @param {number} width
+ * @param {number} height
+ * @param {!Map<!SVGSprite, !{x: number, y: number}>} spritePositions
+ */
+ constructor(width, height, spritePositions) {
+ this._width = width;
+ this._height = height;
+ this._sprites = Array.from(spritePositions.keys());
+ this._positions = spritePositions;
+ }
+
+ /**
+ * @return {number}
+ */
+ width() {
+ return this._width;
+ }
+
+ /**
+ * @return {number}
+ */
+ height() {
+ return this._height;
+ }
+
+ /**
+ * @return {!Array<!SVGSprite>}
+ */
+ sprites() {
+ return this._sprites;
+ }
+
+ /**
+ * @param {!SVGSprite} sprite
+ * @return {!{x: number, y: number}}
+ */
+ spritePosition(sprite) {
+ console.assert(this._positions.has(sprite), 'sprite ' + sprite.filePath + ' has undefined position!');
+ return this._positions.get(sprite);
+ }
+
+ /**
+ * @return {string}
+ */
+ svgText() {
+ if (this._svgText)
+ return this._svgText;
+
+ var svgBody = '';
+ var spriteId = 0;
+ for (var sprite of this._sprites) {
+ var spriteSVG = sprite.content.trim();
+
+ // Strip of <?xml> header, if any.
+ if (spriteSVG.startsWith('<?xml')) {
+ var headerIndexEnd = spriteSVG.indexOf('?>');
+ spriteSVG = spriteSVG.substring(headerIndexEnd + 2);
+ }
+
+ // Rename sprite ids to avoid clashing.
+ spriteSVG = postsvg().use(renameId({pattern: 'sprite' + (++spriteId) + '_[id]'})).process(spriteSVG);
+
+ // Wrap sprite to SVG container with proper position.
+ var position = this._positions.get(sprite);
+ var prefix = `<svg x="${position.x}" y="${position.y}" width="${sprite.width}" height="${sprite.height}">`;
+ var suffix = '</svg>';
+ spriteSVG = prefix + spriteSVG + suffix;
+
+ svgBody += spriteSVG;
+ }
+
+ var xmlHeader = '<?xml version="1.0" encoding="utf-8"?>';
+ var spriteSheetHeader = `<svg width="${this._width}" height="${this._height}" xmlns="http://www.w3.org/2000/svg">`;
+ return xmlHeader + spriteSheetHeader + svgBody + '</svg>';
+ }
+};
+
+module.exports = SVGSpriteSheet;

Powered by Google App Engine
This is Rietveld 408576698