📄 mmidc_preview.c
字号:
// Author: bruce.chi
// Note:
/*****************************************************************************/
PUBLIC void DCSetting_SaveNVValue( MMIDC_SETTING_INFO_T *setting_ptr)
{
MMIDC_SETTING_SAVE_INFO_T dc_nv_info = {0};
MN_RETURN_RESULT_E nv_result = 0;
s_mmidc_nv_info.e_quality = setting_ptr->e_quality;
s_mmidc_nv_info.e_photo_size = setting_ptr->e_photo_size;
s_mmidc_nv_info.b_shutter_voice = setting_ptr->b_shutter_voice;
s_mmidc_nv_info.b_flash_enabled = setting_ptr->b_flash_enabled;
s_mmidc_nv_info.e_dv_format = setting_ptr->e_dv_format;
s_mmidc_nv_info.e_af = setting_ptr->e_af;
//read and compare
MMINV_READ(MMINV_DC_SETTING_INFO, &dc_nv_info, nv_result);
if (nv_result != MN_RETURN_SUCCESS)
{
DC_ASSERT_LOW(0);
MMINV_WRITE(MMINV_DC_SETTING_INFO, &s_mmidc_nv_info);
}
else if (0 != memcmp(&s_mmidc_nv_info, &dc_nv_info, sizeof(s_mmidc_nv_info)))
{
MMINV_WRITE(MMINV_DC_SETTING_INFO, &s_mmidc_nv_info);
}
else
{
//do nothing
}
}
/*****************************************************************************/
// Description : Set default value of dc setting
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
PUBLIC void DCSetting_SetDefaultValue(MMIDC_SETTING_INFO_T *setting_info_ptr)
{
MMIDC_SETTING_SAVE_INFO_T* setting_save_ptr = &s_mmidc_nv_info;
DC_ASSERT_LOW(PNULL != setting_info_ptr);
setting_info_ptr->i_contrast = MMIDC_CONTRAST_MAX / 2;
setting_info_ptr->e_effect = MMIDC_EFFECT_NORMAL;
setting_info_ptr->i_brightness = MMIDC_BRIGHTNESS_MAX / 2;
setting_info_ptr->e_mode = MMIDC_MODE_INDOOOR;
setting_info_ptr->e_quality = setting_save_ptr->e_quality;
setting_info_ptr->e_photo_size = setting_save_ptr->e_photo_size;
setting_info_ptr->b_shutter_voice = setting_save_ptr->b_shutter_voice;
setting_info_ptr->e_overtime = MMIDC_OVERTIME_DEACTIVATED;
setting_info_ptr->i_focus = 0;
setting_info_ptr->b_flash_enabled = setting_save_ptr->b_flash_enabled;
setting_info_ptr->e_dv_format = setting_save_ptr->e_dv_format;
setting_info_ptr->e_storage_dev = setting_save_ptr->e_storage_dev;
setting_info_ptr->e_af = setting_save_ptr->e_af;
#ifdef MMIDC_DEBUG
setting_info_ptr->st_cap_osd_info.e_osd_type = CAPTURE_OSD_CHARACTER;
SCI_MEMCPY(setting_info_ptr->st_cap_osd_info.str, "HellO", strlen("HellO"));
setting_info_ptr->st_cap_osd_info.str_len = strlen("HellO");
setting_info_ptr->st_cap_osd_info.is_ucs2 = FALSE;
#else
SCI_MEMSET(&setting_info_ptr->st_cap_osd_info, 0, sizeof(setting_info_ptr->st_cap_osd_info));
setting_info_ptr->st_cap_osd_info.e_osd_type = CAPTURE_OSD_NONE;
#endif
setting_info_ptr->e_frame_rate = MMIDC_PREV_FRAME_RATE_HIGH;
setting_info_ptr->e_lcd = MAIN_LCD_ID;
setting_info_ptr->b_prefilter = MMIDC_CAPTURE_PREFILTER_STATE;
setting_info_ptr->i_sooth = MMIDC_CAPTURE_I_SMOOTH;
setting_info_ptr->e_prevwin_mode = PREVIEW_WIN_FULLSCREEN_CHAR_OSDMENU;
setting_info_ptr->e_capwin_mode = CAP_WIN_FULLSCREEN_CHAR_OSDMENU;
SCI_MEMSET(&setting_info_ptr->st_preview_osd_info, 0, sizeof(setting_info_ptr->st_preview_osd_info));
setting_info_ptr->is_from_dc = TRUE;
}
/*****************************************************************************/
// Description : use DC Driver interface to exit DC module
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
LOCAL BOOLEAN DCAdap_Exit(void)
{
return TRUE;
}
/*****************************************************************************/
// Description : use DC Driver interface to open DC
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
PUBLIC BOOLEAN DCAdap_DCOpen(void)
{
BOOLEAN ret = FALSE;
#ifndef MMI_NOR_VERSION
if (s_dc_context_ptr == PNULL)
{
s_dc_context_ptr = BL_Malloc(BLOCK_MEM_POOL_1);
SCI_ASSERT(s_dc_context_ptr != PNULL);
}
#else
const MMIDC_ALBUM_OPEN_FROM *album_open_status =GetAlbumOpenStatus();
SCI_TRACE_LOW("DCAdap_DCOpen album_open_status->is_from_mms %d s_dc_context_ptr= %d",album_open_status->is_from_mms,s_dc_context_ptr);
if(!album_open_status->is_from_mms)
{
if (s_dc_context_ptr == PNULL)
{
s_dc_context_ptr = BL_Malloc(BLOCK_MEM_POOL_1);
SCI_ASSERT(s_dc_context_ptr != PNULL);
}
}
#endif
#ifdef _MMI_OCR
if (!MMIOCR_Is_From_OCR())
{
ret = DC_Open((uint8 *)s_dc_context_ptr, MMIDC_MAX_PHOTO_SIZE);
SCI_TRACE_LOW("DCAM status %d",ret);
}
else
{
ret = OCR_Init(PNULL, PNULL);
SCI_TRACE_LOW("DCAM ocr status %d",ret);
}
#else
ret = DC_Open((uint8 *)s_dc_context_ptr, MMIDC_MAX_PHOTO_SIZE);
#endif
if(ret == 0)
{
s_is_dc_open = TRUE;
return TRUE;
}
else
{
return FALSE;
}
//测试函数作为表达式时是否打印函数内信息
SCI_TRACE_LOW("LW TRACE: DCAdap_DCOpen__函数名作为表达式的打印信息");
}
/*****************************************************************************/
// Description : use DC Driver interface to set preview parameter
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
static int a,b,c;
LOCAL BOOLEAN DCAdap_SetPreviewParam(const MMIDC_SETTING_INFO_T *setting_ptr)
{ //LW 2007.8.15
//SCI_TRACE_LOW("LW TRACE:DCAdap_SetPreviewParam__xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
DC_PREVIEW_PARAM_T st_preview_param = {0};
BOOLEAN ret=TRUE;
a=st_preview_param.i_frame_rate;
b=st_preview_param.i_sensor_sequence;
c=st_preview_param.i_lcd;
//SCI_TRACE_LOW("ST_PREVIEW_PARAM.i_frame_rate=%d .isensor_sequence=%d .i_lcd=%d",a,b,c);
SCI_TRACE_LOW("DCAdap_SetPreviewParam setting_ptr->e_af = %d ",setting_ptr->e_af);
//SCI_TRACE_LOW("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ");
//set preview param
st_preview_param.i_lcd = setting_ptr->e_lcd;
st_preview_param.b_prefilter = setting_ptr->b_prefilter;
st_preview_param.i_frame_rate = setting_ptr->e_frame_rate;
st_preview_param.i_smooth = setting_ptr->i_sooth;
SCI_TRACE_LOW("seting_ptr->e_lcd=%d, ->b_prefilter=%d, ->e_frame_rate=%d, ->i_sooth=%d",setting_ptr->e_lcd,setting_ptr->b_prefilter,setting_ptr->e_frame_rate,setting_ptr->i_sooth);
if(0 == setting_ptr->is_from_dc)
{
st_preview_param.b_is_scale = FALSE;
}
else
{
st_preview_param.b_is_scale = TRUE;
}
switch(setting_ptr->e_af)
{
case MMIDC_AF_CONTINUOUS:
st_preview_param.af_flag = 1;
st_preview_param.i_sensor_sequence = DCAdap_GetSensorModeSequence(setting_ptr, MMIDC_PREVIEW_AF_CONTINUOUS);
if (!DCSetting_GetTrimRect(&st_preview_param.st_trim_rect, &st_preview_param.st_disp_rect, setting_ptr, MMIDC_PREVIEW_AF_CONTINUOUS))
{
return FALSE;
}
break;
case MMIDC_AF_OFF:
a=st_preview_param.i_sensor_sequence;
st_preview_param.i_sensor_sequence = DCAdap_GetSensorModeSequence(setting_ptr, MMIDC_PREVIEW_NO_AF);
st_preview_param.af_flag = 0;
if (!DCSetting_GetTrimRect(&st_preview_param.st_trim_rect, &st_preview_param.st_disp_rect, setting_ptr, MMIDC_PREVIEW_NO_AF))
{
return FALSE;
}
break;
default:
DC_ASSERT_LOW(0);
st_preview_param.af_flag = 0;
break;
}
#ifndef _MMI_OCR
ret= DC_SetPreviewParam(&st_preview_param);
//SCI_TRACE_LOW("ret=%d",ret);
#else
if (MMIOCR_Is_From_OCR())
{
ret=OCR_SetPreviewParam(NULL);
}
else
{
//打印不出SCI_TRACE_LOW("LW TRACE:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
ret= DC_SetPreviewParam(&st_preview_param);
//SCI_TRACE_LOW("LW TRACE:RET=%D",ret);
}
#endif
if (0!=ret)
{
return FALSE;
}
//set preview osd
//依赖于DC_SETTING_INFO,OSD_MENU数组,OSD_CIRCLE数组,当前OSDMENU_Select情况。
switch(setting_ptr->e_prevwin_mode)
{
case PREVIEW_WIN_FULLSCREEN_CHAR_OSDMENU: //主屏全屏、文字OSD MENU
DrawPreviewCharacterOSDMenu(setting_ptr->is_from_dc);
break;
case PREVIEW_WIN_FULLSCREEN_IMAGE_OSDMENU: //主屏全屏、图片OSD MENU
DrawImgOSDMenu(
setting_ptr->is_from_dc,
setting_ptr->st_preview_osd_info.cur_img_osd_menu_index,
setting_ptr->st_preview_osd_info.left_img_osd_menu_index,
&st_preview_param.st_disp_rect
);
break;
case PREVIEW_WIN_PARTSCREEN_CIRCLE_OSD: //主屏半屏、像框
DrawImgOSDCircle(setting_ptr->st_preview_osd_info.e_circle_osd_index, &st_preview_param.st_disp_rect);
break;
case PREVIEW_WIN_SUBLCD_NO_OSD: //副屏, NO OSD
DisableOSDMenu();
break;
default:
DC_ASSERT_LOW(0);
break;
}
return TRUE;
}
/*****************************************************************************/
// Description : use DC Driver interface to set preview parameter in af status
// Global resource dependence :
// Author: bruce.chi
// Note:
/*****************************************************************************/
PUBLIC BOOLEAN DCAdap_SetAFSinglePreviewParam(const MMIDC_SETTING_INFO_T *setting_ptr)
{
DC_PREVIEW_PARAM_T st_preview_param = {0};
//set preview param
st_preview_param.i_lcd = setting_ptr->e_lcd;
st_preview_param.b_prefilter = setting_ptr->b_prefilter;
st_preview_param.i_frame_rate = setting_ptr->e_frame_rate;
st_preview_param.i_smooth = setting_ptr->i_sooth;
if(0 == setting_ptr->is_from_dc)
{
st_preview_param.b_is_scale = FALSE;
}
else
{
st_preview_param.b_is_scale = TRUE;
}
st_preview_param.af_flag = 1;
st_preview_param.i_sensor_sequence = DCAdap_GetSensorModeSequence(setting_ptr, MMIDC_PREVIEW_AF_SINGLE);
if (!DCSetting_GetTrimRect(&st_preview_param.st_trim_rect, &st_preview_param.st_disp_rect, setting_ptr, MMIDC_PREVIEW_AF_SINGLE))
{
return FALSE;
}
#ifdef MMI_ENABLE_AUTO_FOCUS
if (0 != DC_SingleModeAutoFocus(&st_preview_param))
{
return FALSE;
}
#endif
//set preview osd
//依赖于DC_SETTING_INFO,OSD_MENU数组,OSD_CIRCLE数组,当前OSDMENU_Select情况。
switch(setting_ptr->e_prevwin_mode)
{
case PREVIEW_WIN_FULLSCREEN_CHAR_OSDMENU: //主屏全屏、文字OSD MENU
DrawPreviewCharacterOSDMenu(setting_ptr->is_from_dc);
break;
case PREVIEW_WIN_FULLSCREEN_IMAGE_OSDMENU: //主屏全屏、图片OSDMENU
DrawImgOSDMenu(
setting_ptr->is_from_dc,
setting_ptr->st_preview_osd_info.cur_img_osd_menu_index,
setting_ptr->st_preview_osd_info.left_img_osd_menu_index,
&st_preview_param.st_disp_rect
);
break;
case PREVIEW_WIN_PARTSCREEN_CIRCLE_OSD: //主屏半屏、像框
DrawImgOSDCircle(setting_ptr->st_preview_osd_info.e_circle_osd_index, &st_preview_param.st_disp_rect);
break;
case PREVIEW_WIN_SUBLCD_NO_OSD: //副屏, NO OSD
DisableOSDMenu();
break;
default:
DC_ASSERT_LOW(0);
break;
}
return TRUE;
}
/*****************************************************************************/
// Description : Get preview/capture trim rect according to setting info
// Global resource dependence :
// Author: bruce.chi
// Note: trim_rect的计算,是根据LCD的大小,然后取一个小的scale系数,乘回去的
// if (need_trunk)
// {
// scale_factor = MIN((sensor_width / lcd_width), (sensor_height / lcd_height));
// trim_width = scale_factor * lcd_width;
// trim_heigth = scale_factor * lcd_height;
// and trim_widht, trim_height must be up_trunked by 16
// display_rect need not to trim
// }
/*****************************************************************************/
PUBLIC BOOLEAN DCSetting_GetTrimRect(RECT_T *p_trim_rect, RECT_T *p_disp_rect, const MMIDC_SETTING_INFO_T *setting_ptr, MMIDC_TRIMRECT_TYPE_E e_trimrect_type)
{ //LW 2007.8.15
int32 sensor_width = 0;
int32 sensor_height = 0;
int32 target_width = 0;
int32 target_height = 0;
BOOLEAN need_trunk = FALSE;
MMIDC_PHOTO_SIZE_E e_photo_size = 0;
MMIVC_VIDEO_SIZE_E e_video_size = 0;
DC_ASSERT_LOW(p_trim_rect != PNULL);
DC_ASSERT_LOW(setting_ptr != PNULL);
//calc display rect
p_disp_rect->w_start_x = 0;
p_disp_rect->w_start_y = 0;
switch(setting_ptr->e_prevwin_mode)
{
case PREVIEW_WIN_FULLSCREEN_CHAR_OSDMENU:
case PREVIEW_WIN_FULLSCREEN_IMAGE_OSDMENU:
//全屏
p_disp_rect->w_width = MMIDC_MAINSCREEN_WIDTH;
p_disp_rect->w_height = MMIDC_MAINSCREEN_HEIGHT;
break;
case PREVIEW_WIN_PARTSCREEN_CIRCLE_OSD:
//半屏
p_disp_rect->w_width = MMIDC_MAINSCREEN_WIDTH;
p_disp_rect->w_height = MMIDC_MAINSCREEN_HEIGHT - PARTSCREEN_CIRCLE_OSD_IMG_HEIGHT - MMI_FULLSCREEN_SOFTKEY_BAR_HEIGHT;
break;
case PREVIEW_WIN_SUBLCD_NO_OSD:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -