/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Corporation code. * * The Initial Developer of the Original Code is Mozilla Foundation. * Portions created by the Initial Developer are Copyright (C) 2011 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Matt Woodrow * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "Logging.h" #include "SourceSurfaceSkia.h" #include "skia/SkBitmap.h" #include "skia/SkDevice.h" #include "HelpersSkia.h" #include "DrawTargetSkia.h" namespace mozilla { namespace gfx { SourceSurfaceSkia::SourceSurfaceSkia() : mDrawTarget(NULL) { } SourceSurfaceSkia::~SourceSurfaceSkia() { MarkIndependent(); } IntSize SourceSurfaceSkia::GetSize() const { return mSize; } SurfaceFormat SourceSurfaceSkia::GetFormat() const { return mFormat; } bool SourceSurfaceSkia::InitFromData(unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat) { mBitmap.setConfig(GfxFormatToSkiaConfig(aFormat), aSize.width, aSize.height, aStride); if (!mBitmap.allocPixels()) { return false; } if (!mBitmap.copyPixelsFrom(aData, mBitmap.getSafeSize(), aStride)) { return false; } mSize = aSize; mFormat = aFormat; mStride = aStride; return true; } bool SourceSurfaceSkia::InitWithBitmap(const SkBitmap& aBitmap, SurfaceFormat aFormat, DrawTargetSkia* aOwner) { mFormat = aFormat; mSize = IntSize(aBitmap.width(), aBitmap.height()); if (aOwner) { mBitmap = aBitmap; mStride = aBitmap.rowBytes(); mDrawTarget = aOwner; return true; } else if (aBitmap.copyTo(&mBitmap, aBitmap.getConfig())) { mStride = mBitmap.rowBytes(); return true; } return false; } unsigned char* SourceSurfaceSkia::GetData() { mBitmap.lockPixels(); unsigned char *pixels = (unsigned char *)mBitmap.getPixels(); mBitmap.unlockPixels(); return pixels; } void SourceSurfaceSkia::DrawTargetWillChange() { if (mDrawTarget) { mDrawTarget = NULL; SkBitmap temp = mBitmap; mBitmap.reset(); temp.copyTo(&mBitmap, temp.getConfig()); } } void SourceSurfaceSkia::DrawTargetDestroyed() { mDrawTarget = NULL; } void SourceSurfaceSkia::MarkIndependent() { if (mDrawTarget) { mDrawTarget->RemoveSnapshot(this); mDrawTarget = NULL; } } } }