| Index: base/gfx/platform_canvas_win.h
|
| ===================================================================
|
| --- base/gfx/platform_canvas_win.h (revision 5678)
|
| +++ base/gfx/platform_canvas_win.h (working copy)
|
| @@ -5,192 +5,9 @@
|
| #ifndef BASE_GFX_PLATFORM_CANVAS_WIN_H_
|
| #define BASE_GFX_PLATFORM_CANVAS_WIN_H_
|
|
|
| -#include "base/gfx/platform_device_win.h"
|
| -#include "base/basictypes.h"
|
| +// TODO(brettw) this file should be removed and the includes changed to this
|
| +// new location.
|
| +#include "webkit/port/platform/graphics/skia/public/PlatformCanvasWin.h"
|
|
|
| -#include "SkCanvas.h"
|
| -
|
| -namespace gfx {
|
| -
|
| -// This class is a specialization of the regular SkCanvas that is designed to
|
| -// work with a gfx::PlatformDevice to manage platform-specific drawing. It
|
| -// allows using both Skia operations and platform-specific operations.
|
| -class PlatformCanvasWin : public SkCanvas {
|
| - public:
|
| - // Set is_opaque if you are going to erase the bitmap and not use
|
| - // transparency: this will enable some optimizations. The shared_section
|
| - // parameter is passed to gfx::PlatformDevice::create. See it for details.
|
| - //
|
| - // If you use the version with no arguments, you MUST call initialize()
|
| - PlatformCanvasWin();
|
| - PlatformCanvasWin(int width, int height, bool is_opaque);
|
| - PlatformCanvasWin(int width, int height, bool is_opaque,
|
| - HANDLE shared_section);
|
| - virtual ~PlatformCanvasWin();
|
| -
|
| - // For two-part init, call if you use the no-argument constructor above. Note
|
| - // that we want this to optionally match the Linux initialize if you only
|
| - // pass 3 arguments, hence the evil default argument.
|
| - bool initialize(int width, int height, bool is_opaque,
|
| - HANDLE shared_section = NULL);
|
| -
|
| - // These calls should surround calls to platform drawing routines, the DC
|
| - // returned by beginPlatformPaint is the DC that can be used to draw into.
|
| - // Call endPlatformPaint when you are done and want to use Skia operations
|
| - // again; this will synchronize the bitmap to Windows.
|
| - virtual HDC beginPlatformPaint();
|
| - virtual void endPlatformPaint();
|
| -
|
| - // Returns the platform device pointer of the topmost rect with a non-empty
|
| - // clip. In practice, this is usually either the top layer or nothing, since
|
| - // we usually set the clip to new layers when we make them.
|
| - //
|
| - // If there is no layer that is not all clipped out, this will return a
|
| - // dummy device so callers do not have to check. If you are concerned about
|
| - // performance, check the clip before doing any painting.
|
| - //
|
| - // This is different than SkCanvas' getDevice, because that returns the
|
| - // bottommost device.
|
| - //
|
| - // Danger: the resulting device should not be saved. It will be invalidated
|
| - // by the next call to save() or restore().
|
| - PlatformDeviceWin& getTopPlatformDevice() const;
|
| -
|
| - protected:
|
| - // Creates a device store for use by the canvas. We override this so that
|
| - // the device is always our own so we know that we can use GDI operations
|
| - // on it. Simply calls into createPlatformDevice().
|
| - virtual SkDevice* createDevice(SkBitmap::Config, int width, int height,
|
| - bool is_opaque, bool isForLayer);
|
| -
|
| - // Creates a device store for use by the canvas. By default, it creates a
|
| - // BitmapPlatformDeviceWin. Can be overridden to change the object type.
|
| - virtual SkDevice* createPlatformDevice(int width, int height, bool is_opaque,
|
| - HANDLE shared_section);
|
| -
|
| - private:
|
| - // Unimplemented.
|
| - virtual SkDevice* setBitmapDevice(const SkBitmap& bitmap);
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PlatformCanvasWin);
|
| -};
|
| -
|
| -// A class designed to help with WM_PAINT operations on Windows. It will
|
| -// do BeginPaint/EndPaint on init/destruction, and will create the bitmap and
|
| -// canvas with the correct size and transform for the dirty rect. The bitmap
|
| -// will be automatically painted to the screen on destruction.
|
| -//
|
| -// You MUST call isEmpty before painting to determine if anything needs
|
| -// painting. Sometimes the dirty rect can actually be empty, and this makes
|
| -// the bitmap functions we call unhappy. The caller should not paint in this
|
| -// case.
|
| -//
|
| -// Therefore, all you need to do is:
|
| -// case WM_PAINT: {
|
| -// gfx::PlatformCanvasWinPaint canvas(hwnd);
|
| -// if (!canvas.isEmpty()) {
|
| -// ... paint to the canvas ...
|
| -// }
|
| -// return 0;
|
| -// }
|
| -template <class T>
|
| -class CanvasPaintT : public T {
|
| - public:
|
| - CanvasPaintT(HWND hwnd) : hwnd_(hwnd), paint_dc_(NULL), for_paint_(true) {
|
| - memset(&ps_, 0, sizeof(ps_));
|
| - initPaint(true);
|
| - }
|
| -
|
| - CanvasPaintT(HWND hwnd, bool opaque) : hwnd_(hwnd), paint_dc_(NULL),
|
| - for_paint_(true) {
|
| - memset(&ps_, 0, sizeof(ps_));
|
| - initPaint(opaque);
|
| - }
|
| -
|
| - // Creates a CanvasPaintT for the specified region that paints to the
|
| - // specified dc. This does NOT do BeginPaint/EndPaint.
|
| - CanvasPaintT(HDC dc, bool opaque, int x, int y, int w, int h)
|
| - : hwnd_(NULL),
|
| - paint_dc_(dc),
|
| - for_paint_(false) {
|
| - memset(&ps_, 0, sizeof(ps_));
|
| - ps_.rcPaint.left = x;
|
| - ps_.rcPaint.right = x + w;
|
| - ps_.rcPaint.top = y;
|
| - ps_.rcPaint.bottom = y + h;
|
| - init(opaque);
|
| - }
|
| -
|
| -
|
| - virtual ~CanvasPaintT() {
|
| - if (!isEmpty()) {
|
| - restoreToCount(1);
|
| - // Commit the drawing to the screen
|
| - getTopPlatformDevice().drawToHDC(paint_dc_,
|
| - ps_.rcPaint.left, ps_.rcPaint.top,
|
| - NULL);
|
| - }
|
| - if (for_paint_)
|
| - EndPaint(hwnd_, &ps_);
|
| - }
|
| -
|
| - // Returns true if the invalid region is empty. The caller should call this
|
| - // function to determine if anything needs painting.
|
| - bool isEmpty() const {
|
| - return ps_.rcPaint.right - ps_.rcPaint.left == 0 ||
|
| - ps_.rcPaint.bottom - ps_.rcPaint.top == 0;
|
| - }
|
| -
|
| - // Use to access the Windows painting parameters, especially useful for
|
| - // getting the bounding rect for painting: paintstruct().rcPaint
|
| - const PAINTSTRUCT& paintStruct() const {
|
| - return ps_;
|
| - }
|
| -
|
| - // Returns the DC that will be painted to
|
| - HDC paintDC() const {
|
| - return paint_dc_;
|
| - }
|
| -
|
| - protected:
|
| - HWND hwnd_;
|
| - HDC paint_dc_;
|
| - PAINTSTRUCT ps_;
|
| -
|
| - private:
|
| - void initPaint(bool opaque) {
|
| - paint_dc_ = BeginPaint(hwnd_, &ps_);
|
| -
|
| - init(opaque);
|
| - }
|
| -
|
| - void init(bool opaque) {
|
| - // FIXME(brettw) for ClearType, we probably want to expand the bounds of
|
| - // painting by one pixel so that the boundaries will be correct (ClearType
|
| - // text can depend on the adjacent pixel). Then we would paint just the
|
| - // inset pixels to the screen.
|
| - const int width = ps_.rcPaint.right - ps_.rcPaint.left;
|
| - const int height = ps_.rcPaint.bottom - ps_.rcPaint.top;
|
| - if (!initialize(width, height, opaque, NULL)) {
|
| - // Cause a deliberate crash;
|
| - *(char*) 0 = 0;
|
| - }
|
| -
|
| - // This will bring the canvas into the screen coordinate system for the
|
| - // dirty rect
|
| - translate(SkIntToScalar(-ps_.rcPaint.left),
|
| - SkIntToScalar(-ps_.rcPaint.top));
|
| - }
|
| -
|
| - // If true, this canvas was created for a BeginPaint.
|
| - const bool for_paint_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CanvasPaintT);
|
| -};
|
| -
|
| -typedef CanvasPaintT<PlatformCanvasWin> PlatformCanvasWinPaint;
|
| -
|
| -} // namespace gfx
|
| -
|
| #endif // BASE_GFX_PLATFORM_CANVAS_WIN_H_
|
|
|
|
|