/* * Copyright 2012, The Android Open Source Project * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PicturePile_h #define PicturePile_h #include "IntRect.h" #include "IntSize.h" #include "PrerenderedInval.h" #include "SkBitmap.h" #include "SkRegion.h" #include "SkRefCnt.h" #include #include #include #include #define USE_RECORDING_CONTEXT true #if USE_RECORDING_CONTEXT namespace WebCore { class Recording; } typedef WebCore::Recording Picture; #else class SkPicture; typedef SkPicture Picture; #endif class SkCanvas; namespace WebCore { class GraphicsContext; class PicturePainter { public: virtual void paintContents(GraphicsContext* gc, IntRect& dirty) = 0; virtual SkCanvas* createPrerenderCanvas(PrerenderedInval* prerendered) { return 0; } virtual ~PicturePainter() {} }; class PictureContainer { public: Picture* picture; IntRect area; bool dirty; RefPtr prerendered; float maxZoomScale; PictureContainer(const IntRect& area) : picture(0) , area(area) , dirty(true) , maxZoomScale(1) {} PictureContainer(const PictureContainer& other); ~PictureContainer(); }; class PicturePile { public: PicturePile() {} PicturePile(const PicturePile& other); const IntSize& size() { return m_size; } void clearPrerenders(); // used by PicturePileLayerContents void draw(SkCanvas* canvas); // Used by WebViewCore void invalidate(const IntRect& dirtyRect); void setSize(const IntSize& size); void updatePicturesIfNeeded(PicturePainter* painter); void reset(); SkRegion& dirtyRegion() { return m_dirtyRegion; } PrerenderedInval* prerenderedInvalForArea(const IntRect& area); // UI-side methods used to check content, after construction/updates are complete float maxZoomScale() const; bool isEmpty() const; private: void applyWebkitInvals(); void updatePicture(PicturePainter* painter, PictureContainer& container); Picture* recordPicture(PicturePainter* painter, PictureContainer& container); void appendToPile(const IntRect& inval, const IntRect& originalInval = IntRect()); void drawWithClipRecursive(SkCanvas* canvas, int index); void drawPicture(SkCanvas* canvas, PictureContainer& pc); IntSize m_size; Vector m_pile; Vector m_webkitInvals; SkRegion m_dirtyRegion; }; } // namespace android #endif // PicturePile_h