⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basefont.cpp

📁 linux文本方式下的外挂中文环境,很好用,有源码.功能很全.我都用它
💻 CPP
字号:
// vi:ts=4:shiftwidth=4:expandtab/***************************************************************************                          basefont.cpp  -  description                             -------------------    begin                : Fri Mar 16 2001    copyright            : (C) 2001 by ejoy    email                : ejoy@users.sourceforge.net ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/mman.h>#include <sys/stat.h>#include <stdexcept>#include <cassert>#include "global.h"#include "debug.h"#include "hzdecoder.h"#include "basefont.h"BaseFont::BaseFont(string & fn, int w, int h):mFd(0),mpBuf(0),mWidth(w),mHeight(h) {    mFd = open(fn.c_str(), O_RDONLY);    if (mFd == -1)        throw (runtime_error("can not open gbfont!"));    struct stat st;    if (fstat(mFd, &st) == -1)        throw (runtime_error("can not get gbfont size!"));    mBufSize = st.st_size;    if (mBufSize > 50000) {        //hzfont use mmap        mpBuf = (char *) mmap((caddr_t) 0, mBufSize, PROT_READ,                    MAP_FILE | MAP_SHARED, mFd, (off_t) 0);        if (mpBuf == MAP_FAILED)            throw (runtime_error("error in mmap gbfont!"));    } else {        //ascii font read to buffer        mpBuf = (char *) new char[mBufSize];        unsigned nread = read(mFd, mpBuf, mBufSize);        if (nread != mBufSize)            throw (runtime_error("error in reading asciifont!"));    }    GetInfo();    mpNull = (char *) new char[mByteLen];    memset(mpNull, 0xff, mByteLen);}BaseFont::~BaseFont() {    if (mBufSize > 50000)        munmap(mpBuf, mBufSize);    else        delete[] mpBuf;    delete[] mpNull;    close(mFd);}void BaseFont::GetInfo() {    if (mBufSize > 4 && (mpBuf[0] == 0x36 && mpBuf[1] == 0x04)) {        if (mpBuf[2] > 3) {  // extend PCF for big charset            mHeight = (int) mpBuf[3];            mWidth = (int) mpBuf[4];            mDataOffset = 9;            memcpy(&mNumChars, &mpBuf[5], sizeof(long));        } else {  // Linux/i386 PC Screen Font data            mNumChars = ((mpBuf[2] == 1 || mpBuf[2] == 3) ? 512 : 256);            mHeight = (int) mpBuf[3];            mDataOffset = 4;        }        mWidthBytes = mWidth / 8 + ((mWidth % 8) ? 1: 0);    } else {                        // RAW font data        mWidthBytes = mWidth / 8 + ((mWidth % 8) ? 1: 0);        mNumChars = mBufSize / mWidthBytes;        mDataOffset = 0;    }    assert(mHeight > 0 && mWidth > 0 && mNumChars > 0);    mByteLen = mHeight * mWidthBytes;}char *BaseFont::GetChar(char c) {    char* p = mpBuf + mDataOffset + c * mByteLen;    if (p > mpBuf + mBufSize - 1)        return mpNull;    else        return p;}char *BaseFont::GetChar(char c1, char c2) {    char* p = mpBuf + mDataOffset + mByteLen * gpDecoder->Index(c1,c2);    if (p > mpBuf + mBufSize - 1)        return mpNull;    else        return p;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -