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