|
From the very picojpeg page[^]:
Optimized for minimal memory consumption: Uses only ~2.3KB of work memory.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Pallini,
They said the code memory consumption 2.3kb, not the code uses.
actually while resizing an image of 1MB file, it reduces the size by taking the first pixel of each 8x8 block, so for that they will allocate the size of >32 kb of memory.
thanks
srini
|
|
|
|
|
As far as I can understand you haven't to keep the whole image in RAM, have you?
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
hi CPallini,
Actually for using malloc we need to allocate heap space in startup.s file, here its allowing only 1000k of memory and if I enter 2000k it will throw error as "there is no space in execution region", so when it try to access the memory at 35k it will show error, below is the code where it is getting stuck.
pImage = (uint8 *)malloc(row_pitch * decoded_height);// here the size of allocation is >32kb.
if (!pImage)
{
fclose(g_pInFile);
return NULL;
}
row_blocks_per_mcu = image_info.m_MCUWidth >> 3;
col_blocks_per_mcu = image_info.m_MCUHeight >> 3;
for ( ; ; )
{
int y, x;
uint8 *pDst_row;
status = pjpeg_decode_mcu();
if (status)
{
if (status != PJPG_NO_MORE_BLOCKS)
{
printf("pjpeg_decode_mcu() failed with status %u\n", status);
free(pImage);
fclose(g_pInFile);
return NULL;
}
break;
}
if (mcu_y >= image_info.m_MCUSPerCol)
{
free(pImage);
fclose(g_pInFile);
return NULL;
}
if (reduce)
{
// In reduce mode, only the first pixel of each 8x8 block is valid.
pDst_row = pImage + mcu_y * col_blocks_per_mcu * row_pitch + mcu_x * row_blocks_per_mcu * image_info.m_comps;
if (image_info.m_scanType == PJPG_GRAYSCALE)
{
*pDst_row = image_info.m_pMCUBufR[0];
}
else
{
uint y, x;
for (y = 0; y < col_blocks_per_mcu; y++)
{
uint src_ofs = (y * 128);
for (x = 0; x < row_blocks_per_mcu; x++)
{
pDst_row[0] = image_info.m_pMCUBufR[src_ofs]; // Here the error occurs.
pDst_row[1] = image_info.m_pMCUBufG[src_ofs];
pDst_row[2] = image_info.m_pMCUBufB[src_ofs];
pDst_row += 3;
src_ofs += 64;
}
pDst_row += row_pitch - 3 * row_blocks_per_mcu;
}
}
}
mcu_x++;
if (mcu_x == image_info.m_MCUSPerRow)
{
mcu_x = 0;
mcu_y++;
}
}
fclose(g_pInFile);
*x = decoded_width;
*y = decoded_height;
*comps = image_info.m_comps;
return pImage;
thanks
srini
|
|
|
|
|
Am I missing something?
The library author claims: "Written entirely in C, no reliance at all on the C run-time library (it includes no headers other than picojpeg.h), and does not use any dynamic memory allocation."
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Hi pallini,
I have used visual C++ 2008 express edition to execute the code and works fine, Since we are using Kiel as our IDE I did some minor changes.
Yes only one header file(picojpeg.h) and they have used malloc in jpg2tga.c file
|
|
|
|
|
Member 10833501 wrote: they have used malloc in jpg2tga.c file They? jpg2tga?
Quoting again 'them': picojpeg is a public domain JPEG decompressor written in plain C in a single source file picojpeg.c and a single header picojpeg.h"
and actually there is no malloc in picojpeg.c file.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
hi pallini,
Source package is having 2 source files
1) picojpeg.c and jpg2tga.c
For your reerence I am attaching the link again here
">http://code.google.com/p/picojpeg/"
thanks
srini
|
|
|
|
|
jpg2tga.cpp is not actually part of the library. It is an example program.
However, if you really need such a functionality you could try to modify the code (if possible) to fit your needs.
Another option could be using an external (serial) RAM.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Is there a way to retrieve CPrintInfo from a PRINTDLG structure ?
I had tried following code:
PRINTDLG pd;
pd.lStructSize = (DWORD)sizeof(PRINTDLG);
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
{
CPrintInfo PrintInfo;
???
}
This CPrintInfo object I want it into a CView constructor ...
|
|
|
|
|
Your code merely creates an empty CPrintInfo structure. You should check the documentation[^] for full details.
|
|
|
|
|
I see ... and there is no solution to retrieve CPrintInfo in C(My)View constructor ?
|
|
|
|
|
The Remarks section on the documentation page states:
CPrintInfo is a structure and does not have a base class.
The framework creates an object of CPrintInfo each time the Print or Print Preview command is chosen and destroys it when the command is completed.
So this control is only available within those two sections of your application, after either menu item is selected. It is possible that you could force this by sending a Print or Print Preview message to your application.
|
|
|
|
|
Richard, is there a way to force printpreview to application, in such a way that user see nothing about it, just for retrieving CPrintInfo ? Could you tell me how ?
|
|
|
|
|
Flaviu2 wrote: Could you tell me how ? Sorry, no, I have never tried such a thing.
|
|
|
|
|
Ok, no pb, I have to digg in ...
|
|
|
|
|
Richard, I still have a question: I had tried to create manually an CPrintInfo object, just like that:
CPrintDialog pdlg(FALSE);
pdlg.GetDefaults();
HDC hDC = pdlg.CreatePrinterDC();
if(NULL != hDC)
{
m_pPreviewInfo = new CPrintInfo;
m_dcPrint.CreateCompatibleDC(CDC::FromHandle(hDC));
m_pPreviewInfo->m_rectDraw.left = 0;
m_pPreviewInfo->m_rectDraw.top = 0;
m_pPreviewInfo->m_rectDraw.right = m_dcPrint.GetDeviceCaps(HORZRES);
m_pPreviewInfo->m_rectDraw.bottom = m_dcPrint.GetDeviceCaps(VERTRES);
m_pPreviewInfo->m_bContinuePrinting = TRUE;
m_pPreviewInfo->m_bDirect = TRUE;
m_pPreviewInfo->m_bDocObject = FALSE;
m_pPreviewInfo->m_bPreview = TRUE;
m_pPreviewInfo->m_lpUserData = NULL;
m_pPreviewInfo->m_pPD = &pdlg;
m_pPreviewInfo->SetMinPage(1);
m_pPreviewInfo->SetMaxPage(2);
m_nPages = m_pPreviewInfo->m_nNumPreviewPages;
m_pPreviewDC = new CPreviewDC;
m_pPreviewDC->SetAttribDC(m_pPreviewInfo->m_pPD->m_pd.hDC);
m_sizePrinterPPI.cx = m_dcPrint.GetDeviceCaps(LOGPIXELSX);
m_sizePrinterPPI.cy = m_dcPrint.GetDeviceCaps(LOGPIXELSY);
m_nPages = m_pPreviewInfo->m_nNumPreviewPages;
if (m_nPages == 0)
m_nPages = 1;
else if (m_nPages > m_nMaxPages)
m_nPages = m_nMaxPages; }
where m_pPreviewInfo and m_pPreviewDC is protected members of CMyCustomPrintPreview:
CPreviewDC* m_pPreviewDC;
CPrintInfo* m_pPreviewInfo;
of the first sight, I had do something wrong on the above code ? Because when I am trying to use m_pPreviewInfo object in CMyCustomPrintPreview::OnDraw, is crashing and I get an access violation on:
_AFXEXT_INLINE UINT CPrintInfo::GetMaxPage() const
{ return m_pPD->m_pd.nMaxPage; }
Thank you.
|
|
|
|
|
I suspect that your CPrintDialog object is going out of scope thus causing this error. You should use new to create it before adding it to your CPrintInfo .
|
|
|
|
|
Yes, that was it ... Thank you. I am go with one step further ... I come beck soon.
modified 26-Sep-14 3:21am.
|
|
|
|
|
Yes, I had created dinamically (with new), but when I am trying to clean up in my class destructor, it crashing ...
CPrintPreview::~CPrintPreview
{
if(NULL != m_pPrintDlg)
delete m_pPrintDlg; }
weird ...
|
|
|
|
|
Are you sure that your CPrintInfo object still exists at this point?
|
|
|
|
|
I am sure that is not null ... is not enough ? How can assure of CPrintInfo existence ?
|
|
|
|
|
It should be enough, but if it has somehow been corrupted, or already deleted then you will get a crash. The only way to check is via the debugger.
|
|
|
|
|
Thank you Richard, deleteing CPrintInfo object is excluded, the destructor is the only place where I explicity delete this object ... I have to dig in ...
|
|
|
|
|
I tried to create a COM component for outlook using article "Building an Office2K COM addin with VC++/ATL". When I register COM, COM added in outlook (display a button in oulook), But If I again open outlook (means 2nd time), COM addin is not there.
What I need to change so that COM functionality should be there untill I unregister the COM component?
|
|
|
|