// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/resources/ui_resource_bitmap.h" #include #include #include "base/logging.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkMallocPixelRef.h" #include "third_party/skia/include/core/SkPixelRef.h" namespace cc { namespace { UIResourceBitmap::UIResourceFormat SkColorTypeToUIResourceFormat( SkColorType sk_type) { UIResourceBitmap::UIResourceFormat format = UIResourceBitmap::RGBA8; switch (sk_type) { case kN32_SkColorType: format = UIResourceBitmap::RGBA8; break; case kAlpha_8_SkColorType: format = UIResourceBitmap::ALPHA_8; break; default: NOTREACHED() << "Invalid SkColorType for UIResourceBitmap: " << sk_type; break; } return format; } } // namespace void UIResourceBitmap::Create(sk_sp pixel_ref, const SkImageInfo& info, UIResourceFormat format) { DCHECK(info.width()); DCHECK(info.height()); DCHECK(pixel_ref); DCHECK(pixel_ref->isImmutable()); format_ = format; info_ = info; pixel_ref_ = std::move(pixel_ref); } void UIResourceBitmap::DrawToCanvas(SkCanvas* canvas, SkPaint* paint) { SkBitmap bitmap; bitmap.setInfo(info_, pixel_ref_.get()->rowBytes()); bitmap.setPixelRef(pixel_ref_, 0, 0); canvas->drawBitmap(bitmap, 0, 0, paint); canvas->flush(); } UIResourceBitmap::UIResourceBitmap(const SkBitmap& skbitmap) { DCHECK_EQ(skbitmap.width(), skbitmap.rowBytesAsPixels()); DCHECK(skbitmap.isImmutable()); sk_sp pixel_ref = sk_ref_sp(skbitmap.pixelRef()); Create(std::move(pixel_ref), skbitmap.info(), SkColorTypeToUIResourceFormat(skbitmap.colorType())); } UIResourceBitmap::UIResourceBitmap(const gfx::Size& size, bool is_opaque) { SkAlphaType alphaType = is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), alphaType); sk_sp pixel_ref( SkMallocPixelRef::MakeAllocate(info, info.minRowBytes(), NULL)); pixel_ref->setImmutable(); Create(std::move(pixel_ref), info, UIResourceBitmap::RGBA8); } UIResourceBitmap::UIResourceBitmap(sk_sp pixel_ref, const gfx::Size& size) { SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kOpaque_SkAlphaType); Create(std::move(pixel_ref), info, UIResourceBitmap::ETC1); } UIResourceBitmap::UIResourceBitmap(const UIResourceBitmap& other) = default; UIResourceBitmap::~UIResourceBitmap() {} } // namespace cc