Revert "Add ImageToColorSpace helper in SkImageFilter"
This reverts commit e02d3caab8
.
Reason for revert: New logic triggers out-of-date assert. Reverting until I can fix that, too.
Original change's description:
> Add ImageToColorSpace helper in SkImageFilter
>
> Share this logic among a couple filters that need it. This also fixes a
> bug that showed up in the morhpology GM for GPU color space configs.
>
> BUG=skia:
>
> Change-Id: Ic686b07aff80e58e14a86108703bfbb3cf524979
> Reviewed-on: https://skia-review.googlesource.com/6475
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Brian Osman <brianosman@google.com>
>
TBR=bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org
BUG=skia:
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
Change-Id: I00b444dfaaa9b5981f7b33b34419cf9795b52ddb
Reviewed-on: https://skia-review.googlesource.com/6480
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
e02d3caab8
commit
a4cb388c0f
@ -386,15 +386,6 @@ protected:
|
||||
*/
|
||||
Context mapContext(const Context& ctx) const;
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
/**
|
||||
* Returns a version of the passed-in image (possibly the original), that is in a colorspace
|
||||
* with the same gamut as the one from the OutputProperties. This allows filters that do many
|
||||
* texture samples to guarantee that any color space conversion has happened before running.
|
||||
*/
|
||||
static sk_sp<SkSpecialImage> ImageToColorSpace(SkSpecialImage* src, const OutputProperties&);
|
||||
#endif
|
||||
|
||||
private:
|
||||
friend class SkGraphics;
|
||||
static void PurgeCache();
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include "SkImageFilter.h"
|
||||
|
||||
#include "SkCanvas.h"
|
||||
#include "SkColorSpace_Base.h"
|
||||
#include "SkFuzzLogging.h"
|
||||
#include "SkImageFilterCache.h"
|
||||
#include "SkLocalMatrixImageFilter.h"
|
||||
@ -345,35 +344,6 @@ bool SkImageFilter::applyCropRect(const Context& ctx, const SkIRect& srcBounds,
|
||||
return dstBounds->intersect(ctx.clipBounds());
|
||||
}
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
sk_sp<SkSpecialImage> SkImageFilter::ImageToColorSpace(SkSpecialImage* src,
|
||||
const OutputProperties& outProps) {
|
||||
// There are several conditions that determine if we actually need to convert the source to the
|
||||
// destination's color space. Rather than duplicate that logic here, just try to make an xform
|
||||
// object. If that produces something, then both are tagged, and the source is in a different
|
||||
// gamut than the dest. There is some overhead to making the xform, but those are cached, and
|
||||
// if we get one back, that means we're about to use it during the conversion anyway.
|
||||
sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(src->getColorSpace(),
|
||||
outProps.colorSpace());
|
||||
|
||||
if (!colorSpaceXform) {
|
||||
// No xform needed, just return the original image
|
||||
return sk_ref_sp(src);
|
||||
}
|
||||
|
||||
sk_sp<SkSpecialSurface> surf(src->makeSurface(outProps,
|
||||
SkISize::Make(src->width(), src->height())));
|
||||
if (!surf) {
|
||||
return sk_ref_sp(src);
|
||||
}
|
||||
|
||||
SkCanvas* canvas = surf->getCanvas();
|
||||
SkASSERT(canvas);
|
||||
src->draw(canvas, 0, 0, nullptr);
|
||||
return surf->makeImageSnapshot();
|
||||
}
|
||||
#endif
|
||||
|
||||
// Return a larger (newWidth x newHeight) copy of 'src' with black padding
|
||||
// around it.
|
||||
static sk_sp<SkSpecialImage> pad_image(SkSpecialImage* src,
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "SkColorPriv.h"
|
||||
#include "SkReadBuffer.h"
|
||||
#include "SkSpecialImage.h"
|
||||
#include "SkSpecialSurface.h"
|
||||
#include "SkWriteBuffer.h"
|
||||
#include "SkRect.h"
|
||||
#include "SkUnPreMultiply.h"
|
||||
@ -281,6 +282,23 @@ static GrTextureDomain::Mode convert_tilemodes(SkMatrixConvolutionImageFilter::T
|
||||
}
|
||||
return GrTextureDomain::kIgnore_Mode;
|
||||
}
|
||||
|
||||
// Return a copy of 'src' transformed to the output's color space
|
||||
static sk_sp<SkSpecialImage> image_to_color_space(SkSpecialImage* src,
|
||||
const SkImageFilter::OutputProperties& outProps) {
|
||||
sk_sp<SkSpecialSurface> surf(src->makeSurface(
|
||||
outProps, SkISize::Make(src->width(), src->height())));
|
||||
if (!surf) {
|
||||
return sk_ref_sp(src);
|
||||
}
|
||||
|
||||
SkCanvas* canvas = surf->getCanvas();
|
||||
SkASSERT(canvas);
|
||||
|
||||
src->draw(canvas, 0, 0, nullptr);
|
||||
|
||||
return surf->makeImageSnapshot();
|
||||
}
|
||||
#endif
|
||||
|
||||
sk_sp<SkSpecialImage> SkMatrixConvolutionImageFilter::onFilterImage(SkSpecialImage* source,
|
||||
@ -304,11 +322,15 @@ sk_sp<SkSpecialImage> SkMatrixConvolutionImageFilter::onFilterImage(SkSpecialIma
|
||||
fKernelSize.width() * fKernelSize.height() <= MAX_KERNEL_SIZE) {
|
||||
GrContext* context = source->getContext();
|
||||
|
||||
// Ensure the input is in the destination color space. Typically applyCropRect will have
|
||||
// called pad_image to account for our dilation of bounds, so the result will already be
|
||||
// moved to the destination color space. If a filter DAG avoids that, then we use this
|
||||
// fall-back, which saves us from having to do the xform during the filter itself.
|
||||
input = ImageToColorSpace(input.get(), ctx.outputProperties());
|
||||
// If the input is not yet already in the destination color space, do an explicit up-front
|
||||
// conversion. This is extremely unlikely (maybe even impossible). Typically, applyCropRect
|
||||
// will have called pad_image to account for our dilation of bounds, so the result will
|
||||
// already be moved to the destination color space. If someone makes a filter DAG that
|
||||
// avoids that, then we use this fall-back, which saves us from having to do the xform
|
||||
// during the filter itself.
|
||||
if (input->getColorSpace() != ctx.outputProperties().colorSpace()) {
|
||||
input = image_to_color_space(input.get(), ctx.outputProperties());
|
||||
}
|
||||
|
||||
sk_sp<GrTexture> inputTexture(input->asTextureRef(context));
|
||||
SkASSERT(inputTexture);
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "SkReadBuffer.h"
|
||||
#include "SkRect.h"
|
||||
#include "SkSpecialImage.h"
|
||||
#include "SkSpecialSurface.h"
|
||||
#include "SkWriteBuffer.h"
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
@ -545,6 +546,23 @@ static sk_sp<SkSpecialImage> apply_morphology(
|
||||
std::move(srcTexture), std::move(colorSpace),
|
||||
&input->props());
|
||||
}
|
||||
|
||||
// Return a copy of 'src' transformed to the output's color space
|
||||
static sk_sp<SkSpecialImage> image_to_color_space(SkSpecialImage* src,
|
||||
const SkImageFilter::OutputProperties& outProps) {
|
||||
sk_sp<SkSpecialSurface> surf(src->makeSurface(
|
||||
outProps, SkISize::Make(src->width(), src->height())));
|
||||
if (!surf) {
|
||||
return sk_ref_sp(src);
|
||||
}
|
||||
|
||||
SkCanvas* canvas = surf->getCanvas();
|
||||
SkASSERT(canvas);
|
||||
|
||||
src->draw(canvas, 0, 0, nullptr);
|
||||
|
||||
return surf->makeImageSnapshot();
|
||||
}
|
||||
#endif
|
||||
|
||||
sk_sp<SkSpecialImage> SkMorphologyImageFilter::onFilterImage(SkSpecialImage* source,
|
||||
@ -585,11 +603,15 @@ sk_sp<SkSpecialImage> SkMorphologyImageFilter::onFilterImage(SkSpecialImage* sou
|
||||
if (source->isTextureBacked()) {
|
||||
GrContext* context = source->getContext();
|
||||
|
||||
// Ensure the input is in the destination color space. Typically applyCropRect will have
|
||||
// called pad_image to account for our dilation of bounds, so the result will already be
|
||||
// moved to the destination color space. If a filter DAG avoids that, then we use this
|
||||
// fall-back, which saves us from having to do the xform during the filter itself.
|
||||
input = ImageToColorSpace(input.get(), ctx.outputProperties());
|
||||
// If the input is not yet already in the destination color space, do an explicit up-front
|
||||
// conversion. This is extremely unlikely (maybe even impossible). Typically, applyCropRect
|
||||
// will have called pad_image to account for our dilation of bounds, so the result will
|
||||
// already be moved to the destination color space. If someone makes a filter DAG that
|
||||
// avoids that, then we use this fall-back, which saves us from having to do the xform
|
||||
// during the filter itself.
|
||||
if (input->getColorSpace() != ctx.outputProperties().colorSpace()) {
|
||||
input = image_to_color_space(input.get(), ctx.outputProperties());
|
||||
}
|
||||
|
||||
auto type = (kDilate_Op == this->op()) ? GrMorphologyEffect::kDilate_MorphologyType
|
||||
: GrMorphologyEffect::kErode_MorphologyType;
|
||||
|
Loading…
Reference in New Issue
Block a user