gfx/2d/HelpersSkia.h

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef MOZILLA_GFX_HELPERSSKIA_H_
     7 #define MOZILLA_GFX_HELPERSSKIA_H_
     9 #include "2D.h"
    10 #include "skia/SkCanvas.h"
    11 #include "skia/SkDashPathEffect.h"
    12 #include "skia/SkShader.h"
    13 #ifdef USE_SKIA_GPU
    14 #include "skia/GrTypes.h"
    15 #endif
    16 #include "mozilla/Assertions.h"
    17 #include <vector>
    19 namespace mozilla {
    20 namespace gfx {
    22 static inline SkBitmap::Config
    23 GfxFormatToSkiaConfig(SurfaceFormat format)
    24 {
    25   switch (format)
    26   {
    27     case SurfaceFormat::B8G8R8A8:
    28       return SkBitmap::kARGB_8888_Config;
    29     case SurfaceFormat::B8G8R8X8:
    30       // We probably need to do something here.
    31       return SkBitmap::kARGB_8888_Config;
    32     case SurfaceFormat::R5G6B5:
    33       return SkBitmap::kRGB_565_Config;
    34     case SurfaceFormat::A8:
    35       return SkBitmap::kA8_Config;
    36     default:
    37       return SkBitmap::kARGB_8888_Config;
    38   }
    39 }
    41 static inline SkColorType
    42 GfxFormatToSkiaColorType(SurfaceFormat format)
    43 {
    44   switch (format)
    45   {
    46     case SurfaceFormat::B8G8R8A8:
    47       return kBGRA_8888_SkColorType;
    48     case SurfaceFormat::B8G8R8X8:
    49       // We probably need to do something here.
    50       return kBGRA_8888_SkColorType;
    51     case SurfaceFormat::R5G6B5:
    52       return kRGB_565_SkColorType;
    53     case SurfaceFormat::A8:
    54       return kAlpha_8_SkColorType;
    55     default:
    56       return kRGBA_8888_SkColorType;
    57   }
    58 }
    60 static inline SurfaceFormat
    61 SkiaConfigToGfxFormat(SkBitmap::Config config)
    62 {
    63   switch (config)
    64   {
    65     case SkBitmap::kARGB_8888_Config:
    66       return SurfaceFormat::B8G8R8A8;
    67     case SkBitmap::kRGB_565_Config:
    68       return SurfaceFormat::R5G6B5;
    69     case SkBitmap::kA8_Config:
    70       return SurfaceFormat::A8;
    71     default:
    72       return SurfaceFormat::B8G8R8A8;
    73   }
    74 }
    76 #ifdef USE_SKIA_GPU
    77 static inline GrPixelConfig
    78 GfxFormatToGrConfig(SurfaceFormat format)
    79 {
    80   switch (format)
    81   {
    82     case SurfaceFormat::B8G8R8A8:
    83       return kBGRA_8888_GrPixelConfig;
    84     case SurfaceFormat::B8G8R8X8:
    85       // We probably need to do something here.
    86       return kBGRA_8888_GrPixelConfig;
    87     case SurfaceFormat::R5G6B5:
    88       return kRGB_565_GrPixelConfig;
    89     case SurfaceFormat::A8:
    90       return kAlpha_8_GrPixelConfig;
    91     default:
    92       return kRGBA_8888_GrPixelConfig;
    93   }
    95 }
    96 #endif
    97 static inline void
    98 GfxMatrixToSkiaMatrix(const Matrix& mat, SkMatrix& retval)
    99 {
   100     retval.setAll(SkFloatToScalar(mat._11), SkFloatToScalar(mat._21), SkFloatToScalar(mat._31),
   101                   SkFloatToScalar(mat._12), SkFloatToScalar(mat._22), SkFloatToScalar(mat._32),
   102                   0, 0, SK_Scalar1);
   103 }
   105 static inline SkPaint::Cap
   106 CapStyleToSkiaCap(CapStyle aCap)
   107 {
   108   switch (aCap)
   109   {
   110     case CapStyle::BUTT:
   111       return SkPaint::kButt_Cap;
   112     case CapStyle::ROUND:
   113       return SkPaint::kRound_Cap;
   114     case CapStyle::SQUARE:
   115       return SkPaint::kSquare_Cap;
   116   }
   117   return SkPaint::kDefault_Cap;
   118 }
   120 static inline SkPaint::Join
   121 JoinStyleToSkiaJoin(JoinStyle aJoin)
   122 {
   123   switch (aJoin)
   124   {
   125     case JoinStyle::BEVEL:
   126       return SkPaint::kBevel_Join;
   127     case JoinStyle::ROUND:
   128       return SkPaint::kRound_Join;
   129     case JoinStyle::MITER:
   130     case JoinStyle::MITER_OR_BEVEL:
   131       return SkPaint::kMiter_Join;
   132   }
   133   return SkPaint::kDefault_Join;
   134 }
   136 static inline bool
   137 StrokeOptionsToPaint(SkPaint& aPaint, const StrokeOptions &aOptions)
   138 {
   139   // Skia renders 0 width strokes with a width of 1 (and in black),
   140   // so we should just skip the draw call entirely.
   141   if (!aOptions.mLineWidth) {
   142     return false;
   143   }
   144   aPaint.setStrokeWidth(SkFloatToScalar(aOptions.mLineWidth));
   145   aPaint.setStrokeMiter(SkFloatToScalar(aOptions.mMiterLimit));
   146   aPaint.setStrokeCap(CapStyleToSkiaCap(aOptions.mLineCap));
   147   aPaint.setStrokeJoin(JoinStyleToSkiaJoin(aOptions.mLineJoin));
   149   if (aOptions.mDashLength > 0) {
   150     // Skia only supports dash arrays that are multiples of 2.
   151     uint32_t dashCount;
   153     if (aOptions.mDashLength % 2 == 0) {
   154       dashCount = aOptions.mDashLength;
   155     } else {
   156       dashCount = aOptions.mDashLength * 2;
   157     }
   159     std::vector<SkScalar> pattern;
   160     pattern.resize(dashCount);
   162     for (uint32_t i = 0; i < dashCount; i++) {
   163       pattern[i] = SkFloatToScalar(aOptions.mDashPattern[i % aOptions.mDashLength]);
   164     }
   166     SkDashPathEffect* dash = SkDashPathEffect::Create(&pattern.front(),
   167                                                       dashCount, 
   168                                                       SkFloatToScalar(aOptions.mDashOffset));
   169     SkSafeUnref(aPaint.setPathEffect(dash));
   170   }
   172   aPaint.setStyle(SkPaint::kStroke_Style);
   173   return true;
   174 }
   176 static inline SkXfermode::Mode
   177 GfxOpToSkiaOp(CompositionOp op)
   178 {
   179   switch (op)
   180   {
   181     case CompositionOp::OP_OVER:
   182       return SkXfermode::kSrcOver_Mode;
   183     case CompositionOp::OP_ADD:
   184       return SkXfermode::kPlus_Mode;
   185     case CompositionOp::OP_ATOP:
   186       return SkXfermode::kSrcATop_Mode;
   187     case CompositionOp::OP_OUT:
   188       return SkXfermode::kSrcOut_Mode;
   189     case CompositionOp::OP_IN:
   190       return SkXfermode::kSrcIn_Mode;
   191     case CompositionOp::OP_SOURCE:
   192       return SkXfermode::kSrc_Mode;
   193     case CompositionOp::OP_DEST_IN:
   194       return SkXfermode::kDstIn_Mode;
   195     case CompositionOp::OP_DEST_OUT:
   196       return SkXfermode::kDstOut_Mode;
   197     case CompositionOp::OP_DEST_OVER:
   198       return SkXfermode::kDstOver_Mode;
   199     case CompositionOp::OP_DEST_ATOP:
   200       return SkXfermode::kDstATop_Mode;
   201     case CompositionOp::OP_XOR:
   202       return SkXfermode::kXor_Mode;
   203     case CompositionOp::OP_MULTIPLY:
   204       return SkXfermode::kMultiply_Mode;
   205     case CompositionOp::OP_SCREEN:
   206       return SkXfermode::kScreen_Mode;
   207     case CompositionOp::OP_OVERLAY:
   208       return SkXfermode::kOverlay_Mode;
   209     case CompositionOp::OP_DARKEN:
   210       return SkXfermode::kDarken_Mode;
   211     case CompositionOp::OP_LIGHTEN:
   212       return SkXfermode::kLighten_Mode;
   213     case CompositionOp::OP_COLOR_DODGE:
   214       return SkXfermode::kColorDodge_Mode;
   215     case CompositionOp::OP_COLOR_BURN:
   216       return SkXfermode::kColorBurn_Mode;
   217     case CompositionOp::OP_HARD_LIGHT:
   218       return SkXfermode::kHardLight_Mode;
   219     case CompositionOp::OP_SOFT_LIGHT:
   220       return SkXfermode::kSoftLight_Mode;
   221     case CompositionOp::OP_DIFFERENCE:
   222       return SkXfermode::kDifference_Mode;
   223     case CompositionOp::OP_EXCLUSION:
   224       return SkXfermode::kExclusion_Mode;
   225     case CompositionOp::OP_HUE:
   226       return SkXfermode::kHue_Mode;
   227     case CompositionOp::OP_SATURATION:
   228       return SkXfermode::kSaturation_Mode;
   229     case CompositionOp::OP_COLOR:
   230       return SkXfermode::kColor_Mode;
   231     case CompositionOp::OP_LUMINOSITY:
   232       return SkXfermode::kLuminosity_Mode;
   233     default:
   234       return SkXfermode::kSrcOver_Mode;
   235   }
   236 }
   238 static inline SkColor ColorToSkColor(const Color &color, Float aAlpha)
   239 {
   240   //XXX: do a better job converting to int
   241   return SkColorSetARGB(U8CPU(color.a*aAlpha*255.0), U8CPU(color.r*255.0),
   242                         U8CPU(color.g*255.0), U8CPU(color.b*255.0));
   243 }
   245 static inline SkRect
   246 RectToSkRect(const Rect& aRect)
   247 {
   248   return SkRect::MakeXYWH(SkFloatToScalar(aRect.x), SkFloatToScalar(aRect.y), 
   249                           SkFloatToScalar(aRect.width), SkFloatToScalar(aRect.height));
   250 }
   252 static inline SkRect
   253 IntRectToSkRect(const IntRect& aRect)
   254 {
   255   return SkRect::MakeXYWH(SkIntToScalar(aRect.x), SkIntToScalar(aRect.y), 
   256                           SkIntToScalar(aRect.width), SkIntToScalar(aRect.height));
   257 }
   259 static inline SkIRect
   260 RectToSkIRect(const Rect& aRect)
   261 {
   262   return SkIRect::MakeXYWH(int32_t(aRect.x), int32_t(aRect.y),
   263                            int32_t(aRect.width), int32_t(aRect.height));
   264 }
   266 static inline SkIRect
   267 IntRectToSkIRect(const IntRect& aRect)
   268 {
   269   return SkIRect::MakeXYWH(aRect.x, aRect.y, aRect.width, aRect.height);
   270 }
   272 static inline Point
   273 SkPointToPoint(const SkPoint &aPoint)
   274 {
   275   return Point(SkScalarToFloat(aPoint.x()), SkScalarToFloat(aPoint.y()));
   276 }
   278 static inline Rect
   279 SkRectToRect(const SkRect &aRect)
   280 {
   281   return Rect(SkScalarToFloat(aRect.x()), SkScalarToFloat(aRect.y()),
   282               SkScalarToFloat(aRect.width()), SkScalarToFloat(aRect.height()));
   283 }
   285 static inline SkShader::TileMode
   286 ExtendModeToTileMode(ExtendMode aMode)
   287 {
   288   switch (aMode)
   289   {
   290     case ExtendMode::CLAMP:
   291       return SkShader::kClamp_TileMode;
   292     case ExtendMode::REPEAT:
   293       return SkShader::kRepeat_TileMode;
   294     case ExtendMode::REFLECT:
   295       return SkShader::kMirror_TileMode;
   296   }
   297   return SkShader::kClamp_TileMode;
   298 }
   300 }
   301 }
   303 #endif /* MOZILLA_GFX_HELPERSSKIA_H_ */

mercurial