Mercurial > otakunoraifu
diff font/font_peer_fn.cc @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 15a18fbe6f21 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/font/font_peer_fn.cc @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2001 Yuki Sawada + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This code uses some parts of AVG32 for Macintosh by Kenjo. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdexcept> +#include <string> + +using namespace std; + +#include "font.h" +#include "font_peer.h" + +namespace XKFont { + +#define FN_DAT_SIZE 2544768 + +PeerFn::PeerFn(const char *name, int index, int hsize, int vsize) : buffer(0) +{ + FILE *fp = 0; + + buffer = new unsigned char[FN_DAT_SIZE]; + fp = fopen(name, "rb"); + if (!fp) { + delete[] buffer; + buffer = 0; + string err = string("XKFont::PeerFn::PeerFn : Cannot open font file ")+name; + throw std::invalid_argument(err); + } + fread(buffer, 1, FN_DAT_SIZE, fp); + fclose(fp); + + return; +} + + +PeerFn::~PeerFn() { + delete[] buffer; +} + +static unsigned int +font_glyph_fn_codeconv_euc_to_jis(unsigned int euc) +{ + unsigned int h, l; + + h = (euc >> 8) & 0xff; + l = euc & 0xff; + + if (h < 0x81) { + l = h; + h = 0; + } else if (l == 0x8e) + h = 0; + else { + h -= 0x80; + l -= 0x80; + } + + return (h << 8) | l; +} + +bool +PeerFn::GlyphCreate(unsigned int code, Glyph* glyph) +{ + unsigned char *p1, *p2; + unsigned int h, l, offset; + int x, y; + + l = font_glyph_fn_codeconv_euc_to_jis(code); + l -= 0x2121; + h = l >> 8; + l &= 0xff; + offset = (h * 0x5e + l) * 12 * 24; + if (offset > FN_DAT_SIZE - 12 * 24) + offset = 0; + + glyph->bitmap_left = 0; + glyph->bitmap_top = 21; + glyph->bitmap.width = 24; + glyph->bitmap.rows = 24; + +#if 0 + glyph->metrics.ascender = private->vsize - 4; + glyph->metrics.descender = -4; +#endif + glyph->advance.x = 24 + 1; + glyph->advance.y = 24 + 1; + + glyph->bitmap.buffer = new unsigned char[24*24]; + + p1 = glyph->bitmap.buffer; + p2 = buffer + offset; + for (y = 0; y < 24; y++) { + for (x = 0; x < 12; x++) { + unsigned char c = ~*p2++; + unsigned char c1; + c1 = (c) & 0x0f; *p1++ = (c1<<4) | c1; + c1 = (c>>4)& 0x0f; *p1++ = (c1<<4) | c1; + } + } + return true; +} + +} /* end of namespace XKFont */