1 /* 2 * Copyright (c) 2002-2025 Gargoyle Software Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * https://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 package org.htmlunit.platform.canvas.rendering; 16 17 import java.io.IOException; 18 19 import org.htmlunit.javascript.host.canvas.Path2D; 20 21 /** 22 * Interface to the rendering context used by 23 * {@link org.htmlunit.javascript.host.canvas.CanvasRenderingContext2D}. 24 * 25 * @author Ronald Brill 26 */ 27 public interface RenderingBackend { 28 29 /** 30 * WindingRule to be used while rendering. 31 */ 32 enum WindingRule { 33 /** WindingRule.NON_ZERO. */ 34 NON_ZERO, 35 /** WindingRule.EVEN_ODD. */ 36 EVEN_ODD 37 } 38 39 /** 40 * Starts a new path by emptying the list of sub-paths. 41 */ 42 void beginPath(); 43 44 /** 45 * Adds a cubic Bézier curve to the current sub-path. It requires 46 * three points: the first two are control points and the third one 47 * is the end point. The starting point is the latest point in the 48 * current path, which can be changed using moveTo() before 49 * creating the Bézier curve. 50 * @param cp1x the cp1x 51 * @param cp1y the cp1y 52 * @param cp2x the cp2x 53 * @param cp2y the cp2y 54 * @param x the x 55 * @param y the y 56 */ 57 void bezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, 58 double x, double y); 59 60 /** 61 * Adds a circular arc to the current sub-path. 62 * @param x the x 63 * @param y the y 64 * @param radius the radius 65 * @param startAngle the start angle 66 * @param endAngle the end angle 67 * @param anticlockwise is anti-clockwise 68 */ 69 void arc(double x, double y, double radius, double startAngle, 70 double endAngle, boolean anticlockwise); 71 72 /** 73 * Paints the specified rectangular area. 74 * @param x the x 75 * @param y the y 76 * @param w the width 77 * @param h the height 78 */ 79 void clearRect(double x, double y, double w, double h); 80 81 /** 82 * Draws images onto the context. 83 * 84 * @param imageData the reader to read the image from 8the first one) 85 * @param sx the X coordinate of the top left corner of the sub-rectangle of the source image 86 * to draw into the destination context 87 * @param sy the Y coordinate of the top left corner of the sub-rectangle of the source image 88 * to draw into the destination context 89 * @param sWidth the width of the sub-rectangle of the source image to draw into the destination context 90 * @param sHeight the height of the sub-rectangle of the source image to draw into the destination context 91 * @param dx the X coordinate in the destination canvas at which to place the top-left corner of the source image 92 * @param dy the Y coordinate in the destination canvas at which to place the top-left corner of the source image 93 * @param dWidth the width to draw the image in the destination canvas. This allows scaling of the drawn image 94 * @param dHeight the height to draw the image in the destination canvas. This allows scaling of the drawn image 95 * @throws IOException in case o problems 96 */ 97 void drawImage(org.htmlunit.platform.image.ImageData imageData, 98 int sx, int sy, Integer sWidth, Integer sHeight, 99 int dx, int dy, Integer dWidth, Integer dHeight) throws IOException; 100 101 /** 102 * Constructs a base64 encoded string out of the image data. 103 * 104 * @param type the name of the image format 105 * @return the base64 encoded string 106 * @throws IOException in case o problems 107 */ 108 String encodeToString(String type) throws IOException; 109 110 /** 111 * Creates an elliptical arc centered at (x, y) with the radii radiusX and radiusY. 112 * The path starts at startAngle and ends at endAngle, and travels in the direction 113 * given by anticlockwise (defaulting to clockwise). 114 * @param x the x 115 * @param y the y 116 * @param radiusX the radiusX 117 * @param radiusY the radiusY 118 * @param rotation the rotation 119 * @param startAngle the start angle 120 * @param endAngle the end angle 121 * @param anticlockwise is anti-clockwise 122 */ 123 void ellipse(double x, double y, 124 double radiusX, double radiusY, 125 double rotation, double startAngle, double endAngle, 126 boolean anticlockwise); 127 128 /** 129 * Fills the current or given path with the current fillStyle. 130 */ 131 void fill(); 132 133 /** 134 * Paints the specified rectangular area. 135 * @param x the x 136 * @param y the y 137 * @param w the width 138 * @param h the height 139 */ 140 void fillRect(int x, int y, int w, int h); 141 142 /** 143 * Fills a given text at the given (x, y) position. 144 * @param text the text 145 * @param x the x 146 * @param y the y 147 */ 148 void fillText(String text, double x, double y); 149 150 /** 151 * Creates a byte array containing the (4) color values of all pixels. 152 * 153 * @param width the width 154 * @param height the height 155 * @param sx start point x 156 * @param sy start point y 157 * @return the bytes 158 */ 159 byte[] getBytes(int width, int height, int sx, int sy); 160 161 /** 162 * Adds a straight line to the current sub-path by connecting the 163 * sub-path's last point to the specified (x, y) coordinates. 164 * @param x the x 165 * @param y the y 166 */ 167 void lineTo(double x, double y); 168 169 /** 170 * Begins a new sub-path at the point specified 171 * by the given (x, y) coordinates. 172 * @param x the x 173 * @param y the y 174 */ 175 void moveTo(double x, double y); 176 177 /** 178 * Paints data from the given ImageData object onto the canvas. 179 * @param imageDataBytes an array of pixel values 180 * @param imageDataHeight the height of the imageData 181 * @param imageDataWidth the width of the imageData 182 * @param dx horizontal position (x coordinate) at which to place the image data in the destination canvas 183 * @param dy vertical position (y coordinate) at which to place the image data in the destination canvas 184 * @param dirtyX horizontal position (x coordinate) of the top-left corner 185 * from which the image data will be extracted. Defaults to 0. 186 * @param dirtyY vertical position (y coordinate) of the top-left corner 187 * from which the image data will be extracted. Defaults to 0. 188 * @param dirtyWidth width of the rectangle to be painted. 189 * Defaults to the width of the image data. 190 * @param dirtyHeight height of the rectangle to be painted. 191 * Defaults to the height of the image data. 192 */ 193 void putImageData(byte[] imageDataBytes, int imageDataHeight, int imageDataWidth, 194 int dx, int dy, int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight); 195 196 /** 197 * Adds a quadratic Bézier curve to the current sub-path. It requires 198 * two points: the first one is a control point and the second one is 199 * the end point. The starting point is the latest point in the 200 * current path, which can be changed using moveTo() before 201 * creating the quadratic Bézier curve. 202 * @param cpx the cpx 203 * @param cpy the cpy 204 * @param x the x 205 * @param y the y 206 */ 207 void quadraticCurveTo(double cpx, double cpy, double x, double y); 208 209 /** 210 * Adds a rectangle to the current path. 211 * @param x the x 212 * @param y the y 213 * @param w the width 214 * @param h the height 215 */ 216 void rect(double x, double y, double w, double h); 217 218 /** 219 * Restores the most recently saved canvas state by popping the top 220 * entry in the drawing state stack. If there is no saved state, 221 * this method does nothing. 222 */ 223 void restore(); 224 225 /** 226 * Adds a rotation to the transformation matrix. 227 * @param angle the angle 228 */ 229 void rotate(double angle); 230 231 /** 232 * Saves the entire state of the canvas by pushing 233 * the current state onto a stack. 234 */ 235 void save(); 236 237 /** 238 * Sets the {@code fillStyle} property. 239 * @param fillStyle the {@code fillStyle} property 240 */ 241 void setFillStyle(String fillStyle); 242 243 /** 244 * Sets the {@code strokeStyle} property. 245 * @param strokeStyle the {@code strokeStyle} property 246 */ 247 void setStrokeStyle(String strokeStyle); 248 249 /** 250 * Returns the {@code lineWidth} property. 251 * @return the {@code lineWidth} property 252 */ 253 int getLineWidth(); 254 255 /** 256 * Sets the {@code lineWidth} property. 257 * @param lineWidth the {@code lineWidth} property 258 */ 259 void setLineWidth(int lineWidth); 260 261 /** 262 * Resets (overrides) the current transformation to the identity matrix, 263 * and then invokes a transformation described by the arguments of this method. 264 * This lets you scale, rotate, translate (move), and skew the context. 265 * @param m11 Horizontal scaling. A value of 1 results in no scaling 266 * @param m12 Vertical skewing 267 * @param m21 Horizontal skewing 268 * @param m22 Vertical scaling. A value of 1 results in no scaling 269 * @param dx Horizontal translation (moving) 270 * @param dy Vertical translation (moving). 271 */ 272 void setTransform(double m11, double m12, double m21, double m22, double dx, double dy); 273 274 /** 275 * Strokes (outlines) the current or given path with the current stroke style. 276 */ 277 void stroke(); 278 279 /** 280 * Paints the specified rectangular area. 281 * @param x the x 282 * @param y the y 283 * @param w the width 284 * @param h the height 285 */ 286 void strokeRect(int x, int y, int w, int h); 287 288 /** 289 * Multiplies the current transformation with the matrix described by the 290 * arguments of this method. This lets you scale, rotate, translate (move), 291 * and skew the context. 292 * @param m11 Horizontal scaling. A value of 1 results in no scaling 293 * @param m12 Vertical skewing 294 * @param m21 Horizontal skewing 295 * @param m22 Vertical scaling. A value of 1 results in no scaling 296 * @param dx Horizontal translation (moving) 297 * @param dy Vertical translation (moving). 298 */ 299 void transform(double m11, double m12, double m21, double m22, double dx, double dy); 300 301 /** 302 * Adds a translation transformation to the current matrix. 303 * @param x the x 304 * @param y the y 305 */ 306 void translate(int x, int y); 307 308 /** 309 * Turns the current or given path into the current clipping region. 310 * It replaces any previous clipping region. 311 * @param windingRule the RenderingBackend.WindingRule {@link WindingRule} 312 * to be used 313 * @param path the path or null if the current path should be used 314 */ 315 void clip(RenderingBackend.WindingRule windingRule, Path2D path); 316 317 /** 318 * Attempts to add a straight line from the current point to the start of the current sub-path. 319 * If the shape has already been closed or has only one point, this function does nothing. 320 */ 321 void closePath(); 322 323 /** 324 * @return the alpha (transparency) value that is applied to shapes and images 325 * before they are drawn onto the canvas. 326 */ 327 double getGlobalAlpha(); 328 329 /** 330 * Specifies the alpha (transparency) value that is applied to shapes and images 331 * before they are drawn onto the canvas. 332 * @param globalAlpha the new alpha 333 */ 334 void setGlobalAlpha(double globalAlpha); 335 }