我知道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;
}
#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;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货