///////////////////////////////////////////////////////////////////////////// // CFPage::ProcessingComingLine void CFPage::ProcessingComingLine( CSTR_line* Comingline ) { CSTR_line line; CSTR_attr attr; CFragment* Fragment; Handle hCPAGE; Handle hBlock; POLY_ poly; line = *Comingline; if( !CSTR_GetLineAttr( line , &attr ) || attr.Flags&CSTR_STR_EMPTY ) return; m_nCurFragNumber = attr.fragment; if( m_nCurFragNumber != m_nPrevFragNumber ){ m_arFrags.push_back( new CFragment() ); Fragment = m_arFrags[Count.Frags]; assert(Fragment); hCPAGE = CPAGE_GetHandlePage( CPAGE_GetCurrentPage()); hBlock = CPAGE_GetBlockFirst( hCPAGE, NULL ); while(hBlock) { if(CPAGE_GetBlockInterNum(hCPAGE,hBlock)==(uint32_t)m_nCurFragNumber){ Fragment->m_wUserNumber = (uint32_t)CPAGE_GetBlockUserNum( hCPAGE, hBlock ); Fragment->m_Flags = attr.Flags; //nega if(attr.Flags == CSTR_STR_NEGATIVE){ //nega_str CPAGE_GetBlockData(hCPAGE,hBlock,TYPE_TEXT, &poly, sizeof(POLY_)); Fragment->m_rectFrag.left = poly.com.Vertex[0].x - TemplateOffset.x; Fragment->m_rectFrag.right = poly.com.Vertex[2].x - TemplateOffset.x; Fragment->m_rectFrag.top = poly.com.Vertex[0].y - TemplateOffset.y; Fragment->m_rectFrag.bottom = poly.com.Vertex[2].y - TemplateOffset.y; } break; } hBlock = CPAGE_GetBlockNext(hCPAGE,hBlock, NULL ); } assert(hBlock!=NULL); ++Count.Frags; } AddString(Comingline); m_nPrevFragNumber = m_nCurFragNumber; }
Rect GetPictRect(uint NumberPict, uint32_t * UserNumber) { uint PictCount = 0; uint NumberPage = CPAGE_GetCurrentPage(); Handle h_Page = CPAGE_GetHandlePage(NumberPage); Handle h_Pict = CPAGE_PictureGetFirst(h_Page); while (h_Pict && PictCount < NumberPict) { PictCount++; h_Pict = CPAGE_PictureGetNext(h_Page, h_Pict); } if (!h_Pict) throw std::runtime_error("[GetPictRect] can't get picture"); *UserNumber = (uint32_t) CPAGE_GetBlockUserNum(h_Page, h_Pict); Point Lr, Wh; if (CPAGE_PictureGetPlace(h_Page, h_Pict, 0, &Lr, &Wh)) return Rect(Lr - TemplateOffset, Wh.x(), Wh.y()); else throw std::runtime_error("[GetPictRect] CPAGE_PictureGetPlace failed"); }
//########################################### // Если блоки конвертируемы один в другой, тогда имеет смысл оставить только один, // наиболее полный тип. Именно это и делает эта функция. // 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; }