现在的位置: 首页 > 综合 > 正文

Skia画图测试

2013年09月03日 ⁄ 综合 ⁄ 共 11719字 ⁄ 字号 评论关闭

/*************************************** . mk ****************************************************/

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES:= \
        ILiveSearchService.cpp \
        LiveSearchService.cpp \
        CommonConvertor.cpp \
        ISystemControlService.cpp \
        SystemControlService.cpp \
        ILivePlayService.cpp \
        LivePlayService.cpp \
        IEPGService.cpp \
        EPGService.cpp \
        ISystemInfoService.cpp \
        SystemInfoService.cpp \
        IDvbUpdateService.cpp \
        DvbUpdateService.cpp \
        ILiveBouquetService.cpp \
        LiveBouquetService.cpp \
        LiveDrawService.cpp \

LOCAL_SHARED_LIBRARIES := \
        libui libcutils libutils libbinder libsonivox libicuuc libexpat \
        libdl  \
        libandroid_runtime \
libsurfaceflinger_client \
        libskia

LOCAL_SHARED_LIBRARIES += libstlport \

LOCAL_SHARED_LIBRARIES += libdm \

LOCAL_MODULE:= libnativedm

LOCAL_MODULE_TAGS := eng

LOCAL_C_INCLUDES := \
    $(JNI_H_INCLUDE) \
    ccdt/frameworks/base/dvb/libdm \
    $(TOP)/external/stlport/stlport \
    $(TOP)/external/skia/include/core \
    $(TOP)/external/skia/include/utils \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/EpgReceiver \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/ProgramSearch \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/ServiceFactory \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/SystemControl \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/ProgramPlay \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/SystemInfo \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/BouquetMonitor \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/OtaLoader \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DDManager \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/Notification \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/TableFilter \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/SectionFilter \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/FrontMonitor \
    ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/TableSystem \
    ccdt/frameworks/base/dvb/libdm/src/include \
    ccdt/frameworks/base/dvb/libdm//src/DVB/DvbCore/include \
    ccdt/frameworks/base/dvb/libdm/src/DD/include \
    ccdt/frameworks/base/dvb/libdm/src/DVB/Utils \

include $(BUILD_SHARED_LIBRARY)

/*******************************************   .h  ************************************************************/

#ifndef LIVEDRAWSERVICE_H
#define LIVEDRAWSERVICE_H

#include <utils/threads.h>
#include <utils/String16.h>

#include <surfaceflinger/SurfaceComposerClient.h>
#include <surfaceflinger/Surface.h>
#include <surfaceflinger/ISurfaceComposer.h>

#include <SkCanvas.h>
#include <SkRegion.h>
#include <SkBitmap.h>

namespace android {

    enum ePixelFormat {
        PixelFormat_32BitRGBA = PIXEL_FORMAT_RGBA_8888 ,    // 4x8-bit RGBA
        PixelFormat_32BitRGB0 = PIXEL_FORMAT_RGBX_8888 ,  // 4x8-bit RGB0
        PixelFormat_24BitRGB  = PIXEL_FORMAT_RGB_888 ,    // 3x8-bit RGB
        PixelFormat_16BitRGB  = PIXEL_FORMAT_RGB_565  ,    // 16-bit RGB
        PixelFormat_32BitBGRA = PIXEL_FORMAT_BGRA_8888 ,  // 4x8-bit BGRA
        PixelFormat_16BitARGB5551 = PIXEL_FORMAT_RGBA_5551  ,  // 16-bit ARGB
        PixelFormat_16BitARGB4444 = PIXEL_FORMAT_RGBA_4444 ,  // 16-bit ARGB
    };

    enum eColorConfig {
        ColorConfig_KARGB4444 = SkBitmap::kARGB_4444_Config,  //!< 16-bits per pixel, (see SkColorPriv.h for packing)
        ColorConfig_KARGB8888 = SkBitmap::kARGB_8888_Config,  //!< 32-bits per pixel, (see SkColorPriv.h for packing)
    };

class LiveDrawService
{
public:

    int open(int canvasId,int x,int y,int w,int h,ePixelFormat mPixelFormat,eColorConfig rgbConfig);
    int close(int canvasId);
    int closeAll();
    int drawBuffer(int canvasId,void* picBuffer,int w,int h,int x,int y,int alphaValue,eColorConfig rgbConfig);
    int clearCanvas(int canvasId);
    int hideCanvas(int canvasId);
    int showCanvas(int canvasId);
    LiveDrawService();
    ~LiveDrawService();
};

class DvbCanvasManager
{
public:
    sp<SurfaceComposerClient> videoClient;
    sp<SurfaceControl> spSurCtrl ;
    SurfaceControl* surContrl ;
    sp<Surface> sur ;
    SkCanvas* canvas ;
    SkPaint* paint ;
    int canvasWidth,canvasHeight;
    eColorConfig mColorConfig;
    int drawBuffer(void* picBuffer,int w,int h,int x,int y,eColorConfig rgbConfig,int alphaValue,bool isClearBefor);
    int clearCanvas();
    int hideCanvas();
    int showCanvas();
    int getBytesPerPixByRgbConfig(eColorConfig rgbConfig);

};

}//end namespace android
#endif // LIVEDRAWSERVICE_H

/************************************         cpp            ***********************************************/
#include "LiveDrawService.h"

#include <stdlib.h>
#include <stdio.h>
#include <utils/Log.h>

using namespace android;

std::map<int,DvbCanvasManager> allCanvasMap;
int pid = -1;
SkColor color[2] = {0xaf00ff00,0xaf0000ff};
int indexColor = 1;

LiveDrawService::LiveDrawService()
{

    pid = getpid();
    //canvas 1
    int buffer[500 * 100];
    for(int i = 0 ;i < 20000;i++) {
       buffer[i] = 0xff00ff00;
    }
    for(int i = 20000 ;i < 50000;i++) {
       buffer[i] = 0xff0000ff;
    }
    open(1,500,150,300,500,PixelFormat_32BitRGBA,ColorConfig_KARGB8888);
    drawBuffer(1,buffer,500,100,0,0,-1,ColorConfig_KARGB8888);

    //canvas 2
    int buffer2[100 * 1000];
    for(int i = 0 ;i < 50000;i++) {
       buffer2[i] = 0xff00ff00;
    }
    for(int i = 50000 ;i < 100000;i++) {
       buffer2[i] = 0xff0000ff;
    }
    open(2,100,600,1200,100,PixelFormat_32BitRGBA,ColorConfig_KARGB8888);
    drawBuffer(2,buffer2,1000,100,0,0,-1,ColorConfig_KARGB8888);

}

LiveDrawService::~LiveDrawService()
{

}

int LiveDrawService::open(int canvasId,int x,int y,int w,int h,ePixelFormat mPixelFormat,eColorConfig mColorConfig)
{
    LOGI(" %s in [x=%d,y=%d,w=%d,h=%d]",__FUNCTION__,x,y,w,h);

    std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);

    if(itCanvas == allCanvasMap.end()) {//not exist open it
        LOGI("open new canvas!!");
        DvbCanvasManager *oneCanvasManager = new DvbCanvasManager();
        oneCanvasManager->videoClient = new SurfaceComposerClient;
        if(oneCanvasManager->videoClient == NULL) {
           LOGI("oneCanvasManager->videoClient = NULL!! return");
        }
        oneCanvasManager->spSurCtrl = oneCanvasManager->videoClient->createSurface(pid,0,w,h,mPixelFormat,0);
        oneCanvasManager->surContrl = oneCanvasManager->spSurCtrl.get();
        oneCanvasManager->sur = oneCanvasManager->surContrl->getSurface();
        oneCanvasManager->mColorConfig = mColorConfig;
        oneCanvasManager->videoClient->openTransaction();//set surface value
        oneCanvasManager->spSurCtrl->setSize(w, h);
        oneCanvasManager->spSurCtrl->setPosition(x, y);
        oneCanvasManager->spSurCtrl->setLayer(1000000);
        oneCanvasManager->spSurCtrl->hide();
        oneCanvasManager->videoClient->closeTransaction();//end sets

        SkBitmap* pBitmap = new SkBitmap();
        pBitmap->setConfig((SkBitmap::Config)mColorConfig, w, h);

        pBitmap->allocPixels();
        Surface::SurfaceInfo info;

        oneCanvasManager->sur->lock(&info);                  //set Surface to info,about x,y,w,h   lock surface to get data form it
        pBitmap->setPixels(info.bits);     //build bitmap from info
        oneCanvasManager->sur->unlockAndPost();              //release surface after get data

        oneCanvasManager->canvas = new SkCanvas(*pBitmap);   //build canvas form bitmap
        oneCanvasManager->canvasWidth = w;
        oneCanvasManager->canvasHeight = h;
        oneCanvasManager->paint = new SkPaint();
        oneCanvasManager->videoClient->openTransaction();
        oneCanvasManager->spSurCtrl->show();
        oneCanvasManager->videoClient->closeTransaction();

        allCanvasMap.insert(std::make_pair(canvasId,*oneCanvasManager));
        delete oneCanvasManager;
        LOGI("open new canvas over!!");
    }else {
        LOGI("this canvasId is opened no need to open!! canvasId = %d",canvasId);
    }
    return 1;
}

int LiveDrawService::close(int canvasId)
{
    allCanvasMap.erase(canvasId);
    return 1;
}

int LiveDrawService::closeAll()
{
    allCanvasMap.clear();
    return 1;
}

/*******************
  * LiveDrawService draw buffer
  ********************/
int LiveDrawService::drawBuffer(int canvasId,void* picBuffer,int w,int h,int x,int y,int alphaValue,eColorConfig rgbConfig)
{
    LOGI(" %s in canvasId = %d!!",__FUNCTION__,canvasId);
    std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);

    if(itCanvas == allCanvasMap.end()) {//not exist return
        LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
        return -1;
    }else {
        return (*itCanvas).second.drawBuffer(picBuffer,w,h,x,y,rgbConfig,alphaValue,true);
    }
    return -1;
}

int LiveDrawService::clearCanvas(int canvasId)
{
    LOGI("%s in canvasId = %d!!",__FUNCTION__,canvasId);
    std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
    if(itCanvas == allCanvasMap.end()) {//not exist return
        LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
        return -1;
    }else {
        return (*itCanvas).second.clearCanvas();
    }
}

int LiveDrawService::hideCanvas(int canvasId)
{
    LOGI("%s in canvasId = %d!!",__FUNCTION__,canvasId);
    std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
    if(itCanvas == allCanvasMap.end()) {//not exist return
        LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
        return -1;
    }else {
        return (*itCanvas).second.hideCanvas();
    }
}

int LiveDrawService::showCanvas(int canvasId)
{
    LOGI("%s in canvasId = %d!!",__FUNCTION__,canvasId);
    std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
    if(itCanvas == allCanvasMap.end()) {//not exist return
        LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
        return -1;
    }else {
        return (*itCanvas).second.showCanvas();
    }
}

/*******************
  * draw buffer
  ********************/
int DvbCanvasManager::drawBuffer(void* picBuffer,int w,int h,int x,int y,eColorConfig rgbConfig,int alphaValue,bool isClearBefor)
{
    LOGI(" %s in!! [w=%d,h=%d,x=%d,y=%d]",__FUNCTION__,w,h,x,y);
    if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {

        if (Surface::isValid(sur)) {
            if(isClearBefor) {
               clearCanvas();
            }

            SkBitmap* pBitmap = new SkBitmap();
            pBitmap->setConfig((SkBitmap::Config)rgbConfig, w , h ,w * getBytesPerPixByRgbConfig(rgbConfig));//w * pBitmap->bytesPerPixel()
            pBitmap->allocPixels();
            pBitmap->setPixels(picBuffer);

            if(alphaValue > 0) {
                paint->setAlpha(alphaValue);
            }

            SkIRect *mSkIRectSrc = new SkIRect();
            mSkIRectSrc->set(0,0,w,h);

            SkRect *mSkRectDest = new SkRect();
            mSkRectDest->set(x,y,x + w,y + h);

            canvas->drawBitmapRect(*pBitmap,mSkIRectSrc,*mSkRectDest,paint);

            videoClient->openTransaction();
            surContrl->show();
            videoClient->closeTransaction();

            delete pBitmap;
            delete mSkIRectSrc;
            delete mSkRectDest;
        }else {
            LOGI("Surface unvalide!!");
        }
        LOGI("%s draw success !!",__FUNCTION__);
        return 1;
    }else {
        LOGI("%s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
    }
    return -1;
}

int DvbCanvasManager::clearCanvas()
{
    LOGI("%s in!!",__FUNCTION__);
    if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
        canvas->drawColor(0x00ffffff);//not work,the color is over old
        /*
        SkBitmap* pBitmap = new SkBitmap();
        pBitmap->setConfig((SkBitmap::Config)mColorConfig, canvasWidth , canvasHeight ,canvasWidth * getBytesPerPixByRgbConfig(mColorConfig));//w * pBitmap->bytesPerPixel()
        pBitmap->allocPixels();
        pBitmap->eraseARGB(0,0,0,0);
        canvas->drawBitmap(*pBitmap,0,0);
        */
        LOGI("%s over!!",__FUNCTION__);
    }else {
        LOGI(" %s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
    }
    return 1;
}

int DvbCanvasManager::hideCanvas()
{
    LOGI("%s in!!",__FUNCTION__);
    if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
        videoClient->openTransaction();
        surContrl->hide();
        videoClient->closeTransaction();
    }else {
        LOGI(" %s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
    }
    return 1;
}

int DvbCanvasManager::showCanvas()
{
    LOGI("%s in!!",__FUNCTION__);
    if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
        videoClient->openTransaction();
        surContrl->show();
        videoClient->closeTransaction();
    }else {
        LOGI(" %s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
    }
    return 1;
}

int DvbCanvasManager::getBytesPerPixByRgbConfig(eColorConfig rgbConfig)
{
  int bytes = 2;
  switch(rgbConfig)
  {
  case ColorConfig_KARGB4444 :
      {
        bytes = 2;
      }
      break;
  case ColorConfig_KARGB8888 :
      {
        bytes = 4;
      }
      break;
  default:
      break;
  }
  return bytes ;
}

抱歉!评论已关闭.