1 Commits

Author SHA1 Message Date
Arnavion 3d3ef58d73 Removed RendererSettings class. 2016-01-25 13:22:26 -08:00
4 changed files with 66 additions and 58 deletions
+1 -1
View File
@@ -50,7 +50,7 @@ The API documentation is linked in the Links section below. Here's an overview:
* The renderer can be told to dynamically change the size of the subtitles based on user input by calling [WebRenderer.resize()](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.WebRenderer.resize)
* Lastly, the renderer contains an implementation of preloading fonts before playing the video. It uses a map of font names to URLs - this map can be conveniently created from a CSS file containing @font-face rules using [RendererSettings.makeFontMapFromStyleElement()](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.RendererSettings.makeFontMapFromStyleElement)
* Lastly, the renderer contains an implementation of preloading fonts before playing the video. It uses a map of font names to URLs - this map can be conveniently created from a CSS file containing @font-face rules using [libjass.renderers.makeFontMapFromStyleElement()](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.makeFontMapFromStyleElement)
* For an example of using libjass, check out [the demo.](http://arnavion.github.io/libjass/demo/index.xhtml) It has comments explaining basic usage and pointers to some advanced usage.
+2 -1
View File
@@ -26,4 +26,5 @@ export { VideoClock } from "./clocks/video";
export { DefaultRenderer } from "./default";
export { NullRenderer } from "./null";
export { WebRenderer } from "./web/renderer";
export { RendererSettings } from "./settings";
export { RendererSettings, makeFontMapFromStyleElement } from "./settings";
+2 -2
View File
@@ -20,7 +20,7 @@
import { Clock, ClockEvent } from "./clocks/base";
import { RendererSettings } from "./settings";
import { RendererSettings, toRendererSettings } from "./settings";
import { verboseMode } from "../settings";
@@ -44,7 +44,7 @@ export class NullRenderer {
constructor(private _ass: ASS, private _clock: Clock, settings?: RendererSettings) {
this._id = ++NullRenderer._lastRendererId;
this._settings = RendererSettings.from(settings);
this._settings = toRendererSettings(settings);
this._clock.addEventListener(ClockEvent.Play, () => this._onClockPlay());
this._clock.addEventListener(ClockEvent.Tick, () => this._onClockTick());
+61 -54
View File
@@ -23,7 +23,7 @@ import { Map } from "../utility/map";
/**
* Settings for the renderer.
*/
export class RendererSettings {
export interface RendererSettings {
/**
* A map of font name to one or more URLs of that font. If provided, the fonts in this map are pre-loaded by the WebRenderer when it's created.
*
@@ -37,7 +37,7 @@ export class RendererSettings {
*
* Only the first and second forms allow you to use local fonts. The third form only allows you to use remote fonts.
*
* If you have a <style> or <link> element on the page containing @font-face rules, you can use the {@link libjass.renderers.RendererSettings.makeFontMapFromStyleElement}
* If you have a <style> or <link> element on the page containing @font-face rules, you can use the {@link libjass.renderers.makeFontMapFromStyleElement}
* convenience method to create a font map.
*
* Defaults to null.
@@ -96,67 +96,74 @@ export class RendererSettings {
* @type {boolean}
*/
useAttachedFonts: boolean;
}
/**
* A convenience method to create a font map from a <style> or <link> element that contains @font-face rules. There should be one @font-face rule for each font name, mapping to a font file URL.
*
* For example:
*
* @font-face {
* font-family: "Helvetica";
* src: url("/fonts/helvetica.ttf"), local("Arial");
* }
*
* @param {!LinkStyle} linkStyle
* @return {!Map.<string, string>}
*/
static makeFontMapFromStyleElement(linkStyle: LinkStyle): Map<string, string> {
const fontMap = new Map<string, string>();
/**
* Converts an arbitrary object into a {@link libjass.renderers.RendererSettings} object.
*
* @param {*} object
* @return {!libjass.renderers.RendererSettings}
*/
export function toRendererSettings(object?: any): RendererSettings {
if (object === undefined || object === null) {
object = {};
}
const styleSheet = <CSSStyleSheet>linkStyle.sheet;
for (let i = 0; i < styleSheet.cssRules.length; i++) {
const rule = styleSheet.cssRules[i];
const {
fontMap = null,
preRenderTime = 5,
preciseOutlines = false,
enableSvg = true,
fallbackFonts = 'Arial, Helvetica, sans-serif, "Segoe UI Symbol"',
useAttachedFonts = false
} = <RendererSettings>object;
if (isFontFaceRule(rule)) {
const name = rule.style.getPropertyValue("font-family").match(/^["']?(.*?)["']?$/)[1];
return {
fontMap,
preRenderTime,
preciseOutlines,
enableSvg,
fallbackFonts,
useAttachedFonts,
};
}
let src = rule.style.getPropertyValue("src");
if (!src) {
src = rule.cssText.split("\n")
.map(line => line.match(/src:\s*([^;]+?)\s*;/))
.filter(matches => matches !== null)
.map(matches => matches[1])[0];
}
/**
* A convenience method to create a font map from a <style> or <link> element that contains @font-face rules. There should be one @font-face rule for each font name, mapping to a font file URL.
*
* For example:
*
* @font-face {
* font-family: "Helvetica";
* src: url("/fonts/helvetica.ttf"), local("Arial");
* }
*
* @param {!LinkStyle} linkStyle
* @return {!Map.<string, string>}
*/
export function makeFontMapFromStyleElement(linkStyle: LinkStyle): Map<string, string> {
const fontMap = new Map<string, string>();
fontMap.set(name, src);
const styleSheet = <CSSStyleSheet>linkStyle.sheet;
for (let i = 0; i < styleSheet.cssRules.length; i++) {
const rule = styleSheet.cssRules[i];
if (isFontFaceRule(rule)) {
const name = rule.style.getPropertyValue("font-family").match(/^["']?(.*?)["']?$/)[1];
let src = rule.style.getPropertyValue("src");
if (!src) {
src = rule.cssText.split("\n")
.map(line => line.match(/src:\s*([^;]+?)\s*;/))
.filter(matches => matches !== null)
.map(matches => matches[1])[0];
}
}
return fontMap;
fontMap.set(name, src);
}
}
/**
* Converts an arbitrary object into a {@link libjass.renderers.RendererSettings} object.
*
* @param {*} object
* @return {!libjass.renderers.RendererSettings}
*/
static from(object?: any): RendererSettings {
if (object === undefined || object === null) {
object = {};
}
const { fontMap = null, preRenderTime = 5, preciseOutlines = false, enableSvg = true, fallbackFonts = 'Arial, Helvetica, sans-serif, "Segoe UI Symbol"', useAttachedFonts = false } = <RendererSettings>object;
const result = new RendererSettings();
result.fontMap = fontMap;
result.preRenderTime = preRenderTime;
result.preciseOutlines = preciseOutlines;
result.enableSvg = enableSvg;
result.fallbackFonts = fallbackFonts;
result.useAttachedFonts = useAttachedFonts;
return result;
}
return fontMap;
}
/**