我正在使用Skia(预建)来绘制一个Android原生窗口,我从java表面获取。代码在我可以测试的每个设备上都运行良好,除了三星Galaxy S3(安装了android 4.0.4)。第一个图像是我应该看到的,第二个图像出现在Galaxy S3上:
绘制矩形的jni函数是:
JNIEXPORT void JNICALL Java_com_test_TestSkia_InitializeWindow(JNIEnv* env, jobject thiz, jobject surface)
{
ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
ANativeWindow_Buffer buffer;
ANativeWindow_lock(window, &buffer, NULL);
SkBitmap bitmap;
bitmap.setConfig(convertPixelFormat(buffer.format), buffer.width, buffer.height);
bitmap.setPixels(buffer.bits);
SkCanvas canvas;
canvas.setBitmapDevice(bitmap);
SkRect rectRed;
rectRed.setXYWH(30,30,400,700);
SkPaint paint;
paint.setColor(SK_ColorRED);
canvas.drawRect(rectRed,paint);
ANativeWindow_unlockAndPost(window);
}
我在以下设备上进行了测试,没有问题:
我试着调用ANativeWindow_setBuffersGeometry(窗口,0,0,0)没有运气(无论如何,窗口锁定后缓冲区的尺寸和格式似乎没问题。)
到目前为止,只有Galaxy S3给我带来了麻烦,此时我不知道该怎么做,我甚至无法判断问题是与ndk原生窗口api或skia有关,还是可能是与使用TouchWiz的星系S3有关......任何想法都会受到欢迎!
答案 0 :(得分:2)
您需要考虑buffer.stride
。您的图片清楚地显示您正在buffer.stride != buffer.width
我无法测试,但可能以下更改就足够了:
SkBitmap bitmap;
SkBitmap::Config cfg = convertPixelFormat(buffer.format);
bitmap.setConfig(cfg, buffer.width, buffer.height,
SkBitmap::ComputeBytesPerPixel(cfg) * buffer.stride);