1 /*
   2  * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.webkit.perf;
  27 
  28 import java.nio.ByteBuffer;
  29 
  30 import com.sun.javafx.logging.PlatformLogger;
  31 import com.sun.webkit.graphics.Ref;
  32 import com.sun.webkit.graphics.RenderTheme;
  33 import com.sun.webkit.graphics.ScrollBarTheme;
  34 import com.sun.webkit.graphics.WCFont;
  35 import com.sun.webkit.graphics.WCGradient;
  36 import com.sun.webkit.graphics.WCGraphicsContext;
  37 import com.sun.webkit.graphics.WCIcon;
  38 import com.sun.webkit.graphics.WCImage;
  39 import com.sun.webkit.graphics.WCPath;
  40 import com.sun.webkit.graphics.WCPoint;
  41 import com.sun.webkit.graphics.WCRectangle;
  42 import com.sun.webkit.graphics.WCTransform;
  43 
  44 public final class WCGraphicsPerfLogger extends WCGraphicsContext {
  45     private static final PlatformLogger log = PlatformLogger.getLogger(WCGraphicsPerfLogger.class.getName());
  46 
  47     private static final PerfLogger logger = PerfLogger.getLogger(log);
  48 
  49     private final WCGraphicsContext gc;
  50 
  51     public WCGraphicsPerfLogger(WCGraphicsContext gc) {
  52         this.gc = gc;
  53     }
  54 
  55     public synchronized static boolean isEnabled() {
  56         return logger.isEnabled();
  57     }
  58 
  59     public static void log() {
  60         logger.log();
  61     }
  62 
  63     public static void reset() {
  64         logger.reset();
  65     }
  66 
  67     @Override
  68     public Object getPlatformGraphics() {
  69         return gc.getPlatformGraphics();
  70     }
  71 
  72     @Override
  73     public void drawString(WCFont f, int[] glyphs,
  74                            float[] advanceDXY,
  75                            float x, float y)
  76     {
  77         logger.resumeCount("DRAWSTRING_GV");
  78         gc.drawString(f, glyphs, advanceDXY, x, y);
  79         logger.suspendCount("DRAWSTRING_GV");
  80     }
  81 
  82     @Override
  83     public void strokeRect(float x, float y, float w, float h, float lengthWidth) {
  84         logger.resumeCount("STROKERECT_FFFFF");
  85         gc.strokeRect(x,y,w,h,lengthWidth);
  86         logger.suspendCount("STROKERECT_FFFFF");
  87     }
  88 
  89     @Override
  90     public void fillRect(float x, float y, float w, float h, Integer rgba) {
  91         logger.resumeCount("FILLRECT_FFFFI");
  92         gc.fillRect(x, y, w, h, rgba);
  93         logger.suspendCount("FILLRECT_FFFFI");
  94     }
  95 
  96     @Override public void fillRoundedRect(float x, float y, float w, float h,
  97             float topLeftW, float topLeftH, float topRightW, float topRightH,
  98             float bottomLeftW, float bottomLeftH, float bottomRightW, float bottomRightH,
  99             int rgba) {
 100         logger.resumeCount("FILL_ROUNDED_RECT");
 101         gc.fillRoundedRect(x, y, w, h, topLeftW, topLeftH, topRightW, topRightH,
 102                 bottomLeftW, bottomLeftH, bottomRightW, bottomRightH, rgba);
 103         logger.suspendCount("FILL_ROUNDED_RECT");
 104     }
 105 
 106     @Override
 107     public void clearRect(float x, float y, float w, float h) {
 108         logger.resumeCount("CLEARRECT");
 109         gc.clearRect(x, y, w, h);
 110         logger.suspendCount("CLEARRECT");
 111     }
 112 
 113     @Override
 114     public void setFillColor(int rgba) {
 115         logger.resumeCount("SETFILLCOLOR");
 116         gc.setFillColor(rgba);
 117         logger.suspendCount("SETFILLCOLOR");
 118     }
 119 
 120     @Override
 121     public void setFillGradient(WCGradient gradient) {
 122         logger.resumeCount("SET_FILL_GRADIENT");
 123         gc.setFillGradient(gradient);
 124         logger.suspendCount("SET_FILL_GRADIENT");
 125     }
 126 
 127     @Override
 128     public void setTextMode(boolean fill, boolean stroke, boolean clip) {
 129         logger.resumeCount("SET_TEXT_MODE");
 130         gc.setTextMode(fill, stroke, clip);
 131         logger.suspendCount("SET_TEXT_MODE");
 132     }
 133 
 134     @Override
 135     public void setFontSmoothingType(int fontSmoothingType) {
 136         logger.resumeCount("SET_FONT_SMOOTHING_TYPE");
 137         gc.setFontSmoothingType(fontSmoothingType);
 138         logger.suspendCount("SET_FONT_SMOOTHING_TYPE");
 139     }
 140 
 141     @Override
 142     public int getFontSmoothingType() {
 143         logger.resumeCount("GET_FONT_SMOOTHING_TYPE");
 144         int n = gc.getFontSmoothingType();
 145         logger.suspendCount("GET_FONT_SMOOTHING_TYPE");
 146         return n;
 147     }
 148 
 149     @Override
 150     public void setStrokeStyle(int style) {
 151         logger.resumeCount("SETSTROKESTYLE");
 152         gc.setStrokeStyle(style);
 153         logger.suspendCount("SETSTROKESTYLE");
 154     }
 155 
 156     @Override
 157     public void setStrokeColor(int rgba) {
 158         logger.resumeCount("SETSTROKECOLOR");
 159         gc.setStrokeColor(rgba);
 160         logger.suspendCount("SETSTROKECOLOR");
 161     }
 162 
 163     @Override
 164     public void setStrokeWidth(float width) {
 165         logger.resumeCount("SETSTROKEWIDTH");
 166         gc.setStrokeWidth(width);
 167         logger.suspendCount("SETSTROKEWIDTH");
 168     }
 169 
 170     @Override
 171     public void setStrokeGradient(WCGradient gradient) {
 172         logger.resumeCount("SET_STROKE_GRADIENT");
 173         gc.setStrokeGradient(gradient);
 174         logger.suspendCount("SET_STROKE_GRADIENT");
 175     }
 176 
 177     @Override
 178     public void setLineDash(float offset, float... sizes) {
 179         logger.resumeCount("SET_LINE_DASH");
 180         gc.setLineDash(offset, sizes);
 181         logger.suspendCount("SET_LINE_DASH");
 182     }
 183 
 184     @Override
 185     public void setLineCap(int lineCap) {
 186         logger.resumeCount("SET_LINE_CAP");
 187         gc.setLineCap(lineCap);
 188         logger.suspendCount("SET_LINE_CAP");
 189     }
 190 
 191     @Override
 192     public void setLineJoin(int lineJoin) {
 193         logger.resumeCount("SET_LINE_JOIN");
 194         gc.setLineJoin(lineJoin);
 195         logger.suspendCount("SET_LINE_JOIN");
 196     }
 197 
 198     @Override
 199     public void setMiterLimit(float miterLimit) {
 200         logger.resumeCount("SET_MITER_LIMIT");
 201         gc.setMiterLimit(miterLimit);
 202         logger.suspendCount("SET_MITER_LIMIT");
 203     }
 204 
 205     @Override
 206     public void setShadow(float dx, float dy, float blur, int color) {
 207         logger.resumeCount("SETSHADOW");
 208         gc.setShadow(dx, dy, blur, color);
 209         logger.suspendCount("SETSHADOW");
 210     }
 211 
 212     @Override
 213     public void drawPolygon(WCPath path, boolean shouldAntialias) {
 214         logger.resumeCount("DRAWPOLYGON");
 215         gc.drawPolygon(path, shouldAntialias);
 216         logger.suspendCount("DRAWPOLYGON");
 217     }
 218 
 219     @Override
 220     public void drawLine(int x0, int y0, int x1, int y1) {
 221         logger.resumeCount("DRAWLINE");
 222         gc.drawLine(x0, y0, x1, y1);
 223         logger.suspendCount("DRAWLINE");
 224     }
 225 
 226     @Override
 227     public void drawImage(WCImage img,
 228                           float dstx, float dsty, float dstw, float dsth,
 229                           float srcx, float srcy, float srcw, float srch) {
 230         logger.resumeCount("DRAWIMAGE");
 231         gc.drawImage(img, dstx, dsty, dstw, dsth, srcx, srcy, srcw, srch);
 232         logger.suspendCount("DRAWIMAGE");
 233     }
 234 
 235     @Override
 236     public void drawIcon(WCIcon icon, int x, int y) {
 237         logger.resumeCount("DRAWICON");
 238         gc.drawIcon(icon, x, y);
 239         logger.suspendCount("DRAWICON");
 240     }
 241 
 242     @Override
 243     public void drawPattern(WCImage texture, WCRectangle srcRect,
 244             WCTransform patternTransform, WCPoint phase,
 245             WCRectangle destRect) {
 246         logger.resumeCount("DRAWPATTERN");
 247         gc.drawPattern(texture, srcRect, patternTransform, phase, destRect);
 248         logger.suspendCount("DRAWPATTERN");
 249     }
 250 
 251     @Override
 252     public void translate(float x, float y) {
 253         logger.resumeCount("TRANSLATE");
 254         gc.translate(x, y);
 255         logger.suspendCount("TRANSLATE");
 256     }
 257 
 258     @Override
 259     public void scale(float scaleX, float scaleY) {
 260         logger.resumeCount("SCALE");
 261         gc.scale(scaleX, scaleY);
 262         logger.suspendCount("SCALE");
 263     }
 264 
 265     @Override
 266     public void rotate(float radians) {
 267         logger.resumeCount("ROTATE");
 268         gc.rotate(radians);
 269         logger.suspendCount("ROTATE");
 270     }
 271 
 272     @Override
 273     public void saveState() {
 274         logger.resumeCount("SAVESTATE");
 275         gc.saveState();
 276         logger.suspendCount("SAVESTATE");
 277     }
 278 
 279     @Override
 280     public void restoreState() {
 281         logger.resumeCount("RESTORESTATE");
 282         gc.restoreState();
 283         logger.suspendCount("RESTORESTATE");
 284     }
 285 
 286     @Override
 287     public void setClip(WCPath path, boolean isOut) {
 288         logger.resumeCount("CLIP_PATH");
 289         gc.setClip(path, isOut);
 290         logger.suspendCount("CLIP_PATH");
 291     }
 292 
 293     @Override
 294     public void setClip(WCRectangle clip) {
 295         logger.resumeCount("SETCLIP_R");
 296         gc.setClip(clip);
 297         logger.suspendCount("SETCLIP_R");
 298     }
 299 
 300     @Override
 301     public void setClip(int cx, int cy, int cw, int ch) {
 302         logger.resumeCount("SETCLIP_IIII");
 303         gc.setClip(cx, cy, cw, ch);
 304         logger.suspendCount("SETCLIP_IIII");
 305     }
 306 
 307     @Override
 308     public WCRectangle getClip() {
 309         logger.resumeCount("SETCLIP_IIII");
 310         WCRectangle r = gc.getClip();
 311         logger.suspendCount("SETCLIP_IIII");
 312         return r;
 313     }
 314 
 315     @Override
 316     public void drawRect(int x, int y, int w, int h) {
 317         logger.resumeCount("DRAWRECT");
 318         gc.drawRect(x, y, w, h);
 319         logger.suspendCount("DRAWRECT");
 320     }
 321 
 322     @Override
 323     public void setComposite(int composite) {
 324         logger.resumeCount("SETCOMPOSITE");
 325         gc.setComposite(composite);
 326         logger.suspendCount("SETCOMPOSITE");
 327     }
 328 
 329     @Override
 330     public void strokeArc(int x, int y, int w, int h, int startAngle,
 331                           int angleSpan) {
 332         logger.resumeCount("STROKEARC");
 333         gc.strokeArc(x, y, w, h, startAngle, angleSpan);
 334         logger.suspendCount("STROKEARC");
 335     }
 336 
 337     @Override
 338     public void drawEllipse(int x, int y, int w, int h) {
 339         logger.resumeCount("DRAWELLIPSE");
 340         gc.drawEllipse(x, y, w, h);
 341         logger.suspendCount("DRAWELLIPSE");
 342     }
 343 
 344     @Override
 345     public void drawFocusRing(int x, int y, int w, int h, int rgba) {
 346         logger.resumeCount("DRAWFOCUSRING");
 347         gc.drawFocusRing(x, y, w, h, rgba);
 348         logger.suspendCount("DRAWFOCUSRING");
 349     }
 350 
 351     @Override
 352     public void setAlpha(float alpha) {
 353         logger.resumeCount("SETALPHA");
 354         gc.setAlpha(alpha);
 355         logger.suspendCount("SETALPHA");
 356     }
 357 
 358     @Override
 359     public float getAlpha() {
 360         logger.resumeCount("GETALPHA");
 361         float a = gc.getAlpha();
 362         logger.suspendCount("GETALPHA");
 363         return a;
 364     }
 365 
 366     @Override
 367     public void beginTransparencyLayer(float opacity) {
 368         logger.resumeCount("BEGINTRANSPARENCYLAYER");
 369         gc.beginTransparencyLayer(opacity);
 370         logger.suspendCount("BEGINTRANSPARENCYLAYER");
 371     }
 372 
 373     @Override
 374     public void endTransparencyLayer() {
 375         logger.resumeCount("ENDTRANSPARENCYLAYER");
 376         gc.endTransparencyLayer();
 377         logger.suspendCount("ENDTRANSPARENCYLAYER");
 378     }
 379 
 380     @Override
 381     public void drawString(WCFont f, String str, boolean rtl,
 382                            int from, int to,
 383                            float x, float y)
 384     {
 385         logger.resumeCount("DRAWSTRING");
 386         gc.drawString(f, str, rtl, from, to, x, y);
 387         logger.suspendCount("DRAWSTRING");
 388     }
 389 
 390     @Override
 391     public void strokePath(WCPath path) {
 392         logger.resumeCount("STROKE_PATH");
 393         gc.strokePath(path);
 394         logger.suspendCount("STROKE_PATH");
 395     }
 396 
 397     @Override
 398     public void fillPath(WCPath path) {
 399         logger.resumeCount("FILL_PATH");
 400         gc.fillPath(path);
 401         logger.suspendCount("FILL_PATH");
 402     }
 403 
 404     @Override
 405     public WCImage getImage() {
 406         logger.resumeCount("GETIMAGE");
 407         WCImage res = gc.getImage();
 408         logger.suspendCount("GETIMAGE");
 409         return res;
 410     }
 411 
 412     @Override
 413     public void drawWidget(RenderTheme theme, Ref widget, int x, int y) {
 414         logger.resumeCount("DRAWWIDGET");
 415         gc.drawWidget(theme, widget, x, y);
 416         logger.suspendCount("DRAWWIDGET");
 417     }
 418 
 419     @Override
 420     public void drawScrollbar(ScrollBarTheme theme, Ref widget,
 421                               int x, int y, int pressedPart, int hoveredPart)
 422     {
 423         logger.resumeCount("DRAWSCROLLBAR");
 424         gc.drawScrollbar(theme, widget, x, y, pressedPart, hoveredPart);
 425         logger.suspendCount("DRAWSCROLLBAR");
 426     }
 427 
 428     @Override
 429     public void dispose() {
 430         logger.resumeCount("DISPOSE");
 431         gc.dispose();
 432         logger.suspendCount("DISPOSE");
 433     }
 434 
 435     @Override
 436     public void flush() {
 437         logger.resumeCount("FLUSH");
 438         gc.flush();
 439         logger.suspendCount("FLUSH");
 440     }
 441 
 442     @Override
 443     public void setTransform(WCTransform t) {
 444         logger.resumeCount("SETTRANSFORM");
 445         gc.setTransform(t);
 446         logger.suspendCount("SETTRANSFORM");
 447     }
 448 
 449     @Override
 450     public WCTransform getTransform() {
 451         logger.resumeCount("GETTRANSFORM");
 452         WCTransform t = gc.getTransform();
 453         logger.suspendCount("GETTRANSFORM");
 454         return t;
 455     }
 456 
 457     @Override
 458     public void concatTransform(WCTransform t) {
 459         logger.resumeCount("CONCATTRANSFORM");
 460         gc.concatTransform(t);
 461         logger.suspendCount("CONCATTRANSFORM");
 462     }
 463 
 464     @Override
 465     public void drawBitmapImage(ByteBuffer image, int x, int y, int w, int h) {
 466         logger.resumeCount("DRAWBITMAPIMAGE");
 467         gc.drawBitmapImage(image, x, y, w, h);
 468         logger.suspendCount("DRAWBITMAPIMAGE");
 469     }
 470 
 471     @Override
 472     public WCGradient createLinearGradient(WCPoint p1, WCPoint p2) {
 473         logger.resumeCount("CREATE_LINEAR_GRADIENT");
 474         WCGradient gradient = gc.createLinearGradient(p1, p2);
 475         logger.suspendCount("CREATE_LINEAR_GRADIENT");
 476         return gradient;
 477     }
 478 
 479     @Override
 480     public WCGradient createRadialGradient(WCPoint p1, float r1, WCPoint p2, float r2) {
 481         logger.resumeCount("CREATE_RADIAL_GRADIENT");
 482         WCGradient gradient = gc.createRadialGradient(p1, r1, p2, r2);
 483         logger.suspendCount("CREATE_RADIAL_GRADIENT");
 484         return gradient;
 485     }
 486 }