bwip-angular2
Version:
JavaScript barcode generator supporting over 90 types and standards.
138 lines (123 loc) • 4.27 kB
JavaScript
// bwip-js/node-fonts.js
//
// node-js font lib interface
//
// This is part of the bwip-js project available at:
//
// http://metafloor.github.io/bwip-js
//
// Copyright (c) 2011-2018 Mark Warren
//
// The MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
;
var fs = require('fs');
var monochr = false;
// Load the font description files
var fontmap = {
names:{},
fontsets:[],
};
(function() {
try {
for (var i = 0; i < 10; i++) {
var font = require('./fonts/fnt' + i + '-desc');
fontmap.names[font.name.toUpperCase()] = i; // font-name to font-id
fontmap.fontsets[i] = font; // font-id to font-descriptor
}
} catch (e) {
if (!e.code || e.code != 'MODULE_NOT_FOUND') {
console.log(e);
}
}
})();
// bwipjs needs the following interfaces:
// lookup(fontname) returns fontid
// monochrome(bool) set the fonts to monochrome or anti-aliased
// getglyph(fontid, charcode, width, height)
module.exports = {
lookup:lookup,
monochrome:monochrome,
getglyph:getglyph,
}
function lookup(name) {
var fontid = fontmap.names[name.toUpperCase()];
return fontid === undefined ? 1 : fontid; // OCR B default
}
function monochrome(mono) {
monochr = mono;
}
// `width` and `height` are the same size, scaled respectively by the
// x,y factors. Because bar code width is what we care about, font
// width is the only metric we use to match the font.
function getglyph(fontid, charcode, width, height) {
if (fontid < 0 || fontid >= fontmap.fontsets.length) {
fontid = 1; // OCR B default
}
var fontset = fontmap.fontsets[fontid];
if (width < fontset.minsize) {
width = fontset.minsize;
} else if (width > fontset.maxsize) {
width = fontset.maxsize;
}
// Find the largest size not exceeding
var size = width;
while (size > 5 && !fontset.sizes[size]) {
size--;
}
if (size == 5) {
throw 'font-size too small (' + width + ')';
}
var fkey = (monochr ? 'm' : 'a') + size;
var font = fontset.fonts[fkey];
// demand-load the font file
if (!font) {
// We can avoid this Sync() interface (the browser version does), but
// requires more work for the user.
var fontdir = process.env.BWIPJS_FONTS || __dirname + '/fonts';
if (fontdir[fontdir.length-1] == '/') {
fontdir = fontdir.substr(0, fontdir.length-1);
}
var bytes = fs.readFileSync(fontdir + '/fnt' + fontid +
(monochr ? 'm-' : 'a-') + size + '.bin');
fontset.fonts[fkey] = font = { bytes:bytes, glyphs:[] };
}
// Convert the charcode to a glyph index
if (charcode < fontset.minchar || charcode > fontset.maxchar) {
charcode = fontset.minchar; // default, space
}
charcode -= fontset.minchar;
var glyph = font.glyphs[charcode];
if (!glyph) {
var bytes = font.bytes;
var offset = bytes.readUInt32LE(charcode * 4);
font.glyphs[charcode] = glyph = {
advance: bytes.readUInt16LE(offset),
top: bytes.readInt16LE(offset + 2),
left: bytes.readInt16LE(offset + 4),
width: bytes.readUInt16LE(offset + 6),
height: bytes.readUInt16LE(offset + 8),
offset: offset + 10,
bytes: bytes,
};
}
return glyph;
}