00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkCanvas_DEFINED
00018 #define SkCanvas_DEFINED
00019
00020 #include "SkTypes.h"
00021 #include "SkBitmap.h"
00022 #include "SkDeque.h"
00023 #include "SkPaint.h"
00024 #include "SkRefCnt.h"
00025 #include "SkPath.h"
00026 #include "SkRegion.h"
00027 #include "SkScalarCompare.h"
00028 #include "SkXfermode.h"
00029
00030 class SkBounder;
00031 class SkDevice;
00032 class SkDraw;
00033 class SkDrawFilter;
00034 class SkPicture;
00035 class SkShape;
00036
00052 class SkCanvas : public SkRefCnt {
00053 public:
00058 explicit SkCanvas(const SkBitmap& bitmap);
00063 explicit SkCanvas(SkDevice* device = NULL);
00064 virtual ~SkCanvas();
00065
00067
00072 virtual bool getViewport(SkIPoint* size) const;
00073
00078 virtual bool setViewport(int x, int y);
00079
00084 SkDevice* getDevice() const;
00085
00090 SkDevice* setDevice(SkDevice* device);
00091
00096 virtual SkDevice* setBitmapDevice(const SkBitmap& bitmap);
00097
00099
00100 enum SaveFlags {
00102 kMatrix_SaveFlag = 0x01,
00104 kClip_SaveFlag = 0x02,
00106 kHasAlphaLayer_SaveFlag = 0x04,
00108 kFullColorLayer_SaveFlag = 0x08,
00110 kClipToLayer_SaveFlag = 0x10,
00111
00112
00113 kMatrixClip_SaveFlag = 0x03,
00114 kARGB_NoClipLayer_SaveFlag = 0x0F,
00115 kARGB_ClipLayer_SaveFlag = 0x1F
00116 };
00117
00125 virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
00126
00141 virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
00142 SaveFlags flags = kARGB_ClipLayer_SaveFlag);
00143
00157 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
00158 SaveFlags flags = kARGB_ClipLayer_SaveFlag);
00159
00164 virtual void restore();
00165
00169 int getSaveCount() const;
00170
00176 void restoreToCount(int saveCount);
00177
00183 virtual bool translate(SkScalar dx, SkScalar dy);
00184
00190 virtual bool scale(SkScalar sx, SkScalar sy);
00191
00196 virtual bool rotate(SkScalar degrees);
00197
00203 virtual bool skew(SkScalar sx, SkScalar sy);
00204
00209 virtual bool concat(const SkMatrix& matrix);
00210
00214 virtual void setMatrix(const SkMatrix& matrix);
00215
00218 void resetMatrix();
00219
00225 virtual bool clipRect(const SkRect& rect,
00226 SkRegion::Op op = SkRegion::kIntersect_Op);
00227
00233 virtual bool clipPath(const SkPath& path,
00234 SkRegion::Op op = SkRegion::kIntersect_Op);
00235
00244 virtual bool clipRegion(const SkRegion& deviceRgn,
00245 SkRegion::Op op = SkRegion::kIntersect_Op);
00246
00253 bool setClipRegion(const SkRegion& deviceRgn) {
00254 return this->clipRegion(deviceRgn, SkRegion::kReplace_Op);
00255 }
00256
00263 enum EdgeType {
00267 kBW_EdgeType,
00271 kAA_EdgeType
00272 };
00273
00283 bool quickReject(const SkRect& rect, EdgeType et) const;
00284
00296 bool quickReject(const SkPath& path, EdgeType et) const;
00297
00308 bool quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const;
00309
00315 bool getClipBounds(SkRect* bounds, EdgeType et = kAA_EdgeType) const;
00316
00325 void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b,
00326 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode);
00327
00333 void drawColor(SkColor color,
00334 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode);
00335
00340 virtual void drawPaint(const SkPaint& paint);
00341
00342 enum PointMode {
00344 kPoints_PointMode,
00346 kLines_PointMode,
00348 kPolygon_PointMode
00349 };
00350
00372 virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
00373 const SkPaint& paint);
00374
00378 void drawPoint(SkScalar x, SkScalar y, const SkPaint& paint);
00379
00385 void drawPoint(SkScalar x, SkScalar y, SkColor color);
00386
00396 void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1,
00397 const SkPaint& paint);
00398
00404 virtual void drawRect(const SkRect& rect, const SkPaint& paint);
00405
00411 void drawIRect(const SkIRect& rect, const SkPaint& paint)
00412 {
00413 SkRect r;
00414 r.set(rect);
00415 this->drawRect(r, paint);
00416 }
00417
00426 void drawRectCoords(SkScalar left, SkScalar top, SkScalar right,
00427 SkScalar bottom, const SkPaint& paint);
00428
00434 void drawOval(const SkRect& oval, const SkPaint&);
00435
00444 void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius,
00445 const SkPaint& paint);
00446
00458 void drawArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
00459 bool useCenter, const SkPaint& paint);
00460
00468 void drawRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry,
00469 const SkPaint& paint);
00470
00476 virtual void drawPath(const SkPath& path, const SkPaint& paint);
00477
00489 virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
00490 const SkPaint* paint = NULL);
00491
00500 virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
00501 const SkRect& dst, const SkPaint* paint = NULL);
00502
00503 virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
00504 const SkPaint* paint = NULL);
00505
00517 virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
00518 const SkPaint* paint = NULL);
00519
00528 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
00529 SkScalar y, const SkPaint& paint);
00530
00538 virtual void drawPosText(const void* text, size_t byteLength,
00539 const SkPoint pos[], const SkPaint& paint);
00540
00550 virtual void drawPosTextH(const void* text, size_t byteLength,
00551 const SkScalar xpos[], SkScalar constY,
00552 const SkPaint& paint);
00553
00566 void drawTextOnPathHV(const void* text, size_t byteLength,
00567 const SkPath& path, SkScalar hOffset,
00568 SkScalar vOffset, const SkPaint& paint);
00569
00580 virtual void drawTextOnPath(const void* text, size_t byteLength,
00581 const SkPath& path, const SkMatrix* matrix,
00582 const SkPaint& paint);
00583
00593 virtual void drawPicture(SkPicture& picture);
00594
00597 virtual void drawShape(SkShape*);
00598
00599 enum VertexMode {
00600 kTriangles_VertexMode,
00601 kTriangleStrip_VertexMode,
00602 kTriangleFan_VertexMode
00603 };
00604
00623 virtual void drawVertices(VertexMode vmode, int vertexCount,
00624 const SkPoint vertices[], const SkPoint texs[],
00625 const SkColor colors[], SkXfermode* xmode,
00626 const uint16_t indices[], int indexCount,
00627 const SkPaint& paint);
00628
00630
00635 SkBounder* getBounder() const { return fBounder; }
00636
00645 virtual SkBounder* setBounder(SkBounder* bounder);
00646
00652 SkDrawFilter* getDrawFilter() const;
00653
00662 virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter);
00663
00665
00670 const SkMatrix& getTotalMatrix() const;
00671
00676 const SkRegion& getTotalClip() const;
00677
00686 virtual SkDevice* createDevice(SkBitmap::Config, int width, int height,
00687 bool isOpaque, bool isForLayer);
00688
00690
00697 class LayerIter {
00698 public:
00700 LayerIter(SkCanvas*, bool skipEmptyClips);
00701 ~LayerIter();
00702
00704 bool done() const { return fDone; }
00706 void next();
00707
00708
00709
00710 SkDevice* device() const;
00711 const SkMatrix& matrix() const;
00712 const SkRegion& clip() const;
00713 const SkPaint& paint() const;
00714 int x() const;
00715 int y() const;
00716
00717 private:
00718
00719
00720
00721
00722
00723 intptr_t fStorage[12];
00724 class SkDrawIter* fImpl;
00725 SkPaint fDefaultPaint;
00726 bool fDone;
00727 };
00728
00729 protected:
00730
00731 virtual void commonDrawBitmap(const SkBitmap&, const SkMatrix& m,
00732 const SkPaint& paint);
00733
00734 private:
00735 class MCRec;
00736
00737 SkDeque fMCStack;
00738
00739 MCRec* fMCRec;
00740
00741 uint32_t fMCRecStorage[32];
00742
00743 SkBounder* fBounder;
00744 SkDevice* fLastDeviceToGainFocus;
00745
00746 void prepareForDeviceDraw(SkDevice*);
00747
00748 bool fDeviceCMDirty;
00749 void updateDeviceCMCache();
00750
00751 friend class SkDrawIter;
00752
00753 SkDevice* init(SkDevice*);
00754 void internalDrawBitmap(const SkBitmap&, const SkMatrix& m,
00755 const SkPaint* paint);
00756 void drawDevice(SkDevice*, int x, int y, const SkPaint*);
00757
00758 int internalSave(SaveFlags flags);
00759 void internalRestore();
00760
00761
00762
00763
00764 mutable SkRectCompareType fLocalBoundsCompareType;
00765 mutable bool fLocalBoundsCompareTypeDirty;
00766
00767 const SkRectCompareType& getLocalClipBoundsCompareType() const {
00768 if (fLocalBoundsCompareTypeDirty) {
00769 this->computeLocalClipBoundsCompareType();
00770 fLocalBoundsCompareTypeDirty = false;
00771 }
00772 return fLocalBoundsCompareType;
00773 }
00774 void computeLocalClipBoundsCompareType() const;
00775 };
00776
00781 class SkAutoCanvasRestore : SkNoncopyable {
00782 public:
00783 SkAutoCanvasRestore(SkCanvas* canvas, bool doSave) : fCanvas(canvas) {
00784 SkASSERT(canvas);
00785 fSaveCount = canvas->getSaveCount();
00786 if (doSave) {
00787 canvas->save();
00788 }
00789 }
00790 ~SkAutoCanvasRestore() {
00791 fCanvas->restoreToCount(fSaveCount);
00792 }
00793
00794 private:
00795 SkCanvas* fCanvas;
00796 int fSaveCount;
00797 };
00798
00799 #endif
00800