mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
c62360f0a2
Backed out changeset 49632bc14e27 (bug 900133) Backed out changeset 036780fccc89 (bug 900133) Backed out changeset b8db58f5e209 (bug 893302) Backed out changeset 67c3e4204e44 (bug 893302) Backed out changeset a857a4246dd9 (bug 900133) Backed out changeset e0e2e27af6c1 (bug 881634)
125 lines
2.6 KiB
C++
125 lines
2.6 KiB
C++
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
#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(nullptr), mLocked(false)
|
|
{
|
|
}
|
|
|
|
SourceSurfaceSkia::~SourceSurfaceSkia()
|
|
{
|
|
MaybeUnlock();
|
|
if (mDrawTarget) {
|
|
mDrawTarget->SnapshotDestroyed();
|
|
mDrawTarget = nullptr;
|
|
}
|
|
}
|
|
|
|
IntSize
|
|
SourceSurfaceSkia::GetSize() const
|
|
{
|
|
return mSize;
|
|
}
|
|
|
|
SurfaceFormat
|
|
SourceSurfaceSkia::GetFormat() const
|
|
{
|
|
return mFormat;
|
|
}
|
|
|
|
bool
|
|
SourceSurfaceSkia::InitFromCanvas(SkCanvas* aCanvas,
|
|
SurfaceFormat aFormat,
|
|
DrawTargetSkia* aOwner)
|
|
{
|
|
SkISize size = aCanvas->getDeviceSize();
|
|
|
|
mBitmap = (SkBitmap)aCanvas->getDevice()->accessBitmap(false);
|
|
mFormat = aFormat;
|
|
|
|
mSize = IntSize(size.fWidth, size.fHeight);
|
|
mStride = mBitmap.rowBytes();
|
|
mDrawTarget = aOwner;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
SourceSurfaceSkia::InitFromData(unsigned char* aData,
|
|
const IntSize &aSize,
|
|
int32_t aStride,
|
|
SurfaceFormat aFormat)
|
|
{
|
|
SkBitmap temp;
|
|
temp.setConfig(GfxFormatToSkiaConfig(aFormat), aSize.width, aSize.height, aStride);
|
|
temp.setPixels(aData);
|
|
|
|
if (!temp.copyTo(&mBitmap, GfxFormatToSkiaConfig(aFormat))) {
|
|
return false;
|
|
}
|
|
|
|
if (aFormat == FORMAT_B8G8R8X8) {
|
|
mBitmap.lockPixels();
|
|
// We have to manually set the A channel to be 255 as Skia doesn't understand BGRX
|
|
ConvertBGRXToBGRA(reinterpret_cast<unsigned char*>(mBitmap.getPixels()), aSize, aStride);
|
|
mBitmap.unlockPixels();
|
|
mBitmap.notifyPixelsChanged();
|
|
mBitmap.setIsOpaque(true);
|
|
}
|
|
|
|
mSize = aSize;
|
|
mFormat = aFormat;
|
|
mStride = aStride;
|
|
return true;
|
|
}
|
|
|
|
unsigned char*
|
|
SourceSurfaceSkia::GetData()
|
|
{
|
|
if (!mLocked) {
|
|
mBitmap.lockPixels();
|
|
mLocked = true;
|
|
}
|
|
|
|
unsigned char *pixels = (unsigned char *)mBitmap.getPixels();
|
|
return pixels;
|
|
}
|
|
|
|
void
|
|
SourceSurfaceSkia::DrawTargetWillChange()
|
|
{
|
|
if (mDrawTarget) {
|
|
MaybeUnlock();
|
|
|
|
mDrawTarget = nullptr;
|
|
SkBitmap temp = mBitmap;
|
|
mBitmap.reset();
|
|
temp.copyTo(&mBitmap, temp.getConfig());
|
|
}
|
|
}
|
|
|
|
void
|
|
SourceSurfaceSkia::MaybeUnlock()
|
|
{
|
|
if (mLocked) {
|
|
mBitmap.unlockPixels();
|
|
mLocked = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|