gfx/skia/trunk/src/utils/SkDumpCanvas.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     2 /*
     3  * Copyright 2011 Google Inc.
     4  *
     5  * Use of this source code is governed by a BSD-style license that can be
     6  * found in the LICENSE file.
     7  */
     9 #include "SkDumpCanvas.h"
    11 #ifdef SK_DEVELOPER
    12 #include "SkPicture.h"
    13 #include "SkPixelRef.h"
    14 #include "SkRRect.h"
    15 #include "SkString.h"
    16 #include <stdarg.h>
    17 #include <stdio.h>
    19 // needed just to know that these are all subclassed from SkFlattenable
    20 #include "SkShader.h"
    21 #include "SkPathEffect.h"
    22 #include "SkXfermode.h"
    23 #include "SkColorFilter.h"
    24 #include "SkPathEffect.h"
    25 #include "SkMaskFilter.h"
    27 static void toString(const SkRect& r, SkString* str) {
    28     str->appendf("[%g,%g %g:%g]",
    29                  SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop),
    30                  SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
    31 }
    33 static void toString(const SkIRect& r, SkString* str) {
    34     str->appendf("[%d,%d %d:%d]", r.fLeft, r.fTop, r.width(), r.height());
    35 }
    37 static void toString(const SkRRect& rrect, SkString* str) {
    38     SkRect r = rrect.getBounds();
    39     str->appendf("[%g,%g %g:%g]",
    40                  SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop),
    41                  SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
    42     if (rrect.isOval()) {
    43         str->append("()");
    44     } else if (rrect.isSimple()) {
    45         const SkVector& rad = rrect.getSimpleRadii();
    46         str->appendf("(%g,%g)", rad.x(), rad.y());
    47     } else if (rrect.isComplex()) {
    48         SkVector radii[4] = {
    49             rrect.radii(SkRRect::kUpperLeft_Corner),
    50             rrect.radii(SkRRect::kUpperRight_Corner),
    51             rrect.radii(SkRRect::kLowerRight_Corner),
    52             rrect.radii(SkRRect::kLowerLeft_Corner),
    53         };
    54         str->appendf("(%g,%g %g,%g %g,%g %g,%g)",
    55                      radii[0].x(), radii[0].y(),
    56                      radii[1].x(), radii[1].y(),
    57                      radii[2].x(), radii[2].y(),
    58                      radii[3].x(), radii[3].y());
    59     }
    60 }
    62 static void dumpVerbs(const SkPath& path, SkString* str) {
    63     SkPath::Iter iter(path, false);
    64     SkPoint pts[4];
    65     for (;;) {
    66         switch (iter.next(pts, false)) {
    67             case SkPath::kMove_Verb:
    68                 str->appendf(" M%g,%g", pts[0].fX, pts[0].fY);
    69                 break;
    70             case SkPath::kLine_Verb:
    71                 str->appendf(" L%g,%g", pts[0].fX, pts[0].fY);
    72                 break;
    73             case SkPath::kQuad_Verb:
    74                 str->appendf(" Q%g,%g,%g,%g", pts[1].fX, pts[1].fY,
    75                              pts[2].fX, pts[2].fY);
    76                 break;
    77             case SkPath::kCubic_Verb:
    78                 str->appendf(" C%g,%g,%g,%g,%g,%g", pts[1].fX, pts[1].fY,
    79                              pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY);
    80                 break;
    81             case SkPath::kClose_Verb:
    82                 str->append("X");
    83                 break;
    84             case SkPath::kDone_Verb:
    85                 return;
    86             case SkPath::kConic_Verb:
    87                 SkASSERT(0);
    88                 break;
    89         }
    90     }
    91 }
    93 static void toString(const SkPath& path, SkString* str) {
    94     if (path.isEmpty()) {
    95         str->append("path:empty");
    96     } else {
    97         toString(path.getBounds(), str);
    98 #if 1
    99         SkString s;
   100         dumpVerbs(path, &s);
   101         str->append(s.c_str());
   102 #endif
   103         str->append("]");
   104         str->prepend("path:[");
   105     }
   106 }
   108 static const char* toString(SkRegion::Op op) {
   109     static const char* gOpNames[] = {
   110         "DIFF", "SECT", "UNION", "XOR", "RDIFF", "REPLACE"
   111     };
   112     return gOpNames[op];
   113 }
   115 static void toString(const SkRegion& rgn, SkString* str) {
   116     str->append("Region:[");
   117     toString(rgn.getBounds(), str);
   118     str->append("]");
   119     if (rgn.isComplex()) {
   120         str->append(".complex");
   121     }
   122 }
   124 static const char* toString(SkCanvas::VertexMode vm) {
   125     static const char* gVMNames[] = {
   126         "TRIANGLES", "STRIP", "FAN"
   127     };
   128     return gVMNames[vm];
   129 }
   131 static const char* toString(SkCanvas::PointMode pm) {
   132     static const char* gPMNames[] = {
   133         "POINTS", "LINES", "POLYGON"
   134     };
   135     return gPMNames[pm];
   136 }
   138 static void toString(const void* text, size_t byteLen, SkPaint::TextEncoding enc,
   139                      SkString* str) {
   140     // FIXME: this code appears to be untested - and probably unused - and probably wrong
   141     switch (enc) {
   142         case SkPaint::kUTF8_TextEncoding:
   143             str->appendf("\"%.*s\"%s", (int)SkTMax<size_t>(byteLen, 32), (const char*) text,
   144                         byteLen > 32 ? "..." : "");
   145             break;
   146         case SkPaint::kUTF16_TextEncoding:
   147             str->appendf("\"%.*ls\"%s", (int)SkTMax<size_t>(byteLen, 32), (const wchar_t*) text,
   148                         byteLen > 64 ? "..." : "");
   149             break;
   150         case SkPaint::kUTF32_TextEncoding:
   151             str->appendf("\"%.*ls\"%s", (int)SkTMax<size_t>(byteLen, 32), (const wchar_t*) text,
   152                         byteLen > 128 ? "..." : "");
   153             break;
   154         case SkPaint::kGlyphID_TextEncoding:
   155             str->append("<glyphs>");
   156             break;
   158         default:
   159             SkASSERT(false);
   160             break;
   161     }
   162 }
   164 ///////////////////////////////////////////////////////////////////////////////
   166 #define WIDE_OPEN   16384
   168 SkDumpCanvas::SkDumpCanvas(Dumper* dumper) : INHERITED(WIDE_OPEN, WIDE_OPEN) {
   169     fNestLevel = 0;
   170     SkSafeRef(dumper);
   171     fDumper = dumper;
   172 }
   174 SkDumpCanvas::~SkDumpCanvas() {
   175     SkSafeUnref(fDumper);
   176 }
   178 void SkDumpCanvas::dump(Verb verb, const SkPaint* paint,
   179                         const char format[], ...) {
   180     static const size_t BUFFER_SIZE = 1024;
   182     char    buffer[BUFFER_SIZE];
   183     va_list args;
   184     va_start(args, format);
   185     vsnprintf(buffer, BUFFER_SIZE, format, args);
   186     va_end(args);
   188     if (fDumper) {
   189         fDumper->dump(this, verb, buffer, paint);
   190     }
   191 }
   193 ///////////////////////////////////////////////////////////////////////////////
   195 void SkDumpCanvas::willSave(SaveFlags flags) {
   196     this->dump(kSave_Verb, NULL, "save(0x%X)", flags);
   197     this->INHERITED::willSave(flags);
   198 }
   200 SkCanvas::SaveLayerStrategy SkDumpCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint,
   201                                                         SaveFlags flags) {
   202     SkString str;
   203     str.printf("saveLayer(0x%X)", flags);
   204     if (bounds) {
   205         str.append(" bounds");
   206         toString(*bounds, &str);
   207     }
   208     if (paint) {
   209         if (paint->getAlpha() != 0xFF) {
   210             str.appendf(" alpha:0x%02X", paint->getAlpha());
   211         }
   212         if (paint->getXfermode()) {
   213             str.appendf(" xfermode:%p", paint->getXfermode());
   214         }
   215     }
   216     this->dump(kSave_Verb, paint, str.c_str());
   217     return this->INHERITED::willSaveLayer(bounds, paint, flags);
   218 }
   220 void SkDumpCanvas::willRestore() {
   221     this->dump(kRestore_Verb, NULL, "restore");
   222     this->INHERITED::willRestore();
   223 }
   225 void SkDumpCanvas::didTranslate(SkScalar dx, SkScalar dy) {
   226     this->dump(kMatrix_Verb, NULL, "translate(%g %g)",
   227                SkScalarToFloat(dx), SkScalarToFloat(dy));
   228     this->INHERITED::didTranslate(dx, dy);
   229 }
   231 void SkDumpCanvas::didScale(SkScalar sx, SkScalar sy) {
   232     this->dump(kMatrix_Verb, NULL, "scale(%g %g)",
   233                SkScalarToFloat(sx), SkScalarToFloat(sy));
   234     this->INHERITED::didScale(sx, sy);
   235 }
   237 void SkDumpCanvas::didRotate(SkScalar degrees) {
   238     this->dump(kMatrix_Verb, NULL, "rotate(%g)", SkScalarToFloat(degrees));
   239     this->INHERITED::didRotate(degrees);
   240 }
   242 void SkDumpCanvas::didSkew(SkScalar sx, SkScalar sy) {
   243     this->dump(kMatrix_Verb, NULL, "skew(%g %g)",
   244                SkScalarToFloat(sx), SkScalarToFloat(sy));
   245     this->INHERITED::didSkew(sx, sy);
   246 }
   248 void SkDumpCanvas::didConcat(const SkMatrix& matrix) {
   249     SkString str;
   250     matrix.toString(&str);
   251     this->dump(kMatrix_Verb, NULL, "concat(%s)", str.c_str());
   252     this->INHERITED::didConcat(matrix);
   253 }
   255 void SkDumpCanvas::didSetMatrix(const SkMatrix& matrix) {
   256     SkString str;
   257     matrix.toString(&str);
   258     this->dump(kMatrix_Verb, NULL, "setMatrix(%s)", str.c_str());
   259     this->INHERITED::didSetMatrix(matrix);
   260 }
   262 ///////////////////////////////////////////////////////////////////////////////
   264 const char* SkDumpCanvas::EdgeStyleToAAString(ClipEdgeStyle edgeStyle) {
   265     return kSoft_ClipEdgeStyle == edgeStyle ? "AA" : "BW";
   266 }
   268 void SkDumpCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
   269     SkString str;
   270     toString(rect, &str);
   271     this->dump(kClip_Verb, NULL, "clipRect(%s %s %s)", str.c_str(), toString(op),
   272                EdgeStyleToAAString(edgeStyle));
   273     this->INHERITED::onClipRect(rect, op, edgeStyle);
   274 }
   276 void SkDumpCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
   277     SkString str;
   278     toString(rrect, &str);
   279     this->dump(kClip_Verb, NULL, "clipRRect(%s %s %s)", str.c_str(), toString(op),
   280                EdgeStyleToAAString(edgeStyle));
   281     this->INHERITED::onClipRRect(rrect, op, edgeStyle);
   282 }
   284 void SkDumpCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
   285     SkString str;
   286     toString(path, &str);
   287     this->dump(kClip_Verb, NULL, "clipPath(%s %s %s)", str.c_str(), toString(op),
   288                EdgeStyleToAAString(edgeStyle));
   289     this->INHERITED::onClipPath(path, op, edgeStyle);
   290 }
   292 void SkDumpCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
   293     SkString str;
   294     toString(deviceRgn, &str);
   295     this->dump(kClip_Verb, NULL, "clipRegion(%s %s)", str.c_str(),
   296                toString(op));
   297     this->INHERITED::onClipRegion(deviceRgn, op);
   298 }
   300 void SkDumpCanvas::onPushCull(const SkRect& cullRect) {
   301     SkString str;
   302     toString(cullRect, &str);
   303     this->dump(kCull_Verb, NULL, "pushCull(%s)", str.c_str());
   304 }
   306 void SkDumpCanvas::onPopCull() {
   307     this->dump(kCull_Verb, NULL, "popCull()");
   308 }
   309 ///////////////////////////////////////////////////////////////////////////////
   311 void SkDumpCanvas::drawPaint(const SkPaint& paint) {
   312     this->dump(kDrawPaint_Verb, &paint, "drawPaint()");
   313 }
   315 void SkDumpCanvas::drawPoints(PointMode mode, size_t count,
   316                                const SkPoint pts[], const SkPaint& paint) {
   317     this->dump(kDrawPoints_Verb, &paint, "drawPoints(%s, %d)", toString(mode),
   318                count);
   319 }
   321 void SkDumpCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
   322     SkString str;
   323     toString(rect, &str);
   324     this->dump(kDrawOval_Verb, &paint, "drawOval(%s)", str.c_str());
   325 }
   327 void SkDumpCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
   328     SkString str;
   329     toString(rect, &str);
   330     this->dump(kDrawRect_Verb, &paint, "drawRect(%s)", str.c_str());
   331 }
   333 void SkDumpCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
   334     SkString str;
   335     toString(rrect, &str);
   336     this->dump(kDrawDRRect_Verb, &paint, "drawRRect(%s)", str.c_str());
   337 }
   339 void SkDumpCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
   340                                 const SkPaint& paint) {
   341     SkString str0, str1;
   342     toString(outer, &str0);
   343     toString(inner, &str0);
   344     this->dump(kDrawRRect_Verb, &paint, "drawDRRect(%s,%s)",
   345                str0.c_str(), str1.c_str());
   346 }
   348 void SkDumpCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
   349     SkString str;
   350     toString(path, &str);
   351     this->dump(kDrawPath_Verb, &paint, "drawPath(%s)", str.c_str());
   352 }
   354 void SkDumpCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
   355                                const SkPaint* paint) {
   356     SkString str;
   357     bitmap.toString(&str);
   358     this->dump(kDrawBitmap_Verb, paint, "drawBitmap(%s %g %g)", str.c_str(),
   359                SkScalarToFloat(x), SkScalarToFloat(y));
   360 }
   362 void SkDumpCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
   363                                         const SkRect& dst, const SkPaint* paint,
   364                                         DrawBitmapRectFlags flags) {
   365     SkString bs, rs;
   366     bitmap.toString(&bs);
   367     toString(dst, &rs);
   368     // show the src-rect only if its not everything
   369     if (src && (src->fLeft > 0 || src->fTop > 0 ||
   370                 src->fRight < SkIntToScalar(bitmap.width()) ||
   371                 src->fBottom < SkIntToScalar(bitmap.height()))) {
   372         SkString ss;
   373         toString(*src, &ss);
   374         rs.prependf("%s ", ss.c_str());
   375     }
   377     this->dump(kDrawBitmap_Verb, paint, "drawBitmapRectToRect(%s %s)",
   378                bs.c_str(), rs.c_str());
   379 }
   381 void SkDumpCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
   382                                      const SkPaint* paint) {
   383     SkString bs, ms;
   384     bitmap.toString(&bs);
   385     m.toString(&ms);
   386     this->dump(kDrawBitmap_Verb, paint, "drawBitmapMatrix(%s %s)",
   387                bs.c_str(), ms.c_str());
   388 }
   390 void SkDumpCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
   391                                const SkPaint* paint) {
   392     SkString str;
   393     bitmap.toString(&str);
   394     this->dump(kDrawBitmap_Verb, paint, "drawSprite(%s %d %d)", str.c_str(),
   395                x, y);
   396 }
   398 void SkDumpCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
   399                              SkScalar y, const SkPaint& paint) {
   400     SkString str;
   401     toString(text, byteLength, paint.getTextEncoding(), &str);
   402     this->dump(kDrawText_Verb, &paint, "drawText(%s [%d] %g %g)", str.c_str(),
   403                byteLength, SkScalarToFloat(x), SkScalarToFloat(y));
   404 }
   406 void SkDumpCanvas::drawPosText(const void* text, size_t byteLength,
   407                                 const SkPoint pos[], const SkPaint& paint) {
   408     SkString str;
   409     toString(text, byteLength, paint.getTextEncoding(), &str);
   410     this->dump(kDrawText_Verb, &paint, "drawPosText(%s [%d] %g %g ...)",
   411                str.c_str(), byteLength, SkScalarToFloat(pos[0].fX),
   412                SkScalarToFloat(pos[0].fY));
   413 }
   415 void SkDumpCanvas::drawPosTextH(const void* text, size_t byteLength,
   416                                  const SkScalar xpos[], SkScalar constY,
   417                                  const SkPaint& paint) {
   418     SkString str;
   419     toString(text, byteLength, paint.getTextEncoding(), &str);
   420     this->dump(kDrawText_Verb, &paint, "drawPosTextH(%s [%d] %g %g ...)",
   421                str.c_str(), byteLength, SkScalarToFloat(xpos[0]),
   422                SkScalarToFloat(constY));
   423 }
   425 void SkDumpCanvas::drawTextOnPath(const void* text, size_t byteLength,
   426                                    const SkPath& path, const SkMatrix* matrix,
   427                                    const SkPaint& paint) {
   428     SkString str;
   429     toString(text, byteLength, paint.getTextEncoding(), &str);
   430     this->dump(kDrawText_Verb, &paint, "drawTextOnPath(%s [%d])",
   431                str.c_str(), byteLength);
   432 }
   434 void SkDumpCanvas::drawPicture(SkPicture& picture) {
   435     this->dump(kDrawPicture_Verb, NULL, "drawPicture(%p) %d:%d", &picture,
   436                picture.width(), picture.height());
   437     fNestLevel += 1;
   438     this->INHERITED::drawPicture(picture);
   439     fNestLevel -= 1;
   440     this->dump(kDrawPicture_Verb, NULL, "endPicture(%p) %d:%d", &picture,
   441                picture.width(), picture.height());
   442 }
   444 void SkDumpCanvas::drawVertices(VertexMode vmode, int vertexCount,
   445                                  const SkPoint vertices[], const SkPoint texs[],
   446                                  const SkColor colors[], SkXfermode* xmode,
   447                                  const uint16_t indices[], int indexCount,
   448                                  const SkPaint& paint) {
   449     this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] %g %g ...)",
   450                toString(vmode), vertexCount, SkScalarToFloat(vertices[0].fX),
   451                SkScalarToFloat(vertices[0].fY));
   452 }
   454 void SkDumpCanvas::drawData(const void* data, size_t length) {
   455 //    this->dump(kDrawData_Verb, NULL, "drawData(%d)", length);
   456     this->dump(kDrawData_Verb, NULL, "drawData(%d) %.*s", length,
   457                SkTMin<size_t>(length, 64), data);
   458 }
   460 void SkDumpCanvas::beginCommentGroup(const char* description) {
   461     this->dump(kBeginCommentGroup_Verb, NULL, "beginCommentGroup(%s)", description);
   462 }
   464 void SkDumpCanvas::addComment(const char* kywd, const char* value) {
   465     this->dump(kAddComment_Verb, NULL, "addComment(%s, %s)", kywd, value);
   466 }
   468 void SkDumpCanvas::endCommentGroup() {
   469     this->dump(kEndCommentGroup_Verb, NULL, "endCommentGroup()");
   470 }
   472 ///////////////////////////////////////////////////////////////////////////////
   473 ///////////////////////////////////////////////////////////////////////////////
   475 SkFormatDumper::SkFormatDumper(void (*proc)(const char*, void*), void* refcon) {
   476     fProc = proc;
   477     fRefcon = refcon;
   478 }
   480 static void appendPtr(SkString* str, const void* ptr, const char name[]) {
   481     if (ptr) {
   482         str->appendf(" %s:%p", name, ptr);
   483     }
   484 }
   486 static void appendFlattenable(SkString* str, const SkFlattenable* ptr,
   487                               const char name[]) {
   488     if (ptr) {
   489         str->appendf(" %s:%p", name, ptr);
   490     }
   491 }
   493 void SkFormatDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
   494                           const char str[], const SkPaint* p) {
   495     SkString msg, tab;
   496     const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
   497     SkASSERT(level >= 0);
   498     for (int i = 0; i < level; i++) {
   499 #if 0
   500         tab.append("\t");
   501 #else
   502         tab.append("    ");   // tabs are often too wide to be useful
   503 #endif
   504     }
   505     msg.printf("%s%s", tab.c_str(), str);
   507     if (p) {
   508         msg.appendf(" color:0x%08X flags:%X", p->getColor(), p->getFlags());
   509         appendFlattenable(&msg, p->getShader(), "shader");
   510         appendFlattenable(&msg, p->getXfermode(), "xfermode");
   511         appendFlattenable(&msg, p->getPathEffect(), "pathEffect");
   512         appendFlattenable(&msg, p->getMaskFilter(), "maskFilter");
   513         appendFlattenable(&msg, p->getPathEffect(), "pathEffect");
   514         appendFlattenable(&msg, p->getColorFilter(), "filter");
   516         if (SkDumpCanvas::kDrawText_Verb == verb) {
   517             msg.appendf(" textSize:%g", SkScalarToFloat(p->getTextSize()));
   518             appendPtr(&msg, p->getTypeface(), "typeface");
   519         }
   521         if (p->getStyle() != SkPaint::kFill_Style) {
   522             msg.appendf(" strokeWidth:%g", SkScalarToFloat(p->getStrokeWidth()));
   523         }
   524     }
   526     fProc(msg.c_str(), fRefcon);
   527 }
   529 ///////////////////////////////////////////////////////////////////////////////
   531 static void dumpToDebugf(const char text[], void*) {
   532     SkDebugf("%s\n", text);
   533 }
   535 SkDebugfDumper::SkDebugfDumper() : INHERITED(dumpToDebugf, NULL) {}
   537 #endif

mercurial