starling-framework
Version:
A fast, productive library for 2D cross-platform development.
216 lines • 9.43 kB
TypeScript
import MeshStyle from "./MeshStyle";
import VertexDataFormat from "../rendering/VertexDataFormat";
import RenderState from "../rendering/RenderState";
import MeshEffect from "../rendering/MeshEffect";
import Matrix from "openfl/geom/Matrix";
declare namespace starling.styles {
/**
* Provides support for signed distance fields to Starling meshes.
* *
* * <p>Signed distance field rendering allows bitmap fonts and other single colored shapes to
* * be drawn without jagged edges, even at high magnifications. The technique was introduced in
* * the SIGGRAPH paper <a href="http://tinyurl.com/AlphaTestedMagnification">Improved
* * Alpha-Tested Magnification for Vector Textures and Special Effects</a> by Valve Software.
* * </p>
* *
* * <p>While bitmap fonts are a great solution to render text in a GPU-friendly way, they
* * don't scale well. For best results, one has to embed the font in all the sizes used within
* * the app. The distance field style solves this issue: instead of providing a standard
* * black and white image of the font, it uses a <em>signed distance field texture</em> as
* * its input (a texture that encodes, for each pixel, the distance to the closest edge of a
* * vector shape). With this data, the shape can be rendered smoothly at almost any scale.</p>
* *
* * <p>Here are some tools that support creation of such distance field textures:</p>
* *
* * <ul>
* * <li>Field Agent - a Ruby script that uses ImageMagick to create single-channel distance
* * field textures. Part of the Starling download ('util' directory).</li>
* * <li><a href="https://github.com/Chlumsky/msdfgen">msdfgen</a> - an excellent and fast
* * open source command line tool that creates multi- and single-channel distance field
* * textures.</li>
* * </ul>
* *
* * <p>The former tools convert arbitrary SVG or PNG images to distance field textures.
* * To create distance field <em>fonts</em>, have a look at the following alternatives:</p>
* *
* * <ul>
* * <li><a href="https://github.com/soimy/msdf-bmfont-xml/">msdf-bmfont-xml</a> - a command
* * line tool powered by msdf and thus producing excellent multi-channel output.</li>
* * <li><a href="http://kvazars.com/littera/">Littera</a> - a free online bitmap font
* * generator.</li>
* * <li><a href="http://github.com/libgdx/libgdx/wiki/Hiero">Hiero</a> - a cross platform
* * tool.</li>
* * <li><a href="http://www.angelcode.com/products/bmfont/">BMFont</a> - Windows-only, from
* * AngelCode.</li>
* * </ul>
* *
* * <strong>Single-Channel vs. Multi-Channel</strong>
* *
* * <p>The original approach for distance field textures uses just a single channel (encoding
* * the distance of each pixel to the shape that's being represented). By utilizing
* * all three color channels, however, the results can be greatly enhanced - a technique
* * developed by Viktor Chlumský.</p>
* *
* * <p>Starling supports such multi-channel DF textures, as well. When using an appropriate
* * texture, don't forget to enable the style's <code>multiChannel</code> property.</p>
* *
* * <strong>Special effects</strong>
* *
* * <p>Another advantage of this rendering technique: it supports very efficient rendering of
* * some popular filter effects, in just one pass, directly on the GPU. You can add an
* * <em>outline</em> around the shape, let it <em>glow</em> in an arbitrary color, or add
* * a <em>drop shadow</em>.</p>
* *
* * <p>The type of effect currently used is called the 'mode'.
* * Meshes with the same mode will be batched together on rendering.</p>
*
*/
export class DistanceFieldStyle extends MeshStyle {
/**
* Creates a new distance field style.
* *
* * @param softness adds a soft transition between the inside and the outside.
* * This should typically be 1.0 divided by the spread (in points)
* * used when creating the distance field texture.
* * @param threshold the value separating the inside from the outside of the shape.
* * Range: 0 - 1.
*
*/
constructor(softness?: number, threshold?: number);
/**
* Basic distance field rendering, without additional effects.
*/
static readonly MODE_BASIC = "basic";
/**
* Adds an outline around the edge of the shape.
*/
static readonly MODE_OUTLINE = "outline";
/**
* Adds a smooth glow effect around the shape.
*/
static readonly MODE_GLOW = "glow";
/**
* Adds a drop shadow behind the shape.
*/
static readonly MODE_SHADOW = "shadow";
/**
* @private
*/
override copyFrom(meshStyle: MeshStyle): void;
/**
* @private
*/
override createEffect(): MeshEffect;
/**
* @private
*/
override batchVertexData(targetStyle: MeshStyle, targetVertexID?: number, matrix?: Matrix, vertexID?: number, numVertices?: number): void;
/**
* @private
*/
override updateEffect(effect: MeshEffect, state: RenderState): void;
/**
* @private
*/
override canBatchWith(meshStyle: MeshStyle): boolean;
/**
* Restores basic render mode, i.e. smooth rendering of the shape.
*/
setupBasic(): void;
/**
* Sets up outline rendering mode. The 'width' determines the threshold where the
* * outline ends; 'width + threshold' must not exceed '1.0'.
*
*/
setupOutline(width?: number, color?: number, alpha?: number): void;
/**
* Sets up glow rendering mode. The 'blur' determines the threshold where the
* * blur ends; 'blur + threshold' must not exceed '1.0'.
*
*/
setupGlow(blur?: number, color?: number, alpha?: number): void;
/**
* Sets up shadow rendering mode. The 'blur' determines the threshold where the drop
* * shadow ends; 'offsetX' and 'offsetY' are expected in points.
* *
* * <p>Beware that the style can only act within the limits of the mesh's vertices.
* * This means that not all combinations of blur and offset are possible; too high values
* * will cause the shadow to be cut off on the sides. Reduce either blur or offset to
* * compensate.</p>
*
*/
setupDropShadow(blur?: number, offsetX?: number, offsetY?: number, color?: number, alpha?: number): void;
/**
* The current render mode. It's recommended to use one of the 'setup...'-methods to
* * change the mode, as those provide useful standard settings, as well. @default basic
*/
get mode(): string;
set mode(value: string)
/**
* Indicates if the distance field texture utilizes multiple channels. This improves
* * render quality, but requires specially created DF textures. @default false
*/
get multiChannel(): boolean;
set multiChannel(value: boolean)
/**
* The threshold that will separate the inside from the outside of the shape. On the
* * distance field texture, '0' means completely outside, '1' completely inside; the
* * actual edge runs along '0.5'. @default 0.5
*/
get threshold(): number;
set threshold(value: number)
/**
* Indicates how soft the transition between inside and outside should be rendered.
* * A value of '0' will lead to a hard, jagged edge; '1' will be just as blurry as the
* * actual distance field texture. The recommend value should be <code>1.0 / spread</code>
* * (you determine the spread when creating the distance field texture). @default 0.125
*/
get softness(): number;
set softness(value: number)
/**
* The alpha value with which the inner area (what's rendered in 'basic' mode) is drawn.
* * @default 1.0
*/
get alpha(): number;
set alpha(value: number)
/**
* The threshold that determines where the outer area (outline, glow, or drop shadow)
* * ends. Ignored in 'basic' mode.
*/
get outerThreshold(): number;
set outerThreshold(value: number)
/**
* The alpha value on the inner side of the outer area's gradient.
* * Used for outline, glow, and drop shadow modes.
*/
get outerAlphaStart(): number;
set outerAlphaStart(value: number)
/**
* The alpha value on the outer side of the outer area's gradient.
* * Used for outline, glow, and drop shadow modes.
*/
get outerAlphaEnd(): number;
set outerAlphaEnd(value: number)
/**
* The color with which the outer area (outline, glow, or drop shadow) will be filled.
* * Ignored in 'basic' mode.
*/
get outerColor(): number;
set outerColor(value: number)
/**
* The x-offset of the shadow in points. Note that certain combinations of offset and
* * blur value can lead the shadow to be cut off at the edges. Reduce blur or offset to
* * counteract.
*/
get shadowOffsetX(): number;
set shadowOffsetX(value: number)
/**
* The y-offset of the shadow in points. Note that certain combinations of offset and
* * blur value can lead the shadow to be cut off at the edges. Reduce blur or offset to
* * counteract.
*/
get shadowOffsetY(): number;
set shadowOffsetY(value: number)
}
}
export default starling.styles.DistanceFieldStyle;