1 /* 2 * Copyright 2006, The Android Open Source Project 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef platform_graphics_context_h 27 #define platform_graphics_context_h 28 29 #include "IntRect.h" 30 #include "GraphicsContext.h" 31 #include "RenderSkinAndroid.h" 32 #include "RenderSkinMediaButton.h" 33 #include "SkCanvas.h" 34 #include "SkPicture.h" 35 #include "SkTDArray.h" 36 #include <wtf/Vector.h> 37 38 class SkCanvas; 39 40 namespace WebCore { 41 42 class PlatformGraphicsContext { 43 public: 44 class State; 45 46 PlatformGraphicsContext(); 47 virtual ~PlatformGraphicsContext(); 48 virtual bool isPaintingDisabled() = 0; 49 setGraphicsContext(GraphicsContext * gc)50 void setGraphicsContext(GraphicsContext* gc) { m_gc = gc; } deleteUs()51 virtual bool deleteUs() const { return false; } 52 53 typedef enum { PaintingContext, RecordingContext } ContextType; 54 virtual ContextType type() = 0; 55 56 // State management 57 virtual void beginTransparencyLayer(float opacity) = 0; 58 virtual void endTransparencyLayer() = 0; 59 virtual void save(); 60 virtual void restore(); 61 62 // State values 63 virtual void setAlpha(float alpha); 64 int getNormalizedAlpha() const; 65 virtual void setCompositeOperation(CompositeOperator op); 66 virtual bool setFillColor(const Color& c); 67 virtual bool setFillShader(SkShader* fillShader); 68 virtual void setLineCap(LineCap cap); 69 virtual void setLineDash(const DashArray& dashes, float dashOffset); 70 virtual void setLineJoin(LineJoin join); 71 virtual void setMiterLimit(float limit); 72 virtual void setShadow(int radius, int dx, int dy, SkColor c); 73 virtual void setShouldAntialias(bool useAA); 74 virtual bool setStrokeColor(const Color& c); 75 virtual bool setStrokeShader(SkShader* strokeShader); 76 virtual void setStrokeStyle(StrokeStyle style); 77 virtual void setStrokeThickness(float f); 78 79 // FIXME: These setupPaint* should be private, but 80 // they are used by FontAndroid currently 81 virtual void setupPaintFill(SkPaint* paint) const; 82 virtual bool setupPaintShadow(SkPaint* paint, SkPoint* offset) const; 83 // Sets up the paint for stroking. Returns true if the style is really 84 // just a dash of squares (the size of the paint's stroke-width. 85 virtual bool setupPaintStroke(SkPaint* paint, SkRect* rect, bool isHLine = false); 86 87 // Matrix operations 88 virtual void concatCTM(const AffineTransform& affine) = 0; 89 virtual void rotate(float angleInRadians) = 0; 90 virtual void scale(const FloatSize& size) = 0; 91 virtual void translate(float x, float y) = 0; 92 virtual const SkMatrix& getTotalMatrix() = 0; 93 94 // Clipping 95 virtual void addInnerRoundedRectClip(const IntRect& rect, int thickness) = 0; 96 virtual void canvasClip(const Path& path) = 0; 97 virtual bool clip(const FloatRect& rect) = 0; 98 virtual bool clip(const Path& path) = 0; 99 virtual bool clipConvexPolygon(size_t numPoints, const FloatPoint*, bool antialias) = 0; 100 virtual bool clipOut(const IntRect& r) = 0; 101 virtual bool clipOut(const Path& p) = 0; 102 virtual bool clipPath(const Path& pathToClip, WindRule clipRule) = 0; 103 virtual SkIRect getTotalClipBounds() = 0; 104 105 // Drawing 106 virtual void clearRect(const FloatRect& rect) = 0; 107 virtual void drawBitmapPattern(const SkBitmap& bitmap, const SkMatrix& matrix, 108 CompositeOperator compositeOp, const FloatRect& destRect) = 0; 109 virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, 110 const SkRect& dst, CompositeOperator op = CompositeSourceOver) = 0; 111 virtual void drawConvexPolygon(size_t numPoints, const FloatPoint* points, 112 bool shouldAntialias) = 0; 113 virtual void drawEllipse(const IntRect& rect) = 0; 114 virtual void drawFocusRing(const Vector<IntRect>& rects, int /* width */, 115 int /* offset */, const Color& color) = 0; 116 virtual void drawHighlightForText(const Font& font, const TextRun& run, 117 const FloatPoint& point, int h, 118 const Color& backgroundColor, ColorSpace colorSpace, 119 int from, int to, bool isActive) = 0; 120 virtual void drawLine(const IntPoint& point1, const IntPoint& point2) = 0; 121 virtual void drawLineForText(const FloatPoint& pt, float width) = 0; 122 virtual void drawLineForTextChecking(const FloatPoint& pt, float width, 123 GraphicsContext::TextCheckingLineStyle) = 0; 124 virtual void drawRect(const IntRect& rect) = 0; 125 virtual void fillPath(const Path& pathToFill, WindRule fillRule) = 0; 126 virtual void fillRect(const FloatRect& rect) = 0; fillRect(const FloatRect & rect,const Color & color,ColorSpace)127 void fillRect(const FloatRect& rect, const Color& color, ColorSpace) { 128 fillRect(rect, color); 129 } 130 virtual void fillRect(const FloatRect& rect, const Color& color) = 0; fillRoundedRect(const IntRect & rect,const IntSize & topLeft,const IntSize & topRight,const IntSize & bottomLeft,const IntSize & bottomRight,const Color & color,ColorSpace)131 void fillRoundedRect(const IntRect& rect, const IntSize& topLeft, 132 const IntSize& topRight, const IntSize& bottomLeft, 133 const IntSize& bottomRight, const Color& color, 134 ColorSpace) { 135 fillRoundedRect(rect, topLeft, topRight, bottomLeft, bottomRight, color); 136 } 137 virtual void fillRoundedRect(const IntRect& rect, const IntSize& topLeft, 138 const IntSize& topRight, const IntSize& bottomLeft, 139 const IntSize& bottomRight, const Color& color) = 0; 140 virtual void strokeArc(const IntRect& r, int startAngle, int angleSpan) = 0; 141 virtual void strokePath(const Path& pathToStroke) = 0; 142 virtual void strokeRect(const FloatRect& rect, float lineWidth) = 0; 143 144 virtual void drawPosText(const void* text, size_t byteLength, 145 const SkPoint pos[], const SkPaint& paint) = 0; 146 virtual void drawMediaButton(const IntRect& rect, RenderSkinMediaButton::MediaButton buttonType, 147 bool translucent = false, bool drawBackground = true, 148 const IntRect& thumb = IntRect()) = 0; 149 150 virtual SkCanvas* recordingCanvas() = 0; 151 virtual void setTextOffset(FloatSize offset) = 0; 152 setRawState(State * state)153 void setRawState(State* state) { m_state = state; } 154 155 struct ShadowRec { 156 SkScalar blur; 157 SkScalar dx; 158 SkScalar dy; 159 SkColor color; // alpha>0 means valid shadow 160 ShadowRec(SkScalar b = 0, 161 SkScalar x = 0, 162 SkScalar y = 0, 163 SkColor c = 0) // by default, alpha=0, so no shadow blurShadowRec164 : blur(b), dx(x), dy(y), color(c) 165 {}; 166 }; 167 168 class State { 169 public: 170 SkPathEffect* pathEffect; 171 float miterLimit; 172 float alpha; 173 float strokeThickness; 174 SkPaint::Cap lineCap; 175 SkPaint::Join lineJoin; 176 SkXfermode::Mode mode; 177 int dashRatio; // Ratio of the length of a dash to its width 178 ShadowRec shadow; 179 SkColor fillColor; 180 SkShader* fillShader; 181 SkColor strokeColor; 182 SkShader* strokeShader; 183 bool useAA; 184 StrokeStyle strokeStyle; 185 186 State(); 187 State(const State& other); 188 ~State(); 189 190 void setShadow(int radius, int dx, int dy, SkColor c); 191 bool setupShadowPaint(SkPaint* paint, SkPoint* offset, 192 bool shadowsIgnoreTransforms); 193 SkColor applyAlpha(SkColor c) const; 194 195 State cloneInheritedProperties(); 196 private: 197 // Not supported. 198 void operator=(const State&); 199 200 friend class PlatformGraphicsContextRecording; 201 friend class PlatformGraphicsContextSkia; 202 }; 203 204 protected: 205 virtual bool shadowsIgnoreTransforms() const = 0; 206 void setupPaintCommon(SkPaint* paint) const; 207 GraphicsContext* m_gc; // Back-ptr to our parent 208 209 WTF::Vector<State> m_stateStack; 210 State* m_state; 211 }; 212 213 } 214 #endif 215