有关surface操作的应用情况
来源:互联网 发布:心知天气 签名验证 编辑:程序博客网 时间:2024/05/22 15:30
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;
}
// Associate a SkCanvas object to this surface
jobject canvas = env->GetObjectField(clazz, so.canvas);
env->SetIntField(canvas, co.surfaceFormat, info.format);
有关android的绘制机制的复杂度实在是太高了,目前只是从一些层面看问题。
得到一些启示然后进行总结应用。
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;
}
- 有关surface操作的应用情况
- 微软Surface的商务应用
- 普通应用使用Surface的方法
- 从应用的行为理解Surface
- 普通应用使用Surface的方法
- 普通应用使用Surface的方法
- Android 应用窗口 Surface的创建
- windows应用开发由浅入深(二)有关控件的操作
- 有关Access操作时出现“不能打开更多的表”的情况
- 有关Zigbee的应用
- 有关事务的应用
- 有关TreeView的应用
- 有关%和/的应用
- TreeView的有关操作
- TreeView的有关操作
- TreeView的有关操作
- 有关数据库的操作
- 有关时间的操作
- ubuntu 11.04 Firefox JAVA安装
- DB2load 的一些心得
- VIVI+UBOOT ( ^_^ )
- struts2配置
- 打Jar包 ,以及简单的war包在tomcat下的应用
- 有关surface操作的应用情况
- 做有界面的Activex控件的步骤
- 转载数据库设计的几点心得
- RMAN的备份集增量备份
- 读林锐博士的《软件工程思想》有感
- PHP开发中的中文编码问题
- Linux 信号说明列表
- 二进制最大公约数算法
- mac SVN 设置代理