gfx/skia/trunk/src/gpu/SkGrPixelRef.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 2010 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  */
    11 #include "SkGrPixelRef.h"
    12 #include "GrContext.h"
    13 #include "GrTexture.h"
    14 #include "SkGr.h"
    15 #include "SkRect.h"
    17 // since we call lockPixels recursively on fBitmap, we need a distinct mutex,
    18 // to avoid deadlock with the default one provided by SkPixelRef.
    19 SK_DECLARE_STATIC_MUTEX(gROLockPixelsPixelRefMutex);
    21 SkROLockPixelsPixelRef::SkROLockPixelsPixelRef(const SkImageInfo& info)
    22     : INHERITED(info, &gROLockPixelsPixelRefMutex) {}
    24 SkROLockPixelsPixelRef::~SkROLockPixelsPixelRef() {}
    26 bool SkROLockPixelsPixelRef::onNewLockPixels(LockRec* rec) {
    27     fBitmap.reset();
    28 //    SkDebugf("---------- calling readpixels in support of lockpixels\n");
    29     if (!this->onReadPixels(&fBitmap, NULL)) {
    30         SkDebugf("SkROLockPixelsPixelRef::onLockPixels failed!\n");
    31         return false;
    32     }
    33     fBitmap.lockPixels();
    34     if (NULL == fBitmap.getPixels()) {
    35         return false;
    36     }
    38     rec->fPixels = fBitmap.getPixels();
    39     rec->fColorTable = NULL;
    40     rec->fRowBytes = fBitmap.rowBytes();
    41     return true;
    42 }
    44 void SkROLockPixelsPixelRef::onUnlockPixels() {
    45     fBitmap.unlockPixels();
    46 }
    48 bool SkROLockPixelsPixelRef::onLockPixelsAreWritable() const {
    49     return false;
    50 }
    52 ///////////////////////////////////////////////////////////////////////////////
    54 static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, SkBitmap::Config dstConfig,
    55                                            const SkIRect* subset) {
    56     if (NULL == texture) {
    57         return NULL;
    58     }
    59     GrContext* context = texture->getContext();
    60     if (NULL == context) {
    61         return NULL;
    62     }
    63     GrTextureDesc desc;
    65     SkIPoint pointStorage;
    66     SkIPoint* topLeft;
    67     if (subset != NULL) {
    68         SkASSERT(SkIRect::MakeWH(texture->width(), texture->height()).contains(*subset));
    69         // Create a new texture that is the size of subset.
    70         desc.fWidth = subset->width();
    71         desc.fHeight = subset->height();
    72         pointStorage.set(subset->x(), subset->y());
    73         topLeft = &pointStorage;
    74     } else {
    75         desc.fWidth  = texture->width();
    76         desc.fHeight = texture->height();
    77         topLeft = NULL;
    78     }
    79     desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit;
    80     desc.fConfig = SkBitmapConfig2GrPixelConfig(dstConfig);
    82     SkImageInfo info;
    83     if (!GrPixelConfig2ColorType(desc.fConfig, &info.fColorType)) {
    84         return NULL;
    85     }
    86     info.fWidth = desc.fWidth;
    87     info.fHeight = desc.fHeight;
    88     info.fAlphaType = kPremul_SkAlphaType;
    90     GrTexture* dst = context->createUncachedTexture(desc, NULL, 0);
    91     if (NULL == dst) {
    92         return NULL;
    93     }
    95     context->copyTexture(texture, dst->asRenderTarget(), topLeft);
    97     // TODO: figure out if this is responsible for Chrome canvas errors
    98 #if 0
    99     // The render texture we have created (to perform the copy) isn't fully
   100     // functional (since it doesn't have a stencil buffer). Release it here
   101     // so the caller doesn't try to render to it.
   102     // TODO: we can undo this release when dynamic stencil buffer attach/
   103     // detach has been implemented
   104     dst->releaseRenderTarget();
   105 #endif
   107     SkGrPixelRef* pixelRef = SkNEW_ARGS(SkGrPixelRef, (info, dst));
   108     SkSafeUnref(dst);
   109     return pixelRef;
   110 }
   112 ///////////////////////////////////////////////////////////////////////////////
   114 SkGrPixelRef::SkGrPixelRef(const SkImageInfo& info, GrSurface* surface,
   115                            bool transferCacheLock) : INHERITED(info) {
   116     // TODO: figure out if this is responsible for Chrome canvas errors
   117 #if 0
   118     // The GrTexture has a ref to the GrRenderTarget but not vice versa.
   119     // If the GrTexture exists take a ref to that (rather than the render
   120     // target)
   121     fSurface = surface->asTexture();
   122 #else
   123     fSurface = NULL;
   124 #endif
   125     if (NULL == fSurface) {
   126         fSurface = surface;
   127     }
   128     fUnlock = transferCacheLock;
   129     SkSafeRef(surface);
   131     if (fSurface) {
   132         SkASSERT(info.fWidth <= fSurface->width());
   133         SkASSERT(info.fHeight <= fSurface->height());
   134     }
   135 }
   137 SkGrPixelRef::~SkGrPixelRef() {
   138     if (fUnlock) {
   139         GrContext* context = fSurface->getContext();
   140         GrTexture* texture = fSurface->asTexture();
   141         if (NULL != context && NULL != texture) {
   142             context->unlockScratchTexture(texture);
   143         }
   144     }
   145     SkSafeUnref(fSurface);
   146 }
   148 GrTexture* SkGrPixelRef::getTexture() {
   149     if (NULL != fSurface) {
   150         return fSurface->asTexture();
   151     }
   152     return NULL;
   153 }
   155 SkPixelRef* SkGrPixelRef::deepCopy(SkBitmap::Config dstConfig, const SkIRect* subset) {
   156     if (NULL == fSurface) {
   157         return NULL;
   158     }
   160     // Note that when copying a render-target-backed pixel ref, we
   161     // return a texture-backed pixel ref instead.  This is because
   162     // render-target pixel refs are usually created in conjunction with
   163     // a GrTexture owned elsewhere (e.g., SkGpuDevice), and cannot live
   164     // independently of that texture.  Texture-backed pixel refs, on the other
   165     // hand, own their GrTextures, and are thus self-contained.
   166     return copyToTexturePixelRef(fSurface->asTexture(), dstConfig, subset);
   167 }
   169 bool SkGrPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) {
   170     if (NULL == fSurface || !fSurface->isValid()) {
   171         return false;
   172     }
   174     int left, top, width, height;
   175     if (NULL != subset) {
   176         left = subset->fLeft;
   177         width = subset->width();
   178         top = subset->fTop;
   179         height = subset->height();
   180     } else {
   181         left = 0;
   182         width = this->info().fWidth;
   183         top = 0;
   184         height = this->info().fHeight;
   185     }
   186     if (!dst->allocPixels(SkImageInfo::MakeN32Premul(width, height))) {
   187         SkDebugf("SkGrPixelRef::onReadPixels failed to alloc bitmap for result!\n");
   188         return false;
   189     }
   190     SkAutoLockPixels al(*dst);
   191     void* buffer = dst->getPixels();
   192     return fSurface->readPixels(left, top, width, height,
   193                                 kSkia8888_GrPixelConfig,
   194                                 buffer, dst->rowBytes());
   195 }

mercurial