/***************************************************************************** * FUNCTION * gui_image_query_cache_type * DESCRIPTION * Query image type to cache * PARAMETERS * image_id [IN] Image resource ID * filename [IN] Filename * RETURNS * gui_cache_image_type_enum *****************************************************************************/ gui_cache_image_type_enum gui_image_query_cache_type(MMI_ID_TYPE image_id, PS8 filename) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ U16 image_type; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ /* get image type */ if (image_id != 0) { image_type = gdi_image_get_type_from_id(image_id); } else { image_type = gdi_image_get_type_from_file(filename); } /* Do nothing if the image is invalid. */ if (image_type == GDI_IMAGE_TYPE_INVALID) { return GUI_CACHE_IMAGE_NONE; } #if (defined(MT6223) || defined(MT6223P) || defined(MT6205) || defined(MT6205B)) /* For 6223 and 6205, cache GIF and JPG images by PBM. */ if ((image_type == GDI_IMAGE_TYPE_JPG) || (image_type == GDI_IMAGE_TYPE_JPG_FILE) || (image_type == GDI_IMAGE_TYPE_GIF) || (image_type == GDI_IMAGE_TYPE_GIF_FILE)) { return GUI_CACHE_IMAGE_PBM; } #endif /* (defined(MT6223) || defined(MT6223P) || defined(MT6205) || defined(MT6205B)) */ return GUI_CACHE_IMAGE_NONE; }
/***************************************************************************** * FUNCTION * gdi_image_decoder_decode_file_with_output_clipping * DESCRIPTION * * PARAMETERS * offset_x [IN] * offset_y [IN] * width [IN] * height [IN] * output_clipx1 [IN] * output_clipy1 [IN] * output_clipx2 [IN] * output_clipy2 [IN] * is_blt [IN] * image_name [?] * handle_ptr [?] * RETURNS * *****************************************************************************/ GDI_RESULT gdi_image_decoder_decode_file_with_output_clipping( S32 offset_x, S32 offset_y, S32 width, S32 height, S32 output_clipx1, S32 output_clipy1, S32 output_clipx2, S32 output_clipy2, BOOL is_blt, S8 *image_name, gdi_handle *handle_ptr) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ GDI_ENTER_CRITICAL_SECTION(gdi_image_decoder_decode_file) S16 valid_idx; S16 this_idx; U32 file_size; BOOL has_entry = FALSE; FS_HANDLE file_handle; U16 image_type; if (handle_ptr != NULL) { *handle_ptr = GDI_ERROR_HANDLE; } if (width == 0 || height == 0) { GDI_RETURN(GDI_SUCCEED); } /* check if it is a decodable file format */ image_type = gdi_image_get_type_from_file(image_name); if (image_type != GDI_IMAGE_TYPE_JPG_FILE) /* currently, we only support jpeg file */ { GDI_RETURN(GDI_IMAGE_DECODER_ERR_INVALID_IMG_TYPE); } /* find a valid entry to record this jpeg decoder */ for (valid_idx = 0; valid_idx < GDI_IMAGE_DECODER_ITEM_COUNT; valid_idx++) { if (gdi_image_decoder_item_list[valid_idx].is_used == FALSE) { has_entry = TRUE; break; } } if (has_entry == FALSE) { /* cant find entry to save jpeg decoder data */ GDI_RETURN(GDI_IMAGE_DECODER_ERR_NO_ITEM_ENTRY); } /* open file */ file_handle = DRM_open_file((U16*) image_name, FS_READ_ONLY, 0); if (file_handle >= 0) { /* check if size can fit into file buffer */ /* DRM_REPLACE */ /* FS_GetFileSize(file_handle, (kal_uint32*)&file_size); */ DRM_file_size(file_handle, (kal_uint32*) & file_size); /* check if dest size larger than intermediate frame buffer */ if (gdi_image_decoder_frame_buf_size < (U32) ((width + 16) * (height + 16))) /* +16 for jpeg's stuffing */ { /* DRM_REPLACE */ /* FS_Close(file_handle); */ DRM_close_file(file_handle); GDI_RETURN(GDI_IMAGE_DECODER_ERR_FRAME_BUF_NOT_ENOUGH); } if (gdi_image_decoder_item_first_idx == -1) { /* first in the list, re-assign first index */ gdi_image_decoder_item_first_idx = valid_idx; } else { this_idx = gdi_image_decoder_item_first_idx; /* loop to find next */ while (this_idx != -1) { if (gdi_image_decoder_item_list[this_idx].next_idx == -1) { gdi_image_decoder_item_list[this_idx].next_idx = valid_idx; break; } this_idx = gdi_image_decoder_item_list[this_idx].next_idx; } } /* find a valid seq number */ if (gdi_image_decoder_item_seq_num_idx < GDI_IMAGE_DECODER_ITEM_SEQ_NUM_LIMIT - 1) { gdi_image_decoder_item_seq_num_idx++; } else { gdi_image_decoder_item_seq_num_idx = 1; } gdi_image_decoder_item_list[valid_idx].is_used = TRUE; gdi_image_decoder_item_list[valid_idx].file_handle = file_handle; gdi_image_decoder_item_list[valid_idx].is_blt = is_blt; gdi_image_decoder_item_list[valid_idx].img_type = image_type; gdi_image_decoder_item_list[valid_idx].dest_offset_x = offset_x; gdi_image_decoder_item_list[valid_idx].dest_offset_y = offset_y; gdi_image_decoder_item_list[valid_idx].dest_width = (U16) width; gdi_image_decoder_item_list[valid_idx].dest_height = (U16) height; gdi_image_decoder_item_list[valid_idx].next_idx = -1; gdi_image_decoder_item_list[valid_idx].seq_num = gdi_image_decoder_item_seq_num_idx; gdi_image_decoder_item_list[valid_idx].layer_handle = (gdi_handle) gdi_act_layer; gdi_image_decoder_item_list[valid_idx].lcd_handle = GDI_LCD->act_handle; gdi_image_decoder_item_list[valid_idx].clipx1 = gdi_act_layer->clipx1; gdi_image_decoder_item_list[valid_idx].clipy1 = gdi_act_layer->clipy1; gdi_image_decoder_item_list[valid_idx].clipx2 = gdi_act_layer->clipx2; gdi_image_decoder_item_list[valid_idx].clipy2 = gdi_act_layer->clipy2; gdi_image_decoder_item_list[valid_idx].output_clipx1 = output_clipx1; gdi_image_decoder_item_list[valid_idx].output_clipy1 = output_clipy1; gdi_image_decoder_item_list[valid_idx].output_clipx2 = output_clipx2; gdi_image_decoder_item_list[valid_idx].output_clipy2 = output_clipy2; if (gdi_image_decoder_item_list[gdi_image_decoder_item_first_idx].next_idx == -1) { /* only one jpeg wait to decoder, call this function, if already has another jpeg is decoding, the following function will be called when the previous jpeg is decoderd */ gdi_image_decoder_decode_from_list(); } /* succeed create a jpeg decoder entry , return it's sequential no as handle */ if (handle_ptr != NULL) { *handle_ptr = gdi_image_decoder_item_seq_num_idx; } GDI_RETURN(GDI_SUCCEED); } else { /* open File error */ GDI_RETURN(GDI_IMAGE_DECODER_ERR_OPEN_FILE_FAILED); } GDI_EXIT_CRITICAL_SECTION(gdi_image_decoder_decode_file) }