Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkLocalMatrixImageFilter.h"
      9 #include "SkReadBuffer.h"
     10 #include "SkString.h"
     11 
     12 SkImageFilter* SkLocalMatrixImageFilter::Create(const SkMatrix& localM, SkImageFilter* input) {
     13     if (!input) {
     14         return nullptr;
     15     }
     16     if (localM.getType() & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) {
     17         return nullptr;
     18     }
     19     if (localM.isIdentity()) {
     20         return SkRef(input);
     21     }
     22     return new SkLocalMatrixImageFilter(localM, input);
     23 }
     24 
     25 SkLocalMatrixImageFilter::SkLocalMatrixImageFilter(const SkMatrix& localM, SkImageFilter* input)
     26   : INHERITED(1, &input), fLocalM(localM)
     27 {}
     28 
     29 SkFlattenable* SkLocalMatrixImageFilter::CreateProc(SkReadBuffer& buffer) {
     30     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     31     SkMatrix lm;
     32     buffer.readMatrix(&lm);
     33     return SkLocalMatrixImageFilter::Create(lm, common.getInput(0));
     34 }
     35 
     36 void SkLocalMatrixImageFilter::flatten(SkWriteBuffer& buffer) const {
     37     this->INHERITED::flatten(buffer);
     38     buffer.writeMatrix(fLocalM);
     39 }
     40 
     41 bool SkLocalMatrixImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& src,
     42                                                        const Context& ctx,
     43                                                        SkBitmap* result, SkIPoint* offset) const {
     44     Context localCtx(SkMatrix::Concat(ctx.ctm(), fLocalM), ctx.clipBounds(), ctx.cache());
     45     return this->filterInputDeprecated(0, proxy, src, localCtx, result, offset);
     46 }
     47 
     48 bool SkLocalMatrixImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& matrix,
     49                                               SkIRect* dst, MapDirection direction) const {
     50     return this->getInput(0)->filterBounds(src, SkMatrix::Concat(matrix, fLocalM), dst, direction);
     51 }
     52 
     53 #ifndef SK_IGNORE_TO_STRING
     54 void SkLocalMatrixImageFilter::toString(SkString* str) const {
     55     str->append("SkLocalMatrixImageFilter: (");
     56     str->append(")");
     57 }
     58 #endif
     59