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 "SkCanvas.h" 33 #include "SkPicture.h" 34 #include "SkTDArray.h" 35 #include <wtf/Vector.h> 36 37 class SkCanvas; 38 39 namespace WebCore { 40 41 class PlatformGraphicsContext { 42 public: 43 PlatformGraphicsContext(); 44 virtual ~PlatformGraphicsContext(); 45 virtual bool isPaintingDisabled() = 0; 46 virtual SkCanvas* getCanvas() = 0; 47 setGraphicsContext(GraphicsContext * gc)48 void setGraphicsContext(GraphicsContext* gc) { m_gc = gc; } deleteUs()49 virtual bool deleteUs() const { return false; } 50 51 typedef enum { PaintingContext, RecordingContext } ContextType; 52 virtual ContextType type() = 0; 53 54 // State management 55 virtual void beginTransparencyLayer(float opacity) = 0; 56 virtual void endTransparencyLayer() = 0; 57 virtual void save(); 58 virtual void restore(); 59 60 // State values 61 virtual void setAlpha(float alpha); 62 int getNormalizedAlpha() const; 63 virtual void setCompositeOperation(CompositeOperator op); 64 virtual void setFillColor(const Color& c); 65 virtual void setFillShader(SkShader* fillShader); 66 virtual void setLineCap(LineCap cap); 67 virtual void setLineDash(const DashArray& dashes, float dashOffset); 68 virtual void setLineJoin(LineJoin join); 69 virtual void setMiterLimit(float limit); 70 virtual void setShadow(int radius, int dx, int dy, SkColor c); 71 virtual void setShouldAntialias(bool useAA); 72 virtual void setStrokeColor(const Color& c); 73 virtual void setStrokeShader(SkShader* strokeShader); 74 virtual void setStrokeStyle(StrokeStyle style); 75 virtual void setStrokeThickness(float f); 76 77 // FIXME: These setupPaint* should be private, but 78 // they are used by FontAndroid currently 79 virtual void setupPaintFill(SkPaint* paint) const; 80 virtual bool setupPaintShadow(SkPaint* paint, SkPoint* offset) const; 81 // Sets up the paint for stroking. Returns true if the style is really 82 // just a dash of squares (the size of the paint's stroke-width. 83 virtual bool setupPaintStroke(SkPaint* paint, SkRect* rect, bool isHLine = false); 84 85 // Matrix operations 86 virtual void concatCTM(const AffineTransform& affine) = 0; 87 virtual void rotate(float angleInRadians) = 0; 88 virtual void scale(const FloatSize& size) = 0; 89 virtual void translate(float x, float y) = 0; 90 virtual const SkMatrix& getTotalMatrix() = 0; 91 92 // Clipping 93 virtual void addInnerRoundedRectClip(const IntRect& rect, int thickness) = 0; 94 virtual void canvasClip(const Path& path) = 0; 95 virtual void clip(const FloatRect& rect) = 0; 96 virtual void clip(const Path& path) = 0; 97 virtual void clipConvexPolygon(size_t numPoints, const FloatPoint*, bool antialias) = 0; 98 virtual void clipOut(const IntRect& r) = 0; 99 virtual void clipOut(const Path& p) = 0; 100 virtual void clipPath(const Path& pathToClip, WindRule clipRule) = 0; 101 102 // Drawing 103 virtual void clearRect(const FloatRect& rect) = 0; 104 virtual void drawBitmapPattern(const SkBitmap& bitmap, const SkMatrix& matrix, 105 CompositeOperator compositeOp, const FloatRect& destRect) = 0; 106 virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, 107 const SkRect& dst, CompositeOperator op) = 0; 108 virtual void drawConvexPolygon(size_t numPoints, const FloatPoint* points, 109 bool shouldAntialias) = 0; 110 virtual void drawEllipse(const IntRect& rect) = 0; 111 virtual void drawFocusRing(const Vector<IntRect>& rects, int /* width */, 112 int /* offset */, const Color& color) = 0; 113 virtual void drawHighlightForText(const Font& font, const TextRun& run, 114 const FloatPoint& point, int h, 115 const Color& backgroundColor, ColorSpace colorSpace, 116 int from, int to, bool isActive) = 0; 117 virtual void drawLine(const IntPoint& point1, const IntPoint& point2) = 0; 118 virtual void drawLineForText(const FloatPoint& pt, float width) = 0; 119 virtual void drawLineForTextChecking(const FloatPoint& pt, float width, 120 GraphicsContext::TextCheckingLineStyle) = 0; 121 virtual void drawRect(const IntRect& rect) = 0; 122 virtual void fillPath(const Path& pathToFill, WindRule fillRule) = 0; 123 virtual void fillRect(const FloatRect& rect) = 0; fillRect(const FloatRect & rect,const Color & color,ColorSpace)124 void fillRect(const FloatRect& rect, const Color& color, ColorSpace) { 125 fillRect(rect, color); 126 } 127 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)128 void fillRoundedRect(const IntRect& rect, const IntSize& topLeft, 129 const IntSize& topRight, const IntSize& bottomLeft, 130 const IntSize& bottomRight, const Color& color, 131 ColorSpace) { 132 fillRoundedRect(rect, topLeft, topRight, bottomLeft, bottomRight, color); 133 } 134 virtual void fillRoundedRect(const IntRect& rect, const IntSize& topLeft, 135 const IntSize& topRight, const IntSize& bottomLeft, 136 const IntSize& bottomRight, const Color& color) = 0; 137 virtual void strokeArc(const IntRect& r, int startAngle, int angleSpan) = 0; 138 virtual void strokePath(const Path& pathToStroke) = 0; 139 virtual void strokeRect(const FloatRect& rect, float lineWidth) = 0; 140 141 virtual SkCanvas* recordingCanvas() = 0; 142 virtual void endRecording(int type = 0) = 0; 143 144 protected: 145 146 struct ShadowRec { 147 SkScalar blur; 148 SkScalar dx; 149 SkScalar dy; 150 SkColor color; // alpha>0 means valid shadow 151 ShadowRec(SkScalar b = 0, 152 SkScalar x = 0, 153 SkScalar y = 0, 154 SkColor c = 0) // by default, alpha=0, so no shadow blurShadowRec155 : blur(b), dx(x), dy(y), color(c) 156 {}; 157 }; 158 159 class State { 160 public: 161 SkPathEffect* pathEffect; 162 float miterLimit; 163 float alpha; 164 float strokeThickness; 165 SkPaint::Cap lineCap; 166 SkPaint::Join lineJoin; 167 SkXfermode::Mode mode; 168 int dashRatio; // Ratio of the length of a dash to its width 169 ShadowRec shadow; 170 SkColor fillColor; 171 SkShader* fillShader; 172 SkColor strokeColor; 173 SkShader* strokeShader; 174 bool useAA; 175 StrokeStyle strokeStyle; 176 177 State(); 178 State(const State& other); 179 ~State(); 180 181 void setShadow(int radius, int dx, int dy, SkColor c); 182 bool setupShadowPaint(SkPaint* paint, SkPoint* offset, 183 bool shadowsIgnoreTransforms); 184 SkColor applyAlpha(SkColor c) const; 185 186 State cloneInheritedProperties(); 187 private: 188 // Not supported. 189 void operator=(const State&); 190 191 friend class PlatformGraphicsContextRecording; 192 friend class PlatformGraphicsContextSkia; 193 }; 194 195 virtual bool shadowsIgnoreTransforms() const = 0; 196 void setupPaintCommon(SkPaint* paint) const; 197 GraphicsContext* m_gc; // Back-ptr to our parent 198 199 struct State; 200 WTF::Vector<State> m_stateStack; 201 State* m_state; 202 }; 203 204 } 205 #endif 206