180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStippleMaskFilter.h"
9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkString.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkStippleMaskFilter::filterMask(SkMask* dst,
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                     const SkMask& src,
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                     const SkMatrix& matrix,
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                     SkIPoint* margin) const {
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (src.fFormat != SkMask::kA8_Format) {
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return false;
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->fBounds = src.fBounds;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->fRowBytes = dst->fBounds.width();
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->fFormat = SkMask::kA8_Format;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->fImage = NULL;
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (NULL != src.fImage) {
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        size_t dstSize = dst->computeImageSize();
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (0 == dstSize) {
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;   // too big to allocate, abort
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dst->fImage = SkMask::AllocImage(dstSize);
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uint8_t* srcScanLine = src.fImage;
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uint8_t* scanline = dst->fImage;
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int y = 0; y < src.fBounds.height(); ++y) {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int x = 0; x < src.fBounds.width(); ++x) {
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                scanline[x] = srcScanLine[x] && ((x+y) & 0x1) ? 0xFF : 0x00;
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            scanline += dst->fRowBytes;
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            srcScanLine += src.fRowBytes;
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_DEVELOPER
49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergervoid SkStippleMaskFilter::toString(SkString* str) const {
50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    str->append("SkStippleMaskFilter: ()");
51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}
52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif
53