| /* |
| * Copyright (C) 2016 Apple Inc. All Rights Reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| const Icons = { |
| Airplay : { name: "Airplay", type: "svg", label: UIString("AirPlay") }, |
| AirplayPlacard : { name: "airplay-placard", type: "png", label: UIString("AirPlay") }, |
| EnterFullscreen : { name: "EnterFullscreen", type: "svg", label: UIString("Enter Full Screen") }, |
| EnterPiP : { name: "PipIn", type: "svg", label: UIString("Enter Picture in Picture") }, |
| ExitFullscreen : { name: "ExitFullscreen", type: "svg", label: UIString("Exit Full Screen") }, |
| Forward : { name: "Forward", type: "svg", label: UIString("Forward") }, |
| InvalidCompact : { name: "InvalidCompact", type: "pdf", label: UIString("Invalid") }, |
| InvalidPlacard : { name: "invalid-placard", type: "png", label: UIString("Invalid") }, |
| Pause : { name: "Pause", type: "svg", label: UIString("Pause") }, |
| PiPPlacard : { name: "pip-placard", type: "png", label: UIString("Picture in Picture") }, |
| Play : { name: "Play", type: "svg", label: UIString("Play") }, |
| PlayCompact : { name: "PlayCompact", type: "pdf", label: UIString("Play") }, |
| Rewind : { name: "Rewind", type: "svg", label: UIString("Rewind") }, |
| SkipBack : { name: "SkipBack15", type: "svg", label: UIString("Skip Back %s Seconds", SkipSeconds) }, |
| SkipForward : { name: "SkipForward15", type: "svg", label: UIString("Skip Forward %s Seconds", SkipSeconds) }, |
| SpinnerCompact : { name: "ActivityIndicatorSpriteCompact", type: "png", label: UIString("Loading…") }, |
| Tracks : { name: "MediaSelector", type: "svg", label: UIString("Media Selection") }, |
| Volume : { name: "VolumeHi", type: "svg", label: UIString("Mute") }, |
| VolumeRTL : { name: "VolumeHi-RTL", type: "svg", label: UIString("Mute") }, |
| VolumeDown : { name: "VolumeLo", type: "svg", label: UIString("Volume Down") }, |
| VolumeMuted : { name: "Mute", type: "svg", label: UIString("Unmute") }, |
| VolumeMutedRTL : { name: "Mute-RTL", type: "svg", label: UIString("Unmute") }, |
| VolumeUp : { name: "VolumeHi", type: "svg", label: UIString("Volume Up") } |
| }; |
| |
| const MimeTypes = { |
| "pdf": "application/pdf", |
| "png": "image/png", |
| "svg": "image/svg+xml" |
| }; |
| |
| const IconsWithFullscreenVariants = [Icons.Airplay, Icons.Tracks, Icons.EnterPiP]; |
| |
| const iconService = new class IconService { |
| |
| constructor() |
| { |
| this.images = {}; |
| } |
| |
| // Public |
| |
| imageForIconAndLayoutTraits(icon, layoutTraits) |
| { |
| const [fileName, platform] = this._fileNameAndPlatformForIconAndLayoutTraits(icon, layoutTraits); |
| const path = `${platform}/${fileName}.${icon.type}`; |
| |
| let image = this.images[path]; |
| if (image) |
| return image; |
| |
| image = this.images[path] = new Image; |
| |
| if (this.mediaControlsHost) |
| image.src = `data:${MimeTypes[icon.type]};base64,${this.mediaControlsHost.base64StringForIconNameAndType(fileName, icon.type)}`; |
| else |
| image.src = `${this.directoryPath}/${path}`; |
| |
| return image; |
| } |
| |
| // Private |
| |
| _fileNameAndPlatformForIconAndLayoutTraits(icon, layoutTraits) |
| { |
| let platform; |
| if (layoutTraits & LayoutTraits.macOS) |
| platform = "macOS"; |
| else if (layoutTraits & LayoutTraits.iOS || layoutTraits & LayoutTraits.Compact) |
| platform = "iOS"; |
| else |
| throw "Could not identify icon's platform from layout traits."; |
| |
| let iconName = icon.name; |
| if (layoutTraits & LayoutTraits.macOS && layoutTraits & LayoutTraits.Fullscreen && IconsWithFullscreenVariants.includes(icon)) |
| iconName += "-fullscreen"; |
| |
| let fileName = iconName; |
| if (icon.type === "png") |
| fileName = `${iconName}@${window.devicePixelRatio}x`; |
| |
| return [fileName, platform]; |
| } |
| |
| }; |