Re: Anyway to COMPRESS RESOURCES???
You don't really need GDI+.
I have a bunch of JPGs in a projects resources, and I load them using a
class called CResourceStream, and CImage.
CImage Image;
CResourceStream stream(NULL,MAKEINTRESOURCE(IDR_JPGIMAGE),_T("JPG"));
Image.Load(&stream);
Here is CResourceStream
class CResourceStream : public IStream
{
public:
BYTE *m_pArray;
DWORD m_dwRead;
DWORD m_dwLength;
CResourceStream(HINSTANCE hInst, LPCTSTR name, LPCTSTR type)
{
m_pArray = 0;
m_dwRead = m_dwLength = 0;
HRSRC hRsrc = ::FindResource(hInst, name, type);
if (!hRsrc) return;
m_dwLength = SizeofResource(hInst, hRsrc);
m_pArray = (BYTE*)LoadResource(0, hRsrc);
if (!m_pArray) m_dwLength = 0;
}
STDMETHOD(Read)(void *pv, ULONG cb, ULONG *pcbRead)
{
if (!pv) return E_INVALIDARG;
if (cb == 0) return S_OK;
if (!m_pArray) return E_UNEXPECTED;
BYTE *pCurr = m_pArray + m_dwRead;
memcpy(pv, pCurr, cb);
if (pcbRead) *pcbRead = cb;
m_dwRead += cb;
return S_OK;
}
STDMETHOD(Seek)(LARGE_INTEGER move , DWORD origin, ULARGE_INTEGER * pos)
{
switch (origin) {
case STREAM_SEEK_SET: m_dwRead = move.LowPart; break;
case STREAM_SEEK_CUR: m_dwRead += move.LowPart; break;
default: return E_NOTIMPL;
}
if (pos) {
pos->HighPart = 0;
pos->LowPart = m_dwRead;
}
return S_OK;
}
STDMETHOD(QueryInterface)(REFIID iid, void **ppUnk)
{
*ppUnk = NULL;
if (::InlineIsEqualGUID(iid, IID_IUnknown) ||
::InlineIsEqualGUID(iid, IID_ISequentialStream) ||
::InlineIsEqualGUID(iid, IID_IStream))
{
*ppUnk = (void*)(IStream*)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef( void) throw()
{
return (ULONG)1;
}
ULONG STDMETHODCALLTYPE Release( void) throw()
{
return (ULONG)1;
}
// Unimplemented
STDMETHOD(Write)(const void* , ULONG , ULONG* ) { return E_UNEXPECTED; }
STDMETHOD(SetSize)(ULARGE_INTEGER ) { return E_NOTIMPL; }
STDMETHOD(CopyTo)(IStream *, ULARGE_INTEGER , ULARGE_INTEGER *,
ULARGE_INTEGER *) { return E_NOTIMPL; }
STDMETHOD(Commit)(DWORD ) { return E_NOTIMPL; }
STDMETHOD(Revert)() { return E_NOTIMPL; }
STDMETHOD(LockRegion)(ULARGE_INTEGER , ULARGE_INTEGER , DWORD ) { return
E_NOTIMPL; }
STDMETHOD(UnlockRegion)(ULARGE_INTEGER , ULARGE_INTEGER , DWORD ) {
return E_NOTIMPL; }
STDMETHOD(Stat)(STATSTG *, DWORD ) { return E_NOTIMPL; }
STDMETHOD(Clone)(IStream **) { return E_NOTIMPL; }
};
AliR.
"Somebody" <somebody@cox.net> wrote in message
news:3HL3i.3622$gM1.3376@newsfe21.lga...
Is there any way to compress resources? My res directory is 1.7MB and
1.4MB of that is from 4 files. 1 24bit BMP, 1 32bit BMP and 2 TTF files. I
need to keep all 4 of these files embedded in my DLL. I'd like to avoid
"heavy baggage" as that would defeat the purpose.
It looks like storing the 2 BMP files as PNG would knock off about 500k to
600k.
But it seems like I'd have to use GDI+ (CImage class) to display them. I'd
like to avoid that requirement as a larger DLL is better then that.
Likewise I'd like to avoid bloated 3rd party libraries that'd bloat my DLL
by the same amount I'm saving :).
And that doesn't solve the problem of the TTF files.