Bool32 FillPicsInTables(Handle hCCOM, Handle hCPAGE) { POLY_ block; Handle h = NULL; CCOM_comp * comp; for(h = CPAGE_GetBlockFirst(hCPAGE,POSSIBLE_PICTURES); h!=NULL; h = CPAGE_GetBlockNext(hCPAGE,h,POSSIBLE_PICTURES)) { CPAGE_GetBlockData(hCPAGE,h,POSSIBLE_PICTURES, &block, sizeof(block)); CPAGE_DeleteBlock(hCPAGE, h); if (nPics % PICS_QUANTUM == 0) { pPics = (CCOM_comp *) realloc (pPics, (size_t) ((nPics / PICS_QUANTUM + 1)* PICS_QUANTUM * sizeof (CCOM_comp))); } comp = &pPics[nPics++]; comp->upper = block.com.Vertex[0].y; comp->left = block.com.Vertex[0].x; comp->w = block.com.Vertex[1].x - block.com.Vertex[0].x; comp->h = block.com.Vertex[2].y - block.com.Vertex[1].y; } return TRUE; }
Bool32 SearchNewLines( PRSPreProcessImage Image ) { Bool32 ret = TRUE; bool searchlines = LDPUMA_Skip(Image->hDebugCancelSearchDotLines) && !LDPUMA_Skip(hDotLine); Handle hSaveImage = CPAGE_CreateBlock(Image->hCPAGE, RSL_VERLINE, 0, 0, Image, sizeof (RSPreProcessImage)); if(LDPUMA_Skip(Image->hDebugCancelVerifyLines)) { ret=RLINE_LinesPass1(Image->hCPAGE,*(Image->phCCOM),Image->phCLINE,Image->pgneed_clean_line, searchlines, (uchar)Image->gnLanguage); if (ret && !gbRSLT) ret = RLINE_LinesPass2(*(Image->phCCOM),Image->phCLINE, Image->hCPAGE); } CPAGE_DeleteBlock(Image->hCPAGE, hSaveImage); return ret; }
//########################################### // Если блоки конвертируемы один в другой, тогда имеет смысл оставить только один, // наиболее полный тип. Именно это и делает эта функция. // CPAGE_FUNC(Bool32) CPAGE_UpdateBlocks( Handle hPage, Handle type ) { PROLOG; Bool32 rc = TRUE; uint32_t size = 0; char * lpData = NULL; Handle temporaray = 0; SetReturnCode_cpage(IDS_ERR_NO); #ifdef _DEBUG _ASSERT(CPAGE_GetNameInternalType(type)); #endif SetReturnCode_cpage(IDS_ERR_NO); Handle hBlock = CPAGE_GetBlockFirst(hPage,type); if(!hBlock) { rc = TRUE; goto lOut; } // Создадим временные блоки и удалим старые. // Тем самым предотвращаем зацикливание. temporaray = CPAGE_GetInternalType("temporary"); while(hBlock) { Handle hNextBlock = CPAGE_GetBlockNext(hPage,hBlock,type);// type - запрашиваемый тип блока Handle dwType = CPAGE_GetBlockType(hPage,hBlock); // dwType - Реальный тип блока if(dwType != type) // Была произведена конвертация из типа dwType ! { uint32_t UserNum = CPAGE_GetBlockUserNum(hPage,hBlock); uint32_t Flags = CPAGE_GetBlockFlags(hPage,hBlock); if(lpData == NULL) { // Определим необходимый размер и отведем память. size = CPAGE_GetBlockData(hPage,hBlock,type,NULL,0); if(size) { lpData = (char *)myAlloc(size); if(!lpData) { rc = FALSE; SetReturnCode_cpage(IDS_ERR_NO_MEMORY); break; } } else { SetReturnCode_cpage(IDS_ERR_DISCREP); rc = FALSE; break; } } if(CPAGE_GetBlockData(hPage,hBlock,type,lpData,size)==size) { CPAGE_DeleteBlock(hPage,hBlock); if(!CPAGE_CreateBlock(hPage,temporaray, UserNum , Flags, lpData, size)) { SetReturnCode_cpage(IDS_ERR_NO_MEMORY); rc = FALSE; break; } } } hBlock = hNextBlock; } // Переименуем временные блоки if(lpData) // Проверка на существование таких блоков { myFree(lpData); for(hBlock = CPAGE_GetBlockFirst(hPage,temporaray); hBlock; hBlock = CPAGE_GetBlockNext(hPage,hBlock,temporaray)) { BLOCK_H_H(hPage,hBlock).SetType(type); } } lOut:EPILOG; return rc; }