106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian/*
206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * Copyright (C) 2010 The Android Open Source Project
306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian *
406e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
506e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * you may not use this file except in compliance with the License.
606e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * You may obtain a copy of the License at
706e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian *
806e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
906e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian *
1006e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * Unless required by applicable law or agreed to in writing, software
1106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * See the License for the specific language governing permissions and
1406e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian * limitations under the License.
1506e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian */
1606e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
1706e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <utils/Log.h>
1806e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
1906e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <binder/IPCThreadState.h>
2006e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <binder/ProcessState.h>
2106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <binder/IServiceManager.h>
2206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
2306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <binder/IMemory.h>
2490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h>
2506e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
2606e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <SkImageEncoder.h>
2706e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian#include <SkBitmap.h>
2806e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
2906e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopianusing namespace android;
3006e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
3106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopianint main(int argc, char** argv)
3206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian{
3306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    if (argc != 2) {
3406e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian        printf("usage: %s path\n", argv[0]);
3506e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian        exit(0);
3606e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    }
3706e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
3806e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    const String16 name("SurfaceFlinger");
3906e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    sp<ISurfaceComposer> composer;
4006e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    getService(name, &composer);
4106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
4206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    sp<IMemoryHeap> heap;
4306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    uint32_t w, h;
4406e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    PixelFormat f;
459d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    sp<IBinder> display(composer->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
469d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    status_t err = composer->captureScreen(display, &heap, &w, &h, &f, 0, 0);
4706e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    if (err != NO_ERROR) {
4806e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian        fprintf(stderr, "screen capture failed: %s\n", strerror(-err));
4906e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian        exit(0);
5006e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    }
5106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
5206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    printf("screen capture success: w=%u, h=%u, pixels=%p\n",
5306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian            w, h, heap->getBase());
5406e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
5506e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    printf("saving file as PNG in %s ...\n", argv[1]);
5606e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
5706e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    SkBitmap b;
5806e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    b.setConfig(SkBitmap::kARGB_8888_Config, w, h);
5906e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    b.setPixels(heap->getBase());
6006e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    SkImageEncoder::EncodeFile(argv[1], b,
6106e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian            SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality);
6206e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian
6306e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian    return 0;
6406e7056660d65d4b0bbe1bb2cbf3e779074dbd9fMathias Agopian}
65