⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmidc_capture_wintab.c

📁 手机Camera部分上层软件代码
💻 C
📖 第 1 页 / 共 2 页
字号:
PUBLIC void MMIDC_OpenCaptureWin(void)
{
	MMK_CreateWin((uint32 *)MMIDC_SHOOTWIN_TAB, PNULL);
}

/*****************************************************************************/
// 	Description : close capture window
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
PUBLIC void MMIDC_CloseCaptureWin(void)
{
	if (MMK_IsOpenWin(MMIDC_SHOOT_WIN_ID))
	{
		MMK_CloseWin(MMIDC_SHOOT_WIN_ID);
	}
}

/*****************************************************************************/
// 	Description : capture one photo
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
LOCAL BOOLEAN CaptureOnePhoto(uint8 **jpg_ptr_ptr,
							  uint32 *jpg_len_ptr
							  )
{
	static	int					s_protect_count = 0;
	MMIDC_REVIEW_PHOTO_INFO_T	st_review_info = {0};
	int							dc_status = 0;	
	
	MMIDC_SETTING_INFO_T		*setting_ptr = PNULL;
	RECT_T						rect = {0};

	//do capture
	setting_ptr = MMIDC_GetSettingInfo();

	if (!DCAdap_Capture(setting_ptr))
	{
		SCI_TRACE_LOW("mmidc_capture_wintab.c:HandleCaptureWinMsg, DCAdap_Capture error");
		return FALSE;
	}

	//wait sometime to get data
	s_protect_count = 0;

	if(DCAdap_GetZoomLevel() == 0)
	{
		do
		{
			SCI_Sleep(200);
			s_protect_count++;
			if (s_protect_count >= 30)
			{
				break;
			}
			dc_status = DC_QueryStatus();
		}while (((dc_status & DC_STATUS_ENCODE_DONE) == 0));

		if (s_protect_count >= 30)
		{
			s_protect_count = 0;
			return FALSE;
		}
	}
	if(DCAdap_GetZoomLevel() > 0)
	{
		GetCapZoomTrimRect(setting_ptr->e_photo_size,&st_review_info.width,&st_review_info.height);
		SCI_TRACE_LOW("GetCapZoomTrimRect: %d, %d", st_review_info.width,\
															st_review_info.height);
	}
	
	s_protect_count = 0;

	st_review_info.photo_ptr = DCAdap_MakeSnapshotData(&st_review_info.photo_len);
	if (st_review_info.photo_ptr == PNULL || st_review_info.photo_len == 0)
	{
		return FALSE;
	}

	//review at once
	st_review_info.e_review_from	= PHOTO_REVIEW_FROM_CAPTURE;
	st_review_info.e_review_type	= REVIEW_WHOLE_PHOTO;
	st_review_info.x_start			= 0;
	st_review_info.y_start			= 0;
	st_review_info.i_lcd			= setting_ptr->e_lcd;

	*jpg_ptr_ptr = st_review_info.photo_ptr;
	*jpg_len_ptr = st_review_info.photo_len;

	//draw background in lcd
	if (setting_ptr->e_lcd == MAIN_LCD_ID)
	{
		DrawDefaultBackGroud(MAIN_LCD_ID);
	}
	else
	{
		DrawDefaultBackGroud(SUB_LCD_ID);
	}

	if (!MMIDC_ReviewPhoto(&st_review_info))
	{
		SCI_TRACE_LOW("mmidc_capture_wintab.c:HandleCaptureWinMsg, review failed");
		return FALSE;
	}
	
	return TRUE;
}
/*****************************************************************************/
// 	Description : capture a photo
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
PUBLIC BOOLEAN MMIDC_CaptureOnePhotoForOCR(uint8 **jpg_ptr_ptr,
							  uint32 *jpg_len_ptr
							  )
{
#ifdef _MMI_OCR
	static	int					s_protect_count = 0;
	MMIDC_REVIEW_PHOTO_INFO_T	st_review_info = {0};
	int							dc_status = 0;	
	
	MMIDC_SETTING_INFO_T		*setting_ptr = PNULL;
	RECT_T						rect = {0};

	//do capture
	setting_ptr = MMIDC_GetSettingInfo();

        if (OCR_NONE_ERROR!=OCR_Capture(PNULL))
	{
		SCI_TRACE_LOW("mmidc_capture_wintab.c:OCR_Capture error");
		return FALSE;
	}

	

	//wait sometime to get data
	s_protect_count = 0;

	do
	{
		SCI_Sleep(200);
		s_protect_count++;
		if (s_protect_count >= 30)
		{
			break;
		}
		dc_status = DC_QueryStatus();
	}while (((dc_status & DC_STATUS_ENCODE_DONE) == 0));

	if (s_protect_count >= 30)
	{
		s_protect_count = 0;
		return FALSE;
	}


	s_protect_count = 0;

	st_review_info.photo_ptr = OCR_GetYUVbuf(&st_review_info.photo_len);
	SCI_TRACE_LOW("mmidc_capture_wintab.c:HandleCaptureWinMsg, enter OCR_GetYUVbuf");
		

	if (st_review_info.photo_ptr == PNULL || st_review_info.photo_len == 0)
	{  SCI_TRACE_LOW("mmidc_capture_wintab.c:review data is null.");
		return FALSE;
	}

	//review at once
	st_review_info.e_review_from	= PHOTO_REVIEW_FROM_CAPTURE;
	st_review_info.e_review_type	= REVIEW_WHOLE_PHOTO;
	st_review_info.x_start			= 0;
	st_review_info.y_start			= 0;
	st_review_info.i_lcd			= setting_ptr->e_lcd;

	*jpg_ptr_ptr = st_review_info.photo_ptr;
	*jpg_len_ptr = st_review_info.photo_len;

	//draw background in lcd
	if (setting_ptr->e_lcd == MAIN_LCD_ID)
	{
		DrawDefaultBackGroud(MAIN_LCD_ID);
	}
	else
	{
		DrawDefaultBackGroud(SUB_LCD_ID);
	}

	if (!MMIDC_ReviewPhoto(&st_review_info))
	{
		SCI_TRACE_LOW("mmidc_capture_wintab.c:HandleCaptureWinMsg, review failed");
		return FALSE;
	}
	else
	{
		  DisplayCaptureWaitingStr(MAIN_LCD_ID);
	}

	return TRUE;
#else
    return TRUE;
#endif
}


/*****************************************************************************/
// 	Description : draw waiting string when capture
//	Global resource dependence : 
//  Author: bruce.chi
//	Note:
/*****************************************************************************/
#define STRING_BACK_CR	MMI_GREEN_COLOR
PUBLIC void DisplayCaptureWaitingStr(uint8 lcdID)
{
	GUI_POINT_T		st_start_point = {0};
	MMI_STRING_T	prompt_str = {0};
	uint16			str_width = 0;
	uint16			str_height = 0;
	GUI_FONT_T		font = 	MMI_DEFAULT_TEXT_FONT;
	GUI_RECT_T		rect = {0};
	int				i = 0, j = 0;

	int32			screen_width = 0;
	int32			screen_height = 0;
	GUI_COLOR_T		*lcd_buf_ptr = PNULL;
	GUI_COLOR_T		*p_buf = PNULL;

	GUI_COLOR_T		cr = 0;
	LCD_INFO_T		lcd_info = {0};

	//get string, string width and height
	MMI_GetLabelTextByLang(TXTSYS_WAITING, &prompt_str);
	str_width = GUI_CalculateStringPiexlNum(
					prompt_str.str_ptr,
					prompt_str.length,
					prompt_str.is_ucs2,
					font,
					0
					);
	str_height = GUI_GetFontHeight(font, prompt_str.is_ucs2);

	//draw string in LCD buffer
	if (lcdID == MAIN_LCD_ID)
	{
#ifndef SC6600M_DVB_MMI		
		screen_width = MMIDC_MAINSCREEN_WIDTH;
		screen_height = MMIDC_MAINSCREEN_HEIGHT;
#else
		LCD_GetInfo(MAIN_LCD_ID, &lcd_info);
		screen_width = lcd_info.lcd_width;
		screen_height = lcd_info.lcd_height;
#endif

#ifdef WIN32
		{
			extern GUI_COLOR_T * s_mainlcdbuf_ptr;
			lcd_buf_ptr = s_mainlcdbuf_ptr;
		}
#else
		lcd_buf_ptr = (GUI_COLOR_T *)LCD_GetLCDBuffer();
#endif
	}
	else
	{
		screen_width = MMI_SUBSCREEN_WIDTH;
		screen_height = MMI_SUBSCREEN_HEIGHT;
#ifdef WIN32
		{
			GUI_SUBLCD_COLOR_T *s_sublcdbuf_ptr = PNULL;
			lcd_buf_ptr = s_sublcdbuf_ptr;
		}
#else
		lcd_buf_ptr = (GUI_COLOR_T *)LCD_GetSubLCDBuffer();
#endif
	}
	st_start_point.x = (screen_width - str_width) / 2;
	st_start_point.y = screen_height / 2;

	rect.left = st_start_point.x;
	rect.right = st_start_point.x + str_width;
	rect.top = st_start_point.y;
	rect.bottom = st_start_point.y + str_height;
	LCD_FillRect(lcdID, rect, STRING_BACK_CR);
	LCD_DisplayIdleString(
				lcdID,
				st_start_point,
				prompt_str.str_ptr,
				prompt_str.length,
				0,
				MMI_BLACK_COLOR,//MMI_WHITE_COLOR,
				font,
				prompt_str.is_ucs2,
				0
				);
	
	//this is very important to invalidate the lcd right now and then forbid APP_Task to invalidate lcd
	MMITHEME_SetUpdateDelayCount(0);
	
#if 0
	//MMITHEME_UpdateRect();
	LCD_InvalidateRect(
		lcdID, 
		st_start_point.x,
		st_start_point.y, 
		st_start_point.x + str_width,
		st_start_point.y + str_height
		);
#else
	
	for (i = rect.top; i < rect.bottom; i++)
	{
		for (j = rect.left; j < rect.right; j++)
		{
			cr = lcd_buf_ptr[i * screen_width + j];
			if (cr == STRING_BACK_CR)
			{
				//skip
			}
			else if ((cr == MMI_BLACK_COLOR) || (cr == MMI_WHITE_COLOR) )
			{
				LCD_InvalidateRect(
					lcdID,
					j,
					i,
					j,
					i
					);
			}
		}
	}
#endif
}

/*****************************************************************************/
// 	Description : Handle_TP_Button_Register
//         
//	Global resource dependence : 
//   Author:       bown.zhang
//	Note:   
/*****************************************************************************/
LOCAL void Handle_TP_Button_Register(MMI_WIN_ID_T	win_id)
{
    MMI_SPECIAL_BUTTON_T special_button_ok = {0};
    MMI_SPECIAL_BUTTON_T special_button_cancel = {0};

    MMI_RECT_T rect_ok = {0};
    MMI_RECT_T rect_cancel = {0};
  
    rect_ok.left = (MMI_MAINSCREEN_WIDTH - s_osd_char_disp_rect.w_width) / 2;
    rect_ok.top = (MMI_MAINSCREEN_HEIGHT + s_osd_char_disp_rect.w_height) / 2 - MMIDC_CAPTURE_OK_TEXT_HEIGHT;
    rect_ok.right = rect_ok.left + MMIDC_CAPTURE_OK_TEXT_WIDTH;
    rect_ok.bottom = (MMI_MAINSCREEN_HEIGHT + s_osd_char_disp_rect.w_height) / 2;

    rect_cancel.left = (MMI_MAINSCREEN_WIDTH + s_osd_char_disp_rect.w_width) / 2 - MMIDC_CAPTURE_CANCEL_TEXT_WIDTH;
    rect_cancel.top = (MMI_MAINSCREEN_HEIGHT + s_osd_char_disp_rect.w_height) / 2 - MMIDC_CAPTURE_OK_TEXT_HEIGHT;
    rect_cancel.right = (MMI_MAINSCREEN_WIDTH + s_osd_char_disp_rect.w_width) / 2;
    rect_cancel.bottom = (MMI_MAINSCREEN_HEIGHT + s_osd_char_disp_rect.w_height) / 2;
        
    //register * button
    special_button_cancel.type = MMI_SPECIAL_RECT;
    special_button_cancel.rect = rect_cancel;
    special_button_cancel.callback_msg_id = MSG_APP_CANCEL;

    MMK_SetSpecialButtonAction(win_id, &special_button_cancel);

    //register = button
    special_button_ok.type = MMI_SPECIAL_RECT;
    special_button_ok.rect = rect_ok;
    special_button_ok.callback_msg_id = MSG_APP_OK;

    MMK_SetSpecialButtonAction(win_id, &special_button_ok);
}

#endif//_MMIDC_CAPTURE_WINTAB_C_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -