OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkImage_Base.h" | 8 #include "SkImage_Base.h" |
9 #include "SkImagePriv.h" | 9 #include "SkImagePriv.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 return true; | 48 return true; |
49 } | 49 } |
50 | 50 |
51 static SkImage* NewEmpty(); | 51 static SkImage* NewEmpty(); |
52 | 52 |
53 SkImage_Raster(const SkImageInfo&, SkData*, size_t rb); | 53 SkImage_Raster(const SkImageInfo&, SkData*, size_t rb); |
54 virtual ~SkImage_Raster(); | 54 virtual ~SkImage_Raster(); |
55 | 55 |
56 virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRI
DE; | 56 virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRI
DE; |
57 virtual void onDrawRectToRect(SkCanvas*, const SkRect*, const SkRect&, const
SkPaint*) SK_OVERRIDE; | 57 virtual void onDrawRectToRect(SkCanvas*, const SkRect*, const SkRect&, const
SkPaint*) SK_OVERRIDE; |
| 58 virtual bool onReadPixels(SkBitmap*, const SkIRect&) const SK_OVERRIDE; |
| 59 virtual const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const S
K_OVERRIDE; |
58 virtual bool getROPixels(SkBitmap*) const SK_OVERRIDE; | 60 virtual bool getROPixels(SkBitmap*) const SK_OVERRIDE; |
59 | 61 |
60 // exposed for SkSurface_Raster via SkNewImageFromPixelRef | 62 // exposed for SkSurface_Raster via SkNewImageFromPixelRef |
61 SkImage_Raster(const SkImageInfo&, SkPixelRef*, size_t rowBytes); | 63 SkImage_Raster(const SkImageInfo&, SkPixelRef*, size_t rowBytes); |
62 | 64 |
63 SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); } | 65 SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); } |
64 | 66 |
65 private: | 67 private: |
66 SkImage_Raster() : INHERITED(0, 0) {} | 68 SkImage_Raster() : INHERITED(0, 0) {} |
67 | 69 |
68 SkBitmap fBitmap; | 70 SkBitmap fBitmap; |
69 | 71 |
70 typedef SkImage_Base INHERITED; | 72 typedef SkImage_Base INHERITED; |
71 }; | 73 }; |
72 | 74 |
73 /////////////////////////////////////////////////////////////////////////////// | 75 /////////////////////////////////////////////////////////////////////////////// |
74 | 76 |
75 SkImage* SkImage_Raster::NewEmpty() { | 77 SkImage* SkImage_Raster::NewEmpty() { |
76 // Returns lazily created singleton | 78 // Returns lazily created singleton |
77 static SkImage* gEmpty; | 79 static SkImage* gEmpty; |
78 if (NULL == gEmpty) { | 80 if (NULL == gEmpty) { |
79 gEmpty = SkNEW(SkImage_Raster); | 81 gEmpty = SkNEW(SkImage_Raster); |
80 } | 82 } |
81 gEmpty->ref(); | 83 gEmpty->ref(); |
82 return gEmpty; | 84 return gEmpty; |
83 } | 85 } |
84 | 86 |
| 87 static void release_data(void* addr, void* context) { |
| 88 SkData* data = static_cast<SkData*>(context); |
| 89 data->unref(); |
| 90 } |
| 91 |
85 SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes) | 92 SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes) |
86 : INHERITED(info.fWidth, info.fHeight) { | 93 : INHERITED(info.fWidth, info.fHeight) |
87 fBitmap.setConfig(info, rowBytes); | 94 { |
88 SkAutoTUnref<SkPixelRef> ref( | 95 data->ref(); |
89 SkMallocPixelRef::NewWithData(info, rowBytes, NULL, data, 0)); | 96 void* addr = const_cast<void*>(data->data()); |
90 fBitmap.setPixelRef(ref); | 97 |
| 98 fBitmap.installPixels(info, addr, rowBytes, release_data, data); |
91 fBitmap.setImmutable(); | 99 fBitmap.setImmutable(); |
| 100 fBitmap.lockPixels(); |
92 } | 101 } |
93 | 102 |
94 SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes
) | 103 SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes
) |
95 : INHERITED(info.fWidth, info.fHeight) | 104 : INHERITED(info.fWidth, info.fHeight) |
96 { | 105 { |
97 fBitmap.setConfig(info, rowBytes); | 106 fBitmap.setConfig(info, rowBytes); |
98 fBitmap.setPixelRef(pr); | 107 fBitmap.setPixelRef(pr); |
| 108 fBitmap.lockPixels(); |
99 } | 109 } |
100 | 110 |
101 SkImage_Raster::~SkImage_Raster() {} | 111 SkImage_Raster::~SkImage_Raster() {} |
102 | 112 |
103 void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPa
int* paint) { | 113 void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPa
int* paint) { |
104 canvas->drawBitmap(fBitmap, x, y, paint); | 114 canvas->drawBitmap(fBitmap, x, y, paint); |
105 } | 115 } |
106 | 116 |
107 void SkImage_Raster::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const
SkRect& dst, const SkPaint* paint) { | 117 void SkImage_Raster::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, |
| 118 const SkRect& dst, const SkPaint* paint) { |
108 canvas->drawBitmapRectToRect(fBitmap, src, dst, paint); | 119 canvas->drawBitmapRectToRect(fBitmap, src, dst, paint); |
109 } | 120 } |
110 | 121 |
| 122 bool SkImage_Raster::onReadPixels(SkBitmap* dst, const SkIRect& subset) const { |
| 123 if (dst->pixelRef()) { |
| 124 return this->INHERITED::onReadPixels(dst, subset); |
| 125 } else { |
| 126 SkBitmap src; |
| 127 if (!fBitmap.extractSubset(&src, subset)) { |
| 128 return false; |
| 129 } |
| 130 return src.copyTo(dst, src.config()); |
| 131 } |
| 132 } |
| 133 |
| 134 const void* SkImage_Raster::onPeekPixels(SkImageInfo* infoPtr, |
| 135 size_t* rowBytesPtr) const { |
| 136 SkImageInfo info; |
| 137 if (!fBitmap.asImageInfo(&info) || !fBitmap.getPixels()) { |
| 138 return false; |
| 139 } |
| 140 *infoPtr = info; |
| 141 *rowBytesPtr = fBitmap.rowBytes(); |
| 142 return fBitmap.getPixels(); |
| 143 } |
| 144 |
111 bool SkImage_Raster::getROPixels(SkBitmap* dst) const { | 145 bool SkImage_Raster::getROPixels(SkBitmap* dst) const { |
112 *dst = fBitmap; | 146 *dst = fBitmap; |
113 return true; | 147 return true; |
114 } | 148 } |
115 | 149 |
116 /////////////////////////////////////////////////////////////////////////////// | 150 /////////////////////////////////////////////////////////////////////////////// |
117 | 151 |
118 SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, siz
e_t rowBytes) { | 152 SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, siz
e_t rowBytes) { |
119 if (!SkImage_Raster::ValidArgs(info, rowBytes)) { | 153 if (!SkImage_Raster::ValidArgs(info, rowBytes)) { |
120 return NULL; | 154 return NULL; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 189 } |
156 | 190 |
157 SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, | 191 SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, |
158 size_t rowBytes) { | 192 size_t rowBytes) { |
159 return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes)); | 193 return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes)); |
160 } | 194 } |
161 | 195 |
162 SkPixelRef* SkBitmapImageGetPixelRef(SkImage* image) { | 196 SkPixelRef* SkBitmapImageGetPixelRef(SkImage* image) { |
163 return ((SkImage_Raster*)image)->getPixelRef(); | 197 return ((SkImage_Raster*)image)->getPixelRef(); |
164 } | 198 } |
OLD | NEW |