Index: experimental/webtry/main.cpp |
diff --git a/experimental/webtry/main.cpp b/experimental/webtry/main.cpp |
deleted file mode 100644 |
index a83a60842d5de26b151b7d69cef000a5d8cdc98f..0000000000000000000000000000000000000000 |
--- a/experimental/webtry/main.cpp |
+++ /dev/null |
@@ -1,208 +0,0 @@ |
-#include <sys/time.h> |
-#include <sys/resource.h> |
- |
-#include "GrContextFactory.h" |
- |
-#include "SkCanvas.h" |
-#include "SkCommandLineFlags.h" |
-#include "SkData.h" |
-#include "SkForceLinking.h" |
-#include "SkGraphics.h" |
-#include "SkImageDecoder.h" |
-#include "SkImageEncoder.h" |
-#include "SkImageInfo.h" |
-#include "SkOSFile.h" |
-#include "SkStream.h" |
-#include "SkSurface.h" |
- |
-#include "seccomp_bpf.h" |
- |
-__SK_FORCE_IMAGE_DECODER_LINKING; |
- |
-DEFINE_string(out, "", "Output basename; fiddle will append the config used and the appropriate extension"); |
-DEFINE_string(source, "", "Filename of the source image."); |
-DEFINE_int32(width, 256, "Width of output image."); |
-DEFINE_int32(height, 256, "Height of output image."); |
-DEFINE_bool(gpu, false, "Use GPU (Mesa) rendering."); |
-DEFINE_bool(raster, true, "Use Raster rendering."); |
-DEFINE_bool(pdf, false, "Use PDF rendering."); |
- |
-// Defined in template.cpp. |
-extern SkBitmap source; |
- |
-static bool install_syscall_filter() { |
- |
-#ifndef SK_UNSAFE_BUILD_DESKTOP_ONLY |
- struct sock_filter filter[] = { |
- /* Grab the system call number. */ |
- EXAMINE_SYSCALL, |
- /* List allowed syscalls. */ |
- ALLOW_SYSCALL(exit_group), |
- ALLOW_SYSCALL(exit), |
- ALLOW_SYSCALL(fstat), |
- ALLOW_SYSCALL(read), |
- ALLOW_SYSCALL(write), |
- ALLOW_SYSCALL(close), |
- ALLOW_SYSCALL(mmap), |
- ALLOW_SYSCALL(munmap), |
- ALLOW_SYSCALL(brk), |
- ALLOW_SYSCALL(futex), |
- KILL_PROCESS, |
- }; |
- struct sock_fprog prog = { |
- SK_ARRAY_COUNT(filter), |
- filter, |
- }; |
- |
- // Lock down the app so that it can't get new privs, such as setuid. |
- // Calling this is a requirement for an unpriviledged process to use mode |
- // 2 seccomp filters, ala SECCOMP_MODE_FILTER, otherwise we'd have to be |
- // root. |
- if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { |
- perror("prctl(NO_NEW_PRIVS)"); |
- goto failed; |
- } |
- // Now call seccomp and restrict the system calls that can be made to only |
- // the ones in the provided filter list. |
- if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) { |
- perror("prctl(SECCOMP)"); |
- goto failed; |
- } |
- return true; |
- |
-failed: |
- if (errno == EINVAL) { |
- fprintf(stderr, "SECCOMP_FILTER is not available. :(\n"); |
- } |
- return false; |
-#else |
- return true; |
-#endif /* SK_UNSAFE_BUILD_DESKTOP_ONLY */ |
-} |
- |
-static void setLimits() { |
- struct rlimit n; |
- |
- // Limit to 5 seconds of CPU. |
- n.rlim_cur = 5; |
- n.rlim_max = 5; |
- if (setrlimit(RLIMIT_CPU, &n)) { |
- perror("setrlimit(RLIMIT_CPU)"); |
- } |
- |
- // Limit to 150M of Address space. |
- n.rlim_cur = 150000000; |
- n.rlim_max = 150000000; |
- if (setrlimit(RLIMIT_AS, &n)) { |
- perror("setrlimit(RLIMIT_CPU)"); |
- } |
-} |
- |
-extern void draw(SkCanvas* canvas); |
- |
-static void drawAndDump(SkSurface* surface, SkWStream* stream) { |
- SkCanvas *canvas = surface->getCanvas(); |
- draw(canvas); |
- |
- // Write out the image as a PNG. |
- SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
- SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100)); |
- if (NULL == data.get()) { |
- printf("Failed to encode\n"); |
- exit(1); |
- } |
- stream->write(data->data(), data->size()); |
-} |
- |
-static void drawRaster(SkWStream* stream, SkImageInfo info) { |
- SkAutoTUnref<SkSurface> surface; |
- surface.reset(SkSurface::NewRaster(info)); |
- drawAndDump(surface, stream); |
-} |
- |
-static void drawGPU(SkWStream* stream, GrContext* gr, SkImageInfo info) { |
- SkAutoTUnref<SkSurface> surface; |
- surface.reset(SkSurface::NewRenderTarget(gr,info)); |
- |
- drawAndDump(surface, stream); |
-} |
- |
-static void drawPDF(SkWStream* stream, SkImageInfo info) { |
- printf( "Not implemented yet...\n"); |
-} |
- |
-int main(int argc, char** argv) { |
- SkCommandLineFlags::Parse(argc, argv); |
- SkAutoGraphics init; |
- |
- if (FLAGS_out.count() == 0) { |
- perror("The --out flag must have an argument."); |
- return 1; |
- } |
- |
- if (FLAGS_source.count() == 1) { |
- const char *sourceDir = getenv("WEBTRY_INOUT"); |
- if (NULL == sourceDir) { |
- sourceDir = "/skia_build/inout"; |
- } |
- |
- SkString sourcePath = SkOSPath::Join(sourceDir, FLAGS_source[0]); |
- if (!SkImageDecoder::DecodeFile(sourcePath.c_str(), &source)) { |
- perror("Unable to read the source image."); |
- } |
- } |
- |
- // make sure to open any needed output files before we set up the security |
- // jail |
- |
- SkWStream* streams[3] = {NULL, NULL, NULL}; |
- |
- if (FLAGS_raster) { |
- SkString outPath; |
- outPath.printf("%s_raster.png", FLAGS_out[0]); |
- streams[0] = SkNEW_ARGS(SkFILEWStream,(outPath.c_str())); |
- } |
- if (FLAGS_gpu) { |
- SkString outPath; |
- outPath.printf("%s_gpu.png", FLAGS_out[0]); |
- streams[1] = SkNEW_ARGS(SkFILEWStream,(outPath.c_str())); |
- } |
- if (FLAGS_pdf) { |
- SkString outPath; |
- outPath.printf("%s.pdf", FLAGS_out[0]); |
- streams[2] = SkNEW_ARGS(SkFILEWStream,(outPath.c_str())); |
- } |
- |
- SkImageInfo info = SkImageInfo::MakeN32(FLAGS_width, FLAGS_height, kPremul_SkAlphaType); |
- |
- GrContext *gr = NULL; |
- GrContextFactory* grFactory = NULL; |
- |
- // need to set up the GPU context before we install system call restrictions |
- if (FLAGS_gpu) { |
- |
- GrContext::Options grContextOpts; |
- grFactory = new GrContextFactory(grContextOpts); |
- gr = grFactory->get(GrContextFactory::kMESA_GLContextType); |
- } |
- |
- setLimits(); |
- |
- if (!install_syscall_filter()) { |
- return 1; |
- } |
- |
- if (NULL != streams[0]) { |
- drawRaster(streams[0], info); |
- } |
- if (NULL != streams[1]) { |
- drawGPU(streams[1], gr, info); |
- } |
- if (NULL != streams[2]) { |
- drawPDF(streams[2], info); |
- } |
- |
- if (gr) { |
- delete grFactory; |
- } |
-} |