📄 sgxbitmap.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 + -