void OSD_GetMTextInfor(PMULTI_TEXT pCtrl,mtxtinfo_t * pInfo) { PTEXT_CONTENT pText; UINT16 width,height; UINT16 total_lines = 0,page_lines = 0,lines; INT16 lidx; UINT32 i; UINT8 *pStr; width = pCtrl->rcText.uWidth; page_lines = 0; for(i=0; i<pCtrl->bCount; i++) { pText = &pCtrl->pTextTable[i]; if(pText == NULL) continue; if(pText->bTextType == (UINT8)STRING_ID) pStr = OSD_GetUnicodeString(pText->text.wStringID); else pStr = (UINT8*)pText->text.pString; if(pStr== NULL) continue; lidx = (INT16)pInfo->topline_idx - (INT16)total_lines; lines = OSD_GetTextTotalLine(pStr,pCtrl->head.bFont,width,lidx,&pInfo->topline_pstr,&pInfo->line_height[total_lines]); if(pInfo->topline_idx >= total_lines && pInfo->topline_idx< lines + total_lines) pInfo->topline_tblidx = i; total_lines += lines; } /* Total lines */ pInfo->total_lines = total_lines; /* Get the total logical height.*/ pInfo->total_height = 0; for(i=0;i<total_lines;i++) { pInfo->total_height += pInfo->line_height[i]; if( i> 0) pInfo->total_height += C_LINE_GAP; } /* One page's height */ pInfo->page_height = pCtrl->rcText.uHeight; if(pInfo->topline_idx >= total_lines) pInfo->topline_idx = 0; #if 0 /* Check the topline_idx */ CHECK_TOP_LINE: height = 0; for(i=pInfo->topline_idx;i<total_lines;i++) { height += pInfo->line_height[i]; if(i != pInfo->topline_idx) height += C_LINE_GAP; } if(pInfo->topline_idx> 0 && height < pInfo->page_height) { if(height + pInfo->line_height[total_lines - 1] + C_LINE_GAP <= pInfo->page_height) { pInfo->topline_idx -= 1; goto CHECK_TOP_LINE; } } #endif /* Get Current Page's lines */ height = 0; //for(i=pInfo->topline_idx;i<total_lines;i++) for(i=0;i<total_lines;i++) { height += pInfo->line_height[i]; if(i != pInfo->topline_idx) height += C_LINE_GAP; if(height > pInfo->page_height) break; } page_lines = i; pInfo->page_lines = page_lines; }
void OSD_GetMTextInfor(PMULTI_TEXT pCtrl,mtxtinfo_t * pInfo) { UINT32 i; UINT8 mtfont,*pStr; PTEXT_CONTENT pText; UINT16 lidx,total_lines,page_lines,lines,width,height; page_lines = 0; total_lines = 0; width = pCtrl->rcText.uWidth; MEMSET(&(pInfo->line_height[0]),0x0,MAX_LINE_NUM*sizeof((pInfo->line_height[0]))); if(OSD_GetAttrSlave(pCtrl)) mtfont = (pCtrl->head.bFont)|C_FONT_SLVMASK; else mtfont = pCtrl->head.bFont; for(i=0; i<pCtrl->bCount; i++) { pText = &pCtrl->pTextTable[i]; if(pText == NULL) continue; if(pText->bTextType == (UINT8)STRING_ID) pStr = OSD_GetUnicodeString(pText->text.wStringID); else pStr = (UINT8*)pText->text.pString; if(pStr== NULL) continue; lidx = (INT16)pInfo->topline_idx - (INT16)total_lines; lines = OSD_GetTextTotalLine(pStr,mtfont,width,lidx,&pInfo->topline_pstr,&pInfo->line_height[total_lines]); if(pInfo->topline_idx >= total_lines&& pInfo->topline_idx< lines + total_lines) pInfo->topline_tblidx = i; total_lines += lines; } pInfo->total_lines = total_lines; pInfo->total_height = 0; for(i=0;i<total_lines;i++) { pInfo->total_height += pInfo->line_height[i]; if( i> 0) pInfo->total_height += C_LINE_GAP; } pInfo->page_height = pCtrl->rcText.uHeight; if(pInfo->topline_idx >= total_lines) pInfo->topline_idx = 0; /* Check the topline_idx */ CHECK_TOP_LINE: height = 0; for(i=pInfo->topline_idx;i<total_lines;i++) { height += pInfo->line_height[i]; if(i != pInfo->topline_idx) height += C_LINE_GAP; } if(pInfo->topline_idx> 0 && height < pInfo->page_height) { if(height + pInfo->line_height[total_lines - 1] + C_LINE_GAP <= pInfo->page_height) { pInfo->topline_idx -= 1; goto CHECK_TOP_LINE; } } /* Get Current Page's lines */ height = 0; for(i=pInfo->topline_idx;i<total_lines;i++) { height += pInfo->line_height[i]; if(i != pInfo->topline_idx) height += C_LINE_GAP; if(height > pInfo->page_height) break; } page_lines = i - pInfo->topline_idx; pInfo->page_lines = page_lines; }