/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SkWindow_DEFINED
#define SkWindow_DEFINED
#include "SkView.h"
#include "SkBitmap.h"
#include "SkMatrix.h"
#include "SkRegion.h"
#include "SkEvent.h"
#include "SkKey.h"
#include "SkTDArray.h"
#ifdef SK_BUILD_FOR_WINCEx
#define SHOW_FPS
#endif
//#define USE_GX_SCREEN
class SkCanvas;
class SkOSMenu;
class SkWindow : public SkView {
public:
SkWindow();
virtual ~SkWindow();
const SkBitmap& getBitmap() const { return fBitmap; }
void setConfig(SkBitmap::Config);
void resize(int width, int height, SkBitmap::Config config = SkBitmap::kNo_Config);
void eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
void eraseRGB(U8CPU r, U8CPU g, U8CPU b);
bool isDirty() const { return !fDirtyRgn.isEmpty(); }
bool update(SkIRect* updateArea, SkCanvas* = NULL);
// does not call through to onHandleInval(), but does force the fDirtyRgn
// to be wide open. Call before update() to ensure we redraw everything.
void forceInvalAll();
// return the bounds of the dirty/inval rgn, or [0,0,0,0] if none
const SkIRect& getDirtyBounds() const { return fDirtyRgn.getBounds(); }
bool handleClick(int x, int y, Click::State);
bool handleChar(SkUnichar);
bool handleKey(SkKey);
bool handleKeyUp(SkKey);
bool handleMenu(uint32_t os_cmd);
void addMenu(SkOSMenu*);
const char* getTitle() const { return fTitle.c_str(); }
void setTitle(const char title[]);
const SkMatrix& getMatrix() const { return fMatrix; }
void setMatrix(const SkMatrix&);
void preConcat(const SkMatrix&);
void postConcat(const SkMatrix&);
protected:
virtual bool onEvent(const SkEvent&);
virtual bool onDispatchClick(int x, int y, Click::State);
// called if part of our bitmap is invalidated
virtual void onHandleInval(const SkIRect&);
virtual bool onHandleChar(SkUnichar);
virtual bool onHandleKey(SkKey);
virtual bool onHandleKeyUp(SkKey);
virtual void onAddMenu(const SkOSMenu*) {}
virtual void onSetTitle(const char title[]) {}
// overrides from SkView
virtual bool handleInval(const SkRect*);
virtual bool onGetFocusView(SkView** focus) const;
virtual bool onSetFocusView(SkView* focus);
private:
SkBitmap::Config fConfig;
SkBitmap fBitmap;
SkRegion fDirtyRgn;
Click* fClick; // to track clicks
SkTDArray<SkOSMenu*> fMenus;
SkView* fFocusView;
bool fWaitingOnInval;
SkString fTitle;
SkMatrix fMatrix;
typedef SkView INHERITED;
};
///////////////////////////////////////////////////////////
#ifdef SK_USE_WXWIDGETS
#include "SkOSWindow_wxwidgets.h"
#elif defined(SK_BUILD_FOR_MAC)
#include "SkOSWindow_Mac.h"
#elif defined(SK_BUILD_FOR_WIN)
#include "SkOSWindow_Win.h"
#elif defined(ANDROID)
#include "SkOSWindow_Android.h"
#elif defined(SK_BUILD_FOR_UNIX)
#include "SkOSWindow_Unix.h"
#elif defined(SK_BUILD_FOR_SDL)
#include "SkOSWindow_SDL.h"
#elif defined(SK_BUILD_FOR_IOS)
#include "SkOSWindow_iOS.h"
#endif
#endif