zoukankan      html  css  js  c++  java
  • recovery 下界面UI旋转90 180 270修改

    原文修改出自简书:https://www.jianshu.com/p/768fdd954061

    应该是MTK修改的google源码,支持recovery下屏幕旋转90/180/270, 作者把MTK的修改上传了,验证没有问,可以直接使用,多谢分享

    Android O恢复出厂设置时,图标和屏的方向不一致

            

    96          
    wyman_wu                                                   
                     2018.12.19 17:55               字数 55             阅读 18评论 0
                       

            

    在alpsootable ecoveryminuiAndroid.mk中 添加mt_graphic_rotate.cpp

    LOCAL_SRC_FILES := 
        events.cpp 
        graphics.cpp 
        graphics_adf.cpp 
        graphics_drm.cpp 
        graphics_fbdev.cpp 
        resources.cpp 
        mt_graphic_rotate.cpp
    

    在alpsootable ecoveryminuigraphics_fbdev.cpp中做修改

    #if 0
      Blank(true);
      Blank(false);
    #endif
    
      // return gr_draw;//mtk delete
      return rotate_canvas_get(gr_draw);//mtk add
    
    GRSurface* MinuiBackendFbdev::Flip() {
      rotate_surface(gr_draw, rotate_canvas_get(gr_draw));//mtk add
      if (double_buffered) {
    
    } else {
        // Copy from the in-memory surface to the framebuffer.
        memcpy(gr_framebuffer[0].data, gr_draw->data, gr_draw->height * gr_draw->row_bytes);
      }
      // return gr_draw;//mtk delete
      return rotate_canvas_get(gr_draw);//mtk add
    
    rotate_canvas_exit();//mtk add
      if (!double_buffered && gr_draw) {
        free(gr_draw->data);
        free(gr_draw);
      }
    

    创建alpsootable ecoveryminuimt_graphic_rotate.cpp

    /*
    * Copyright (C) 2014 MediaTek Inc.
    * Modification based on code covered by the mentioned copyright
    * and/or permission notice(s).
    */
    
    
    #include <stdbool.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <inttypes.h>
    
    #include <fcntl.h>
    #include <stdio.h>
    
    #include <sys/cdefs.h>
    #include <sys/ioctl.h>
    #include <sys/mman.h>
    #include <sys/types.h>
    
    #include <linux/fb.h>
    #include <linux/kd.h>
    
    #include "minui/minui.h"
    #include "graphics.h"
    
    GRSurface __gr_canvas;
    
    GRSurface* gr_canvas = NULL;
    int rotate_index=-1;
    
    static void print_surface_info(GRSurface *s, const char *name)
    {
        printf("[graphics] %s > Height:%d, Width:%d, PixelBytes:%d, RowBytes:%d, Size:%d, Data: 0x%08" PRIxPTR "
    ",
            name, s->height, s->width, s->pixel_bytes, s->row_bytes, s->height* s->row_bytes, (uintptr_t) s->data);
    }
    
    // Read configuration from MTK_LCM_PHYSICAL_ROTATION
    #ifndef MTK_LCM_PHYSICAL_ROTATION
    #define MTK_LCM_PHYSICAL_ROTATION "undefined"
    #endif
    static int rotate_config(GRSurface *gr_draw)
    {
        if (rotate_index<0)
        {
            if (gr_draw->pixel_bytes != 4) rotate_index=0; // support 4 bytes pixel only
            else if (0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "90", 2)) 
            {
                rotate_index=1;
            }
            else if (0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3)) 
            {
                rotate_index=2;
            }
            
            else if (0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "270", 3)) rotate_index=3;
            else rotate_index=0;
            printf("[graphics] rotate_config %d %s
    ", rotate_index, MTK_LCM_PHYSICAL_ROTATION);
        }
        return 3;//mtk /*修改这个值可以改变图标的方向*/
    }
    
    #define swap(x, y, type) {type z; z=x; x=y; y=z;}
    
    // Allocate and setup the canvas object
    void rotate_canvas_init(GRSurface *gr_draw)
    {
        gr_canvas = &__gr_canvas;
        memcpy(gr_canvas, gr_draw, sizeof(GRSurface));
    
        // Swap canvas' height and width, if the rotate angle is 90" or 270"
        if (rotate_config(gr_draw)%2) {
            swap(gr_canvas->width, gr_canvas->height, int);
            gr_canvas->row_bytes = gr_canvas->width * gr_canvas->pixel_bytes;
        }
    
        gr_canvas->data = (unsigned char*) malloc(gr_canvas->height * gr_canvas->row_bytes);
        if (gr_canvas->data == NULL) {
            printf("[graphics] rotate_canvas_init() malloc gr_canvas->data failed
    ");
            gr_canvas = NULL;
            return;
        }
    
        memset(gr_canvas->data,  0, gr_canvas->height * gr_canvas->row_bytes);
    
        print_surface_info(gr_draw, "gr_draw");
        print_surface_info(gr_canvas, "gr_canvas");
    }
    
    // Cleanup the canvas
    void rotate_canvas_exit(void)
    {
        if (gr_canvas) {
            if (gr_canvas->data)
                free(gr_canvas->data);
            free(gr_canvas);
        }
        gr_canvas=NULL;
    }
    
    // Return the canvas object
    GRSurface *rotate_canvas_get(GRSurface *gr_draw)
    {
        // Initialize the canvas, if it was not exist.
        if (gr_canvas==NULL)
            rotate_canvas_init(gr_draw);
        return gr_canvas;
    }
    
    // Surface Rotate Routines
    static void rotate_surface_0(GRSurface *dst, GRSurface *src)
    {
        memcpy(dst->data, src->data, src->height*src->row_bytes);
    }
    
    static void rotate_surface_270(GRSurface *dst, GRSurface *src)
    {
        int v, w, h;
        unsigned int *src_pixel;
        unsigned int *dst_pixel;
    
        for (h=0, v=src->width-1; h<dst->height; h++, v--) {
            for (w=0; w<dst->width; w++) {
                dst_pixel = (unsigned int *)(dst->data + dst->row_bytes*h);
                src_pixel = (unsigned int *)(src->data + src->row_bytes*w);
                *(dst_pixel+w)=*(src_pixel+v);
            }
        }
    }
    
    static void rotate_surface_180(GRSurface *dst, GRSurface *src)
    {
        int v, w, k, h;
        unsigned int *src_pixel;
        unsigned int *dst_pixel;
    
        for (h=0, k=src->height-1; h<dst->height && k>=0 ; h++, k--) {
            dst_pixel = (unsigned int *)(dst->data + dst->row_bytes*h);
            src_pixel = (unsigned int *)(src->data + src->row_bytes*k);
            for (w=0, v=src->width-1; w<dst->width && v>=0; w++, v--) {
                *(dst_pixel+w)=*(src_pixel+v);
            }
        }
    }
    
    static void rotate_surface_90(GRSurface *dst, GRSurface *src)
    {
        int w, k, h;
        unsigned int *src_pixel;
        unsigned int *dst_pixel;
    
        for (h=0; h<dst->height; h++) {
            for (w=0, k=src->height-1; w<dst->width; w++, k--) {
                dst_pixel = (unsigned int *)(dst->data + dst->row_bytes*h);
                src_pixel = (unsigned int *)(src->data + src->row_bytes*k);
                *(dst_pixel+w)=*(src_pixel+h);
            }
        }
    }
    
    typedef void (*rotate_surface_t) (GRSurface *, GRSurface *);
    
    rotate_surface_t rotate_func[4]=
    {
        rotate_surface_0,
        rotate_surface_90,
        rotate_surface_180,
        rotate_surface_270
    };
    
    // rotate and copy src* surface to dst surface
    void rotate_surface(GRSurface *dst, GRSurface *src)
    {
        rotate_surface_t rotate;
        rotate=rotate_func[rotate_config(dst)];
        rotate(dst, src);
    }
    
    
    

    创建alpsootable ecoveryminuimt_graphic_rotate.h

    /*
    * Copyright (C) 2014 MediaTek Inc.
    * Modification based on code covered by the mentioned copyright
    * and/or permission notice(s).
    */
    
    #ifndef MT_GRAPHICS_ROTATE_H_
    #define MT_GRAPHICS_ROTATE_H_
    
    #include "minui/minui.h"
    
    void rotate_canvas_exit(void);
    void rotate_canvas_init(GRSurface *gr_draw);
    void rotate_surface(GRSurface *dst, GRSurface *src);
    GRSurface *rotate_canvas_get(GRSurface *gr_draw);
    
    #endif
    
  • 相关阅读:
    马肯9450命令回传
    上海公积金社保业务办理
    工厂调试命令总结
    数据库自动备份
    powerDesigner16.5导出word
    winform 打印预览
    winform 页面设计(一)
    梅特勒-托利多 TCS-35 电子台秤
    winform 练习多线程
    ASP.NET Core 3.1使用Swagger API接口文档
  • 原文地址:https://www.cnblogs.com/codeking100/p/10344008.html
Copyright © 2011-2022 走看看