15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_BACKING_STORE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_BACKING_STORE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/surface/transport_dib.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderProcessHost;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace skia {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PlatformBitmap;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderProcessHost;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHost;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a backing store for the pixels in a RenderWidgetHost.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT BackingStore {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BackingStore();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHost* render_widget_host() const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return render_widget_host_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Size& size() { return size_; }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of bytes that this backing store consumes. The default
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation just assumes there's 32 bits per pixel over the current
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size of the screen. Implementations may override this if they have more
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information about the color depth.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t MemorySize();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paints the bitmap from the renderer onto the backing store. bitmap_rect
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gives the location of bitmap, and copy_rects specifies the subregion(s) of
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the backingstore to be painted from the bitmap. All coordinates are in
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DIPs. |scale_factor| contains the expected device scale factor of the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // backing store.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PaintToBackingStore does not need to guarantee that this has happened by
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the time it returns, in which case it will set |scheduled_callback| to
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true and will call |callback| when completed.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PaintToBackingStore(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderProcessHost* process,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransportDIB::Id bitmap,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& bitmap_rect,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<gfx::Rect>& copy_rects,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      float scale_factor,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& completion_callback,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool* scheduled_completion_callback) = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the gives subset of the backing store and copies it to the given
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PlatformCanvas. The PlatformCanvas should not be initialized. This function
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will call initialize() with the correct size. The return value indicates
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CopyFromBackingStore(const gfx::Rect& rect,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    skia::PlatformBitmap* output) = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scrolls the contents of clip_rect in the backing store by |delta| (but
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |delta|.x() and |delta|.y() cannot both be non-zero).
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ScrollBackingStore(const gfx::Vector2d& delta,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::Rect& clip_rect,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::Size& view_size) = 0;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can only be constructed via subclasses.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackingStore(RenderWidgetHost* widget, const gfx::Size& size);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The owner of this backing store.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHost* render_widget_host_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The size of the backing store.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BackingStore);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_BACKING_STORE_H_
94