我知道Surface_lockCanvas函数是和画图相关的一个函数
#ifdef FSL_EPDC_FB 宏定义内就是别人加的代码,本身android的源码里面不带这一段。谁能告诉我下加这一段的含义static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect)
{
    const sp<Surface>& surface(getSurface(env, clazz));
    if (!Surface::isValid(surface))
        return 0;    // get dirty region
    Region dirtyRegion;
    if (dirtyRect) {
        Rect dirty;
        dirty.left  = env->GetIntField(dirtyRect, ro.l);
        dirty.top   = env->GetIntField(dirtyRect, ro.t);
        dirty.right = env->GetIntField(dirtyRect, ro.r);
        dirty.bottom= env->GetIntField(dirtyRect, ro.b);
        if (!dirty.isEmpty()) {
            dirtyRegion.set(dirty);    
        }
    } else {
        dirtyRegion.set(Rect(0x3FFF,0x3FFF));
    }    Surface::SurfaceInfo info;
    status_t err = surface->lock(&info, &dirtyRegion);
    if (err < 0) {
        const char* const exception = (err == NO_MEMORY) ?
            OutOfResourcesException :
            "java/lang/IllegalArgumentException";
        doThrow(env, exception, NULL);
        return 0;
    }    #ifdef FSL_EPDC_FB
    int *pDirtyRectGroup=NULL;
    int dirtyRectGroupSize=0;
    status_t err;
    if(dirtyRectGroup !=NULL)
    {
dirtyRectGroupSize = env->GetArrayLength(dirtyRectGroup);
if(dirtyRectGroupSize > 0)
{
pDirtyRectGroup = new int[dirtyRectGroupSize];
int *pTemp = env->GetIntArrayElements(dirtyRectGroup,NULL);
memcpy(pDirtyRectGroup, pTemp, dirtyRectGroupSize*sizeof(int));
env->ReleaseIntArrayElements(pDirtyRectGroup, pTemp,0);

err = surface->lock(&info,&dirtyRegion,true, dirtyRectGroupSize, pDirtyRectGroup);
}
else
{
err = surface->lock(&info,&dirtyRegion,true, 0, NULL); }
    }
    else
    {
err = surface->lock(&info,&dirtyRegion,true, 0, NULL);    }
    if(NULL != pDirtyRectGroup)
    {
delete []pDirtyRectGroup;
    }
    #else
    status_t err = surface->lock(&info,&dirtyRegion);
    #endif    // Associate a SkCanvas object to this surface
    jobject canvas = env->GetObjectField(clazz, so.canvas);
    env->SetIntField(canvas, co.surfaceFormat, info.format);    SkCanvas* nativeCanvas = (SkCanvas*)env->GetIntField(canvas, no.native_canvas);
    SkBitmap bitmap;
    ssize_t bpr = info.s * bytesPerPixel(info.format);
    bitmap.setConfig(convertPixelFormat(info.format), info.w, info.h, bpr);
    if (info.format == PIXEL_FORMAT_RGBX_8888) {
        bitmap.setIsOpaque(true);
    }
    if (info.w > 0 && info.h > 0) {
        bitmap.setPixels(info.bits);
    } else {
        // be safe with an empty bitmap.
        bitmap.setPixels(NULL);
    }
    nativeCanvas->setBitmapDevice(bitmap);
    
    SkRegion clipReg;
    if (dirtyRegion.isRect()) { // very common case
        const Rect& b(dirtyRegion.getBounds());
        clipReg.setRect(b.left, b.top, b.right, b.bottom);
    } else {
        size_t count;
        Rect const* r = dirtyRegion.getArray(&count);
        while (count) {
            clipReg.op(r->left, r->top, r->right, r->bottom, SkRegion::kUnion_Op);
            r++, count--;
        }
    }    nativeCanvas->clipRegion(clipReg);
    
    int saveCount = nativeCanvas->save();
    env->SetIntField(clazz, so.saveCount, saveCount);    if (dirtyRect) {
        const Rect& bounds(dirtyRegion.getBounds());
        env->SetIntField(dirtyRect, ro.l, bounds.left);
        env->SetIntField(dirtyRect, ro.t, bounds.top);
        env->SetIntField(dirtyRect, ro.r, bounds.right);
        env->SetIntField(dirtyRect, ro.b, bounds.bottom);
    }
    
    return canvas;
}