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

📄 libggi.cpp

📁 linux文本方式下的外挂中文环境,很好用,有源码.功能很全.我都用它
💻 CPP
字号:
// vi:ts=4:shiftwidth=4:expandtab/***************************************************************************                          libggi.cpp  -  description                             -------------------    begin                : Fri July 20 2001    copyright            : (C) 2001 by huyong    email                : ccpaging@online.sh.cn ***************************************************************************//*************************************************************************** *                                                                         * *   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.                                   * *                                                                         * ***************************************************************************/#ifdef HAVE_CONFIG_H#include <config.h>#endif#ifdef HAVE_GGI_LIB#include <stdio.h>#include <cassert>#include "debug.h"#include "libggi.h"ggi_visual_t LIBGGI::visual;ggi_mode LIBGGI::mode = { /* This will cause the default mode to be set */    1,                      /* 1 frame [???] */    {GGI_AUTO,GGI_AUTO},    /* Default size */    {GGI_AUTO,GGI_AUTO},    /* Virtual */    {0,0},                  /* size in mm don't care */    GT_AUTO,               /* Mode */    {GGI_AUTO,GGI_AUTO}     /* Font size */};    int LIBGGI::mBytesPixel = 0;ggi_pixel LIBGGI::mPixelColor[16];char* LIBGGI::mpixMapBuf = NULL;size_t LIBGGI::mPixMapBufSize = 0;// based on miniguitypedef struct RGB{    char r;    char g;    char b;};// Convertion between rgb8 to rgb16inline static int rgb8to16 (int rgb){    return rgb * (0xFFFF / 0xFF);}bool LIBGGI::TryOpen(char *ggiDriveName) {    int i;    const ggi_pixelformat* pf;    if (ggiInit() != 0) {        printf("unable to initialize LibGGI, exiting.\n");        return false;    }    visual = ggiOpen (ggiDriveName);    if (visual == NULL) {        printf("unable to open default visual, exiting.\n");        ggiExit();        return false;    }    // ggiSetFlags (visual, GGIFLAG_ASYNC);    ggiCheckMode (visual, &mode);    if (ggiSetMode (visual, &mode))    {         printf("Can't set mode\n");        ggiClose (visual);        ggiExit ();        return false;    }    mXres = mode.visible.x;    mYres = mode.visible.y;    if (GT_SCHEME (mode.graphtype) == GT_PALETTE) {        ggiSetColorfulPalette (visual);    }    const RGB DefaultColor16[] = {        {0x00, 0x00, 0x00},     // black         --0        {0x00, 0x00, 0x80},     // dark blue     --1        {0x00, 0x80, 0x00},     // dark green    --2        {0x00, 0x80, 0x80},     // dark cyan     --3        {0x80, 0x00, 0x00},     // dark red      --4        {0x80, 0x00, 0x80},     // dark magenta  --5        {0x80, 0x80, 0x00},     // dark yellow   --6        {0x80, 0x80, 0x80},     // dark gray     --7        {0xC0, 0xC0, 0xC0},     // light gray    --8        {0x00, 0x00, 0xFF},     // blue          --9        {0x00, 0xFF, 0x00},     // green         --10        {0x00, 0xFF, 0xFF},     // cyan          --11        {0xFF, 0x00, 0x00},     // red           --12        {0xFF, 0x00, 0xFF},     // magenta       --13        {0xFF, 0xFF, 0x00},     // yellow        --14        {0xFF, 0xFF, 0xFF}      // light white   --15    };    ggi_color color;    for (i = 0; i < 16; i++) {        color.r = rgb8to16 (DefaultColor16[i].r);        color.g = rgb8to16 (DefaultColor16[i].g);        color.b = rgb8to16 (DefaultColor16[i].b);        mPixelColor[i] = ggiMapColor (visual, &color);    }        pf = ggiGetPixelFormat (visual);    mBytesPixel = (pf->size + 7) >> 3;    /*    bytes_per_phypixel = (pf->size + 7) >> 3;    bits_per_phypixel  = pf->depth;    width_phygc        = mode.visible.x;    height_phygc       = mode.visible.y;    if (pf->depth == 32)        colors_phygc   = 1 << 24;    else        colors_phygc   = 1 << pf->depth;    grayscale_screen   = false;#ifdef _DEBUG    fprintf (stderr, "GGI Mode: bpp %d, depth %d, width %d, height %d.\n",            bytes_per_phypixel,            bits_per_phypixel,            width_phygc,            height_phygc);#endif    bytesperpixel      = bytes_per_pixel;    bitsperpixel       = bits_per_pixel;    */    mpGraphDev = new LIBGGI;    return true;}void LIBGGI::SwitchToGraph() {    // restore color palette    if (GT_SCHEME (mode.graphtype) == GT_PALETTE) {        ggiSetColorfulPalette (visual);    }}void LIBGGI::SwitchToText() {}LIBGGI::~LIBGGI() {    ggiClose(visual);    ggiExit();    if (mpixMapBuf)        delete[] mpixMapBuf;}void LIBGGI::PutPixel(int x,int y,int color) {    ggiPutPixel(visual, x, y, mPixelColor[color]);}void LIBGGI::FillRect(int x1,int y1,int x2,int y2,int color) {    assert( x1 >= 0 && x1 < mXres && y1 >=0 && y1 < mYres);    assert( x2 >= 0 && x2 < mXres && y2 >=0 && y2 < mYres);    assert(x1 <= x2 && y1 <= y2);    ggiSetGCForeground(visual, mPixelColor[color]);    ggiDrawBox(visual, x1, y1, x2 - x1 + 1, y2 - y1 + 1);}void LIBGGI::RevRect(int x1,int y1,int x2,int y2) {    assert( x1 >= 0 && x1 < Width() && y1 >=0 && y1 < Height());    assert( x2 >= 0 && x2 < Width() && y2 >=0 && y2 < Height());    assert(x1 <= x2 && y1 <= y2);    int height = y2 - y1 + 1;    int width = x2 - x1 + 1;    char* pixMap = GetPixMapBuf(width * height * mBytesPixel);    ggiGetBox(visual, x1, y1, width, height, pixMap);    int cnt;    char *pMap = pixMap;    for (cnt = width * height * mBytesPixel; cnt--; pMap++)            *pMap ^= 0xff;    ggiPutBox(visual, x1, y1, width, height, pixMap);}void LIBGGI::DrawChar(int x,int y,int fg,int bg,struct CharBitMap* pFont) {    char* pixMap = GetPixMapBuf(pFont->w * mBlockHeight * mBytesPixel);    GetPixMap(pixMap,fg,bg,pFont);    ggiPutBox(visual, x, y, pFont->w, mBlockHeight, pixMap);}int LIBGGI::GetPixMap(char* pixMap,int fg,int bg,struct CharBitMap* pFont) {    int x, row;    int b = 0;    char* cdat = pFont->pBuf;    char* line;    int line_bytes = pFont->w * mBytesPixel;    line = pixMap;    switch (mBytesPixel) {    case 1:        for (row = mBlockHeight; row--;) {            pixMap = line;            for (x = 0; x < pFont->w; x++) {                // assert( (pixMap - mpixMapBuf) <= mPixMapBufSize);                if (x % 8 == 0)                    b = *cdat++;                if ((b & (0x80 >> (x % 8)))) {                    *pixMap = mPixelColor[fg];                } else {                    *pixMap = mPixelColor[bg];                }                pixMap++;            }            line += line_bytes;        }        break;    case 2:        for (row = mBlockHeight; row--;) {            pixMap = line;            for (x = 0; x < pFont->w; x++) {                if (x % 8 == 0)                    b = *cdat++;                if ((b & (128 >> (x % 8)))) {                    *(ushort *) pixMap = mPixelColor[fg];                } else {                    *(ushort *) pixMap = mPixelColor[bg];                }                pixMap += 2;            }            line += line_bytes;        }        break;    case 3:        for (row = mBlockHeight; row--;) {            pixMap = line;            for (x = 0; x < pFont->w; x++) {                if (x % 8 == 0)                    b = *cdat++;                if ((b & (128 >> (x % 8)))) {                    *(ushort *) pixMap = mPixelColor[fg];                    *(pixMap + 2) = mPixelColor[fg] >> 16;                } else {                    *(ushort *) pixMap = mPixelColor[bg];                    *(pixMap + 2) = mPixelColor[bg] >> 16;                }                pixMap += 3;            }            line += line_bytes;        }        break;    case 4:        for (row = mBlockHeight; row--;) {            pixMap = line;            for (x = 0; x < pFont->w; x++) {                if (x % 8 == 0)                    b = *cdat++;                if ((b & (128 >> (x % 8)))) {                    *(uint *) pixMap = mPixelColor[fg];                } else {                    *(uint *) pixMap = mPixelColor[bg];                }                pixMap += 4;            }            line += line_bytes;        }    }    return line_bytes;}inline char* LIBGGI::GetPixMapBuf(size_t size) {    if (size <= mPixMapBufSize)        return mpixMapBuf;    if (mpixMapBuf)        delete[] mpixMapBuf;            // unit is 32 byte    mPixMapBufSize = ((size + 31) >> 5) << 5;    mpixMapBuf = (char *) new char[mPixMapBufSize];    return mpixMapBuf;}#endif

⌨️ 快捷键说明

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