개요
안드로이드에서 hardware/libhardware/include/hardware 디렉토리에 가보면 HAL 관련 헤더파일들이 있는데 이중 copybit 라는것이 있다.
이것이 하는일은 무엇일까?
일단은 헤더파일부터 분석하고 다른 기기에 포팅된 copybit 를 보면서 다른점을 파악해 보도록 하겠다.



위치
안드로이드 기본 헤더파일 이기때문에 "hardware/libhardware/include/hardware" 디렉토리에 헤더파일이 위치하고 "hardware/libhardware/modules/" 디렉토리에 소스파일이 위치하면 된다.



copybit.h 분석

 /**

 * The id of this module

 */

#define COPYBIT_HARDWARE_MODULE_ID "copybit"


/**

 * Name of the graphics device to open

 */

#define COPYBIT_HARDWARE_COPYBIT0 "copybit0"

이부분은 안드로이드 HAL copybit ID 와 하드웨어 디바이스 드라이버 이름을 지정하는 곳이다.
역시나 copybit 도 하드웨어가 있는거 같다.


 /* supported pixel-formats. these must be compatible with

 * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h

 */

enum {

    COPYBIT_FORMAT_RGBA_8888    = HAL_PIXEL_FORMAT_RGBA_8888,

    COPYBIT_FORMAT_RGBX_8888    = HAL_PIXEL_FORMAT_RGBX_8888,

    COPYBIT_FORMAT_RGB_888      = HAL_PIXEL_FORMAT_RGB_888,

    COPYBIT_FORMAT_RGB_565      = HAL_PIXEL_FORMAT_RGB_565,

    COPYBIT_FORMAT_BGRA_8888    = HAL_PIXEL_FORMAT_BGRA_8888,

    COPYBIT_FORMAT_RGBA_5551    = HAL_PIXEL_FORMAT_RGBA_5551,

    COPYBIT_FORMAT_RGBA_4444    = HAL_PIXEL_FORMAT_RGBA_4444,

    COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP,

    COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP,

};

다음은 PIXEL 포멧을 지정하는 곳이다.
아마도 graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h 이 파일들에서 이것을 사용하는것이 아닐까 싶다.

 /* name for copybit_set_parameter */

enum {

    /* rotation of the source image in degrees (0 to 359) */

    COPYBIT_ROTATION_DEG    = 1,

    /* plane alpha value */

    COPYBIT_PLANE_ALPHA     = 2,

    /* enable or disable dithering */

    COPYBIT_DITHER          = 3,

    /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */

    COPYBIT_TRANSFORM       = 4,

    /* blurs the copied bitmap. The amount of blurring cannot be changed

     * at this time. */

    COPYBIT_BLUR            = 5

};

copybit 의 파라메터를 셋팅한다.
이로서 copybit 는 기본적인 2d 연산인 이동,회전,투명,블러 처리 등을 하는것을 알 수있다.

 /* values for copybit_set_parameter(COPYBIT_TRANSFORM) */

enum {

    /* flip source image horizontally */

    COPYBIT_TRANSFORM_FLIP_H    = HAL_TRANSFORM_FLIP_H,

    /* flip source image vertically */

    COPYBIT_TRANSFORM_FLIP_V    = HAL_TRANSFORM_FLIP_V,

    /* rotate source image 90 degres */

    COPYBIT_TRANSFORM_ROT_90    = HAL_TRANSFORM_ROT_90,

    /* rotate source image 180 degres */

    COPYBIT_TRANSFORM_ROT_180   = HAL_TRANSFORM_ROT_180,

    /* rotate source image 270 degres */

    COPYBIT_TRANSFORM_ROT_270   = HAL_TRANSFORM_ROT_270,

};

 이부분은 아마도 COPYBIT_TRANSFORM 파라메터와 같이 사용해서 이미지의 회전을 담당하는것 같다.

 /* enable/disable value copybit_set_parameter */

enum {

    COPYBIT_DISABLE = 0,

    COPYBIT_ENABLE  = 1

};

파라메터 셋팅을 끌수도 있는것인가?
그게 과연 필요한가?


 /* use get_static_info() to query static informations about the hardware */

enum {

    /* Maximum amount of minification supported by the hardware*/

    COPYBIT_MINIFICATION_LIMIT  = 1,

    /* Maximum amount of magnification supported by the hardware */

    COPYBIT_MAGNIFICATION_LIMIT = 2,

    /* Number of fractional bits support by the scaling engine */

    COPYBIT_SCALING_FRAC_BITS   = 3,

    /* Supported rotation step in degres. */

    COPYBIT_ROTATION_STEP_DEG   = 4,

};

하드웨어의 기본적인 정보들 인거 같다.
각각 다른 의미를 지니고 있는것 같지만 아직은 역할을 잘 모르겠다.

/* Image structure */

struct copybit_image_t {

    /* width */

    uint32_t    w;

    /* height */

    uint32_t    h;

    /* format COPYBIT_FORMAT_xxx */

    int32_t     format;

    /* base of buffer with image */

    void        *base;

    /* handle to the image */

    native_handle_t* handle;

};


/* Rectangle */

struct copybit_rect_t {

    /* left */

    int l;

    /* top */

    int t;

    /* right */

    int r;

    /* bottom */

    int b;

};


/* Region */

struct copybit_region_t {

    int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect);

};

copybit_region_t 는 이름그대로 복사 영역이라는 뜻인거 같고 copybit_rect_t 구조체를 링크 시키고 있는것을 알 수있다.
아마도 해당 영역에 copybit 작업을 한 후에 완료된 region 을 image 에 적용하도록 설계되어 있는거 같다.

/**

 * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM

 * and the fields of this data structure must begin with hw_module_t

 * followed by module specific information.

 */

struct copybit_module_t {

    struct hw_module_t common;

};


/**

 * Every device data structure must begin with hw_device_t

 * followed by module specific public methods and attributes.

 */

struct copybit_device_t {

    struct hw_device_t common;


    /**

     * Set a copybit parameter.

     *

     * @param dev from open

     * @param name one for the COPYBIT_NAME_xxx

     * @param value one of the COPYBIT_VALUE_xxx

     *

     * @return 0 if successful

     */

    int (*set_parameter)(struct copybit_device_t *dev, int name, int value);


    /**

     * Get a static copybit information.

     *

     * @param dev from open

     * @param name one of the COPYBIT_STATIC_xxx

     *

     * @return value or -EINVAL if error

     */

    int (*get)(struct copybit_device_t *dev, int name);


    /**

     * Execute the bit blit copy operation

     *

     * @param dev from open

     * @param dst is the destination image

     * @param src is the source image

     * @param region the clip region

     *

     * @return 0 if successful

     */

    int (*blit)(struct copybit_device_t *dev,

                struct copybit_image_t const *dst,

                struct copybit_image_t const *src,

                struct copybit_region_t const *region);


    /**

     * Execute the stretch bit blit copy operation

     *

     * @param dev from open

     * @param dst is the destination image

     * @param src is the source image

     * @param dst_rect is the destination rectangle

     * @param src_rect is the source rectangle

     * @param region the clip region

     *

     * @return 0 if successful

     */

    int (*stretch)(struct copybit_device_t *dev,

                   struct copybit_image_t const *dst,

                   struct copybit_image_t const *src,

                   struct copybit_rect_t const *dst_rect,

                   struct copybit_rect_t const *src_rect,

                   struct copybit_region_t const *region);

};

이것은 모든 안드로이드 HAL 모듈이 가지고 있는 device 와 module 구조체를 생성하는 부분이다.
안드로이드 내에서 이 HAL 모듈을 사용하기 위해서는 여기에 적혀있는 함수를 사용해야만 하기 때문에 이 함수들이야 말로 이 모듈의 기능을 함축하고 있다고 할 수있다.

copybit 에서보면 device 에 추가 함수들이 몇개 보이는데 한번 알아보도록 하자.
먼저 set_parameter 함수는 위에서 알아본 enum 구조체를 사용해서 파라메터를 등록하는 부분인거 같다.
다음으로 get은 역시 위에서 알아본 enum 구조체를 이용하여 하드웨어에 맞는 값을 돌려주는 일을 하는거 같다.

제일 중요한 부분인 blit 함수와 stretch 함수를 보자.
아마 set_parameter 함수를 이용해서 원하는 셋팅을 한후에 blit 이나 stretch 함수를 호출해서 변환을 하는것 같다.

blit 와 stretch 함수는 하는 역할은 똑같이 복사하는것인데 blit 은 원본을 그대로 복사하고 stretch 는 원본을 줄이거나 늘려서 복사하는역할을 하는것 같다.

by cranix 2010. 4. 2. 15:35
| 1 |