blob: 742fe0bb1a2947bd2a35c5c4cf05d051952e4cb8 [file] [log] [blame]
/*
* Copyright (C) 2012 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef WebOverlay_p_h
#define WebOverlay_p_h
#if USE(ACCELERATED_COMPOSITING)
#include "GraphicsLayer.h"
#include "LayerCompositingThread.h"
#include "Texture.h"
#include "WebOverlay.h"
#include "WebOverlayOverride.h"
#include <SkBitmap.h>
#include <pthread.h>
#include <wtf/OwnPtr.h>
#include <wtf/RefPtr.h>
class SkCanvas;
namespace WTF {
class String;
}
namespace WebCore {
class Animation;
class KeyframeValueList;
}
namespace BlackBerry {
namespace WebKit {
class WebOverlayClient;
class WebPagePrivate;
class WebOverlayPrivate {
public:
WebOverlayPrivate()
: q(0)
, parent(0)
, m_page(0)
{
nativeThread = pthread_self();
}
virtual ~WebOverlayPrivate()
{
ASSERT(pthread_self() == nativeThread);
}
WebPagePrivate* page() const;
void setPage(WebPagePrivate* page) { m_page = page; }
virtual void setClient(WebOverlayClient* c) { client = c; }
WebOverlayOverride* override();
virtual WebCore::FloatPoint position() const = 0;
virtual void setPosition(const WebCore::FloatPoint&) = 0;
virtual WebCore::FloatPoint anchorPoint() const = 0;
virtual void setAnchorPoint(const WebCore::FloatPoint&) = 0;
virtual WebCore::FloatSize size() const = 0;
virtual void setSize(const WebCore::FloatSize&) = 0;
virtual bool sizeIsScaleInvariant() const = 0;
virtual void setSizeIsScaleInvariant(bool) = 0;
virtual WebCore::TransformationMatrix transform() const = 0;
virtual void setTransform(const WebCore::TransformationMatrix&) = 0;
virtual float opacity() const = 0;
virtual void setOpacity(float) = 0;
virtual void addAnimation(const WTF::String& name, WebCore::Animation*, const WebCore::KeyframeValueList&) = 0;
virtual void removeAnimation(const WTF::String&) = 0;
virtual void addChild(WebOverlayPrivate*) = 0;
virtual void removeFromParent() = 0;
virtual void setContentsToImage(const unsigned char* data, const WebCore::IntSize& imageSize, WebOverlay::ImageDataAdoptionType) = 0;
virtual void setContentsToColor(const WebCore::Color&) = 0;
virtual void setDrawsContent(bool) = 0;
virtual void clear() = 0;
virtual void invalidate() = 0;
void drawContents(SkCanvas*);
virtual void resetOverrides() = 0;
void scheduleCompositingRun();
// Never 0
WebCore::LayerCompositingThread* layerCompositingThread() const { return m_layerCompositingThread.get(); }
// Can be 0
virtual WebCore::GraphicsLayer* graphicsLayer() const { return 0; }
WebOverlay* q;
WebOverlayClient* client;
WebOverlay* parent;
pthread_t nativeThread;
protected:
RefPtr<WebCore::LayerCompositingThread> m_layerCompositingThread;
OwnPtr<WebOverlayOverride> m_override;
WebPagePrivate* m_page;
};
class WebOverlayPrivateWebKitThread : public WebOverlayPrivate, public WebCore::GraphicsLayerClient {
public:
WebOverlayPrivateWebKitThread(WebCore::GraphicsLayerClient* = 0);
virtual WebCore::FloatPoint position() const;
virtual void setPosition(const WebCore::FloatPoint&);
virtual WebCore::FloatPoint anchorPoint() const;
virtual void setAnchorPoint(const WebCore::FloatPoint&);
virtual WebCore::FloatSize size() const;
virtual void setSize(const WebCore::FloatSize&);
virtual bool sizeIsScaleInvariant() const;
virtual void setSizeIsScaleInvariant(bool);
virtual WebCore::TransformationMatrix transform() const;
virtual void setTransform(const WebCore::TransformationMatrix&);
virtual float opacity() const;
virtual void setOpacity(float);
virtual void addAnimation(const WTF::String& name, WebCore::Animation*, const WebCore::KeyframeValueList&);
virtual void removeAnimation(const WTF::String& name);
virtual void addChild(WebOverlayPrivate*);
virtual void removeFromParent();
virtual void setContentsToImage(const unsigned char* data, const WebCore::IntSize& imageSize, WebOverlay::ImageDataAdoptionType);
virtual void setContentsToColor(const WebCore::Color&);
virtual void setDrawsContent(bool);
virtual void clear();
virtual void invalidate();
virtual void resetOverrides();
virtual WebCore::GraphicsLayer* graphicsLayer() const { return m_layer.get(); }
// GraphicsLayerClient
virtual void notifyAnimationStarted(const WebCore::GraphicsLayer*, double time) { }
virtual void notifyFlushRequired(const WebCore::GraphicsLayer*);
virtual void paintContents(const WebCore::GraphicsLayer*, WebCore::GraphicsContext&, WebCore::GraphicsLayerPaintingPhase, const WebCore::IntRect& inClip);
virtual bool contentsVisible(const WebCore::GraphicsLayer*, const WebCore::IntRect& contentRect) const { return true; }
private:
OwnPtr<WebCore::GraphicsLayer> m_layer;
};
// The LayerCompositingThreadClient's life cycle is tied to the LayerCompositingThread,
// so it needs to be a separate object from the WebOverlayPrivateCompositingThread.
class WebOverlayLayerCompositingThreadClient : public WebCore::LayerCompositingThreadClient {
public:
WebOverlayLayerCompositingThreadClient();
virtual ~WebOverlayLayerCompositingThreadClient() { }
void setLayer(WebCore::LayerCompositingThread* layer) { m_layerCompositingThread = layer; }
void setClient(WebOverlay* owner, WebOverlayClient* client) { m_owner = owner; m_client = client; }
bool drawsContent() const { return m_drawsContent; }
void setDrawsContent(bool);
void invalidate();
const SkBitmap& contents() const { return m_contents; }
void setContents(const SkBitmap&);
void setContentsToColor(const WebCore::Color&);
// LayerCompositingThreadClient
virtual void layerCompositingThreadDestroyed(WebCore::LayerCompositingThread*);
virtual void layerVisibilityChanged(WebCore::LayerCompositingThread*, bool visible);
virtual void uploadTexturesIfNeeded(WebCore::LayerCompositingThread*);
virtual void drawTextures(WebCore::LayerCompositingThread*, double scale, int positionLocation, int texCoordLocation);
virtual void deleteTextures(WebCore::LayerCompositingThread*);
private:
void clearUploadedContents();
private:
RefPtr<WebCore::Texture> m_texture;
bool m_drawsContent;
SkBitmap m_contents;
SkBitmap m_uploadedContents;
WebCore::Color m_color;
WebCore::LayerCompositingThread* m_layerCompositingThread;
WebOverlay* m_owner;
WebOverlayClient* m_client;
};
class WebOverlayPrivateCompositingThread : public WebOverlayPrivate {
public:
WebOverlayPrivateCompositingThread(PassRefPtr<WebCore::LayerCompositingThread>);
WebOverlayPrivateCompositingThread();
~WebOverlayPrivateCompositingThread();
virtual void setClient(WebOverlayClient*);
virtual WebCore::FloatPoint position() const;
virtual void setPosition(const WebCore::FloatPoint&);
virtual WebCore::FloatPoint anchorPoint() const;
virtual void setAnchorPoint(const WebCore::FloatPoint&);
virtual WebCore::FloatSize size() const;
virtual void setSize(const WebCore::FloatSize&);
virtual bool sizeIsScaleInvariant() const;
virtual void setSizeIsScaleInvariant(bool);
virtual WebCore::TransformationMatrix transform() const;
virtual void setTransform(const WebCore::TransformationMatrix&);
virtual float opacity() const;
virtual void setOpacity(float);
virtual void addAnimation(const WTF::String& name, WebCore::Animation*, const WebCore::KeyframeValueList&);
virtual void removeAnimation(const WTF::String& name);
virtual void addChild(WebOverlayPrivate*);
virtual void removeFromParent();
virtual void setContentsToImage(const unsigned char* data, const WebCore::IntSize& imageSize, WebOverlay::ImageDataAdoptionType);
virtual void setContentsToColor(const WebCore::Color&);
virtual void setDrawsContent(bool);
virtual void clear();
virtual void invalidate();
virtual void resetOverrides();
private:
WebOverlayLayerCompositingThreadClient* m_layerCompositingThreadClient;
};
}
}
#endif // USE(ACCELERATED_COMPOSITING)
#endif // WebOverlay_p_h