Example #1
0
/////////////////////////////////////////////////////////////////////////////
//                    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;
}
Example #2
0
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");
}
Example #3
0
//###########################################
// Если блоки конвертируемы один в другой, тогда имеет смысл оставить только один,
// наиболее полный тип. Именно это и делает эта функция.
//
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;
}