/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkTiledImageUtils.h" #include "include/core/SkBitmap.h" #include "include/core/SkPaint.h" #include "include/core/SkPixelRef.h" #include "include/private/base/SkAssert.h" #include "include/private/base/SkTFitsIn.h" #include "src/core/SkCanvasPriv.h" #include "src/core/SkDevice.h" #include "src/image/SkImage_Base.h" #include "src/image/SkImage_Picture.h" #include namespace SkTiledImageUtils { void DrawImageRect(SkCanvas* canvas, const SkImage* image, const SkRect& src, const SkRect& dst, const SkSamplingOptions& sampling, const SkPaint* paint, SkCanvas::SrcRectConstraint constraint) { if (!image || !canvas) { return; } SkPaint p; if (paint) { p = *paint; } if (!SkCanvasPriv::TopDevice(canvas)->drawAsTiledImageRect( canvas, image, &src, dst, sampling, p, constraint)) { // Either the image didn't require tiling or this is a raster-backed // canvas. In either case fall back to a default draw. canvas->drawImageRect(image, src, dst, sampling, paint, constraint); } } void GetImageKeyValues(const SkImage* image, uint32_t keyValues[kNumImageKeyValues]) { if (!image || !keyValues) { if (keyValues) { memset(keyValues, 0, kNumImageKeyValues * sizeof(uint32_t)); } return; } const SkImage_Base* imageBase = as_IB(image); if (const SkBitmap* bm = imageBase->onPeekBitmap()) { keyValues[0] = bm->pixelRef()->getGenerationID(); SkIRect subset = image->bounds(); subset.offset(bm->pixelRefOrigin()); SkASSERT(SkTFitsIn(subset.fLeft)); SkASSERT(SkTFitsIn(subset.fTop)); SkASSERT(SkTFitsIn(subset.fRight)); SkASSERT(SkTFitsIn(subset.fBottom)); keyValues[1] = 0; // This empty slot is to disambiguate picture IDs keyValues[2] = subset.fLeft; keyValues[3] = subset.fTop; keyValues[4] = subset.fRight; keyValues[5] = subset.fBottom; return; } if (imageBase->type() == SkImage_Base::Type::kLazyPicture) { const SkImage_Picture* pictureImage = static_cast(imageBase); if (pictureImage->getImageKeyValues(keyValues)) { return; } } keyValues[0] = image->uniqueID(); memset(&keyValues[1], 0, (kNumImageKeyValues-1) * sizeof(uint32_t)); } } // namespace SkTiledImageUtils