#ifndef TextIndicator_h
#define TextIndicator_h
#include "FloatRect.h"
#include "Image.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
#define ENABLE_LEGACY_TEXT_INDICATOR_STYLE 1
#else
#define ENABLE_LEGACY_TEXT_INDICATOR_STYLE 0
#endif
namespace WebCore {
class Frame;
class GraphicsContext;
class Range;
enum class TextIndicatorPresentationTransition {
None,
Bounce,
BounceAndCrossfade,
FadeIn,
};
enum class TextIndicatorLifetime {
Permanent,
Temporary
};
enum class TextIndicatorDismissalAnimation {
None,
FadeOut
};
struct TextIndicatorData {
FloatRect selectionRectInRootViewCoordinates;
FloatRect textBoundingRectInRootViewCoordinates;
Vector<FloatRect> textRectsInBoundingRectCoordinates;
float contentImageScaleFactor;
RefPtr<Image> contentImageWithHighlight;
RefPtr<Image> contentImage;
TextIndicatorPresentationTransition presentationTransition;
bool wantsMargin;
};
class TextIndicator : public RefCounted<TextIndicator> {
public:
WEBCORE_EXPORT static Ref<TextIndicator> create(const TextIndicatorData&);
WEBCORE_EXPORT static RefPtr<TextIndicator> createWithSelectionInFrame(Frame&, TextIndicatorPresentationTransition, unsigned margin = 0);
WEBCORE_EXPORT static RefPtr<TextIndicator> createWithRange(const Range&, TextIndicatorPresentationTransition, unsigned margin = 0);
WEBCORE_EXPORT ~TextIndicator();
FloatRect selectionRectInRootViewCoordinates() const { return m_data.selectionRectInRootViewCoordinates; }
FloatRect textBoundingRectInRootViewCoordinates() const { return m_data.textBoundingRectInRootViewCoordinates; }
const Vector<FloatRect>& textRectsInBoundingRectCoordinates() const { return m_data.textRectsInBoundingRectCoordinates; }
float contentImageScaleFactor() const { return m_data.contentImageScaleFactor; }
Image* contentImageWithHighlight() const { return m_data.contentImageWithHighlight.get(); }
Image* contentImage() const { return m_data.contentImage.get(); }
TextIndicatorPresentationTransition presentationTransition() const { return m_data.presentationTransition; }
void setPresentationTransition(TextIndicatorPresentationTransition transition) { m_data.presentationTransition = transition; }
TextIndicatorData data() const { return m_data; }
bool wantsBounce() const;
bool wantsContentCrossfade() const;
bool wantsFadeIn() const;
bool wantsManualAnimation() const;
void setWantsMargin(bool wantsMargin) { m_data.wantsMargin = wantsMargin; }
bool wantsMargin() const { return m_data.wantsMargin; }
private:
TextIndicator(const TextIndicatorData&);
TextIndicatorData m_data;
};
}
#endif // TextIndicator_h