From 8ea76a8e0991ceae7ba2219426a5bf386b790073 Mon Sep 17 00:00:00 2001 From: JupiterRider <60042618+JupiterRider@users.noreply.github.com> Date: Sun, 3 Nov 2024 12:29:12 +0100 Subject: [PATCH 1/5] golang.org/x/exp is not in your go.mod file --- examples/go.mod | 1 + examples/go.sum | 2 ++ 2 files changed, 3 insertions(+) diff --git a/examples/go.mod b/examples/go.mod index e1f47a1..948c9e4 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -21,5 +21,6 @@ require ( require ( github.com/ebitengine/purego v0.7.1 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect golang.org/x/sys v0.20.0 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 19ef93f..ed625b8 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -4,5 +4,7 @@ github.com/jakecoffman/cp v1.2.1 h1:zkhc2Gpo9l4NLUZfeG3j33+3bQD7MkqPa+n5PdX+5mI= github.com/jakecoffman/cp v1.2.1/go.mod h1:JjY/Fp6d8E1CHnu74gWNnU0+b9VzEdUVPoJxg2PsTQg= github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b h1:+67TGbwfgeB5o03Rx+ZBW44zAQ+wUujcwdRA0p9CbJI= github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b/go.mod h1:kvKwD9codtns5mvpA53V3vLnqFb/Ahcu8zgkGM0SIbI= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= From 893dfa5f8539e07cd9a8118d3b54ae4ad55798dc Mon Sep 17 00:00:00 2001 From: JupiterRider <60042618+JupiterRider@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:13:14 +0100 Subject: [PATCH 2/5] GenImageFontAtlas function added to cgo version as well --- raylib/rtext.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/raylib/rtext.go b/raylib/rtext.go index 25f980d..d1ffd2e 100644 --- a/raylib/rtext.go +++ b/raylib/rtext.go @@ -223,3 +223,13 @@ func GetGlyphAtlasRec(font Font, codepoint int32) Rectangle { v := newRectangleFromPointer(unsafe.Pointer(&ret)) return v } + +// GenImageFontAtlas - Generate image font atlas using chars info +func GenImageFontAtlas(glyphs []GlyphInfo, glyphRecs []*Rectangle, fontSize int32, padding int32, packMethod int32) Image { + cglyphs := (*C.GlyphInfo)(unsafe.Pointer(&glyphs[0])) + cglyphRecs := (**C.Rectangle)(unsafe.Pointer(&glyphRecs[0])) + cglyphCount := C.int(len(glyphs)) + ret := C.GenImageFontAtlas(cglyphs, cglyphRecs, cglyphCount, C.int(fontSize), C.int(padding), C.int(packMethod)) + v := newImageFromPointer(unsafe.Pointer(&ret)) + return *v +} From 735af12e7fc9469d536d1f751a4ca7b6b99dfcfd Mon Sep 17 00:00:00 2001 From: JupiterRider <60042618+JupiterRider@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:36:07 +0100 Subject: [PATCH 3/5] update LoadFontData: codePoints can now be nil, codepointCount defaults to 95 (like C raylib does) --- raylib/raylib_purego.go | 7 +++++-- raylib/rtext.go | 10 +++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/raylib/raylib_purego.go b/raylib/raylib_purego.go index 73f83bb..e94af0c 100644 --- a/raylib/raylib_purego.go +++ b/raylib/raylib_purego.go @@ -2900,9 +2900,12 @@ func IsFontReady(font Font) bool { } // LoadFontData - Load font data for further use -func LoadFontData(fileData []byte, fontSize int32, codepoints []rune, typ int32) []GlyphInfo { +func LoadFontData(fileData []byte, fontSize int32, codepoints []rune, codepointCount, typ int32) []GlyphInfo { dataSize := int32(len(fileData)) - codepointCount := int32(len(codepoints)) + // In case no chars count provided, default to 95 + if codepointCount <= 0 { + codepointCount = 95 + } ret := loadFontData(fileData, dataSize, fontSize, codepoints, codepointCount, typ) return unsafe.Slice(ret, codepointCount) } diff --git a/raylib/rtext.go b/raylib/rtext.go index d1ffd2e..1e0c305 100644 --- a/raylib/rtext.go +++ b/raylib/rtext.go @@ -101,12 +101,16 @@ func IsFontReady(font Font) bool { } // LoadFontData - Load font data for further use -func LoadFontData(fileData []byte, fontSize int32, codePoints []int32, typ int32) []GlyphInfo { +func LoadFontData(fileData []byte, fontSize int32, codePoints []rune, codepointCount, typ int32) []GlyphInfo { cfileData := (*C.uchar)(unsafe.Pointer(&fileData[0])) cdataSize := (C.int)(len(fileData)) cfontSize := (C.int)(fontSize) - ccodePoints := (*C.int)(unsafe.Pointer(&codePoints[0])) - ccodePointCount := (C.int)(len(codePoints)) + ccodePoints := (*C.int)(unsafe.SliceData(codePoints)) + // In case no chars count provided, default to 95 + if codepointCount <= 0 { + codepointCount = 95 + } + ccodePointCount := (C.int)(codepointCount) ctype := (C.int)(typ) ret := C.LoadFontData(cfileData, cdataSize, cfontSize, ccodePoints, ccodePointCount, ctype) v := unsafe.Slice((*GlyphInfo)(unsafe.Pointer(ret)), ccodePointCount) From 549dbcf4d846584abec4960b01b8b40f6071eee5 Mon Sep 17 00:00:00 2001 From: JupiterRider <60042618+JupiterRider@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:38:02 +0100 Subject: [PATCH 4/5] SDF-font loading example added --- examples/text/font_sdf/AnonymousPro-Bold.ttf | Bin 0 -> 107832 bytes examples/text/font_sdf/OFL.txt | 94 ++++++++++++++++ examples/text/font_sdf/main.go | 106 +++++++++++++++++++ examples/text/font_sdf/sdf.fs | 26 +++++ 4 files changed, 226 insertions(+) create mode 100644 examples/text/font_sdf/AnonymousPro-Bold.ttf create mode 100644 examples/text/font_sdf/OFL.txt create mode 100644 examples/text/font_sdf/main.go create mode 100644 examples/text/font_sdf/sdf.fs diff --git a/examples/text/font_sdf/AnonymousPro-Bold.ttf b/examples/text/font_sdf/AnonymousPro-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f14c18c15686555f87d27352e33d071dc642ca82 GIT binary patch literal 107832 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 Al>h($ literal 0 HcmV?d00001 diff --git a/examples/text/font_sdf/OFL.txt b/examples/text/font_sdf/OFL.txt new file mode 100644 index 0000000..d89cf45 --- /dev/null +++ b/examples/text/font_sdf/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2009, Mark Simonson (http://www.ms-studio.com, mark@marksimonson.com), +with Reserved Font Name Anonymous Pro. + +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: +https://openfontlicense.org + + +----------------------------------------------------------- +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. diff --git a/examples/text/font_sdf/main.go b/examples/text/font_sdf/main.go new file mode 100644 index 0000000..a626512 --- /dev/null +++ b/examples/text/font_sdf/main.go @@ -0,0 +1,106 @@ +package main + +import ( + _ "embed" + "fmt" + "unsafe" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +//go:embed AnonymousPro-Bold.ttf +var fileData []byte + +func main() { + // Initialization + const screenWidth, screenHeight = 800, 450 + rl.InitWindow(screenWidth, screenHeight, "raylib [text] example - SDF fonts") + defer rl.CloseWindow() // Close window and OpenGL context + + // NOTE: Textures/Fonts MUST be loaded after Window initialization (OpenGL context is required) + + const msg = "Signed Distance Fields" + + // Default font generation from TTF font + fontDefault := rl.Font{BaseSize: 16, CharsCount: 95} + defer rl.UnloadFont(fontDefault) // Default font unloading + + // Loading font data from memory data + // Parameters > font size: 16, no glyphs array provided (nil), glyphs count: 95 (autogenerate chars array) + glyphs := rl.LoadFontData(fileData, 16, nil, 95, rl.FontDefault) + fontDefault.Chars = &glyphs[0] + + // Parameters > font size: 16, glyphs padding in image: 4 px, pack method: 0 (default) + atlas := rl.GenImageFontAtlas(unsafe.Slice(fontDefault.Chars, fontDefault.CharsCount), unsafe.Slice(&fontDefault.Recs, fontDefault.CharsCount), 16, 4, 0) + fontDefault.Texture = rl.LoadTextureFromImage(&atlas) + rl.UnloadImage(&atlas) + + // SDF font generation from TTF font + fontSDF := rl.Font{BaseSize: 16, CharsCount: 95} + defer rl.UnloadFont(fontSDF) // SDF font unloading + + // Parameters > font size: 16, no glyphs array provided (nil), glyphs count: 0 (defaults to 95) + glyphsSDF := rl.LoadFontData(fileData, 16, nil, 0, rl.FontSdf) + fontSDF.Chars = &glyphsSDF[0] + // Parameters > font size: 16, glyphs padding in image: 0 px, pack method: 1 (Skyline algorithm) + atlas = rl.GenImageFontAtlas(unsafe.Slice(fontSDF.Chars, fontSDF.CharsCount), unsafe.Slice(&fontSDF.Recs, fontSDF.CharsCount), 16, 0, 1) + fontSDF.Texture = rl.LoadTextureFromImage(&atlas) + rl.UnloadImage(&atlas) + + // Load SDF required shader (we use default vertex shader) + shader := rl.LoadShader("", "sdf.fs") + defer rl.UnloadShader(shader) // Unload SDF shader + rl.SetTextureFilter(fontSDF.Texture, rl.FilterBilinear) // Required for SDF font + + fontPosition := rl.NewVector2(40, screenHeight/2.0-50) + textSize := rl.Vector2Zero() + fontSize := float32(16) + currentFont := 0 // 0 - fontDefault, 1 - fontSDF + + rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second + + // Main game loop + for !rl.WindowShouldClose() { // Detect window close button or ESC key + fontSize += rl.GetMouseWheelMove() * 8.0 + + if fontSize < 6 { + fontSize = 6 + } + + if rl.IsKeyDown(rl.KeySpace) { + currentFont = 1 + textSize = rl.MeasureTextEx(fontSDF, msg, fontSize, 0) + } else { + currentFont = 0 + textSize = rl.MeasureTextEx(fontDefault, msg, fontSize, 0) + } + + fontPosition.X = float32(rl.GetScreenWidth()/2) - textSize.X/2 + fontPosition.Y = float32(rl.GetScreenHeight()/2) - textSize.Y/2 + 80 + + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + if currentFont == 1 { + // NOTE: SDF fonts require a custom SDf shader to compute fragment color + rl.BeginShaderMode(shader) // Activate SDF font shader + rl.DrawTextEx(fontSDF, msg, fontPosition, fontSize, 0, rl.Black) + rl.EndShaderMode() // Activate our default shader for next drawings + rl.DrawTexture(fontSDF.Texture, 10, 10, rl.Black) + rl.DrawText("SDF!", 320, 20, 80, rl.Red) + } else { + rl.DrawTextEx(fontDefault, msg, fontPosition, fontSize, 0, rl.Black) + rl.DrawTexture(fontDefault.Texture, 10, 10, rl.Black) + rl.DrawText("default font", 315, 40, 30, rl.Gray) + } + + rl.DrawText("FONT SIZE: 16.0", int32(rl.GetScreenWidth()-240), 20, 20, rl.DarkGray) + rl.DrawText(fmt.Sprintf("RENDER SIZE: %02.02f", fontSize), int32(rl.GetScreenWidth()-240), 50, 20, rl.DarkGray) + rl.DrawText("Use MOUSE WHEEL to SCALE TEXT!", int32(rl.GetScreenWidth()-240), 90, 10, rl.DarkGray) + + rl.DrawText("HOLD SPACE to USE SDF FONT VERSION!", 340, int32(rl.GetScreenHeight()-30), 20, rl.Maroon) + + rl.EndDrawing() + + } +} diff --git a/examples/text/font_sdf/sdf.fs b/examples/text/font_sdf/sdf.fs new file mode 100644 index 0000000..545f450 --- /dev/null +++ b/examples/text/font_sdf/sdf.fs @@ -0,0 +1,26 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; +in vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables + +void main() +{ + // Texel color fetching from texture sampler + // NOTE: Calculate alpha using signed distance field (SDF) + float distanceFromOutline = texture(texture0, fragTexCoord).a - 0.5; + float distanceChangePerFragment = length(vec2(dFdx(distanceFromOutline), dFdy(distanceFromOutline))); + float alpha = smoothstep(-distanceChangePerFragment, distanceChangePerFragment, distanceFromOutline); + + // Calculate final fragment color + finalColor = vec4(fragColor.rgb, fragColor.a*alpha); +} From 8c4ce9e206093e9f083e068f46a8890f7e2d5ce5 Mon Sep 17 00:00:00 2001 From: JupiterRider <60042618+JupiterRider@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:40:48 +0100 Subject: [PATCH 5/5] remove trailing whitespace and carriage return in License file --- examples/text/font_sdf/OFL.txt | 188 ++++++++++++++++----------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/examples/text/font_sdf/OFL.txt b/examples/text/font_sdf/OFL.txt index d89cf45..45b11f5 100644 --- a/examples/text/font_sdf/OFL.txt +++ b/examples/text/font_sdf/OFL.txt @@ -1,94 +1,94 @@ -Copyright (c) 2009, Mark Simonson (http://www.ms-studio.com, mark@marksimonson.com), -with Reserved Font Name Anonymous Pro. - -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: -https://openfontlicense.org - - ------------------------------------------------------------ -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. +Copyright (c) 2009, Mark Simonson (http://www.ms-studio.com, mark@marksimonson.com), +with Reserved Font Name Anonymous Pro. + +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: +https://openfontlicense.org + + +----------------------------------------------------------- +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.