skia2/gpu/include/GrClip.h
epoger@google.com ec3ed6a5eb Automatic update of all copyright notices to reflect new license terms.
I have manually examined all of these diffs and restored a few files that
seem to require manual adjustment.

The following files still need to be modified manually, in a separate CL:

android_sample/SampleApp/AndroidManifest.xml
android_sample/SampleApp/res/layout/layout.xml
android_sample/SampleApp/res/menu/sample.xml
android_sample/SampleApp/res/values/strings.xml
android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java
android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java
experimental/CiCarbonSampleMain.c
experimental/CocoaDebugger/main.m
experimental/FileReaderApp/main.m
experimental/SimpleCocoaApp/main.m
experimental/iOSSampleApp/Shared/SkAlertPrompt.h
experimental/iOSSampleApp/Shared/SkAlertPrompt.m
experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig
experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig
experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig
gpu/src/android/GrGLDefaultInterface_android.cpp
gyp/common.gypi
gyp_skia
include/ports/SkHarfBuzzFont.h
include/views/SkOSWindow_wxwidgets.h
make.bat
make.py
src/opts/memset.arm.S
src/opts/memset16_neon.S
src/opts/memset32_neon.S
src/opts/opts_check_arm.cpp
src/ports/SkDebug_brew.cpp
src/ports/SkMemory_brew.cpp
src/ports/SkOSFile_brew.cpp
src/ports/SkXMLParser_empty.cpp
src/utils/ios/SkImageDecoder_iOS.mm
src/utils/ios/SkOSFile_iOS.mm
src/utils/ios/SkStream_NSData.mm
tests/FillPathTest.cpp
Review URL: http://codereview.appspot.com/4816058

git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
2011-07-28 14:26:00 +00:00

142 lines
3.7 KiB
C++

/*
* Copyright 2010 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrClip_DEFINED
#define GrClip_DEFINED
#include "GrClipIterator.h"
#include "GrRect.h"
#include "GrPath.h"
#include "GrTArray.h"
#include "GrTemplates.h"
class GrClip {
public:
GrClip();
GrClip(const GrClip& src);
/**
* If specified, the conservativeBounds parameter already takes (tx,ty)
* into account.
*/
GrClip(GrClipIterator* iter, GrScalar tx, GrScalar ty,
const GrRect* conservativeBounds = NULL);
GrClip(const GrIRect& rect);
GrClip(const GrRect& rect);
~GrClip();
GrClip& operator=(const GrClip& src);
bool hasConservativeBounds() const { return fConservativeBoundsValid; }
const GrRect& getConservativeBounds() const { return fConservativeBounds; }
int getElementCount() const { return fList.count(); }
GrClipType getElementType(int i) const { return fList[i].fType; }
const GrPath& getPath(int i) const {
GrAssert(kPath_ClipType == fList[i].fType);
return fList[i].fPath;
}
GrPathFill getPathFill(int i) const {
GrAssert(kPath_ClipType == fList[i].fType);
return fList[i].fPathFill;
}
const GrRect& getRect(int i) const {
GrAssert(kRect_ClipType == fList[i].fType);
return fList[i].fRect;
}
GrSetOp getOp(int i) const { return fList[i].fOp; }
bool isRect() const {
if (1 == fList.count() && kRect_ClipType == fList[0].fType) {
// if we determined that the clip is a single rect
// we ought to have also used that rect as the bounds.
GrAssert(fConservativeBoundsValid);
GrAssert(fConservativeBounds == fList[0].fRect);
return true;
} else {
return false;
}
}
bool isEmpty() const { return 0 == fList.count(); }
/**
* Resets this clip to be empty
*/
void setEmpty();
/**
* If specified, the bounds parameter already takes (tx,ty) into account.
*/
void setFromIterator(GrClipIterator* iter, GrScalar tx, GrScalar ty,
const GrRect* conservativeBounds = NULL);
void setFromRect(const GrRect& rect);
void setFromIRect(const GrIRect& rect);
friend bool operator==(const GrClip& a, const GrClip& b) {
if (a.fList.count() != b.fList.count()) {
return false;
}
int count = a.fList.count();
for (int i = 0; i < count; ++i) {
if (a.fList[i] != b.fList[i]) {
return false;
}
}
return true;
}
friend bool operator!=(const GrClip& a, const GrClip& b) {
return !(a == b);
}
private:
struct Element {
GrClipType fType;
GrRect fRect;
GrPath fPath;
GrPathFill fPathFill;
GrSetOp fOp;
bool operator ==(const Element& e) const {
if (e.fType != fType || e.fOp != fOp) {
return false;
}
switch (fType) {
case kRect_ClipType:
return fRect == e.fRect;
break;
case kPath_ClipType:
return fPath == e.fPath;
default:
GrCrash("Unknown clip element type.");
return false; // suppress warning
}
}
bool operator !=(const Element& e) const { return !(*this == e); }
};
GrRect fConservativeBounds;
bool fConservativeBoundsValid;
enum {
kPreAllocElements = 4,
};
GrAlignedSTStorage<kPreAllocElements, Element> fListStorage;
GrTArray<Element> fList;
};
#endif