DatumHuePlatform v0.0.24datumhue.com
Contents

handle22 methods, 12 fieldsUI apps only

Scene

A 3D scene viewport returned by datumhue.scene.new.

Obtained from
datumhue.scene.new
Accepted by
datumhue.material.standard, datumhue.voxel.new, datumhue.voxel.world, datumhue.particles.emitter, datumhue.shader.new, Material:set_source, Material:update, Shader:update and 5 more

The examples on this page start from:

lua
local vec3 = datumhue.math.vec3
local color = datumhue.color
local scene = datumhue.scene.new({ width = 320, height = 240 })
scene:mount({ width = 320, height = 240 })
scene:directional_light({ direction = vec3(-1, -2, -1) })

Fields 12

FieldTypeAccessDescription
cameraSceneCameraread/writeThe scene's camera sub-handle. Assign a table of {pos, rotation, fov} to configure it in one step; it cannot be removed.
Example
-- Assign a table to set several fields at once.
scene.camera = { pos = vec3(4, 3, 4), fov = math.rad(50) }
scene.camera:look_at(vec3(0, 0, 0))
print(scene.camera.fov) --> 0.87266463041305542
ambientSceneAmbientread/writeThe scene's ambient-light sub-handle. Assign a table of {color, brightness} to configure it in one step; it cannot be removed.
Example
-- Light that reaches every surface from every side.
scene.ambient = { color = color("#d3c6aa"), brightness = 400 }
bloomSceneBloom?read/writeThe scene's bloom sub-handle, or nil when bloom is off. Assign a table of {intensity, threshold} to enable/configure it, or nil to disable.
Example
-- A table turns bloom on; nil turns it off.
scene.bloom = { intensity = 0.25, threshold = 1 }
print(scene.bloom.intensity) --> 0.25
scene.bloom = nil
print(scene.bloom) --> nil
fogSceneFog?read/writeThe scene's distance-fog sub-handle, or nil when fog is off. Assign a table of {color, near, far} to enable/configure it, or nil to disable.
Example
-- Clear up to 5 units from the camera, solid from 20 on.
scene.fog = { color = color("#2d353b"), near = 5, far = 20 }
scene:plane({ scale = vec3(40, 1, 40), color = color("#a7c080") })
vignetteSceneVignette?read/writeThe scene's vignette sub-handle, or nil when off. Assign a table of {intensity, radius, smoothness, roundness, edge_compensation, center, color} to enable/configure it, or nil to disable.
Example
-- Keys left out keep their defaults; center is in 0..1 image space.
scene.vignette =
    { intensity = 0.6, radius = 0.8, color = color("#1e2326") }
print(scene.vignette.center) --> vec2(0.5, 0.5)
lens_distortionSceneLensDistortion?read/writeThe scene's lens-distortion sub-handle, or nil when off. Assign a table of {intensity, scale, multiplier, center, edge_curvature} to enable/configure it, or nil to disable.
Example
-- Positive intensity bulges the image; scale crops the edges.
scene.lens_distortion = { intensity = 0.3, scale = 1.1 }
chromatic_aberrationSceneChromaticAberration?read/writeThe scene's chromatic-aberration sub-handle, or nil when off. Assign a table of {intensity, max_samples, color_lut} to enable/configure it, or nil to disable.
Example
-- intensity is the streak size as a fraction of the window.
scene.chromatic_aberration = { intensity = 0.02 }
gridSceneGrid?read/writeThe scene's reference grid, or nil when off. Assign a table of {x_axis_color, z_axis_color, minor_line_color, major_line_color, fadeout_distance, dot_fadeout_strength, scale} to enable/configure it, or nil to disable.
Example
-- A reference grid on the XZ plane; every 10th line is a major line.
scene.grid = { scale = 1, fadeout_distance = 40 }
tonemappingscene.Tonemappingread/writeHow the camera maps the scene's light levels to the colors the display can show.
exposurenumber?read/writeCamera exposure (EV100).
atmospherebooleanread/writeWhether the procedural atmosphere is enabled.
backgroundColor?read/writeSolid background (clear) color, or nil for a transparent background. Assign a color or nil.

Methods 22

Scene:cube

method
Scene:cube(opts: scene.MeshOptions) -> SceneNode

Spawn a cube mesh.

Example
-- Sizes are local, before scale: a unit cube centered on pos.
local crate = scene:cube({
    pos = vec3(0, 0.5, 0),
    rotation = datumhue.math.quat.from_rotation_y(math.pi / 6),
    color = color("#dbbc7f"),
})
print(crate:bounds().size) --> vec3(1.0, 1.0, 1.0)

opts scene.MeshOptions options 5 keys, 3 inherited

KeyTypeDefaultDescription
colorColordatumhue.color(1, 1, 1)Base color of the node's own material; ignored when material is given.
materialMaterial | Shadera standard material of colorMaterial handle to apply: a standard Material, or a Shader, whose color the mesh shows unlit (a Material's shader lights it).
From scene.Transform3dOptions
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
rotationQuatdatumhue.math.quat.identity()Rotation quaternion. Build with datumhue.math.quat.from_euler etc.
scaleVec3datumhue.math.vec3(1, 1, 1)Per-axis scale.

Scene:sphere

method
Scene:sphere(opts: scene.MeshOptions) -> SceneNode

Spawn a sphere mesh.

Example
-- 1 unit across; scale makes it larger.
local glossy = datumhue.material.standard({
    color = color("#e67e80"),
    roughness = 0.2,
})
local ball = scene:sphere({
    pos = vec3(0, 1, 0),
    scale = vec3(2, 2, 2),
    material = glossy,
})
print(ball:bounds().size.y) --> 1.0

opts scene.MeshOptions options 5 keys, 3 inherited

KeyTypeDefaultDescription
colorColordatumhue.color(1, 1, 1)Base color of the node's own material; ignored when material is given.
materialMaterial | Shadera standard material of colorMaterial handle to apply: a standard Material, or a Shader, whose color the mesh shows unlit (a Material's shader lights it).
From scene.Transform3dOptions
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
rotationQuatdatumhue.math.quat.identity()Rotation quaternion. Build with datumhue.math.quat.from_euler etc.
scaleVec3datumhue.math.vec3(1, 1, 1)Per-axis scale.

Scene:plane

method
Scene:plane(opts: scene.PlaneOptions) -> SceneNode

Spawn a plane mesh.

Example
-- A 1 x 1 square in the XZ plane, facing +Y; here a 10 x 10 floor.
local floor = scene:plane({
    scale = vec3(10, 1, 10),
    subdivisions = 16,
    color = color("#a7c080"),
})
print(floor:bounds().size) --> vec3(1.0, 0.0, 1.0)

opts scene.PlaneOptions options 6 keys, 3 inherited

KeyTypeDefaultDescription
colorColordatumhue.color(1, 1, 1)Base color of the node's own material; ignored when material is given.
materialMaterial | Shadera standard material of colorMaterial handle to apply: a standard Material, or a Shader, whose color the mesh shows unlit (a Material's shader lights it).
subdivisionsinteger0Grid subdivisions per side, 0..254. A subdivided plane gives mesh:update and node:deform vertices to move.
From scene.Transform3dOptions
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
rotationQuatdatumhue.math.quat.identity()Rotation quaternion. Build with datumhue.math.quat.from_euler etc.
scaleVec3datumhue.math.vec3(1, 1, 1)Per-axis scale.

Scene:cylinder

method
Scene:cylinder(opts: scene.MeshOptions) -> SceneNode

Spawn a cylinder mesh.

Example
-- Upright along Y, 1 unit long and 1 across; here a pipe lying along X.
local pipe = scene:cylinder({
    rotation = datumhue.math.quat.from_rotation_z(math.pi / 2),
    scale = vec3(0.5, 3, 0.5),
    color = color("#7fbbb3"),
})
print(pipe:bounds().size) --> vec3(1.0, 1.0, 1.0)

opts scene.MeshOptions options 5 keys, 3 inherited

KeyTypeDefaultDescription
colorColordatumhue.color(1, 1, 1)Base color of the node's own material; ignored when material is given.
materialMaterial | Shadera standard material of colorMaterial handle to apply: a standard Material, or a Shader, whose color the mesh shows unlit (a Material's shader lights it).
From scene.Transform3dOptions
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
rotationQuatdatumhue.math.quat.identity()Rotation quaternion. Build with datumhue.math.quat.from_euler etc.
scaleVec3datumhue.math.vec3(1, 1, 1)Per-axis scale.

Scene:capsule

method
Scene:capsule(opts: scene.MeshOptions) -> SceneNode

Spawn a capsule mesh.

Example
-- 2 units tall: a 1 unit body between two half-unit caps.
local pill =
    scene:capsule({ pos = vec3(0, 1, 0), color = color("#d699b6") })
print(pill:bounds().size) --> vec3(1.0, 2.0, 1.0)

opts takes the same keys as scene.MeshOptions.

Scene:torus

method
Scene:torus(opts: scene.MeshOptions) -> SceneNode

Spawn a torus mesh.

Example
-- A ring 1 unit across lying in the XZ plane.
local ring =
    scene:torus({ pos = vec3(0, 0.5, 0), color = color("#dbbc7f") })
print(ring:bounds().size) --> vec3(1.0, 0.19999998807907104, 1.0)

opts takes the same keys as scene.MeshOptions.

Scene:cone

method
Scene:cone(opts: scene.MeshOptions) -> SceneNode

Spawn a cone mesh.

Example
-- 1 unit tall around pos, base 1 unit across, the tip toward +Y.
local spike =
    scene:cone({ pos = vec3(0, 0.5, 0), color = color("#e69875") })
print(spike:bounds().size) --> vec3(1.0, 1.0, 1.0)

opts takes the same keys as scene.MeshOptions.

Scene:set_skybox

method
Scene:set_skybox(cubemap?: CubemapAsset)

Set the scene's skybox to a cubemap (from bytes:cubemap() or image_asset:to_cubemap()), or nil to remove it.

Example
-- Six square faces stacked top to bottom: +X, -X, +Y, -Y, +Z, -Z.
local faces = datumhue.image.new({ width = 16, height = 96 })
faces:apply(datumhue.image.picture():fill(color("#7fbbb3")))
scene:set_skybox(faces:to_cubemap())

Scene:set_environment

method
Scene:set_environment(options?: scene.EnvironmentOptions)

Set image-based environment lighting from prefiltered cubemaps, or nil to remove it. Requires diffuse and specular cubemaps; raises if either is missing.

Example
-- Both maps are cubemaps; intensity is in candela per square meter.
local faces = datumhue.image.new({ width = 16, height = 96 })
faces:apply(datumhue.image.picture():fill(color("#d3c6aa")))
local map = faces:to_cubemap()
scene:set_environment({
    diffuse = map,
    specular = map,
    intensity = 800,
})

options scene.EnvironmentOptions options 3 keys

KeyTypeDefaultDescription
diffuseCubemapAssetthe call raisesPrefiltered diffuse irradiance cubemap.
specularCubemapAssetthe call raisesPrefiltered specular radiance cubemap.
intensitynumber1000Light intensity in cd/m^2.

Scene:point_light

method
Scene:point_light(opts: scene.PointLightOptions) -> SceneNode

Spawn a point light.

Example
-- Shines every way from pos, reaching range units.
scene:cube({ pos = vec3(0, 0.5, 0), color = color("#d3c6aa") })
scene:point_light({
    pos = vec3(1, 2, 1),
    color = color("#e69875"),
    intensity = 200000,
    range = 10,
    shadows = true,
})

opts scene.PointLightOptions options 5 keys, 3 inherited

KeyTypeDefaultDescription
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
rangenumber20Falloff range.
From scene.LightOptions
colorColordatumhue.color(1, 1, 1)Light color.
intensitynumber1000Luminous intensity.
shadowsbooleanfalseCast shadows.

Scene:directional_light

method
Scene:directional_light(opts: scene.DirectionalLightOptions) -> SceneNode

Spawn a directional light.

Example
-- Parallel rays along direction, the same everywhere: sunlight.
scene:cube({ pos = vec3(0, 0.5, 0), color = color("#d3c6aa") })
scene:directional_light({
    direction = vec3(1, -1, 0),
    color = color("#dbbc7f"),
    intensity = 5000,
})

opts scene.DirectionalLightOptions options 4 keys, 3 inherited

KeyTypeDefaultDescription
directionVec3datumhue.math.vec3(0, -1, 0)Light direction.
From scene.LightOptions
colorColordatumhue.color(1, 1, 1)Light color.
intensitynumber1000Luminous intensity.
shadowsbooleanfalseCast shadows.

Scene:spot_light

method
Scene:spot_light(opts: scene.SpotLightOptions) -> SceneNode

Spawn a spot light.

Example
-- A cone along direction; the angles are half-angles in radians.
scene:plane({ scale = vec3(10, 1, 10), color = color("#d3c6aa") })
scene:spot_light({
    pos = vec3(0, 4, 0),
    direction = vec3(0, -1, 0),
    intensity = 400000,
    inner_angle = 0.2,
    outer_angle = 0.4,
})

opts scene.SpotLightOptions options 8 keys, 3 inherited

KeyTypeDefaultDescription
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
directionVec3datumhue.math.vec3(0, -1, 0)Light direction.
rangenumber20Falloff range.
inner_anglenumber0Inner cone half-angle in radians.
outer_anglenumbermath.pi / 4Outer cone half-angle in radians.
From scene.LightOptions
colorColordatumhue.color(1, 1, 1)Light color.
intensitynumber1000Luminous intensity.
shadowsbooleanfalseCast shadows.

Scene:model

method
Scene:model(opts: scene.ModelOptions) -> SceneNode

Add an external glTF / GLB scene.

Example
local asset = datumhue.package:dir():read("robot.glb"):scene()
local robot = scene:model({
    asset = asset,
    rotation = datumhue.math.quat.from_rotation_y(math.pi),
    scale = vec3(0.5, 0.5, 0.5),
})

opts scene.ModelOptions options 4 keys

KeyTypeDefaultDescription
asset requiredSceneAssetno defaultExternal glTF / GLB scene asset (from file:read():scene() / dir:read(rel):scene()).
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
rotationQuatdatumhue.math.quat.identity()Rotation quaternion. Build with datumhue.math.quat.from_euler etc.
scaleVec3datumhue.math.vec3(1, 1, 1)Per-axis scale.

Scene:clear

method
Scene:clear()

Remove every node in the scene — meshes, models, lights, voxels, and groups (a parented child goes with its parent). The camera and its settings (background, ambient, fog, bloom, tonemapping, exposure) are kept.

Scene:remove

method
Scene:remove()

Remove the scene wholesale — every node, the camera and its settings, and any UI element mounting it — freeing its render target. Afterwards every other method and property of the handle raises, and calling remove again does nothing. Other handles still holding the texture (a shader channel, a material) keep the last rendered frame.

Scene:group

method
Scene:group(nodes: SceneNode[]) -> SceneNode

Group existing nodes under a new empty frame node and return it; moving or reparenting the frame moves the whole group (a shared transform frame).

Example
-- The new node sits at the origin; moving it moves both cubes.
local left = scene:cube({ pos = vec3(-1, 0.5, 0) })
local right = scene:cube({ pos = vec3(1, 0.5, 0) })
local pair = scene:group({ left, right })
pair.pos = vec3(0, 0, -2)
-- Each cube keeps its position, now relative to the group.
print(left.pos) --> vec3(-1.0, 0.5, 0.0)

Scene:sprite

method
Scene:sprite(opts: scene.SpriteOptions) -> SceneNode

Spawn a billboarded sprite: a textured quad turned to face the scene camera every frame. Pass either source (a Sprite from image:sprite/atlas:sprite) or image (a whole Image). The returned SceneNode carries the sprite-only properties billboard, size_mode, size, pivot, alpha, cutoff, color, flip_x, flip_y, shaded, and cell, alongside the usual node pos/visible/parent. While billboard is not none, that turn sets the node's rotation every frame, replacing any rotation assigned to it. Animate the atlas cell by binding a sprite animator, or by setting cell each frame.

Example
-- A 1 x 2 unit quad that turns to face the camera, its feet at pos.
local art = datumhue.image.new({ width = 16, height = 32 })
art:apply(datumhue.image.picture():fill(color("#a7c080")))
scene:sprite({
    image = art,
    pos = vec3(0, 0, 0),
    size = datumhue.math.vec2(1, 2),
})

opts scene.SpriteOptions options 13 keys

KeyTypeDefaultDescription
sourceSpriteimage gives the appearanceThe appearance to draw, from image:sprite() or atlas:sprite(i). Provide this or image, not both.
imageImagesource gives the appearanceA whole Image to draw, as an alternative to source. Provide this or source, not both.
posVec3datumhue.math.vec3(0, 0, 0)World-space position.
billboard"y_locked" | "full" | "none""y_locked"How the sprite turns to face the camera. y_locked stays upright, turning horizontally toward the camera — the 2.5D character look.
size_mode"world" | "screen""world"Whether size is measured in scene units or in constant on-screen pixels.
sizeVec2the source sprite's own size, else the cell aspect ratio at 1 scene unit tallQuad extent, in the unit chosen by size_mode.
pivotVec2datumhue.math.vec2(0.5, 0)Normalized anchor (x, y) in 0..1 (x rightward, y upward); the node position sits at this point. (0.5, 0) is bottom-center, feet on the floor.
alpha"cutout" | "blend" | "opaque" | "hash""cutout"How transparency is handled. cutout gives crisp alpha-tested edges that depth-sort correctly without draw-order dependence.
cutoffnumber0.5Alpha-test threshold for the cutout mode (0..1).
colorColorthe source sprite's own tint; white for an imageTint multiplied with the texture.
flip_xbooleanthe source sprite's own flip; none for an imageMirror horizontally.
flip_ybooleanthe source sprite's own flip; none for an imageMirror vertically.
shadedbooleanfalseLit by the scene's lights when true; full-bright (unlit) when false.

Scene:camera_relative_yaw

method
Scene:camera_relative_yaw(node: SceneNode) -> number

The horizontal angle (radians, -pi..pi) from node to the scene camera, in world space. Combine with the character's own facing to choose a directional sprite row.

Example
-- The camera starts at (0, 5, 10); this cube sits 10 units to its -X.
local guard = scene:cube({ pos = vec3(-10, 0.5, 10) })
-- Positions take effect at the end of the frame.
datumhue.time.wait_frames(1)
-- Radians about +Y, 0 when the camera is straight ahead in +Z.
print(scene:camera_relative_yaw(guard)) --> 1.5707963705062866

Scene:camera_yaw_bucket

method
Scene:camera_yaw_bucket(node: SceneNode, n: number) -> integer

The horizontal camera angle from node quantized to one of n evenly-spaced buckets (0..n-1, bucket 0 centered on the camera being straight ahead in +Z). Map the bucket to a directional sprite row, e.g. an 8-way character.

Example
-- The camera starts at (0, 5, 10); this cube sits 10 units to its -X.
local guard = scene:cube({ pos = vec3(-10, 0.5, 10) })
datumhue.time.wait_frames(1)
-- 0-based: bucket 0 is the camera straight ahead in +Z, 2 is +X.
print(scene:camera_yaw_bucket(guard, 8)) --> 2

Scene:raycast

method
Scene:raycast(ray: Ray) -> scene.RaycastHit?

Cast a ray into the scene. Returns the nearest of this scene's nodes it hits, or nil if the ray missed them all.

Example
local target = scene:cube({ pos = vec3(0, 0.5, 0) })
-- A new node can be hit once its frame has ended.
datumhue.time.wait_frames(1)
local ray = datumhue.math.ray(vec3(0, 0.5, 5), vec3(0, 0, -1))
local hit = scene:raycast(ray)
print(hit.node == target, hit.distance) --> true 4.5
print(hit.point, hit.normal) --> vec3(0.0, 0.5, 0.5) vec3(0.0, 0.0, 1.0)

returns scene.RaycastHit record 4 keys

KeyTypeDescription
nodeSceneNodeThe node the ray hit.
distancenumberDistance from the ray origin to the hit point.
pointVec3World-space hit point.
normalVec3Surface normal at the hit point.

Scene:screen_to_ray

method
Scene:screen_to_ray(x: number, y: number) -> Ray?

Convert viewport pixel coordinates to a world-space ray, or nil if off-screen. x/y are pixels in the scene's rendered image — origin top-left, Y-down, spanning the scene's own width and height at any resolution it renders at. No display-fit adjustment is applied: when the mounted element scales or letterboxes the scene, convert the cursor into image pixels first.

Example
-- Pixels of the scene's own 320 x 240 image: origin top left, Y down.
-- The camera can map pixels once its first frame has ended.
datumhue.time.wait_frames(1)
local ray = scene:screen_to_ray(160, 120)
-- The center pixel looks from the camera at (0, 5, 10) to the origin.
print(ray.direction) --> vec3(0.0, -0.44721364974975586, -0.89442718029022217)

Scene:mount

method
Scene:mount(options?: ui.ImageOptions) -> UiElement?

Mount this render target as a UI image element. Returns the new UiElement, or nil if the app has no UI.

Example
-- A second view of the same image, letterboxed into a square.
local thumb =
    scene:mount({ width = 120, height = 120, fit = "contain" })

options ui.ImageOptions options 41 keys, 34 inherited

KeyTypeDefaultDescription
parentUiElementthe app's content areaParent element.
materialShaderthe texture shows unprocessedShader material for post-processing.
fit"fill" | "contain" | "cover" | "scale_down" | "integer" | "sharp""fill"How the texture maps into the element box; aspect-preserving modes center in the box. "sharp" draws with its own shader, so it takes no material; neither "integer" nor "sharp" takes auto_size. "integer" scales a draw canvas's or scene's size in UI px, so on one whose texels are finer than that (a canvas without pixel_perfect on a HiDPI display, a scene) a texel covers a fraction of the multiple. Pair it with the source's filter set to "nearest".
auto_sizebooleanfalseFor a draw canvas or scene: resize it to the element's size in UI px whenever the element resizes, so what it draws keeps its size in UI px instead of scaling with the element. A scene renders at its own size, so this also keeps one sharp. Raises on a plain image, whose resolution is fixed (use fit).
accessible_labelstringthe image has no accessible nameAccessible name for assistive technology. Images carry no text, so unlike text-bearing widgets they derive no name of their own. Set it on images that convey meaning, and decorative on the rest.
decorativebooleanfalseKeeps the image out of what assistive technology reads, as alt="" does on the web: a screen reader passes over it. Set it on an image that only decorates, such as art beside text that says who or what it shows. Setting both this and accessible_label raises, and so does naming the image later.
tintColor | ThemedColorthe image shows its own colorsA color each texel is multiplied by, alpha included, so white leaves the image as it is and a lower alpha fades it. A theme token follows the theme.

Also takes every key of ui.NodeStyle (34 keys).

datumhue.com

(c) 2026 Shuusei AB. Quote excerpts of this manual, with attribution to DatumHue, in your own documentation, tutorials, course materials, reviews, and other writing or video. Republishing it in whole or in substantial part needs written permission: support@datumhue.com.

Victor Mono is licensed under the SIL Open Font License 1.1
Copyright (c) 2024, Rune Bjørnerås (https://github.com/rubjo)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Try

    ↑↓ selectEnter openTab filter

    Settings

    Theme
    Text
    Print

    Keyboard shortcuts

    / or Ctrl KSearch
    ↑ ↓ EnterPick a result
    TabNext result filter
    j kNext or previous entry
    [ ]Previous or next page
    yCopy a link to the current entry
    ?These shortcuts
    EscClose

    On this page