152edc4d05380c88de5b334479ad8e537ef2b4925caryclark/*
252edc4d05380c88de5b334479ad8e537ef2b4925caryclark * Copyright 2015 Google Inc.
352edc4d05380c88de5b334479ad8e537ef2b4925caryclark *
452edc4d05380c88de5b334479ad8e537ef2b4925caryclark *
552edc4d05380c88de5b334479ad8e537ef2b4925caryclark * Use of this source code is governed by a BSD-style license that can be
652edc4d05380c88de5b334479ad8e537ef2b4925caryclark * found in the LICENSE file.
752edc4d05380c88de5b334479ad8e537ef2b4925caryclark *
852edc4d05380c88de5b334479ad8e537ef2b4925caryclark */
952edc4d05380c88de5b334479ad8e537ef2b4925caryclark
1052edc4d05380c88de5b334479ad8e537ef2b4925caryclark#ifndef HelloWorld_DEFINED
1152edc4d05380c88de5b334479ad8e537ef2b4925caryclark#define HelloWorld_DEFINED
1252edc4d05380c88de5b334479ad8e537ef2b4925caryclark
1352edc4d05380c88de5b334479ad8e537ef2b4925caryclark#include "SkSurface.h"
1452edc4d05380c88de5b334479ad8e537ef2b4925caryclark#include "SkWindow.h"
1552edc4d05380c88de5b334479ad8e537ef2b4925caryclark
1652edc4d05380c88de5b334479ad8e537ef2b4925caryclarkclass GrContext;
1752edc4d05380c88de5b334479ad8e537ef2b4925caryclarkstruct GrGLInterface;
1852edc4d05380c88de5b334479ad8e537ef2b4925caryclarkclass GrRenderTarget;
1952edc4d05380c88de5b334479ad8e537ef2b4925caryclarkclass SkCanvas;
2052edc4d05380c88de5b334479ad8e537ef2b4925caryclark
2152edc4d05380c88de5b334479ad8e537ef2b4925caryclarkclass HelloWorldWindow : public SkOSWindow {
2252edc4d05380c88de5b334479ad8e537ef2b4925caryclarkpublic:
2352edc4d05380c88de5b334479ad8e537ef2b4925caryclark    enum DeviceType {
2452edc4d05380c88de5b334479ad8e537ef2b4925caryclark        kRaster_DeviceType,
2552edc4d05380c88de5b334479ad8e537ef2b4925caryclark        kGPU_DeviceType,
2652edc4d05380c88de5b334479ad8e537ef2b4925caryclark    };
2752edc4d05380c88de5b334479ad8e537ef2b4925caryclark    HelloWorldWindow(void* hwnd);
2836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual ~HelloWorldWindow() override;
2952edc4d05380c88de5b334479ad8e537ef2b4925caryclark
3052edc4d05380c88de5b334479ad8e537ef2b4925caryclark    // Changes the device type of the object.
3152edc4d05380c88de5b334479ad8e537ef2b4925caryclark    bool setUpBackend();
3252edc4d05380c88de5b334479ad8e537ef2b4925caryclark
3352edc4d05380c88de5b334479ad8e537ef2b4925caryclark    DeviceType getDeviceType() const { return fType; }
3452edc4d05380c88de5b334479ad8e537ef2b4925caryclark
3552edc4d05380c88de5b334479ad8e537ef2b4925caryclarkprotected:
3636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkSurface* createSurface() override {
37702edbd4bc41230902b5fe69d14d15763c27faferobertphillips        SkSurfaceProps props(INHERITED::getSurfaceProps());
3852edc4d05380c88de5b334479ad8e537ef2b4925caryclark        if (kGPU_DeviceType == fType) {
3952edc4d05380c88de5b334479ad8e537ef2b4925caryclark            return SkSurface::NewRenderTargetDirect(fRenderTarget, &props);
4052edc4d05380c88de5b334479ad8e537ef2b4925caryclark        }
4152edc4d05380c88de5b334479ad8e537ef2b4925caryclark        static const SkImageInfo info = SkImageInfo::MakeN32Premul(
4252edc4d05380c88de5b334479ad8e537ef2b4925caryclark                SkScalarRoundToInt(this->width()), SkScalarRoundToInt(this->height()));
43702edbd4bc41230902b5fe69d14d15763c27faferobertphillips        return fSurface = SkSurface::NewRaster(info, &props);
44702edbd4bc41230902b5fe69d14d15763c27faferobertphillips    }
4552edc4d05380c88de5b334479ad8e537ef2b4925caryclark
4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void draw(SkCanvas* canvas) override;
4752edc4d05380c88de5b334479ad8e537ef2b4925caryclark    void drawContents(SkCanvas* canvas);
4852edc4d05380c88de5b334479ad8e537ef2b4925caryclark
4936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onSizeChange() override;
5052edc4d05380c88de5b334479ad8e537ef2b4925caryclark
5152edc4d05380c88de5b334479ad8e537ef2b4925caryclarkprivate:
5252edc4d05380c88de5b334479ad8e537ef2b4925caryclark    bool findNextMatch();  // Set example to the first one that matches FLAGS_match.
5352edc4d05380c88de5b334479ad8e537ef2b4925caryclark    void setTitle();
5452edc4d05380c88de5b334479ad8e537ef2b4925caryclark    void setUpRenderTarget();
5536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onHandleChar(SkUnichar unichar) override;
5652edc4d05380c88de5b334479ad8e537ef2b4925caryclark    void tearDownBackend();
5752edc4d05380c88de5b334479ad8e537ef2b4925caryclark
5852edc4d05380c88de5b334479ad8e537ef2b4925caryclark    // draw contents
5952edc4d05380c88de5b334479ad8e537ef2b4925caryclark    SkScalar fRotationAngle;
6052edc4d05380c88de5b334479ad8e537ef2b4925caryclark
6152edc4d05380c88de5b334479ad8e537ef2b4925caryclark    // support framework
6252edc4d05380c88de5b334479ad8e537ef2b4925caryclark    DeviceType fType;
6352edc4d05380c88de5b334479ad8e537ef2b4925caryclark    SkSurface* fSurface;
6452edc4d05380c88de5b334479ad8e537ef2b4925caryclark    GrContext* fContext;
6552edc4d05380c88de5b334479ad8e537ef2b4925caryclark    GrRenderTarget* fRenderTarget;
6652edc4d05380c88de5b334479ad8e537ef2b4925caryclark    AttachmentInfo fAttachmentInfo;
6752edc4d05380c88de5b334479ad8e537ef2b4925caryclark    const GrGLInterface* fInterface;
6852edc4d05380c88de5b334479ad8e537ef2b4925caryclark
6952edc4d05380c88de5b334479ad8e537ef2b4925caryclark    typedef SkOSWindow INHERITED;
7052edc4d05380c88de5b334479ad8e537ef2b4925caryclark};
7152edc4d05380c88de5b334479ad8e537ef2b4925caryclark
7252edc4d05380c88de5b334479ad8e537ef2b4925caryclark#endif
73