Home | History | Annotate | Download | only in frame
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef ImageBitmap_h
      6 #define ImageBitmap_h
      7 
      8 #include "bindings/core/v8/ScriptWrappable.h"
      9 #include "core/html/HTMLImageElement.h"
     10 #include "core/html/canvas/CanvasImageSource.h"
     11 #include "platform/geometry/IntRect.h"
     12 #include "platform/graphics/Image.h"
     13 #include "platform/heap/Handle.h"
     14 #include "wtf/PassRefPtr.h"
     15 #include "wtf/RefCounted.h"
     16 
     17 namespace blink {
     18 
     19 class HTMLCanvasElement;
     20 class HTMLVideoElement;
     21 class ImageData;
     22 
     23 class ImageBitmap FINAL : public RefCountedWillBeGarbageCollectedFinalized<ImageBitmap>, public ScriptWrappable, public ImageLoaderClient, public CanvasImageSource {
     24     DEFINE_WRAPPERTYPEINFO();
     25     WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(ImageBitmap);
     26 public:
     27     static PassRefPtrWillBeRawPtr<ImageBitmap> create(HTMLImageElement*, const IntRect&);
     28     static PassRefPtrWillBeRawPtr<ImageBitmap> create(HTMLVideoElement*, const IntRect&);
     29     static PassRefPtrWillBeRawPtr<ImageBitmap> create(HTMLCanvasElement*, const IntRect&);
     30     static PassRefPtrWillBeRawPtr<ImageBitmap> create(ImageData*, const IntRect&);
     31     static PassRefPtrWillBeRawPtr<ImageBitmap> create(ImageBitmap*, const IntRect&);
     32     static PassRefPtrWillBeRawPtr<ImageBitmap> create(Image*, const IntRect&);
     33 
     34     PassRefPtr<Image> bitmapImage() const;
     35     PassRefPtrWillBeRawPtr<HTMLImageElement> imageElement() const { return m_imageElement; }
     36 
     37     IntRect bitmapRect() const { return m_bitmapRect; }
     38 
     39     int width() const { return m_cropRect.width(); }
     40     int height() const { return m_cropRect.height(); }
     41     IntSize size() const { return m_cropRect.size(); }
     42 
     43     virtual ~ImageBitmap();
     44 
     45     // CanvasImageSource implementation
     46     virtual PassRefPtr<Image> getSourceImageForCanvas(SourceImageMode, SourceImageStatus*) const OVERRIDE;
     47     virtual bool wouldTaintOrigin(SecurityOrigin*) const OVERRIDE { return false; };
     48     virtual void adjustDrawRects(FloatRect* srcRect, FloatRect* dstRect) const OVERRIDE;
     49     virtual FloatSize sourceSize() const OVERRIDE;
     50 
     51     virtual void trace(Visitor*);
     52 
     53 private:
     54     ImageBitmap(HTMLImageElement*, const IntRect&);
     55     ImageBitmap(HTMLVideoElement*, const IntRect&);
     56     ImageBitmap(HTMLCanvasElement*, const IntRect&);
     57     ImageBitmap(ImageData*, const IntRect&);
     58     ImageBitmap(ImageBitmap*, const IntRect&);
     59     ImageBitmap(Image*, const IntRect&);
     60 
     61     // ImageLoaderClient
     62     virtual void notifyImageSourceChanged() OVERRIDE;
     63     virtual bool requestsHighLiveResourceCachePriority() OVERRIDE { return true; }
     64 
     65     // ImageBitmaps constructed from HTMLImageElements hold a reference to the HTMLImageElement until
     66     // the image source changes.
     67     RefPtrWillBeMember<HTMLImageElement> m_imageElement;
     68     RefPtr<Image> m_bitmap;
     69 
     70     IntRect m_bitmapRect; // The rect where the underlying Image should be placed in reference to the ImageBitmap.
     71     IntRect m_cropRect;
     72 
     73     // The offset by which the desired Image is stored internally.
     74     // ImageBitmaps constructed from HTMLImageElements reference the entire ImageResource and may have a non-zero bitmap offset.
     75     // ImageBitmaps not constructed from HTMLImageElements always pre-crop and store the image at (0, 0).
     76     IntPoint m_bitmapOffset;
     77 
     78 };
     79 
     80 } // namespace blink
     81 
     82 #endif // ImageBitmap_h
     83