DatumHueEnterprise v0.0.24datumhue.com
Contents

handle27 methods, 1 fieldUI apps only

DrawCanvas

A vector-drawing surface returned by datumhue.draw.new. Hand it to canvas:mount(opts) to mount as a UI element, or call the primitive constructors to add drawables.

Obtained from
datumhue.draw.new
Accepted by
datumhue.material.standard, datumhue.shader.new, Material:set_source, Material:update, Shader:update, Shader:set_source, Shader:set_channel, DataHandle:view and 2 more

The examples on this page start from:

lua
local vec2 = datumhue.math.vec2
local vec3 = datumhue.math.vec3
local color = datumhue.color
local canvas = datumhue.draw.new({ background = color("#2d353b") })
canvas:mount({ width = 400, height = 300 })

Fields 1

FieldTypeAccessDescription
filterimage.Filterread/writeTexture sampling mode for this canvas wherever it is drawn (a UI mount, canvas:image, a shader channel). Set nearest to keep pixel art crisp when the canvas is scaled up; the default smooths.

Methods 27

DrawCanvas:rect

method
DrawCanvas:rect(opts: draw.RectOptions) -> DrawPrimitive

Draw a rectangle.

Example
canvas:rect({
    pos = vec2(-60, -40),
    width = 120,
    height = 80,
    color = color("#7fbbb3"),
    filled = false,
    stroke_width = 4,
})

opts draw.RectOptions options 7 keys, 4 inherited

KeyTypeDefaultDescription
posVec2 | Vec3datumhue.math.vec2(0, 0)Bottom-left position; without an explicit z the shape auto-stacks in creation order.
widthnumber50Rectangle width in pixels.
heightnumber50Rectangle height in pixels.
From draw.DrawShapeOptions
colorColordatumhue.color(1, 1, 1)Fill/stroke color.
filledbooleantrueFill the shape rather than stroke it.
stroke_widthnumber2Stroke width in pixels when not filled.
materialShaderthe standard flat materialShader handle to apply.

DrawCanvas:circle

method
DrawCanvas:circle(opts: draw.CircleOptions) -> DrawPrimitive

Draw a circle.

Example
canvas:circle({
    pos = vec2(0, 0),
    radius = 40,
    color = color("#a7c080"),
})

opts draw.CircleOptions options 6 keys, 4 inherited

KeyTypeDefaultDescription
posVec2 | Vec3datumhue.math.vec2(0, 0)Center position; without an explicit z the shape auto-stacks in creation order.
radiusnumber25Circle radius in pixels.
From draw.DrawShapeOptions
colorColordatumhue.color(1, 1, 1)Fill/stroke color.
filledbooleantrueFill the shape rather than stroke it.
stroke_widthnumber2Stroke width in pixels when not filled.
materialShaderthe standard flat materialShader handle to apply.

DrawCanvas:ellipse

method
DrawCanvas:ellipse(opts: draw.EllipseOptions) -> DrawPrimitive

Draw an ellipse.

Example
canvas:ellipse({
    pos = vec2(0, 0),
    rx = 90,
    ry = 30,
    color = color("#dbbc7f"),
})

opts draw.EllipseOptions options 7 keys, 4 inherited

KeyTypeDefaultDescription
posVec2 | Vec3datumhue.math.vec2(0, 0)Center position; without an explicit z the shape auto-stacks in creation order.
rxnumber50Horizontal radius in pixels.
rynumber25Vertical radius in pixels.
From draw.DrawShapeOptions
colorColordatumhue.color(1, 1, 1)Fill/stroke color.
filledbooleantrueFill the shape rather than stroke it.
stroke_widthnumber2Stroke width in pixels when not filled.
materialShaderthe standard flat materialShader handle to apply.

DrawCanvas:line

method
DrawCanvas:line(opts: draw.LineOptions) -> DrawPrimitive

Draw a line.

Example
canvas:line({
    from = vec2(-100, -60),
    to = vec2(100, 60),
    color = color("#e67e80"),
    width = 3,
})

opts draw.LineOptions options 4 keys

KeyTypeDefaultDescription
fromVec2 | Vec3datumhue.math.vec2(0, 0)Start point.
toVec2 | Vec3datumhue.math.vec2(100, 100)End point. The line renders at one depth: the first explicit z among the endpoints, else it auto-stacks in creation order.
colorColordatumhue.color(1, 1, 1)Line color.
widthnumber1Line width in pixels.

DrawCanvas:polygon

method
DrawCanvas:polygon(opts: draw.PolygonOptions) -> DrawPrimitive

Draw a polygon. Supports convex and simple concave polygons.

Example
canvas:polygon({
    points = { vec2(-50, -40), vec2(50, -40), vec2(0, 50) },
    color = color("#d699b6"),
})

opts draw.PolygonOptions options 6 keys, 4 inherited

KeyTypeDefaultDescription
points requiredVec2[]no defaultVertices (array of vec2, min 3).
znumberthe shape auto-stacks in creation orderDepth ordering.
From draw.DrawShapeOptions
colorColordatumhue.color(1, 1, 1)Fill/stroke color.
filledbooleantrueFill the shape rather than stroke it.
stroke_widthnumber2Stroke width in pixels when not filled.
materialShaderthe standard flat materialShader handle to apply.

DrawCanvas:rrect

method
DrawCanvas:rrect(opts: draw.RrectOptions) -> DrawPrimitive

Draw a rounded rectangle.

Example
canvas:rrect({
    pos = vec2(-80, -30),
    width = 160,
    height = 60,
    radius = 16,
    color = color("#83c092"),
})

opts draw.RrectOptions options 8 keys, 4 inherited

KeyTypeDefaultDescription
posVec2 | Vec3datumhue.math.vec2(0, 0)Bottom-left position; without an explicit z the shape auto-stacks in creation order.
widthnumber100Rectangle width in pixels.
heightnumber50Rectangle height in pixels.
radiusnumber10Corner radius in pixels.
From draw.DrawShapeOptions
colorColordatumhue.color(1, 1, 1)Fill/stroke color.
filledbooleantrueFill the shape rather than stroke it.
stroke_widthnumber2Stroke width in pixels when not filled.
materialShaderthe standard flat materialShader handle to apply.

DrawCanvas:arc

method
DrawCanvas:arc(opts: draw.ArcOptions) -> DrawPrimitive

Draw an arc: a pie slice when filled, a curve when stroked.

Example
-- Filled, it is a pie slice: here all but the quarter facing +x.
canvas:arc({
    radius = 60,
    start_angle = math.pi / 4,
    end_angle = 7 * math.pi / 4,
    color = color("#dbbc7f"),
})

opts draw.ArcOptions options 8 keys, 4 inherited

KeyTypeDefaultDescription
posVec2 | Vec3datumhue.math.vec2(0, 0)Center position; without an explicit z the shape auto-stacks in creation order.
radiusnumber50Arc radius in pixels.
start_anglenumber0Start angle in radians (0 = +x axis, increasing counterclockwise).
end_anglenumbermath.pi / 2End angle in radians.
From draw.DrawShapeOptions
colorColordatumhue.color(1, 1, 1)Fill/stroke color.
filledbooleantrueFill the shape rather than stroke it.
stroke_widthnumber2Stroke width in pixels when not filled.
materialShaderthe standard flat materialShader handle to apply.

DrawCanvas:text

method
DrawCanvas:text(opts: draw.TextOptions) -> DrawPrimitive

Draw text.

Example
canvas:text({
    pos = vec2(-100, 20),
    text = "Drawn text wraps at its max width",
    font_size = 20,
    max_width = 200,
    align = "center",
    color = color("#7fbbb3"),
})

opts draw.TextOptions options 10 keys

KeyTypeDefaultDescription
posVec2 | Vec3datumhue.math.vec2(0, 0)Top-left position; without an explicit z the text auto-stacks in creation order.
text requiredstringno defaultText content.
font_sizenumber | string16Font size: a number (pixels) or a unit string like "1.5rem"/"50vw"/"4vmin".
colorColordatumhue.color(1, 1, 1)Text color.
max_widthnumberlines do not wrapMaximum line width in pixels; longer lines wrap.
align"left" | "center" | "right" | "justified""left"Horizontal alignment.
linebreak"word" | "character" | "word_or_character" | "none""word"Line-break mode.
font_weightnumber | "thin" | "extralight" | "light" | "regular" | "normal" | "medium" | "semibold" | "bold"the theme's normal text weightFont weight: a number on the variable weight axis, or a weight name (bold is the heaviest).
font_style"normal" | "italic" | "oblique""normal"Font face: upright, the calligraphic cursive, or a mechanical slant.
spans(draw.TextSpan | DrawPrimitive)[]the text is one plain runRich-text spans: each entry is a span table or a detached span handle.

DrawCanvas:sprite

method
DrawCanvas:sprite(sprite: Sprite, opts?: draw.CanvasSpriteOptions) -> DrawPrimitive

Draw a Sprite (from image:sprite / atlas:sprite) onto this canvas as a textured quad (physics, shaders, and canvas:point_query work on it as on any primitive). The returned primitive's cell property repoints the atlas cell to animate. To draw a whole image or another render target, use canvas:image.

Example
local arrow = datumhue.image.new({ width = 16, height = 16 })
local pic = datumhue.image.picture()
arrow:apply(pic:trifill(0, 15, 15, 15, 8, 0, color("#dbbc7f")))
arrow.filter = "nearest"
canvas:sprite(arrow:sprite(), {
    pos = vec3(0, 0, 0),
    rotation = math.pi / 4,
    scale = vec2(6, 6),
})

opts draw.CanvasSpriteOptions options 5 keys

KeyTypeDefaultDescription
posVec3datumhue.math.vec3(0, 0, 0)Center position in draw space.
rotationnumber0Rotation in radians, counter-clockwise.
scaleVec2datumhue.math.vec2(1, 1)Per-axis scale.
sizeVec2the sprite's or source's own size; for a render target, its logical sizeRendered size in draw units (width, height), overriding the sprite's or source's own size.
materialShaderthe plain textured quadShader material to render with. 2D surfaces take a Shader; Material handles are 3D-only.

DrawCanvas:image

method
DrawCanvas:image(source: Image | DrawCanvas | Scene, opts?: draw.CanvasSpriteOptions) -> DrawPrimitive

Draw a whole Image, or another DrawCanvas / Scene render target, onto this canvas as a textured quad (picture-in-picture).

Example
local photo = datumhue.image.new({ width = 2, height = 2 })
local pic = datumhue.image.picture()
pic:set(0, 0, color("#e67e80")):set(1, 1, color("#7fbbb3"))
photo:apply(pic)
photo.filter = "nearest"
canvas:image(photo, { pos = vec3(-70, 0, 0), size = vec2(96, 96) })
-- Another canvas draws the same way, picture in picture.
local inset = datumhue.draw.new({ width = 96, height = 96 })
inset:circle({ radius = 40, color = color("#a7c080") })
canvas:image(inset, { pos = vec3(70, 0, 0) })

opts draw.CanvasSpriteOptions options 5 keys

KeyTypeDefaultDescription
posVec3datumhue.math.vec3(0, 0, 0)Center position in draw space.
rotationnumber0Rotation in radians, counter-clockwise.
scaleVec2datumhue.math.vec2(1, 1)Per-axis scale.
sizeVec2the sprite's or source's own size; for a render target, its logical sizeRendered size in draw units (width, height), overriding the sprite's or source's own size.
materialShaderthe plain textured quadShader material to render with. 2D surfaces take a Shader; Material handles are 3D-only.

DrawCanvas:tilemap

method
DrawCanvas:tilemap(atlas: Atlas, opts: draw.TilemapOptions) -> TileMap

Create a tilemap that draws onto this canvas from an Atlas. Returns a TileMap; set cells with tilemap:set(x, y, index) (atlas cell index) and read them with tilemap:get(x, y).

Example
-- A cell of the built-in font is its character code minus 32.
local font = datumhue.image.font()
local map = canvas:tilemap(font, { columns = 5, rows = 1 })
for x, code in ipairs({ string.byte("HELLO", 1, -1) }) do
    map:set(x - 1, 0, code - 32)
end

opts draw.TilemapOptions options 2 keys

KeyTypeDefaultDescription
columns requirednumberno defaultNumber of columns in the grid.
rows requirednumberno defaultNumber of rows in the grid.

DrawCanvas:clear

method
DrawCanvas:clear()

Remove all primitives on the canvas (hand-drawn shapes, text, images, and chart marks/axes/legends). Plot areas survive but their rendered content is gone.

DrawCanvas:remove

method
DrawCanvas:remove()

Remove the canvas and everything it hosts — primitives, chart content, plot areas, 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.

DrawCanvas:resize

method
DrawCanvas:resize(width: number, height: number)

Resize the canvas render texture. Existing primitives survive (world-space coordinates); any UI element displaying the canvas picks up the new size.

DrawCanvas:set_camera

method
DrawCanvas:set_camera(opts: draw.SetCameraOptions)

Move or zoom the 2D camera.

Example
-- Center the view on (100, 0) and show it twice as large.
canvas:set_camera({ pos = vec2(100, 0), zoom = 2 })

opts draw.SetCameraOptions options 2 keys

KeyTypeDefaultDescription
posVec2the camera keeps its current centerCamera center in draw coordinates.
zoomnumberthe camera keeps its current zoomZoom factor (>1 in, <1 out).

DrawCanvas:enable_pan_zoom

method
DrawCanvas:enable_pan_zoom(opts: draw.PanZoomOptions)

Drive this canvas's camera from the mouse: drag to pan, scroll to zoom (around the cursor). Replaces any prior pan/zoom config on the canvas; call disable_pan_zoom to stop.

Example
canvas:enable_pan_zoom({
    pan_button = "middle",
    min_zoom = 0.5,
    max_zoom = 4,
})

opts draw.PanZoomOptions options 5 keys

KeyTypeDefaultDescription
pan_button"left" | "right" | "middle" | "back" | "forward""left"Mouse button that pans while dragged.
zoombooleantrueEnable scroll-wheel zoom.
zoom_stepnumber1.1Multiplicative zoom change per scroll notch, > 1.
min_zoomnumber0.1Smallest zoom factor, where 1 is the canvas's default framing.
max_zoomnumber10Largest zoom factor.

DrawCanvas:disable_pan_zoom

method
DrawCanvas:disable_pan_zoom()

Stop driving this canvas's camera from the mouse.

DrawCanvas:screen_to_world

method
DrawCanvas:screen_to_world(pos: Vec2) -> Vec2?

Convert element-relative cursor pixels (Y-down) to draw coordinates (Y-up), accounting for camera pan/zoom and the canvas's on-screen placement (letterbox / scale). Returns nil if the canvas is invalid.

Example
-- The element's top-left pixel is the canvas's top-left corner.
print(canvas:screen_to_world(vec2(0, 0))) --> vec2(-200.0, 150.0)

DrawCanvas:world_to_screen

method
DrawCanvas:world_to_screen(pos: Vec2) -> Vec2?

Convert draw coordinates to element-relative screen pixels, accounting for camera pan/zoom and the canvas's on-screen placement (letterbox / scale).

Example
print(canvas:world_to_screen(vec2(0, 0))) --> vec2(200.0, 150.0)

DrawCanvas:group

method
DrawCanvas:group(primitives: DrawPrimitive[]) -> DrawPrimitive

Group primitives so they move, hide, and fade as a unit. Nested groups supported. group:remove() removes the group and every primitive in it.

Example
local head = canvas:circle({ radius = 30, color = color("#a7c080") })
local eye = canvas:circle({
    pos = vec2(10, 10),
    radius = 6,
    color = color("#e67e80"),
})
local face = canvas:group({ head, eye })
face:update({ pos = vec2(80, 0) })

DrawCanvas:body

method
DrawCanvas:body(opts: draw.BodyOptions) -> DrawPrimitive

Spawn an invisible physics-only body on the canvas. Returns a handle with all physics methods but no visual representation; it takes the add_body() options, and with nothing drawn, omitted sizes are 1 and an omitted radius is 0.5.

Example
-- An invisible floor along the bottom edge.
local floor = canvas:body({
    pos = vec2(0, -140),
    type = "static",
    shape = "rect",
    width = 400,
    height = 20,
})

opts draw.BodyOptions options 19 keys, 18 inherited

KeyTypeDefaultDescription
pos requiredVec3no defaultInitial world position of the body (vec3; vec2 accepted, z = 0).

Also takes every key of physics.BodyOptions (18 keys).

DrawCanvas:path

method
DrawCanvas:path() -> PathBuilder

Create a path builder for arbitrary shapes with bezier curves. The returned builder accepts chainable :move_to / :line_to / :quad_to / :cubic_to / :close calls and is committed with :fill(...) or :stroke(...).

DrawCanvas:point_query

method
DrawCanvas:point_query(point: Vec2) -> DrawPrimitive?

Return the topmost primitive whose drawn shape covers point (canvas-local world space — pipe a cursor through canvas:screen_to_world first), or nil if none. Tests the rendered geometry: a filled shape is hit on its interior, a stroked shape on its outline. Hidden primitives, text, and groups are not hit; for a primitive inside a group, walk .parent to reach the group.

Example
local dot = canvas:circle({ radius = 20 })
-- A new shape can be hit from the next frame on.
datumhue.time.wait_frames(1)
print(canvas:point_query(vec2(5, 5)) == dot) --> true
print(canvas:point_query(vec2(100, 100))) --> nil

DrawCanvas:point_query_all

method
DrawCanvas:point_query_all(point: Vec2) -> DrawPrimitive[]

Every primitive whose drawn shape covers point (canvas-local world space), topmost first; empty when nothing is hit. Same geometry rules as point_query.

Example
local back = canvas:circle({ radius = 40 })
local front = canvas:circle({ pos = vec3(0, 0, 1), radius = 20 })
datumhue.time.wait_frames(1)
local hits = canvas:point_query_all(vec2(0, 0))
print(#hits, hits[1] == front, hits[2] == back) --> 2 true true

DrawCanvas:mount

method
DrawCanvas: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
canvas:circle({ radius = 40, color = color("#a7c080") })
-- A second view of the same canvas, letterboxed into its box. It
-- repeats the first, so it is decorative: screen readers pass over it.
canvas:mount({
    width = 240,
    height = 80,
    fit = "contain",
    decorative = true,
})

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).

DrawCanvas:chart

method
DrawCanvas:chart(options: chart.CanvasChartOptions) -> PlotArea

Carve a PlotArea out of this canvas for charting. Its primitives draw in fixed layers, back to front: the background, grid lines, area fills, lines, bars (with histograms, heatmaps and box plots), points, reference rules and bands, text annotations, axes and the title, then legends. No option sets a z; within a layer, a later primitive draws over an earlier one. Removing the canvas removes the area. Raises if the canvas was removed.

Example
-- A plot area over the right half of the canvas.
local plot = canvas:chart({
    pos = vec3(0, -150, 0),
    width = 200,
    height = 300,
    margin = { left = 30, bottom = 20 },
    background = color("#7fbbb3"),
})

options chart.CanvasChartOptions options 7 keys

KeyTypeDefaultDescription
posVec3datumhue.math.vec3(0, 0, 0)Bottom-left corner of the plot area within the canvas (Y-up, center origin).
widthnumber0Plot area width in canvas units. At 0 or less, the area covers the canvas and follows its size.
heightnumber0Plot area height in canvas units. At 0 or less, the area covers the canvas and follows its size.
marginchart.Marginno marginInner margins reserved for axes / labels.
x_scaleScalea linear scale of the area's own, fit to its marksScale handle mapping data values to the X axis.
y_scaleScalea linear scale of the area's own, fit to its marksScale handle mapping data values to the Y axis.
backgroundColorthe theme's chart background, restyled on a theme switchBackground fill color for the plot area.

DrawCanvas:charts

method
DrawCanvas:charts(options: chart.CanvasChartsOptions) -> PlotArea[]

Carve a rows x cols grid of PlotAreas out of this canvas for faceting / subplots, returned row-major from the top-left. Pass a shared x_scale / y_scale handle to link the cells' axes. Raises if the canvas was removed.

Example
local cells = canvas:charts({
    rows = 1,
    columns = 2,
    pos = vec3(-200, -150, 0),
    width = 400,
    height = 300,
    background = color("#83c092"),
})
print(#cells) --> 2

options chart.CanvasChartsOptions options 10 keys

KeyTypeDefaultDescription
rows requiredintegerno defaultGrid rows.
columns requiredintegerno defaultGrid columns.
posVec3datumhue.math.vec3(0, 0, 0)Bottom-left corner of the whole grid within the canvas (Y-up, center origin).
width requirednumberno defaultTotal grid width in canvas units; cells divide it evenly after gap.
height requirednumberno defaultTotal grid height in canvas units; cells divide it evenly after gap.
gapnumber16Spacing between cells.
marginchart.Marginno marginInner margins reserved for axes / labels, per cell.
x_scaleScalean independent scale per cellOne X scale shared by every cell — pan / zoom on any cell moves all of them.
y_scaleScalean independent scale per cellOne Y scale shared by every cell.
backgroundColorthe theme's chart background, restyled on a theme switchBackground fill color, per cell.

Types 1

chart.Margin

options

options 4 keys

KeyTypeDefaultDescription
topnumber0Top inset.
rightnumber0Right inset.
bottomnumber0Bottom inset.
leftnumber0Left inset.

Nested in: chart.CanvasChartOptions, chart.CanvasChartsOptions

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