一、大致思路說明:其實要解碼JPEG圖片,只需要用到TCPMP中的兩個插件:COMMON和CAMERA兩個鳥插件.CAMERA插件負責解碼JPEG,COMMON負責顯示圖片.各位兄弟,爲了讓解出來的圖象顯示在我們指定的DC中,我們是需要修改COMMON插件的.爲什麼要把圖象顯示在我們指定的DC中呢?因爲我們如果要做顯示的特技的話,就是需要這樣做.比如所謂的"百葉窗"特技等等,那些鳥特級都是使用了雙緩衝的喲.(張挺eMail:[email protected])
二、步驟
1、先按照我的另一文章《TCPMP0.72RC1的編譯與移植以及自己另外做UI完整方法》把COMMON修改編譯出來。文章地址:http://blog.csdn.net/zhangting00_2000/archive/2009/04/20/4095272.aspx
2、設置COMMON爲當前工程,然後把Context_Wnd全部搜出來。修改後的代碼如下:
(1)
void Context_Wnd(void* Wnd,void* hMemDC)
{
context* p = Context();
p->hMemDC = hMemDC;//zt00
if (p)
{
#ifdef REGISTRY_GLOBAL
if (Wnd)
NodeRegLoadGlobal();
else
NodeRegSaveGlobal();
#endif
p->Wnd = Wnd; // only set after globals are loaded
NodeSettingsChanged();
}
}
(2)
DLL void Context_Wnd(void* Wnd,void* hMemDC);
(3)把context結構增加了一個成員,增加後如下:
typedef struct context
{
int Version;
uint32_t ProgramId;
const tchar_t* ProgramName;
const tchar_t* ProgramVersion;
const tchar_t* CmdLine;
void* Wnd;
void* NodeLock;
array Node;
array NodeClass; // ordered by id
array NodeClassPri; // ordered by priority|id
array NodeModule;
int LoadModuleNo;
void* LoadModule;
array StrTable[2];
array StrBuffer;
array StrModule;
void* StrLock;
uint32_t Lang;
int CodePage;
struct pcm_soft* PCM;
struct blitpack* Blit;
struct node* Platform;
struct node* Advanced;
struct node* Player;
notify Error;
int (*HwOrientation)(void*);
void *HwOrientationContext;
bool_t TryDynamic;
int SettingsPage;
size_t StartUpMemory;
bool_t InHibernate;
bool_t WaitDisable;
int FtrId;
bool_t LowMemory;
bool_t CodeFailed;
bool_t CodeMoveBack;
bool_t CodeDelaySlot;
void* CodeLock;
void* CodeInstBegin;
void* CodeInstEnd;
int NextCond;
bool_t NextSet;
bool_t NextByte;
bool_t NextHalf;
bool_t NextSign;
uint32_t* FlushCache;
void* CharConvertUTF8;
void* CharConvertCustom;
int CustomCodePage;
void* CharConvertAscii;
void* Application;
void* Logger;
bool_t KeepDisplay;
int DisableOutOfMemory;
void * hMemDC;//這個東西用來繪製內存圖片的。
} context;
(張挺eMail:[email protected])
(4)進入COMMON下的Overlay,然後打開overlay_gdi.c,找到Blit函數,修改如下:
static int Blit(gdi* p, const constplanes Data, const constplanes DataLast )
{
HDC DC;
if (!p->Planes[0] && !AllocBitmap(p))
return ERR_OUT_OF_MEMORY;
#ifdef BLITTEST
BlitImage(p->Soft2,p->Planes2,Data,DataLast,-1,-1);
BlitImage(p->p.Soft,p->Planes,p->Planes2,NULL,-1,-1);
#else
BlitImage(p->p.Soft,p->Planes,Data,DataLast,-1,-1);
#endif
//
if (!p->DIBSection)
{
if (p->Bitmap)
{
SelectObject(p->DC2,p->Bitmap0);
DeleteObject(p->Bitmap);
}
p->Bitmap = CreateBitmap( p->Overlay.Width, p->Overlay.Height, 1,
p->Overlay.Pixel.BitCount, (char*)p->Planes[0]);
if (!p->Bitmap)
return ERR_OUT_OF_MEMORY;
p->Bitmap0 = SelectObject(p->DC2,p->Bitmap);
}
//MessageBox(NULL,_T("sdhfjshdfk"),_T("fg"),MB_OK);
DC = GetDC(Context()->Wnd);//zt00
BitBlt(Context()->hMemDC,p->p.GUIAlignedRect.x,p->p.GUIAlignedRect.y,
p->OverlayRect.Width,p->OverlayRect.Height,p->DC2,p->OverlayRect.x,p->OverlayRect.y,SRCCOPY);
ReleaseDC(Context()->Wnd,DC);//zt00
PostMessage(Context()->Wnd,WM_USER+1988,100,100);//這裏是發個消息出去,表示已經解碼完畢可以顯示了.
return ERR_NONE;
}
呵呵,修改完了這些後,把COMMON編譯,編譯出來的插件就是我們需要的插件.
最後呢,自己寫一個程序調用這兩個插件(COMMON和CAMERA)就可以了.我給大家寫了一個這樣的程序,代碼下載地址如下:http://download.csdn.net/source/1235426
呵呵,但願大家玩的開心.
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhangting00_2000/archive/2009/04/22/4099607.aspx