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

📄 sgxbitmap.cpp

📁 一个基于BREW上的WEB service程序,通过扫描图书的条形码,登陆WEB站点,利用SOAP-RPC来查询图书信息.
💻 CPP
字号:
/**
***     Class Name                     : SGXBitmap
***     Version                        : 1.0.0
***
***     Author                         : Sophia Cradle Incorporated
***     Platform                       : x86, ARM
***     OS                             : BREW 2.1
***     Target SophiaFramework Version : 3.0
***     Compiler                       : Visual C++ 6.0, Visual C++ .NET 2003,
***                                      RVCTB 1.2
**/

#include "SGXBitmap.hpp"

SGXBitmap::SGXBitmap(Void) : _pbitmap(null), _pdib(null)
{
}

SGXBitmap::SGXBitmap(ACharConstPtr file) : _pbitmap(null), _pdib(null)
{
    LoadBitmap(file);
}

SGXBitmap::SGXBitmap(WCharConstPtr file) : _pbitmap(null), _pdib(null)
{
    LoadBitmap(file);
}

SGXBitmap::SGXBitmap(SFXAnsiStringConstRef file) : _pbitmap(null), _pdib(null)
{
    LoadBitmap(file);
}

SGXBitmap::SGXBitmap(SFXWideStringConstRef file) : _pbitmap(null), _pdib(null)
{
    LoadBitmap(file);
}

SGXBitmap::SGXBitmap(ACharConstPtr resFile, UInt16 id) : _pbitmap(null), _pdib(null)
{
    LoadResBitmap(resFile, id);
}

SGXBitmap::SGXBitmap(WCharConstPtr resFile, UInt16 id) : _pbitmap(null), _pdib(null)
{
    LoadResBitmap(resFile, id);
}

SGXBitmap::SGXBitmap(SFXAnsiStringConstRef resFile, UInt16 id) : _pbitmap(null), _pdib(null)
{
    LoadResBitmap(resFile, id);
}

SGXBitmap::SGXBitmap(SFXWideStringConstRef resFile, UInt16 id) : _pbitmap(null), _pdib(null)
{
    LoadResBitmap(resFile, id);
}

SGXBitmap::SGXBitmap(SFBBitmapSmpConstRef pbitmap) : _pbitmap(null), _pdib(null)
{
    Create(pbitmap);
}

SGXBitmap::SGXBitmap(SGXBitmapConstRef bitmap) : _pbitmap(null), _pdib(null)
{
    Copy(bitmap);
}

SGXBitmap::~SGXBitmap(Void)
{
    _pbitmap.Release();
    _pdib.Release();
}

// DIB 宍幃偺價僢僩儅僢僾傪庢摼偡傞
SFCError SGXBitmap::GetDib(Void)
{
    SFCError error(SFERR_NO_ERROR);
    _pdib.Release();
    if(_pbitmap != null) {
        SFBDIBPtr pdib;
        error = _pbitmap->QueryInterface(AEECLSID_BITMAP, reinterpret_cast<VoidHandle>(&pdib));
        if (error == SFERR_NO_ERROR) {
            _pdib.Attach(pdib);
        } else {
            _pbitmap.Release();
        }
    } else {
        error = SFERR_FAILED;
    }
    return error;
}

SFCError SGXBitmap::LoadBitmap(ACharConstPtr file)
{
    _pbitmap = SFBShell::GetInstance()->LoadBitmap(file);
    return GetDib();
}

SFCError SGXBitmap::LoadBitmap(WCharConstPtr file)
{
    SFXAnsiString ansiFile(file);
    return LoadBitmap(ansiFile);
}

SFCError SGXBitmap::LoadBitmap(SFXAnsiStringConstRef file)
{
    _pbitmap = SFBShell::GetInstance()->LoadBitmap(file);
    return GetDib();
}

SFCError SGXBitmap::LoadBitmap(SFXWideStringConstRef file)
{
    SFXAnsiString ansiFile(file);
    return LoadBitmap(ansiFile);
}

SFCError SGXBitmap::LoadResBitmap(ACharConstPtr resFile, UInt16 id)
{
    _pbitmap = SFBShell::GetInstance()->LoadResBitmap(resFile, id);
    return GetDib();
}

SFCError SGXBitmap::LoadResBitmap(WCharConstPtr resFile, UInt16 id)
{
    SFXAnsiString ansiResFile(resFile);
    return LoadResBitmap(ansiResFile, id);
}

SFCError SGXBitmap::LoadResBitmap(SFXAnsiStringConstRef resFile, UInt16 id)
{
    _pbitmap = SFBShell::GetInstance()->LoadResBitmap(resFile, id);
    return GetDib();
}

SFCError SGXBitmap::LoadResBitmap(SFXWideStringConstRef resFile, UInt16 id)
{
    SFXAnsiString ansiResFile(resFile);
    return LoadResBitmap(ansiResFile, id);
}

// SFBBitmapSmp 偺撪梕傪僐僺乕偡傞
SFCError SGXBitmap::Create(SFBBitmapSmpConstRef pbitmap)
{
    SFCError error(SFERR_NO_ERROR);
    // 價僢僩儅僢僾偺戝偒偝傪庢摼偡傞
    AEEBitmapInfo bmpinfo;
    pbitmap->GetInfo(&bmpinfo);
    // 價僢僩儅僢僾傪僐僺乕偡傞
    SFBBitmapSmp tmpBmp;
    SFBBitmapSmp disp(SFXGraphics::GetInstance()->GetDestination());
    error = disp->CreateCompatibleBitmap(&tmpBmp, static_cast<UInt16>(bmpinfo.cx), static_cast<UInt16>(bmpinfo.cy));
    if (error == SFERR_NO_ERROR) {
        error = tmpBmp->BltIn(SFXRectangle(0, 0, static_cast<SInt16>(bmpinfo.cx), static_cast<SInt16>(bmpinfo.cy)), pbitmap, SFXGrid(0, 0));
        if (error == SFERR_NO_ERROR) {
            _pbitmap = tmpBmp;
            error = GetDib();
        }
    }
    return error;
}

// SGXBitmap 僆僽僕僃僋僩傪僐僺乕偡傞
SFCError SGXBitmap::Copy(SGXBitmapConstRef bitmap)
{
    return Create(bitmap._pbitmap);
}

SGXBitmapConstRef SGXBitmap::operator =(SFBBitmapSmpConstRef pbitmap)
{
    Create(pbitmap);
    return *this;
}

SGXBitmapConstRef SGXBitmap::operator =(SGXBitmapConstRef bitmap)
{
    Copy(bitmap);
    return *this;
}

SFXRGBColor SGXBitmap::GetPixel(SFXPixelConstRef pixel) const
{
    if (_pdib == null) {
        return SFXRGBColor(0, 0, 0, 0);
    }

    UInt32 bitsIndex(_pdib->GetDepth());
    bitsIndex *= pixel.GetX();
    BytePtr p(_pdib->GetBuffer() + pixel.GetY() * _pdib->GetPitch() + (bitsIndex >> 3));
                // bitsIndex >> 3 偼 bitsIndex / 8 偲摍壙
                // 偙傟偱丄巜掕偝傟偨揰偺抣偑奿擺偝傟偰偄傞愭摢偺儊儌儕 傾僪儗僗偑庢摼偱偒傞
    SInt08 localBitsIndex(8 - static_cast<SInt08>(bitsIndex & 7));
                // bitsIndex & 7 偼 bitsIndex % 8 偲摍壙
                // 偙傟偱 p 偺壓偐傜壗價僢僩栚偵栚揑偺僨乕僞偑偁傞偺偐庢摼偱偒傞
    SInt16 len(_pdib->GetDepth());
    NativeColor color(0);
    BytePtr pcolor(reinterpret_cast<BytePtr>(&color));
    SInt08 leftBits(8);     // pcolor 偵偁偲壗價僢僩彂偒崬傔傞偐
    UInt08 getbits;
    UInt16 mask;

    while (len > 0) {
        // len 偲 localBitsIndex 偲 leftBits 偺偆偪嵟彫偺傕偺傪 getbits 偵戙擖
        getbits = (localBitsIndex < leftBits) ? localBitsIndex : leftBits;
        if (getbits > len) {
            getbits = static_cast<UInt08>(len);
        }

        mask = static_cast<UInt16>(1 << localBitsIndex) - 1;
        *pcolor = (*pcolor << getbits) | ((static_cast<UInt08>(mask) & *p) >> ((getbits < localBitsIndex) ? (localBitsIndex - getbits) : 0));
        len -= getbits;
        leftBits -= getbits;
        localBitsIndex -= getbits;
        if (localBitsIndex <= 0) {
            ++p;
            localBitsIndex = 8;
        }
        if (leftBits <= 0) {
            ++pcolor;
            leftBits = 8;
        }
    }
    return _pdib->NativeToColor(color);
}

SFXSize SGXBitmap::GetSize(Void) const
{
    if (_pdib == null) {
        return SFXSize(0, 0);
    } else {
        return _pdib->GetSize();
    }
}

UInt16 SGXBitmap::GetWidth(Void) const
{
    if (_pdib == null) {
        return 0;
    } else {
        return _pdib->GetWidth();
    }
}

UInt16 SGXBitmap::GetHeight(Void) const
{
    if (_pdib == null) {
        return 0;
    } else {
        return _pdib->GetHeight();
    }
}

UInt08 SGXBitmap::GetDepth(Void) const
{
    if (_pdib == null) {
        return 0;
    } else {
        return _pdib->GetDepth();
    }
}

⌨️ 快捷键说明

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