Home | History | Annotate | Download | only in dm
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "DMSrcSink.h"
      9 #include "DMSrcSinkAndroid.h"
     10 
     11 #include "SkAndroidSDKCanvas.h"
     12 #include "SkCanvas.h"
     13 #include "SkiaCanvasProxy.h"
     14 #include "SkStream.h"
     15 #include <utils/TestWindowContext.h>
     16 
     17 /* These functions are only compiled in the Android Framework. */
     18 
     19 namespace DM {
     20 
     21 Error HWUISink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const {
     22     android::uirenderer::TestWindowContext renderer;
     23     renderer.initialize(src.size().width(), src.size().height());
     24     SkCanvas* canvas = renderer.prepareToDraw();
     25     Error err = src.draw(canvas);
     26     if (!err.isEmpty()) {
     27         return err;
     28     }
     29     renderer.finishDrawing();
     30     renderer.fence();
     31     renderer.capturePixels(dst);
     32     return "";
     33 }
     34 
     35 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
     36 
     37 ViaAndroidSDK::ViaAndroidSDK(Sink* sink) : fSink(sink) { }
     38 
     39 Error ViaAndroidSDK::draw(const Src& src,
     40                           SkBitmap* bitmap,
     41                           SkWStream* stream,
     42                           SkString* log) const {
     43     struct ProxySrc : public Src {
     44         const Src& fSrc;
     45         ProxySrc(const Src& src)
     46             : fSrc(src) {}
     47 
     48         Error draw(SkCanvas* canvas) const override {
     49             // Pass through HWUI's upper layers to get operational transforms
     50             SkAutoTDelete<android::Canvas> ac (android::Canvas::create_canvas(canvas));
     51             SkAutoTUnref<android::uirenderer::SkiaCanvasProxy> scProxy
     52                 (new android::uirenderer::SkiaCanvasProxy(ac));
     53 
     54             // Pass through another proxy to get paint transforms
     55             SkAndroidSDKCanvas fc;
     56             fc.reset(scProxy);
     57 
     58             fSrc.draw(&fc);
     59 
     60             return "";
     61         }
     62         SkISize size() const override { return fSrc.size(); }
     63         Name name() const override { sk_throw(); return ""; }
     64     } proxy(src);
     65 
     66     return fSink->draw(proxy, bitmap, stream, log);
     67 }
     68 
     69 }  // namespace DM
     70