18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkWindow_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkWindow_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
11a7e9f05119174848c6be5028568f46eb5e85398ebungeman#include "../private/SkTDArray.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBitmap.h"
14f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "SkMatrix.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEvent.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkKey.h"
184302ae91b0c97993f7b659474a5fd305921cdc5ereed#include "SkSurfaceProps.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
200397e9f3415b4646797f1b17e9a38b5deb864ff0reedclass SkSurface;
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkOSMenu;
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
23c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark#if SK_SUPPORT_GPU
24c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclarkstruct GrGLInterface;
25c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclarkclass GrContext;
26c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclarkclass GrRenderTarget;
27c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark#endif
28c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkWindow : public SkView {
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkWindow();
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkWindow();
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
34c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark    struct AttachmentInfo {
352d1ee7936e3536e45c963db004e3b512bb415fd8brianosman        AttachmentInfo()
362d1ee7936e3536e45c963db004e3b512bb415fd8brianosman            : fSampleCount(0)
372d1ee7936e3536e45c963db004e3b512bb415fd8brianosman            , fStencilBits(0)
382d1ee7936e3536e45c963db004e3b512bb415fd8brianosman            , fColorBits(0) {}
392d1ee7936e3536e45c963db004e3b512bb415fd8brianosman
40c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark        int fSampleCount;
41c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark        int fStencilBits;
422d1ee7936e3536e45c963db004e3b512bb415fd8brianosman        int fColorBits;
43c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark    };
44c8fcafb3f0d152fb92465451bdb2e4bd3ef37222caryclark
454302ae91b0c97993f7b659474a5fd305921cdc5ereed    SkSurfaceProps getSurfaceProps() const { return fSurfaceProps; }
464302ae91b0c97993f7b659474a5fd305921cdc5ereed    void setSurfaceProps(const SkSurfaceProps& props) {
474302ae91b0c97993f7b659474a5fd305921cdc5ereed        fSurfaceProps = props;
484302ae91b0c97993f7b659474a5fd305921cdc5ereed    }
494302ae91b0c97993f7b659474a5fd305921cdc5ereed
50a34be68a7eff0ae475b194f8a29975460cf3e456reed    SkImageInfo info() const { return fBitmap.info(); }
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkBitmap& getBitmap() const { return fBitmap; }
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
53973d92cf91b21013361209e8a5c0c4685728847fkkinnunen    void    resize(int width, int height);
54a34be68a7eff0ae475b194f8a29975460cf3e456reed    void    resize(const SkImageInfo&);
55b109b8c5ec40a7dd85a0a2951a1f98fa63b805aabrianosman    void    setColorType(SkColorType, sk_sp<SkColorSpace>);
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool    isDirty() const { return !fDirtyRgn.isEmpty(); }
58aa400ee34c035c582ea8f3bce8a467d9848ecd25reed@google.com    bool    update(SkIRect* updateArea);
59f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    // does not call through to onHandleInval(), but does force the fDirtyRgn
60f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    // to be wide open. Call before update() to ensure we redraw everything.
61f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void    forceInvalAll();
62f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    // return the bounds of the dirty/inval rgn, or [0,0,0,0] if none
63f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkIRect& getDirtyBounds() const { return fDirtyRgn.getBounds(); }
64f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
654d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    bool    handleClick(int x, int y, Click::State, void* owner, unsigned modi = 0);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool    handleChar(SkUnichar);
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool    handleKey(SkKey);
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool    handleKeyUp(SkKey);
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    addMenu(SkOSMenu*);
71654d72f94c855ceae34db0ee82d92844835c0d29yangsu@google.com    const SkTDArray<SkOSMenu*>* getMenus() { return &fMenus; }
72fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
730ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com    const char* getTitle() const { return fTitle.c_str(); }
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    setTitle(const char title[]);
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
76f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    const SkMatrix& getMatrix() const { return fMatrix; }
77f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void    setMatrix(const SkMatrix&);
78f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void    preConcat(const SkMatrix&);
79f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void    postConcat(const SkMatrix&);
80f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
81ecf3dbe8f2987a08b21be1aff61b7fbfbb69640arobertphillips    virtual sk_sp<SkSurface> makeSurface();
825957f47e8de0ff55b8c0bf84984d4915c7c72825reed@google.com
8338c72151576a6e89b31b0bd4c45a0b01c11641ffjvanverth#if SK_SUPPORT_GPU
8438c72151576a6e89b31b0bd4c45a0b01c11641ffjvanverth    sk_sp<SkSurface> makeGpuBackedSurface(const AttachmentInfo& attachmentInfo,
8538c72151576a6e89b31b0bd4c45a0b01c11641ffjvanverth                                          const GrGLInterface* , GrContext* grContext);
8638c72151576a6e89b31b0bd4c45a0b01c11641ffjvanverth#endif
8738c72151576a6e89b31b0bd4c45a0b01c11641ffjvanverth
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onEvent(const SkEvent&);
904d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    virtual bool onDispatchClick(int x, int y, Click::State, void* owner, unsigned modi);
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // called if part of our bitmap is invalidated
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void onHandleInval(const SkIRect&);
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onHandleChar(SkUnichar);
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onHandleKey(SkKey);
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onHandleKeyUp(SkKey);
9616adfa39330b7b1c6ac16b8127843e55f4233a29Brian Osman    virtual void onAddMenu(const SkOSMenu*) {}
9716adfa39330b7b1c6ac16b8127843e55f4233a29Brian Osman    virtual void onUpdateMenu(const SkOSMenu*) {}
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void onSetTitle(const char title[]) {}
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkView
101f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual bool handleInval(const SkRect*);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onGetFocusView(SkView** focus) const;
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onSetFocusView(SkView* focus);
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1064302ae91b0c97993f7b659474a5fd305921cdc5ereed    SkSurfaceProps  fSurfaceProps;
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkBitmap    fBitmap;
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRegion    fDirtyRgn;
109d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo
110d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo    SkTDArray<Click*>       fClicks; // to track clicks
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDArray<SkOSMenu*>    fMenus;
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkView* fFocusView;
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool    fWaitingOnInval;
116fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1170ae6b245f2b79bc04f0801b08fcf05abcf98fd6creed@android.com    SkString    fTitle;
118f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkMatrix    fMatrix;
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkView INHERITED;
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
123e229e92ea51e9bc7c11033e2099d3ef275621115tfarina@chromium.org////////////////////////////////////////////////////////////////////////////////
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1259e2a319a1bdb8175efb499645846fbbaf27cbf00Hal Canary#if defined(SK_BUILD_FOR_MAC)
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #include "SkOSWindow_Mac.h"
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#elif defined(SK_BUILD_FOR_WIN)
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #include "SkOSWindow_Win.h"
12956c69773aea56c6c6bd47bc7e7970dd081205184djsollen@google.com#elif defined(SK_BUILD_FOR_ANDROID)
13097a0918715b621183647d96dbe8fd2eb038ed564liyuqian    #error Android does not support SkOSWindow and SampleApp. Please use Viewer instead.
131b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo#elif defined(SK_BUILD_FOR_UNIX)
132474a9ea051c584c373da28c5c8511f279ebd734cjoshualitt    #include "SkOSWindow_Unix.h"
133f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#elif defined(SK_BUILD_FOR_IOS)
134f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #include "SkOSWindow_iOS.h"
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
138