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演示小程序

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐