blob: f8fcbee1f60804e2ce4db708d22f6e8911950731 [file] [log] [blame]
/*
* 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 <string.h>
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<uint32_t>(subset.fLeft));
SkASSERT(SkTFitsIn<uint32_t>(subset.fTop));
SkASSERT(SkTFitsIn<uint32_t>(subset.fRight));
SkASSERT(SkTFitsIn<uint32_t>(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<const SkImage_Picture*>(imageBase);
if (pictureImage->getImageKeyValues(keyValues)) {
return;
}
}
keyValues[0] = image->uniqueID();
memset(&keyValues[1], 0, (kNumImageKeyValues-1) * sizeof(uint32_t));
}
} // namespace SkTiledImageUtils