00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SkBlitter_DEFINED
00019 #define SkBlitter_DEFINED
00020
00021 #include "SkBitmap.h"
00022 #include "SkMatrix.h"
00023 #include "SkPaint.h"
00024 #include "SkRefCnt.h"
00025 #include "SkRegion.h"
00026 #include "SkMask.h"
00027
00028 class SkBlitter {
00029 public:
00030 virtual ~SkBlitter();
00031
00032 virtual void blitH(int x, int y, int width);
00033 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t runs[]);
00034 virtual void blitV(int x, int y, int height, SkAlpha alpha);
00035 virtual void blitRect(int x, int y, int width, int height);
00036 virtual void blitMask(const SkMask&, const SkIRect& clip);
00037
00038
00039
00040
00041
00042 virtual const SkBitmap* justAnOpaqueColor(uint32_t* value);
00043
00044
00045 void blitMaskRegion(const SkMask& mask, const SkRegion& clip);
00046 void blitRectRegion(const SkIRect& rect, const SkRegion& clip);
00047 void blitRegion(const SkRegion& clip);
00048
00049
00050 static SkBlitter* Choose(const SkBitmap& device,
00051 const SkMatrix& matrix,
00052 const SkPaint& paint) {
00053 return Choose(device, matrix, paint, NULL, 0);
00054 }
00055
00056 static SkBlitter* Choose(const SkBitmap& device,
00057 const SkMatrix& matrix,
00058 const SkPaint& paint,
00059 void* storage, size_t storageSize);
00060
00061 static SkBlitter* ChooseSprite(const SkBitmap& device,
00062 const SkPaint&,
00063 const SkBitmap& src,
00064 int left, int top,
00065 void* storage, size_t storageSize);
00066
00067 private:
00068 };
00069
00072 class SkNullBlitter : public SkBlitter {
00073 public:
00074 virtual void blitH(int x, int y, int width);
00075 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t runs[]);
00076 virtual void blitV(int x, int y, int height, SkAlpha alpha);
00077 virtual void blitRect(int x, int y, int width, int height);
00078 virtual void blitMask(const SkMask&, const SkIRect& clip);
00079 virtual const SkBitmap* justAnOpaqueColor(uint32_t* value);
00080 };
00081
00086 class SkRectClipBlitter : public SkBlitter {
00087 public:
00088 void init(SkBlitter* blitter, const SkIRect& clipRect) {
00089 SkASSERT(!clipRect.isEmpty());
00090 fBlitter = blitter;
00091 fClipRect = clipRect;
00092 }
00093
00094
00095 virtual void blitH(int x, int y, int width);
00096 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t runs[]);
00097 virtual void blitV(int x, int y, int height, SkAlpha alpha);
00098 virtual void blitRect(int x, int y, int width, int height);
00099 virtual void blitMask(const SkMask&, const SkIRect& clip);
00100 virtual const SkBitmap* justAnOpaqueColor(uint32_t* value);
00101
00102 private:
00103 SkBlitter* fBlitter;
00104 SkIRect fClipRect;
00105 };
00106
00111 class SkRgnClipBlitter : public SkBlitter {
00112 public:
00113 void init(SkBlitter* blitter, const SkRegion* clipRgn) {
00114 SkASSERT(clipRgn && !clipRgn->isEmpty());
00115 fBlitter = blitter;
00116 fRgn = clipRgn;
00117 }
00118
00119
00120 virtual void blitH(int x, int y, int width);
00121 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t runs[]);
00122 virtual void blitV(int x, int y, int height, SkAlpha alpha);
00123 virtual void blitRect(int x, int y, int width, int height);
00124 virtual void blitMask(const SkMask&, const SkIRect& clip);
00125 virtual const SkBitmap* justAnOpaqueColor(uint32_t* value);
00126
00127 private:
00128 SkBlitter* fBlitter;
00129 const SkRegion* fRgn;
00130 };
00131
00132 class SkBlitterClipper {
00133 public:
00134 SkBlitter* apply(SkBlitter* blitter, const SkRegion* clip,
00135 const SkIRect* bounds = NULL);
00136
00137 private:
00138 SkNullBlitter fNullBlitter;
00139 SkRectClipBlitter fRectBlitter;
00140 SkRgnClipBlitter fRgnBlitter;
00141 };
00142
00143 #endif