1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2011 Google Inc. 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkAAClip_DEFINED 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkAAClip_DEFINED 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkBlitter.h" 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkRegion.h" 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAAClip { 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClip(); 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClip(const SkAAClip&); 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger ~SkAAClip(); 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClip& operator=(const SkAAClip&); 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger friend bool operator==(const SkAAClip&, const SkAAClip&); 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger friend bool operator!=(const SkAAClip& a, const SkAAClip& b) { 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return !(a == b); 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void swap(SkAAClip&); 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isEmpty() const { return NULL == fRunHead; } 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkIRect& getBounds() const { return fBounds; } 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setEmpty(); 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setRect(const SkIRect&); 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setRect(const SkRect&, bool doAA = true); 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setPath(const SkPath&, const SkRegion* clip = NULL, bool doAA = true); 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setRegion(const SkRegion&); 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool set(const SkAAClip&); 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkAAClip&, const SkAAClip&, SkRegion::Op); 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // Helpers for op() 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkIRect&, SkRegion::Op); 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkRect&, SkRegion::Op, bool doAA); 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkAAClip&, SkRegion::Op); 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool translate(int dx, int dy, SkAAClip* dst) const; 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool translate(int dx, int dy) { 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this->translate(dx, dy, this); 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Allocates a mask the size of the aaclip, and expands its data into 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the mask, using kA8_Format 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void copyToMask(SkMask*) const; 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // called internally 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool quickContains(int left, int top, int right, int bottom) const; 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool quickContains(const SkIRect& r) const { 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this->quickContains(r.fLeft, r.fTop, r.fRight, r.fBottom); 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const uint8_t* findRow(int y, int* lastYForRow) const; 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const uint8_t* findX(const uint8_t data[], int x, int* initialCount) const; 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger class Iter; 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger struct RunHead; 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger struct YOffset; 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger class Builder; 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void validate() const; 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void validate() const {} 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkIRect fBounds; 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger RunHead* fRunHead; 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void freeRuns(); 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool trimBounds(); 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool trimTopBottom(); 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool trimLeftRight(); 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger friend class Builder; 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger class BuilderBlitter; 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger friend class BuilderBlitter; 90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAAClipBlitter : public SkBlitter { 95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClipBlitter() : fScanlineScratch(NULL) {} 97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual ~SkAAClipBlitter(); 98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void init(SkBlitter* blitter, const SkAAClip* aaclip) { 100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(aaclip && !aaclip->isEmpty()); 101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fBlitter = blitter; 102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fAAClip = aaclip; 103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fAAClipBounds = aaclip->getBounds(); 104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual void blitH(int x, int y, int width) SK_OVERRIDE; 107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual void blitAntiH(int x, int y, const SkAlpha[], 108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const int16_t runs[]) SK_OVERRIDE; 109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE; 112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE; 113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkBlitter* fBlitter; 116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkAAClip* fAAClip; 117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkIRect fAAClipBounds; 118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // point into fScanlineScratch 120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int16_t* fRuns; 121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAlpha* fAA; 122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger enum { 124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger kSize = 32 * 32 125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger }; 126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAutoSMalloc<kSize> fGrayMaskScratch; // used for blitMask 127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void* fScanlineScratch; // enough for a mask at 32bit, or runs+aa 128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void ensureRunsAndAA(); 130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 133