diff options
author | chaviw <chaviw@google.com> | 2017-11-20 18:33:05 -0800 |
---|---|---|
committer | chaviw <chaviw@google.com> | 2017-11-28 15:16:10 -0800 |
commit | 689e091c7faa30f005b9adc0b7b3d2066c62be84 (patch) | |
tree | 423b01b4806be67f073d15c12b59fdf734e92395 /cmds/screencap/screencap.cpp | |
parent | 418346a8cc44c587fdf7b22233e1634c2a838294 (diff) |
Updated screenshot code to reflect native changes.
The changes in native code removed using a GraphicBufferProducer and
instead use only a GraphicBuffer to generate screenshots. Updated JNI
code so it calls the screensot function that returns a GraphicBuffer
and handle returning either a Surface, GraphicBuffer, or Bitmap.
Also updated screencap shell code so it uses the new GraphicBuffer
screenshot code.
Test: Recents, screenshot from SystemUi, screenshot from shell.
Change-Id: I6cb4f619e59461790a2a8f0cd2ea1192d9ae66b6
Diffstat (limited to 'cmds/screencap/screencap.cpp')
-rw-r--r-- | cmds/screencap/screencap.cpp | 97 |
1 files changed, 51 insertions, 46 deletions
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index 6ded24648353..31722815276c 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -159,7 +159,7 @@ int main(int argc, char** argv) void const* mapbase = MAP_FAILED; ssize_t mapsize = -1; - void const* base = NULL; + void* base = NULL; uint32_t w, s, h, f; android_dataspace d; size_t size = 0; @@ -179,7 +179,6 @@ int main(int argc, char** argv) ProcessState::self()->setThreadPoolMaxThreadCount(0); ProcessState::self()->startThreadPool(); - ScreenshotClient screenshot; sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId); if (display == NULL) { fprintf(stderr, "Unable to get handle for display %d\n", displayId); @@ -199,51 +198,57 @@ int main(int argc, char** argv) uint8_t displayOrientation = configs[activeConfig].orientation; uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation]; - status_t result = screenshot.update(display, Rect(), - 0 /* reqWidth */, 0 /* reqHeight */, - INT32_MIN, INT32_MAX, /* all layers */ - false, captureOrientation); - if (result == NO_ERROR) { - base = screenshot.getPixels(); - w = screenshot.getWidth(); - h = screenshot.getHeight(); - s = screenshot.getStride(); - f = screenshot.getFormat(); - d = screenshot.getDataSpace(); - size = screenshot.getSize(); + sp<GraphicBuffer> outBuffer; + status_t result = ScreenshotClient::capture(display, Rect(), 0 /* reqWidth */, + 0 /* reqHeight */, INT32_MIN, INT32_MAX, /* all layers */ false, captureOrientation, + &outBuffer); + if (result != NO_ERROR) { + close(fd); + _exit(1); + } + + result = outBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base); + + if (base == NULL) { + close(fd); + _exit(1); } - if (base != NULL) { - if (png) { - const SkImageInfo info = - SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType, - dataSpaceToColorSpace(d)); - SkPixmap pixmap(info, base, s * bytesPerPixel(f)); - struct FDWStream final : public SkWStream { - size_t fBytesWritten = 0; - int fFd; - FDWStream(int f) : fFd(f) {} - size_t bytesWritten() const override { return fBytesWritten; } - bool write(const void* buffer, size_t size) override { - fBytesWritten += size; - return size == 0 || ::write(fFd, buffer, size) > 0; - } - } fdStream(fd); - (void)SkEncodeImage(&fdStream, pixmap, SkEncodedImageFormat::kPNG, 100); - if (fn != NULL) { - notifyMediaScanner(fn); - } - } else { - uint32_t c = dataSpaceToInt(d); - write(fd, &w, 4); - write(fd, &h, 4); - write(fd, &f, 4); - write(fd, &c, 4); - size_t Bpp = bytesPerPixel(f); - for (size_t y=0 ; y<h ; y++) { - write(fd, base, w*Bpp); - base = (void *)((char *)base + s*Bpp); - } + w = outBuffer->getWidth(); + h = outBuffer->getHeight(); + s = outBuffer->getStride(); + f = outBuffer->getPixelFormat(); + d = HAL_DATASPACE_UNKNOWN; + size = s * h * bytesPerPixel(f); + + if (png) { + const SkImageInfo info = + SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType, dataSpaceToColorSpace(d)); + SkPixmap pixmap(info, base, s * bytesPerPixel(f)); + struct FDWStream final : public SkWStream { + size_t fBytesWritten = 0; + int fFd; + FDWStream(int f) : fFd(f) {} + size_t bytesWritten() const override { return fBytesWritten; } + bool write(const void* buffer, size_t size) override { + fBytesWritten += size; + return size == 0 || ::write(fFd, buffer, size) > 0; + } + } fdStream(fd); + (void)SkEncodeImage(&fdStream, pixmap, SkEncodedImageFormat::kPNG, 100); + if (fn != NULL) { + notifyMediaScanner(fn); + } + } else { + uint32_t c = dataSpaceToInt(d); + write(fd, &w, 4); + write(fd, &h, 4); + write(fd, &f, 4); + write(fd, &c, 4); + size_t Bpp = bytesPerPixel(f); + for (size_t y=0 ; y<h ; y++) { + write(fd, base, w*Bpp); + base = (void *)((char *)base + s*Bpp); } } close(fd); @@ -253,4 +258,4 @@ int main(int argc, char** argv) // b/36066697: Avoid running static destructors. _exit(0); -} +}
\ No newline at end of file |