📄 ipmpx_code.c
字号:
gf_bs_write_data(bs, p->opaqueData, p->opaqueDataSize); } return GF_OK;}static GF_IPMPX_Data *NewGF_IPMPX_SendWatermark(u8 tag){ GF_IPMPX_SendWatermark*ptr; GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_SendWatermark, tag); return (GF_IPMPX_Data *) ptr;}static void DelGF_IPMPX_SendWatermark(GF_IPMPX_Data *_p){ GF_IPMPX_SendWatermark*p = (GF_IPMPX_SendWatermark*)_p; GF_IPMPX_DELETE_ARRAY(p->payload); GF_IPMPX_DELETE_ARRAY(p->opaqueData); free(p);}static GF_Err ReadGF_IPMPX_SendWatermark(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size){ Bool has_op_data; GF_IPMPX_SendWatermark *p = (GF_IPMPX_SendWatermark*)_p; p->wm_status = gf_bs_read_int(bs, 2); p->compression_status = gf_bs_read_int(bs, 2); has_op_data = gf_bs_read_int(bs, 1); gf_bs_read_int(bs, 3); if (p->wm_status==GF_IPMPX_WM_PAYLOAD) p->payload = GF_IPMPX_GetByteArray(bs); if (has_op_data) p->opaqueData = GF_IPMPX_GetByteArray(bs); return GF_OK;}static u32 SizeGF_IPMPX_SendWatermark(GF_IPMPX_Data *_p){ u32 size; GF_IPMPX_SendWatermark *p = (GF_IPMPX_SendWatermark*)_p; size = 1; if (p->payload) size += GF_IPMPX_GetByteArraySize(p->payload); if (p->opaqueData) size += GF_IPMPX_GetByteArraySize(p->opaqueData); return size;}static GF_Err WriteGF_IPMPX_SendWatermark(GF_BitStream *bs, GF_IPMPX_Data *_p){ GF_IPMPX_SendWatermark*p = (GF_IPMPX_SendWatermark*)_p; if (p->payload) p->wm_status = GF_IPMPX_WM_PAYLOAD; gf_bs_write_int(bs, p->wm_status, 2); gf_bs_write_int(bs, p->compression_status, 2); gf_bs_write_int(bs, p->opaqueData ? 1 : 0, 1); gf_bs_write_int(bs, 0, 3); if (p->payload) GF_IPMPX_WriteByteArray(bs, p->payload); if (p->opaqueData) GF_IPMPX_WriteByteArray(bs, p->opaqueData); return GF_OK;}static GF_IPMPX_Data *NewGF_IPMPX_ToolAPI_Config(){ GF_IPMPX_ToolAPI_Config*ptr; GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ToolAPI_Config, GF_IPMPX_TOOL_API_CONFIG_TAG); return (GF_IPMPX_Data *) ptr;}static void DelGF_IPMPX_ToolAPI_Config(GF_IPMPX_Data *_p){ GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p; GF_IPMPX_DELETE_ARRAY(p->opaqueData); free(p);}static GF_Err ReadGF_IPMPX_ToolAPI_Config(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size){ Bool has_i, has_m; GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p; has_i = gf_bs_read_int(bs, 1); has_m = gf_bs_read_int(bs, 1); gf_bs_read_int(bs, 6); if (has_i) p->Instantiation_API_ID = gf_bs_read_int(bs, 32); if (has_m) p->Messaging_API_ID = gf_bs_read_int(bs, 32); p->opaqueData = GF_IPMPX_GetByteArray(bs); return GF_OK;}static u32 SizeGF_IPMPX_ToolAPI_Config(GF_IPMPX_Data *_p){ u32 size; GF_IPMPX_ToolAPI_Config *p = (GF_IPMPX_ToolAPI_Config*)_p; size = 1; if (p->Instantiation_API_ID) size += 4; if (p->Messaging_API_ID ) size += 4; size += GF_IPMPX_GetByteArraySize(p->opaqueData); return size;}static GF_Err WriteGF_IPMPX_ToolAPI_Config(GF_BitStream *bs, GF_IPMPX_Data *_p){ GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p; gf_bs_write_int(bs, p->Instantiation_API_ID ? 1 : 0, 1); gf_bs_write_int(bs, p->Messaging_API_ID ? 1 : 0, 1); gf_bs_write_int(bs, 0, 6); if (p->Instantiation_API_ID) gf_bs_write_int(bs, p->Instantiation_API_ID, 32); if (p->Messaging_API_ID) gf_bs_write_int(bs, p->Messaging_API_ID, 32); GF_IPMPX_WriteByteArray(bs, p->opaqueData); return GF_OK;}static GF_IPMPX_Data *NewGF_IPMPX_ISMACryp(){ GF_IPMPX_ISMACryp *ptr; GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ISMACryp, GF_IPMPX_ISMACRYP_TAG); return (GF_IPMPX_Data *) ptr;}static void DelGF_IPMPX_ISMACryp(GF_IPMPX_Data *_p){ GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p; free(p);}static GF_Err ReadGF_IPMPX_ISMACryp(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size){ GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p; p->cryptoSuite = gf_bs_read_int(bs, 8); p->IV_length = gf_bs_read_int(bs, 8); p->use_selective_encryption = gf_bs_read_int(bs, 1); gf_bs_read_int(bs, 7); p->key_indicator_length = gf_bs_read_int(bs, 8); return GF_OK;}static u32 SizeGF_IPMPX_ISMACryp(GF_IPMPX_Data *_p){ return 4;}static GF_Err WriteGF_IPMPX_ISMACryp(GF_BitStream *bs, GF_IPMPX_Data *_p){ GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p; gf_bs_write_int(bs, p->cryptoSuite, 8); gf_bs_write_int(bs, p->IV_length, 8); gf_bs_write_int(bs, p->use_selective_encryption ? 1 : 0, 1); gf_bs_write_int(bs, 0, 7); gf_bs_write_int(bs, p->key_indicator_length, 8); return GF_OK;}GF_IPMPX_Data *gf_ipmpx_data_new(u8 tag){ switch (tag) { case GF_IPMPX_RIGHTS_DATA_TAG: case GF_IPMPX_OPAQUE_DATA_TAG: return NewGF_IPMPX_OpaqueData(tag); case GF_IPMPX_KEY_DATA_TAG: return NewGF_IPMPX_KeyData(); case GF_IPMPX_SECURE_CONTAINER_TAG: return NewGF_IPMPX_SecureContainer(); case GF_IPMPX_ADD_TOOL_LISTENER_TAG: return NewGF_IPMPX_AddToolNotificationListener(); case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG: return NewGF_IPMPX_RemoveToolNotificationListener(); case GF_IPMPX_INIT_AUTHENTICATION_TAG: return NewGF_IPMPX_InitAuthentication(); case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: return NewGF_IPMPX_MutualAuthentication(); case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: return NewGF_IPMPX_ParametricDescription(); case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG: return NewGF_IPMPX_ToolParamCapabilitiesQuery(); case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG: return NewGF_IPMPX_ToolParamCapabilitiesResponse(); case GF_IPMPX_GET_TOOLS_RESPONSE_TAG: return NewGF_IPMPX_GetToolsResponse(); case GF_IPMPX_GET_TOOL_CONTEXT_TAG: return NewGF_IPMPX_GetToolContext(); case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG: return NewGF_IPMPX_GetToolContextResponse(); case GF_IPMPX_CONNECT_TOOL_TAG: return NewGF_IPMPX_ConnectTool(); case GF_IPMPX_DISCONNECT_TOOL_TAG: return NewGF_IPMPX_DisconnectTool(); case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG: return NewGF_IPMPX_NotifyToolEvent(); case GF_IPMPX_CAN_PROCESS_TAG: return NewGF_IPMPX_CanProcess(); case GF_IPMPX_TRUST_SECURITY_METADATA_TAG: return NewGF_IPMPX_TrustSecurityMetadata(); case GF_IPMPX_ISMACRYP_TAG: return NewGF_IPMPX_ISMACryp(); case GF_IPMPX_GET_TOOLS_TAG: { GF_IPMPX_Data *p; GF_IPMPX_DATA_ALLOC(p, GF_IPMPX_Data, GF_IPMPX_GET_TOOLS_TAG); return p; } case GF_IPMPX_TRUSTED_TOOL_TAG: { GF_IPMPX_TrustedTool *p; GF_IPMPX_DATA_ALLOC(p, GF_IPMPX_TrustedTool, GF_IPMPX_TRUSTED_TOOL_TAG); p->trustSpecifications = gf_list_new(); return (GF_IPMPX_Data *)p; } case GF_IPMPX_TRUST_SPECIFICATION_TAG: { GF_IPMPX_TrustSpecification *p; GF_IPMPX_DATA_ALLOC(p, GF_IPMPX_TrustSpecification, GF_IPMPX_TRUST_SPECIFICATION_TAG); return (GF_IPMPX_Data *)p; } case GF_IPMPX_TOOL_API_CONFIG_TAG: return NewGF_IPMPX_ToolAPI_Config(); case GF_IPMPX_SEL_DEC_INIT_TAG: return NewGF_IPMPX_SelectiveDecryptionInit(); case GF_IPMPX_AUDIO_WM_INIT_TAG: case GF_IPMPX_VIDEO_WM_INIT_TAG: return NewGF_IPMPX_WatermarkingInit(tag); case GF_IPMPX_AUDIO_WM_SEND_TAG: case GF_IPMPX_VIDEO_WM_SEND_TAG: return NewGF_IPMPX_SendWatermark(tag); case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG: { GF_IPMPX_AUTH_AlgorithmDescriptor *p = (GF_IPMPX_AUTH_AlgorithmDescriptor *)malloc(sizeof(GF_IPMPX_AUTH_AlgorithmDescriptor)); if (!p) return NULL; memset(p, 0, sizeof(GF_IPMPX_AUTH_AlgorithmDescriptor)); p->tag = GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG; return (GF_IPMPX_Data *) p; } case GF_IPMPX_KEY_DESCRIPTOR_TAG: { GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)malloc(sizeof(GF_IPMPX_AUTH_KeyDescriptor)); if (!p) return NULL; memset(p, 0, sizeof(GF_IPMPX_AUTH_KeyDescriptor)); p->tag = GF_IPMPX_KEY_DESCRIPTOR_TAG; return (GF_IPMPX_Data *) p; } case GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG: { GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)malloc(sizeof(GF_IPMPX_ParametricDescriptionItem)); if (!p) return NULL; memset(p, 0, sizeof(GF_IPMPX_ParametricDescriptionItem)); p->tag = GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG; return (GF_IPMPX_Data *) p; } case GF_IPMPX_SEL_ENC_BUFFER_TAG: { GF_IPMPX_SelEncBuffer*p = (GF_IPMPX_SelEncBuffer*)malloc(sizeof(GF_IPMPX_SelEncBuffer)); if (!p) return NULL; memset(p, 0, sizeof(GF_IPMPX_SelEncBuffer)); p->tag = GF_IPMPX_SEL_ENC_BUFFER_TAG; return (GF_IPMPX_Data *) p; } case GF_IPMPX_SEL_ENC_FIELD_TAG: { GF_IPMPX_SelEncField*p = (GF_IPMPX_SelEncField*)malloc(sizeof(GF_IPMPX_SelEncField)); if (!p) return NULL; memset(p, 0, sizeof(GF_IPMPX_SelEncField)); p->tag = GF_IPMPX_SEL_ENC_FIELD_TAG; return (GF_IPMPX_Data *) p; }/* case GF_IPMPX_USER_QUERY_TAG: return NewGF_IPMPX_UserQuery(); case GF_IPMPX_USER_RESPONSE_TAG: return NewGF_IPMPX_UserQueryResponse();*/ default: return NULL; }}void gf_ipmpx_data_del(GF_IPMPX_Data *_p){ if (!_p) return; switch (_p->tag) { case GF_IPMPX_RIGHTS_DATA_TAG: case GF_IPMPX_OPAQUE_DATA_TAG: DelGF_IPMPX_OpaqueData(_p); return; case GF_IPMPX_KEY_DATA_TAG: DelGF_IPMPX_KeyData(_p); return; case GF_IPMPX_SECURE_CONTAINER_TAG: DelGF_IPMPX_SecureContainer(_p); return; case GF_IPMPX_ADD_TOOL_LISTENER_TAG: DelGF_IPMPX_AddToolNotificationListener(_p); return; case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG: DelGF_IPMPX_RemoveToolNotificationListener(_p); return; case GF_IPMPX_INIT_AUTHENTICATION_TAG: DelGF_IPMPX_InitAuthentication(_p); return; case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: DelGF_IPMPX_MutualAuthentication(_p); return; case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: DelGF_IPMPX_ParametricDescription(_p); return; case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG: DelGF_IPMPX_ToolParamCapabilitiesQuery(_p); return; case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG: DelGF_IPMPX_ToolParamCapabilitiesResponse(_p); return; case GF_IPMPX_GET_TOOLS_RESPONSE_TAG: DelGF_IPMPX_GetToolsResponse(_p); return; case GF_IPMPX_GET_TOOL_CONTEXT_TAG: DelGF_IPMPX_GetToolContext(_p); return; case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG: DelGF_IPMPX_GetToolContextResponse(_p); return; case GF_IPMPX_CONNECT_TOOL_TAG: DelGF_IPMPX_ConnectTool(_p); return; case GF_IPMPX_DISCONNECT_TOOL_TAG: DelGF_IPMPX_DisconnectTool(_p); return; case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG: DelGF_IPMPX_NotifyToolEvent(_p); return; case GF_IPMPX_CAN_PROCESS_TAG: DelGF_IPMPX_CanProcess(_p); return; case GF_IPMPX_TRUST_SECURITY_METADATA_TAG: DelGF_IPMPX_TrustSecurityMetadata(_p); return; case GF_IPMPX_TOOL_API_CONFIG_TAG: DelGF_IPMPX_ToolAPI_Config(_p); return; case GF_IPMPX_ISMACRYP_TAG: DelGF_IPMPX_ISMACryp(_p); return; case GF_IPMPX_SEL_DEC_INIT_TAG: DelGF_IPMPX_SelectiveDecryptionInit(_p); return; case GF_IPMPX_AUDIO_WM_INIT_TAG: case GF_IPMPX_VIDEO_WM_INIT_TAG: DelGF_IPMPX_WatermarkingInit(_p); return; case GF_IPMPX_AUDIO_WM_SEND_TAG: case GF_IPMPX_VIDEO_WM_SEND_TAG: DelGF_IPMPX_SendWatermark(_p); return;/* case GF_IPMPX_USER_QUERY_TAG: DelGF_IPMPX_UserQuery(_p); return; case GF_IPMPX_USER_RESPONSE_TAG: DelGF_IPMPX_UserQueryResponse(_p); return;*/ case GF_IPMPX_TRUSTED_TOOL_TAG: { GF_IPMPX_TrustedTool *p = (GF_IPMPX_TrustedTool *)_p; while (gf_list_count(p->trustSpecifications)) { GF_IPMPX_Data *ts = (GF_IPMPX_Data *)gf_list_get(p->trustSpecifications, 0); gf_list_rem(p->trustSpecifications, 0); gf_ipmpx_data_del(ts); } gf_list_del(p->trustSpecifications); free(p); return; } case GF_IPMPX_TRUST_SPECIFICATION_TAG: { GF_IPMPX_TrustSpecification *p = (GF_IPMPX_TrustSpecification *)_p; GF_IPMPX_DELETE_ARRAY(p->CCTrustMetadata); free(p); return; } case GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG: { GF_IPMPX_ParametricDescriptionItem *p = (GF_IPMPX_ParametricDescriptionItem*)_p; GF_IPMPX_DELETE_ARRAY(p->main_class); GF_IPMPX_DELETE_ARRAY(p->subClass); GF_IPMPX_DELETE_ARRAY(p->typeData); GF_IPMPX_DELETE_ARRAY(p->type); GF_IPMPX_DELETE_ARRAY(p->addedData); free(p); return; } case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG: _p->tag = GF_IPMPX_AUTH_AlgorithmDescr_Tag; GF_IPMPX_AUTH_Delete((GF_IPMPX_Authentication*)_p); return; case GF_IPMPX_KEY_DESCRIPTOR_TAG: _p->tag = GF_IPMPX_AUTH_KeyDescr_Tag; GF_IPMPX_AUTH_Delete((GF_IPMPX_Authentication*)_p); return; case GF_IPMPX_SEL_ENC_BUFFER_TAG: { GF_IPMPX_SelEncBuffer*p = (GF_IPMPX_SelEncBuffer*)_p; GF_IPMPX_DELETE_ARRAY(p->Stream_Cipher_Specific_Init_Info); free(p); return; } case GF_IPMPX_SEL_ENC_FIELD_TAG: { GF_IPMPX_SelEncField*p = (GF_IPMPX_SelEncField*)_p; GF_IPMPX_DELETE_ARRAY(p->shuffleSpecificInfo); if (p->mappingTable) free(p->mappingTable); free(p); return; } case GF_IPMPX_GET_TOOLS_TAG: default: free(_p); return; }}GF_Err GF_IPMPX_ReadData(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 read){ switch (_p->tag) { case GF_IPMPX_RIGHTS_DATA_TAG: case GF_IPMPX_OPAQUE_DATA_TAG: return ReadGF_IPMPX_OpaqueData(bs, _p, read); case GF_IPMPX_KEY_DATA_TAG: return ReadGF_IPMPX_KeyData(bs, _p, read); case GF_IPMPX_SECURE_CONTAINER_TAG: return ReadGF_IPMPX_SecureContainer(bs, _p, read); case GF_IPMPX_ADD_TOOL_LISTENER_TAG: return ReadGF_IPMPX_AddToolNotificationListener(bs, _p, read); case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG: return ReadGF_IPMPX_RemoveToolNotificationListener(bs, _p, read); case GF_IPMPX_INIT_AUTHENTICATION_TAG: return ReadGF_IPMPX_InitAuthentication(bs, _p, read); case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: return ReadGF_IPMPX_MutualAuthentication(bs, _p, read); case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: return ReadGF_IPMPX_ParametricDescription(bs, _p, read); case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG: return ReadGF_IPMPX_ToolParamCapabilitiesQuery(bs, _p, read); case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG: return ReadGF_IPMPX_ToolParamCapabilitiesResponse(bs, _p, read); case GF_IPMPX_GET_TOOLS_RESPONSE_TAG: return ReadGF_IPMPX_GetToolsResponse(bs, _p, read); case GF_IPMPX_GET_TOOL_CONTEXT_TAG: return ReadGF_IPMPX_GetToolContext(bs, _p, read); case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG: return ReadGF_IPMPX_GetToolContextResponse(bs, _p, read); case GF_IPMPX_CONNECT_TOOL_TAG: return ReadGF_IPMPX_ConnectTool(bs, _p, read); case GF_IPMPX_DISCONNECT_TOOL_TAG: return ReadGF_IPMPX_DisconnectTool(bs, _p, read); case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG: return ReadGF_IPMPX_NotifyToolEvent(bs, _p, read); case GF_IPMPX_CAN_PROCESS_TAG: return ReadGF_IPMPX_CanProcess(bs, _p, read); case GF_IPMPX_TRUST_SECURITY_METADATA_TAG: return ReadGF_IPMPX_TrustSecurityMetadata(bs, _p, read); case GF_IPMPX_TOOL_API_CONFIG_TAG: return ReadGF_IPMPX_ToolAPI_Config(bs, _p, read); case GF_IPMPX_ISMACRYP_TAG: return ReadGF_IPMPX_ISMACryp(bs, _p, read); case GF_IPMPX_SEL_DEC_INIT_TAG: return ReadGF_IPMPX_SelectiveDecryptionInit(bs, _p, read); case GF_IPMPX_AUDIO_WM_INIT_TAG: case GF_IPMPX_VIDEO_WM_INIT_TAG: return ReadGF_IPMPX_WatermarkingInit(bs, _p, read); case GF_IPMPX_AUDIO_WM_SEND_TAG: case GF_IPMPX_VIDEO_WM_SEND_TAG: return ReadGF_IPMPX_SendWatermark(bs, _p, read);/* case GF_IPMPX_USER_QUERY_TAG: return ReadGF_IPMPX_UserQuery(bs, _p, read); case GF_IPMPX_USER_RESPONSE_TAG: return ReadGF_IPMPX_UserQueryResponse(bs, _p, read);*/ case GF_IPMPX_GET_TOOLS_TAG: return GF_OK; default: return GF_BAD_PARAM; }}u32 gf_ipmpx_data_size(GF_IPMPX_Data *_p){ switch (_p->tag) { case GF_IPMPX_RIGHTS_DATA_TAG: case GF_IPMPX_OPAQUE_DATA_TAG: return SizeGF_IPMPX_OpaqueData(_p); case GF_IPMPX_KEY_DATA_TAG: return SizeGF_IPMPX_KeyData(_p); case GF_IPMPX_SECURE_CONTAINER_TAG: return SizeGF_IPMPX_SecureContainer(_p); case GF_IPMPX_ADD_TOOL_LISTENER_TAG: return SizeGF_IPMPX_AddToolNotificationListener(_p); case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG: return SizeGF_IPMPX_RemoveToolNotificationListener(_p); case GF_IPMPX_INIT_AUTHENTICATION_TAG: return SizeGF_IPMPX_InitAuthentication(_p); case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG: return SizeGF_IPMPX_MutualAuthentication(_p); case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG: return SizeGF_IPMPX_ParametricD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -