• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            專注于服務(wù)器編程、網(wǎng)絡(luò)編程

            ~~保持一顆平常心~~持之以恒~~
            posts - 18, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            mtk mmi相關(guān) 摘抄自別人

            Posted on 2009-12-18 21:57 ~William~ 閱讀(980) 評論(0)  編輯 收藏 引用 所屬分類: MTK_MMI
            MTK層相關(guān)應(yīng)用集合(摘抄)
            2009-11-30 17:58

            對于層,有個核心理念:代表屏幕上像素點陣的數(shù)據(jù)集合

            一般來說,MTK上一個像素由兩個字節(jié)表示

             

             

             

            一,mtk平臺上旋轉(zhuǎn)圖像的代碼,可以任意角度旋轉(zhuǎn)。

            void gdi_image_Rotate_Slope(double x,double y ,double dx ,double dy ,U16 IMAGE_ID,double cosn,double sinn)
            {
            S32 i,
            j,
            n,
            imge_width,
            imge_width2,
            imge_height,
            imge_height2,
            transit_layer_buff_size1,
            transit_layer_buff_size2;
            U16* transit_layer_buff_ptr1,
            * transit_layer_buff_ptr2;
            U16 a,r,g,b;
            gdi_handle      transit_layer1,transit_layer2,last_active_layer;
            S32 j2,i2;
            double wb,x0,y0,x1,y1,u,v;

            gdi_layer_multi_layer_enable();

            gdi_image_get_dimension_id(IMAGE_ID,&imge_width,&imge_height);
            transit_layer_buff_size1=((imge_width)*(imge_height)*16)>>3;
            transit_layer_buff_ptr1=(U16*)mmi_frm_scrmem_alloc(transit_layer_buff_size1);
            gdi_layer_create_using_outside_memory(0,0,imge_width,imge_height,&transit_layer1,(PU8)transit_layer_buff_ptr1,transit_layer_buff_size1);
            gdi_layer_push_and_set_active(transit_layer1);
            gdi_layer_clear(GDI_COLOR_BLUE);
            gdi_layer_set_source_key(TRUE, GDI_COLOR_BLUE);
            gdi_image_draw_id(0,0,IMAGE_ID);
            gdi_layer_pop_and_restore_active();

            imge_width2=240;
            imge_height2=320;
            transit_layer_buff_size2=(imge_width2*imge_height2*16)>>3;
            transit_layer_buff_ptr2=(U16*)mmi_frm_scrmem_alloc(transit_layer_buff_size2);
            gdi_layer_create_using_outside_memory(0,0,imge_width2,imge_height2,&transit_layer2,(PU8)transit_layer_buff_ptr2,transit_layer_buff_size2);
            gdi_layer_push_and_set_active(transit_layer2);
            gdi_layer_clear(GDI_COLOR_BLUE);
            gdi_layer_set_source_key(TRUE, GDI_COLOR_BLUE);


            for(i=0;i<imge_height2;i++)
            {
            for(j=0;j<imge_width2;j++)
               {
               x0=((double)j-x)*cosn+((double)i-y)*sinn+dx;
               y0=((double)i-y)*cosn-((double)j-x)*sinn+dy;
               //x0=(j-x)*cosn+(i-y)*sinn;
               //y0=imge_height+(i-y)*cosn-(j-x)*sinn;
               j2=(S32)x0;
               i2=(S32)y0;

               if((i2<(imge_height-1))&&(j2<(imge_width-1))&&(i2>0)&&(j2>0))
                {

                v=y0-i2;
                u=x0-j2;
                if(u>0.5)
                 j2++;
                if(v>0.5)
                 i2++;
                *(transit_layer_buff_ptr2+(i)*imge_width2+j) = *(transit_layer_buff_ptr1+i2*imge_width+j2);

               }
               }
            }

            gdi_layer_pop_and_restore_active();
            gdi_layer_get_active(&last_active_layer);
            gdi_layer_flatten(last_active_layer,transit_layer2,NULL,NULL);
            //gdi_layer_set_blt_layer(last_active_layer,transit_layer2,NULL,NULL);
            gdi_layer_free(transit_layer1);
            gdi_layer_free(transit_layer2);
            mmi_frm_scrmem_free(transit_layer_buff_ptr1);
            mmi_frm_scrmem_free(transit_layer_buff_ptr2);
            gdi_layer_multi_layer_disable();
            }


            二,近日高仿機大行其道,豐富的視覺效果,方便的觸摸操作成了MMI設(shè)計和模仿的重中之中
            當(dāng)人們在盡情享受這種創(chuàng)意帶來的便利的同時MMI工作者卻不得不去設(shè)計維護一個個功能越來越復(fù)雜,
            界面越來越炫麗的令人頭痛的窗口,沒有別的辦法,稍一失誤,就能導(dǎo)到整個窗口界面凌亂,功能失效,
            最終使程序員不得不不把大量的時間和精力花在令人頭痛的界面維護中,在那些復(fù)雜的代碼中尋找著可能的BUG層的運用也許是解決界面刷新,復(fù)雜界面的堆疊,代碼維護最好的方法

            近日有不少朋友和我討論層的使用,而MTK有關(guān)這方面的資料也確實比較少,少數(shù)幾個掌握了的人又視之如珍寶不愿輕易示人,這里舉一個簡單的例子說明層的創(chuàng)建和運用,在這里我們創(chuàng)建兩個層,加上基層一共三個,基層作為背景層,MTK最多支持四個層合成,層的創(chuàng)建最好放在窗口里或者窗口控件里,在退出窗口時釋放,要不會出問題的。,當(dāng)然在別的地方創(chuàng)建也是可以的,但要注意不能是窗口需要頻繁調(diào)用的函數(shù),因為每次創(chuàng)建窗口都要分配內(nèi)存,頻繁調(diào)用會導(dǎo)致內(nèi)存耗盡,退出時切記釋放。該代碼省略了一些與層無關(guān)的內(nèi)容,比如按按鍵處理,觸屏處理,請知悉
            gdi_handle my_layer1, my_layer2, my_base_layer;
            PU8 buf_ptr;
            void exit_myapp_screen(void)
            {
                if (buf_ptr != NULL)
                {
                    med_free_ext_mem((void **)&buf_ptr);
                }
                if (my_layer1 != NULL)
                {
                    gdi_layer_free(my_layer1);
                }
                if (my_layer2 != NULL)
                {
                    gdi_layer_free(my_layer2);
                }
            }
            static void entry_myapp_screen(void)
            {
                U8 *gui_buffer;
                BOOL isEnable;
                gdi_color base_color;

                EntryNewScreen (SCR_ID_XXXX,exit_myapp_screen,entry_myapp_screen, NULL);

                gui_buffer = GetCurrGuiBuffer(SCR_ID_XXXX);
                //設(shè)置窗口不帶狀態(tài)欄
                entry_full_screen();
                //開啟多層
                gdi_layer_multi_layer_enable();

                /*該處的2等于((GDI_LCD_WIDTH*GDI_LCD_HEIGHT*GDI_MAINLCD_BIT_PER_PIXEL)>>3)
                一個像素使用2個字節(jié)表示,即65536色*/
                  buf_ptr = med_alloc_ext_mem(GDI_LCD_WIDTH*GDI_LCD_HEIGHT*2);
                if (buf_ptr == NULL)
                {
                //加一些錯誤提示
                    return;
                }
                /*從外部內(nèi)存創(chuàng)建窗口,因為MTK提供的直接創(chuàng)建函數(shù)只能創(chuàng)建
                一個層和屏幕大小一樣的層*/
                gdi_layer_create_using_outside_memory(
                                                        0,
                                                        0,
                                                        UI_device_width,
                                                        UI_device_height,
                                                        &my_layer1,
                                                        (PU8) buf_ptr,
                                                        (S32) GDI_LCD_WIDTH*GDI_LCD_HEIGHT*2);
                //激活新層1
                gdi_layer_set_active(my_layer1);
                //把背景全刷成紅色
                gdi_layer_clear_background(GDI_COLOR_RED);
                //設(shè)置紅色為通透色
                gdi_layer_set_source_key(TRUE, GDI_COLOR_RED);
                   /*在層1上畫圖,位置是相對層的位置,因為層大小和基層一樣,
                   且原點和基層重合,故該座標(biāo)也是相對屏幕原點的位置*/
                gdi_image_draw_id(50, 100, IMG_ID_PHOART_ICON_6);
                   //創(chuàng)建層2,使用系統(tǒng)提供的直接創(chuàng)建函數(shù)從層內(nèi)存直接創(chuàng)建
                gdi_layer_create(0, 0, UI_device_width, UI_device_height, &my_layer2);
                //激活新層2
                gdi_layer_set_active(my_layer2);
                gdi_layer_clear_background(GDI_COLOR_TRANSPARENT);//刷色
                gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT);//設(shè)置通透
                //在層2上輸出字串
                gui_move_text_cursor(50, 200);
                gui_print_bordered_text(L"hellow word");

                //在最后要激活基層
                   gdi_layer_get_base_handle(&my_base_layer);
                gdi_layer_set_active(my_layer1);
                //得到當(dāng)前活動層的通透屬性
                gdi_layer_get_source_key(&isEnable, &base_color);
                //設(shè)置通透
                gdi_layer_set_source_key(TRUE, base_color);
                //指定合并層,注意疊加的順序
                gdi_layer_set_blt_layer(my_base_layer, my_layer1, my_layer2, 0);
                //刷新到屏幕上
                gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);
            }

            有關(guān)gdi_layer_create函數(shù)再說明一點,如果你通過這個函數(shù)創(chuàng)建的層大小比屏幕小,倒是可以創(chuàng)建多個的,但你所創(chuàng)建的層大小的總和,不能超過屏幕大小
            還有一點需要注意的是,如果程序運行在仿真上,最好使用MALLOC和FREE替換med_alloc_ext_mem和med_free_ext_mem,也就是寫成

            #ifdef WIN32
            malloc
            #else
            med_alloc_ext_mem
            #endif


            #ifdef WIN32
            free
            #else
            med_free_ext_mem
            #endif

            三,對于MTK平臺來說,菜單和屏幕特效曾經(jīng)在很長的一段時間里,影響甚遠(yuǎn)。但對于其設(shè)計過程和方法,由于各種各樣的原因,很少有人提及。

            這里介紹一種不同于前幾天日志所載之方法的另一種方法,就是復(fù)制圖層,其核心實現(xiàn)函數(shù)如下。

            void my_gdi_layer_copy(gdi_layer_struct* dst_layer, int dst_x, int dst_y, int width, int height,
            gdi_layer_struct* src_layer, int src_x, int src_y)
            {
            U16 *dst_buf, *src_buf;
            int i;

            if (dst_x < 0 || dst_y < 0 || dst_x + width > dst_layer->width || dst_y + height > dst_layer->height)
            {
            if (dst_x < 0)
            {
               width -= -dst_x;
               src_x += -dst_x;
               dst_x = 0;
            }
            if (dst_y < 0)
            {
               height -= -dst_y;
               src_y += -dst_y;
               dst_y = 0;
            }
            if (dst_x + width > dst_layer->width)
            {
               width = dst_layer->width - dst_x;
            }
            if (dst_y + height > dst_layer->height)
            {
               height = dst_layer->height - dst_y;
            }
            }
            if (src_x < 0 || src_y < 0 || src_x + width > src_layer->width || src_y + height > src_layer->height)
            {
            if (src_x < 0)
            {
               width -= -src_x;
               dst_x += -src_x;
               src_x = 0;
            }
            if (src_y < 0)
            {
               height -= -src_y;
               dst_y += -src_y;
               src_y = 0;
            }
            if (src_x + width > src_layer->width)
            {
               width = src_layer->width - src_x;
            }
            if (src_y + height > src_layer->height)
            {
               height = src_layer->height - src_y;
            }
            }
            if (width <= 0 || height <= 0)
            return;

            dst_buf = (U16 *)dst_layer->buf_ptr + dst_y * dst_layer->width + dst_x;
            src_buf = (U16 *)src_layer->buf_ptr + src_y * src_layer->width + src_x;
            for (i = 0; i < height; i ++)
            {
            memcpy(dst_buf, src_buf, width * 2);
            dst_buf += dst_layer->width;
            src_buf += src_layer->width;
            }
            }

            有興趣的朋友可以自己利用該函數(shù)研發(fā)各種各樣的變化效果。

             

             

            四,MTK 的層在窗口設(shè)計中應(yīng)用十分廣泛,對于UI來說,沒有一個窗口不是由層構(gòu)成的,最基本的窗口至少也是在基層上設(shè)計的。以至于許多時候,如果對層不甚了解,連閱讀代碼有時也會遇到困難。我曾經(jīng)寫過一些有關(guān)層的使用的基礎(chǔ)知識,由于有關(guān)這方面資料很少,許多時候只能在模擬器上打斷點自己慢慢研究。

            層可以在模擬器中調(diào)試,在模擬器上的TOOL菜單中的Info Monitor功能窗口,可以看到當(dāng)前窗口由哪些層和各個層顯示的內(nèi)容,但不包括你雖然創(chuàng)建了,但沒有調(diào)用函數(shù)gdi_layer_blt或者與他gdi_layer_blt相類似函數(shù)刷到窗口上的層。

            處理PNG有關(guān)的函數(shù)
            gdi_push_and_set_alpha_blending_source_layer
            gdi_pop_and_set_alpha_blending_source_layer
            gdi_set_alpha_blending_source_layer
            gdi_get_alpha_blending_source_layer
            這一組函數(shù)是在層上繪制PNG圖片時使用,是PNG函數(shù)的專用函數(shù),可以有效還原PNG圖片的效果,前兩個函數(shù)是成對使用,后一個函數(shù)作用同前兩個,但使用上更自由一些,如果超過兩個層,每個層都要畫PNG,無疑使用gdi_set_alpha_blending_source_layer更加方便。最后一個是獲取BLENDING層。

            設(shè)置層的位置
            gdi_layer_set_position
            如果層上的數(shù)據(jù)是經(jīng)過十分復(fù)雜的運算過程得出來的,比如要在IDLE上顯示一個可以使用手指移動的農(nóng)歷是日歷,這時就可以在層上畫好要顯示的數(shù)據(jù),通話移動層的位置實現(xiàn)移動效果,要比每次重繪日歷要快捷的多。

            合并到BASE層
            gdi_layer_flatten_previous_to_base
            類似的函數(shù)還有
            gdi_layer_flatten
            前者是把當(dāng)前窗口數(shù)據(jù)合并到基層,后者是把指定的層合的激活層上,該函數(shù)常常在退出窗口時使用,如果你見有些窗口在彈出對話框時該窗口背景突然消失,那大約就是因為未使用該函數(shù)的原因。因為MTK的很多窗口都不是單一層,更關(guān)鍵的是在創(chuàng)建新窗口時有時會釋放老窗口的層資源,導(dǎo)到在老窗口非基層的顯示數(shù)據(jù)丟失。該函數(shù)使用我們可以使用超過四個層來創(chuàng)建更為復(fù)雜的效果。

            添加DM層
            dm_add_blt_layer
            有時你創(chuàng)建了層,激活了層,在層上也繪上了圖片,也調(diào)用刷屏函數(shù)了,但你總是看不到屏上顯示你的層,在模擬器中的Info Monitor窗口也看不到你的層,有時是你的層閃了一下就沒影了,這時你就要研究dm_redraw_category_screen了,該函數(shù)做為大部分窗口的刷新函數(shù),當(dāng)窗口有變化時,就會執(zhí)行該函數(shù),而該函數(shù)中有一段類似如下的函數(shù)調(diào)用:
                        gdi_layer_blt(
                            dm_layers[0],
                            dm_layers[1],
                            dm_layers[2],
                            dm_layers[3],
                            dm_cat_scr_info.x1,
                            dm_cat_scr_info.y1,
                            dm_cat_scr_info.x2 - dm_cat_scr_info.x1 - 1,
                            dm_cat_scr_info.y2 - dm_cat_scr_info.y1 - 1);
            該調(diào)用會重新刷屏,很遺憾的是,你新創(chuàng)建的層不在數(shù)組dm_layers中,也就不在他刷新的范圍內(nèi)。要么調(diào)用dm_add_blt_layer把你的層加入,要么在dm_redraw_category_screen之后再把你自己的層刷到屏上。

            使用外部內(nèi)存創(chuàng)建層med_alloc_ext_mem當(dāng)然類似函數(shù)也有很多,如mmi_frm_scrmem_alloc
            確切的說,這兩個函數(shù)都不能算是LAYER的函數(shù),但如果你要使gdi_layer_create_using_outside_memory創(chuàng)建層,卻少不了這兩個函數(shù)。在這兩個函數(shù)中,我們常常調(diào)用med_alloc_ext_mem來分配內(nèi)存,是因為該函數(shù)能提供大約400K左右內(nèi)存可供調(diào)用,而 mmi_frm_scrmem_alloc可以提供200~300K內(nèi)存可供調(diào)用。但隨著MTK手機淪為SP賺錢工具后,使用 med_alloc_ext_mem分配內(nèi)存越來越不安全。在之前的一次設(shè)計中,出了問題,多虧公司一高手指點,才消滅了這一處使用的隱患。

            保存層到文件
            gdi_layer_save_jpeg_file
            gdi_layer_save_pbm_file
            gdi_layer_save_bmp_file

            還有一類函數(shù),設(shè)計窗口時可以處理層,但卻不屬于層函數(shù),見一個同事使用,順手拉來,以防忘記
            dm_register_category_controlled_callback
            dm_register_category_controlled2_callback
            該函數(shù)會為創(chuàng)建的層指定繪定函數(shù),并且這兩個函數(shù)只能分別處理DM管理的層,DM管理的層及相關(guān)控件可以在結(jié)構(gòu) mmi_dm_control_ids_enum找到,這兩個函數(shù)可以在DM指定的層上繪圖,既可以處理不同的層,也可以處理相同的層,如果不同的層,可以定義在g_categories_controls_map中的control_set_p中定義如下,control_set_p中一般會包含基層,有時也包含新層,定義如下格式
            const U8 categoryXXXX[] =
            {
                4,
                DM_BASE_LAYER_START,
                DM_CATEGORY_CONTROLLED_AREA,
                DM_NEW_LAYER_START,
                DM_CATEGORY_CONTROLLED_AREA2,
            };但是在該結(jié)構(gòu)中只能定義兩個層,如果你想創(chuàng)建第三個層并使用DM管理,就要使用上面提到的dm_add_blt_layer,層的處理函數(shù)也要自己寫,維護。

            刷屏函數(shù)
            gdi_layer_blt_previous
            gui_BLT_double_buffer
            gdi_layer_blt
            gdi_layer_set_blt_layer
            前三個函數(shù)都是刷屏函數(shù),前兩個功能一模一樣,只能指定刷新的區(qū)域,使用前需要用第四個函數(shù)指定參與操作的層。第三個可以自己指定要刷到屏的層和區(qū)域。需要說明的是,執(zhí)行g(shù)ui_BLT_double_buffer和執(zhí)行g(shù)di_layer_blt_previous不僅效果一樣,執(zhí)行過程也是一樣的,gui_BLT_double_buffer只是個函數(shù)指針,指向gdi_layer_blt_previous,調(diào)用他最后執(zhí)行的仍然是 gdi_layer_blt_previous

            波多野结衣久久一区二区| 久久久久久精品久久久久| 色综合久久久久无码专区| 久久无码人妻精品一区二区三区 | 久久久午夜精品| 久久国产精品二国产精品| 精品久久久久久国产免费了| 久久久久久久99精品免费观看| 91精品国产高清久久久久久io| 久久久婷婷五月亚洲97号色| 蜜臀久久99精品久久久久久小说 | 日产精品久久久久久久性色| 亚洲va久久久噜噜噜久久| 国产69精品久久久久久人妻精品| 久久狠狠爱亚洲综合影院| 99久久国产宗和精品1上映| 无码人妻久久一区二区三区免费 | 性做久久久久久久| 久久久久99精品成人片试看 | 久久伊人中文无码| 久久亚洲国产精品成人AV秋霞| AV无码久久久久不卡蜜桃| 国产成人久久AV免费| 久久青青草原精品影院| 久久精品国产亚洲Aⅴ香蕉| 亚洲欧美精品一区久久中文字幕| 97久久国产露脸精品国产| 狠狠88综合久久久久综合网| 日本三级久久网| 亚洲国产成人乱码精品女人久久久不卡| 久久久国产99久久国产一| 青青草原精品99久久精品66| 欧美亚洲国产精品久久蜜芽 | 欧美牲交A欧牲交aⅴ久久 | 伊人久久综合成人网| 国产精品久久久久久搜索| 午夜精品久久久久成人| 韩国免费A级毛片久久| 久久亚洲天堂| 成人久久久观看免费毛片| 亚洲精品乱码久久久久久蜜桃 |