int main(int argc, char** argv)
{
int width = 720, height = 480;
// set up the thread-pool
sp proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create a client to surfaceflinger
sp client = new SurfaceComposerClient();
//DisplayoutBuffer display;
//client->getDisplayoutBuffer(client->getBuiltInDisplay(HWC_DISPLAY_PRIMARY), &display);
sp dtoken(SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain));
DisplayInfo dinfo;
//获取屏幕的宽高等信息
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
width = dinfo.w;
height = dinfo.h;
printf("w=%d,h=%d,xdpi=%f,ydpi=%f,fps=%f,ds=%f\n",
dinfo.w, dinfo.h, dinfo.xdpi, dinfo.ydpi, dinfo.fps, dinfo.density);
if (status)
return -1;
sp surfaceControl = client->createSurface(String8("testsurface"),
dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565, 0);
#if 0
sp<SurfaceComposerClient> session = new SurfaceComposerClient();
sp<IBinder> dtoken(
SurfaceComposerClient::getInternalDisplayToken(/*ISurfaceComposer::eDisplayIdMain*/));
DisplayInfo dinfo;
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
if (status != OK) {
ALOGE("SurfaceComposerClient::getDisplayInfo failed");
return;
}
Vector<DisplayConfig> configs;
if (const status_t status = SurfaceComposerClient::getDisplayConfigs(dtoken, &configs);
status != OK) {
return;
}
uint32_t flags = ISurfaceComposerClient::eSecure
| ISurfaceComposerClient::eOpaque | ISurfaceComposerClient:: eFXSurfaceBufferQueue;
int width = configs[0].resolution.width;
int height = configs[0].resolution.height;
sp<SurfaceControl> control =
mSession->createSurface(String8("AdsVideoLayer"),
width, height,
PIXEL_FORMAT_RGB_565, flags);
status_t err = session->linkToComposerDeath(this);
if (err != NO_ERROR) {
ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
return;
}
#endif
/**
*
* 绘制jpg图片
*/
SkFILEStream stream("/sdcard/test.jpg");
SkImageDecoder* codec = SkImageDecoder::Factory(&stream);
if (codec) {
SkBitmap * bitmap = new SkBitmap();
SkBitmap bmp;
stream.rewind();
codec->decode(&stream, &bmp, kRGB_565_SkColorType,
SkImageDecoder::kDecodePixels_Mode);
printf("image width=%d, high=%d\n", bmp.width(), bmp.height());
surface->lock(&outBuffer, NULL);
bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
//bitmap.setConfig(convertPixelFormat(outBuffer.format), 320, 240, bpr);
bitmap->setInfo(SkImageInfo::Make(width, height, kRGB_565_SkColorType, kUnpremul_SkAlphaType));
bitmap->setPixels(outBuffer.bits);
SkCanvas * canvas = new SkCanvas(*bitmap);
//dev = new SkDevice(bitmap);
//canvas.setDevice(dev);
//canvas->drawBitmap(bmp, SkIntToScalar(0), SkIntToScalar(0)); //绘制原图
canvas->drawBitmapRect(bmp, SkRect::MakeWH(1080, 1940), &paint); //缩放的方式绘制图片
//bitmap.
printf("postScale after width=%d, height=%d", bmp.width(), bmp.height());
surface->unlockAndPost();
sleep(3);
//delete dev;
}
delete bitmap;
delete canvas;
printf("exit!\n");
IPCThreadState::self()->joinThreadPool();
IPCThreadState::self()->stopProcess();
return 0;
}
GitHub - yrzroger/NativeSFDemo: 基于Android图形显示系统结构的Native演示小程序