From c0697dfcefd2f63bea6a133771ea63e0554a0a55 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 25 Mar 2015 15:45:37 -0300 Subject: [PATCH] Implement SkiaSystem::loadSurface() and SkiaSurface::drawSurface() --- src/she/skia/she.cpp | 11 ------ src/she/skia/skia_event_queue.h | 2 + src/she/skia/skia_surface.h | 70 ++++++++++++++++++++++++++++++++- src/she/skia/skia_system.h | 34 +++++++++++++--- 4 files changed, 98 insertions(+), 19 deletions(-) diff --git a/src/she/skia/she.cpp b/src/she/skia/she.cpp index d6ca2c047..a087b6986 100644 --- a/src/she/skia/she.cpp +++ b/src/she/skia/she.cpp @@ -22,17 +22,6 @@ #error There is no Window implementation #endif -// #include "SkApplication.h" -// #include "SkCanvas.h" -// #include "SkEvent.h" -// #include "SkGradientShader.h" -#include "SkBitmap.h" -// #include "SkGraphics.h" -#include "SkImageInfo.h" -// #include "SkGr.h" - -#include - #include "she/skia/skia_surface.h" #include "she/skia/skia_event_queue.h" #include "she/skia/skia_window.h" diff --git a/src/she/skia/skia_event_queue.h b/src/she/skia/skia_event_queue.h index 96366f1e8..f49976a11 100644 --- a/src/she/skia/skia_event_queue.h +++ b/src/she/skia/skia_event_queue.h @@ -4,6 +4,8 @@ // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. +#include + namespace she { class SkiaEventQueue : public EventQueue { diff --git a/src/she/skia/skia_surface.h b/src/she/skia/skia_surface.h index 6e62b942f..77aa087f0 100644 --- a/src/she/skia/skia_surface.h +++ b/src/she/skia/skia_surface.h @@ -6,6 +6,11 @@ #include "she/common/locked_surface.h" +#include "SkBitmap.h" +#include "SkCanvas.h" +#include "SkColorPriv.h" +#include "SkImageInfo.h" + namespace she { class SkiaSurface : public NonDisposableSurface @@ -16,12 +21,12 @@ public: void create(int width, int height) { m_bitmap.tryAllocPixels( - SkImageInfo::MakeUnknown(width, height)); + SkImageInfo::MakeN32Premul(width, height)); } void createRgba(int width, int height) { m_bitmap.tryAllocPixels( - SkImageInfo::MakeN32(width, height, kUnpremul_SkAlphaType)); + SkImageInfo::MakeN32Premul(width, height)); } // Surface impl @@ -82,6 +87,61 @@ public: } void getFormat(SurfaceFormatData* formatData) const override { + formatData->format = kRgbaSurfaceFormat; + formatData->bitsPerPixel = 8*m_bitmap.bytesPerPixel(); + + switch (m_bitmap.colorType()) { + case kRGB_565_SkColorType: + formatData->redShift = SK_R16_SHIFT; + formatData->greenShift = SK_G16_SHIFT; + formatData->blueShift = SK_B16_SHIFT; + formatData->alphaShift = 0; + formatData->redMask = SK_R16_MASK; + formatData->greenMask = SK_G16_MASK; + formatData->blueMask = SK_B16_MASK; + formatData->alphaMask = 0; + break; + case kARGB_4444_SkColorType: + formatData->redShift = SK_R4444_SHIFT; + formatData->greenShift = SK_G4444_SHIFT; + formatData->blueShift = SK_B4444_SHIFT; + formatData->alphaShift = SK_A4444_SHIFT; + formatData->redMask = (15 << SK_R4444_SHIFT); + formatData->greenMask = (15 << SK_G4444_SHIFT); + formatData->blueMask = (15 << SK_B4444_SHIFT); + formatData->alphaMask = (15 << SK_A4444_SHIFT); + break; + case kRGBA_8888_SkColorType: + formatData->redShift = SK_RGBA_R32_SHIFT; + formatData->greenShift = SK_RGBA_G32_SHIFT; + formatData->blueShift = SK_RGBA_B32_SHIFT; + formatData->alphaShift = SK_RGBA_A32_SHIFT; + formatData->redMask = ((1 << SK_RGBA_R32_SHIFT) - 1); + formatData->greenMask = ((1 << SK_RGBA_G32_SHIFT) - 1); + formatData->blueMask = ((1 << SK_RGBA_B32_SHIFT) - 1); + formatData->alphaMask = ((1 << SK_RGBA_A32_SHIFT) - 1); + break; + case kBGRA_8888_SkColorType: + formatData->redShift = SK_BGRA_R32_SHIFT; + formatData->greenShift = SK_BGRA_G32_SHIFT; + formatData->blueShift = SK_BGRA_B32_SHIFT; + formatData->alphaShift = SK_BGRA_A32_SHIFT; + formatData->redMask = ((1 << SK_BGRA_R32_SHIFT) - 1); + formatData->greenMask = ((1 << SK_BGRA_G32_SHIFT) - 1); + formatData->blueMask = ((1 << SK_BGRA_B32_SHIFT) - 1); + formatData->alphaMask = ((1 << SK_BGRA_A32_SHIFT) - 1); + break; + default: + formatData->redShift = 0; + formatData->greenShift = 0; + formatData->blueShift = 0; + formatData->alphaShift = 0; + formatData->redMask = 0; + formatData->greenMask = 0; + formatData->blueMask = 0; + formatData->alphaMask = 0; + break; + } } gfx::Color getPixel(int x, int y) const override { @@ -115,9 +175,15 @@ public: } void drawSurface(const LockedSurface* src, int dstx, int dsty) override { + SkCanvas canvas(m_bitmap); + canvas.drawBitmap(((SkiaSurface*)src)->m_bitmap, + SkIntToScalar(dstx), SkIntToScalar(dsty), nullptr); } void drawRgbaSurface(const LockedSurface* src, int dstx, int dsty) override { + SkCanvas canvas(m_bitmap); + canvas.drawBitmap(((SkiaSurface*)src)->m_bitmap, + SkIntToScalar(dstx), SkIntToScalar(dsty), nullptr); } SkBitmap& bitmap() { diff --git a/src/she/skia/skia_system.h b/src/she/skia/skia_system.h index df3e39f73..2dd4f2de3 100644 --- a/src/she/skia/skia_system.h +++ b/src/she/skia/skia_system.h @@ -4,6 +4,12 @@ // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. +#include "base/file_handle.h" + +#include "SkImageDecoder.h" +#include "SkPixelRef.h" +#include "SkStream.h" + namespace she { class SkiaSystem : public CommonSystem { @@ -50,15 +56,31 @@ public: } Surface* loadSurface(const char* filename) override { - SkiaSurface* sur = new SkiaSurface; - sur->create(32, 32); - return sur; + base::FileHandle fp(base::open_file_with_exception(filename, "rb")); + SkAutoTDelete stream(SkNEW_ARGS(SkFILEStream, (fp, SkFILEStream::kCallerRetains_Ownership))); + + SkAutoTDelete decoder(SkImageDecoder::Factory(stream)); + decoder->setRequireUnpremultipliedColors(true); + + if (decoder) { + stream->rewind(); + SkBitmap bm; + SkImageDecoder::Result res = decoder->decode(stream, &bm, + kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode); + + if (res == SkImageDecoder::kSuccess) { + bm.pixelRef()->setURI(filename); + + SkiaSurface* sur = new SkiaSurface(); + sur->bitmap().swap(bm); + return sur; + } + } + return nullptr; } Surface* loadRgbaSurface(const char* filename) override { - SkiaSurface* sur = new SkiaSurface; - sur->create(32, 32); - return sur; + return loadSurface(filename); } private: