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; }
bool Scale(uint8_t* srcData, int32_t srcWidth, int32_t srcHeight, int32_t srcStride, uint8_t* dstData, int32_t dstWidth, int32_t dstHeight, int32_t dstStride, SurfaceFormat format) { #ifdef USE_SKIA SkAlphaType alphaType; if (format == SurfaceFormat::B8G8R8A8) { alphaType = kPremul_SkAlphaType; } else { alphaType = kOpaque_SkAlphaType; } SkBitmap::Config config = GfxFormatToSkiaConfig(format); SkBitmap imgSrc; imgSrc.setConfig(config, srcWidth, srcHeight, srcStride, alphaType); imgSrc.setPixels(srcData); // Rescaler is compatible with 32 bpp only. Convert to RGB32 if needed. if (config != SkBitmap::kARGB_8888_Config) { imgSrc.copyTo(&imgSrc, SkBitmap::kARGB_8888_Config); } // This returns an SkBitmap backed by dstData; since it also wrote to dstData, // we don't need to look at that SkBitmap. SkBitmap result = skia::ImageOperations::Resize(imgSrc, skia::ImageOperations::RESIZE_BEST, dstWidth, dstHeight, dstData); return !result.isNull(); #else return false; #endif }
bool DrawTargetSkia::Init(const IntSize &aSize, SurfaceFormat aFormat) { mBitmap.setConfig(GfxFormatToSkiaConfig(aFormat), aSize.width, aSize.height); if (!mBitmap.allocPixels()) { return false; } mBitmap.eraseARGB(0, 0, 0, 0); SkAutoTUnref<SkDevice> device(new SkDevice(mBitmap)); SkAutoTUnref<SkCanvas> canvas(new SkCanvas(device.get())); mSize = aSize; mDevice = device.get(); mCanvas = canvas.get(); mFormat = aFormat; return true; }
void DrawTargetSkia::Init(unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat) { SkAlphaType alphaType = kPremul_SkAlphaType; if (aFormat == SurfaceFormat::B8G8R8X8) { // We have to manually set the A channel to be 255 as Skia doesn't understand BGRX ConvertBGRXToBGRA(aData, aSize, aStride); alphaType = kOpaque_SkAlphaType; } SkBitmap bitmap; bitmap.setConfig(GfxFormatToSkiaConfig(aFormat), aSize.width, aSize.height, aStride, alphaType); bitmap.setPixels(aData); SkAutoTUnref<SkCanvas> canvas(new SkCanvas(new SkBitmapDevice(bitmap))); mSize = aSize; mCanvas = canvas.get(); mFormat = aFormat; }
void DrawTargetSkia::Init(unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat) { if (aFormat == FORMAT_B8G8R8X8) { // We have to manually set the A channel to be 255 as Skia doesn't understand BGRX ConvertBGRXToBGRA(aData, aSize, aStride); mBitmap.setIsOpaque(true); } mBitmap.setConfig(GfxFormatToSkiaConfig(aFormat), aSize.width, aSize.height, aStride); mBitmap.setPixels(aData); SkAutoTUnref<SkDevice> device(new SkDevice(mBitmap)); SkAutoTUnref<SkCanvas> canvas(new SkCanvas(device.get())); mSize = aSize; mDevice = device.get(); mCanvas = canvas.get(); mFormat = aFormat; }
bool DrawTargetSkia::Init(const IntSize &aSize, SurfaceFormat aFormat) { SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(GfxFormatToSkiaConfig(aFormat), aSize.width, aSize.height, aFormat == SurfaceFormat::B8G8R8X8)); SkBitmap bitmap = device->accessBitmap(true); if (!bitmap.allocPixels()) { return false; } bitmap.eraseARGB(0, 0, 0, 0); SkAutoTUnref<SkCanvas> canvas(new SkCanvas(device.get())); mSize = aSize; mCanvas = canvas.get(); mFormat = aFormat; return true; }