一、大致思路说明:其实要解码JPEG图片,只需要用到TCPMP中的两个插件:COMMON和CAMERA两个鸟插件.CAMERA插件负责解码JPEG,COMMON负责显示图片.各位兄弟,为了让解出来的图象显示在我们指定的DC中,我们是需要修改COMMON插件的.为什么要把图象显示在我们指定的DC中呢?因为我们如果要做显示的特技的话,就是需要这样做.比如所谓的"百叶窗"特技等等,那些鸟特级都是使用了双缓冲的哟.(张挺eMail:zt00@tom.com)
二、步骤
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:zt00@tom.com)
(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