180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAntiRun.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkUtils.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkAlphaRuns::reset(int width) {
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(width > 0);
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    sk_memset16((uint16_t*)fRuns, (uint16_t)(-42), width);
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fRuns[0] = SkToS16(width);
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fRuns[width] = 0;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAlpha[0] = 0;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(fWidth = width;)
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(this->validate();)
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void SkAlphaRuns::assertValid(int y, int maxStep) const {
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int max = (y + 1) * maxStep - (y == maxStep - 1);
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const int16_t* runs = fRuns;
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const uint8_t*   alpha = fAlpha;
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        while (*runs) {
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(*alpha <= max);
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            alpha += *runs;
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            runs += *runs;
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void SkAlphaRuns::dump() const {
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const int16_t* runs = fRuns;
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const uint8_t* alpha = fAlpha;
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("Runs");
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        while (*runs) {
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int n = *runs;
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf(" %02x", *alpha);
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (n > 1) {
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf(",%d", n);
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            alpha += n;
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            runs += n;
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("\n");
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void SkAlphaRuns::validate() const {
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(fWidth > 0);
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int         count = 0;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const int16_t*  runs = fRuns;
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        while (*runs) {
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(*runs > 0);
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            count += *runs;
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(count <= fWidth);
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            runs += *runs;
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(count == fWidth);
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
74