diff options
author | vangelis@chromium.org <vangelis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-13 01:53:50 +0000 |
---|---|---|
committer | vangelis@chromium.org <vangelis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-13 01:53:50 +0000 |
commit | 2960adfdbb2e3818d6a73599f4a08fbb4aa254c8 (patch) | |
tree | 123476f5b70cf57544a441ec8864256f43e260a3 /skia/ext/skia_utils_mac.mm | |
parent | 627f32edbdf4194f7767d0e053b0b1ade2ab35af (diff) | |
download | chromium_src-2960adfdbb2e3818d6a73599f4a08fbb4aa254c8.zip chromium_src-2960adfdbb2e3818d6a73599f4a08fbb4aa254c8.tar.gz chromium_src-2960adfdbb2e3818d6a73599f4a08fbb4aa254c8.tar.bz2 |
Revert 269568 "use accessTopLayer instead of (DEPRECATED) getTop..."
> use accessTopLayer instead of (DEPRECATED) getTopDevice
>
> NOTRY=True
>
> the win_chromium_rel failure must be a flake, since my CL only edits mac-only files.
>
> the mac gpu failure is unrelated to this CL
>
> Review URL: https://codereview.chromium.org/248113005
TBR=reed@google.com
Review URL: https://codereview.chromium.org/275813005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269964 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/ext/skia_utils_mac.mm')
-rw-r--r-- | skia/ext/skia_utils_mac.mm | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/skia/ext/skia_utils_mac.mm b/skia/ext/skia_utils_mac.mm index 2a96d59..6a624a8 100644 --- a/skia/ext/skia_utils_mac.mm +++ b/skia/ext/skia_utils_mac.mm @@ -284,8 +284,11 @@ SkiaBitLocker::~SkiaBitLocker() { void SkiaBitLocker::releaseIfNeeded() { if (!cgContext_) return; - if (useBitmap_) { + if (useDeviceBits_) { + bitmap_.unlockPixels(); + } else { // Find the bits that were drawn to. + SkAutoLockPixels lockedPixels(bitmap_); const uint32_t* pixelBase = reinterpret_cast<uint32_t*>(bitmap_.getPixels()); int rowPixels = bitmap_.rowBytesAsPixels(); @@ -367,53 +370,55 @@ foundRight: } CGContextRef SkiaBitLocker::cgContext() { + SkBaseDevice* device = canvas_->getTopDevice(); + DCHECK(device); + if (!device) + return 0; releaseIfNeeded(); // This flushes any prior bitmap use - - SkIRect clip_bounds; - const bool clip_is_empty = !canvas_->getClipDeviceBounds(&clip_bounds); - - SkImageInfo info; - size_t row_bytes; - SkIPoint origin; - void* top_pixels = canvas_->accessTopLayerPixels(&info, &row_bytes, &origin); - if (top_pixels && (clip_is_empty || canvas_->isClipRect())) { - useBitmap_ = false; + const SkBitmap& deviceBits = device->accessBitmap(true); + useDeviceBits_ = deviceBits.getPixels(); + if (useDeviceBits_) { + bitmap_ = deviceBits; + bitmap_.lockPixels(); } else { - useBitmap_ = true; - info = SkImageInfo::MakeN32Premul(clip_bounds.width(), clip_bounds.height()); - origin.set(clip_bounds.x(), clip_bounds.y()); - CHECK(bitmap_.allocPixels(info)); + bitmap_.setConfig( + SkBitmap::kARGB_8888_Config, deviceBits.width(), deviceBits.height()); + bitmap_.allocPixels(); bitmap_.eraseColor(0); - top_pixels = bitmap_.getPixels(); } - base::ScopedCFTypeRef<CGColorSpaceRef> colorSpace( CGColorSpaceCreateDeviceRGB()); - cgContext_ = CGBitmapContextCreate(top_pixels, info.width(), - info.height(), 8, row_bytes, colorSpace, - kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst); + cgContext_ = CGBitmapContextCreate(bitmap_.getPixels(), bitmap_.width(), + bitmap_.height(), 8, bitmap_.rowBytes(), colorSpace, + kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst); // Apply device matrix. CGAffineTransform contentsTransform = CGAffineTransformMakeScale(1, -1); contentsTransform = CGAffineTransformTranslate(contentsTransform, 0, - -info.height()); + -device->height()); CGContextConcatCTM(cgContext_, contentsTransform); + const SkIPoint& pt = device->getOrigin(); // Skip applying the clip when not writing directly to device. // They're applied in the offscreen case when the bitmap is drawn. - if (!useBitmap_) { + if (useDeviceBits_) { // Apply clip in device coordinates. CGMutablePathRef clipPath = CGPathCreateMutable(); - if (clip_is_empty) { + const SkRegion& clipRgn = canvas_->getTotalClip(); + if (clipRgn.isEmpty()) { // CoreGraphics does not consider a newly created path to be empty. // Explicitly set it to empty so the subsequent drawing is clipped out. // It would be better to make the CGContext hidden if there was a CG // call that does that. CGPathAddRect(clipPath, 0, CGRectMake(0, 0, 0, 0)); - } else { - SkIRect r = clip_bounds; - r.offset(-origin); - CGPathAddRect(clipPath, 0, SkIRectToCGRect(r)); + } + SkRegion::Iterator iter(clipRgn); + const SkIPoint& pt = device->getOrigin(); + for (; !iter.done(); iter.next()) { + SkIRect skRect = iter.rect(); + skRect.offset(-pt); + CGRect cgRect = SkIRectToCGRect(skRect); + CGPathAddRect(clipPath, 0, cgRect); } CGContextAddPath(cgContext_, clipPath); CGContextClip(cgContext_); @@ -422,7 +427,7 @@ CGContextRef SkiaBitLocker::cgContext() { // Apply content matrix. SkMatrix skMatrix = canvas_->getTotalMatrix(); - skMatrix.postTranslate(-SkIntToScalar(origin.fX), -SkIntToScalar(origin.fY)); + skMatrix.postTranslate(-SkIntToScalar(pt.fX), -SkIntToScalar(pt.fY)); CGAffineTransform affine = SkMatrixToCGAffineTransform(skMatrix); CGContextConcatCTM(cgContext_, affine); |