OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkCGUtils.h" | 8 #include "SkCGUtils.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
224 CGColorSpaceRelease(cs); | 224 CGColorSpaceRelease(cs); |
225 | 225 |
226 if (ctx) { | 226 if (ctx) { |
227 CGContextDrawPDFPage(ctx, page); | 227 CGContextDrawPDFPage(ctx, page); |
228 CGContextRelease(ctx); | 228 CGContextRelease(ctx); |
229 } | 229 } |
230 | 230 |
231 output->swap(bitmap); | 231 output->swap(bitmap); |
232 return true; | 232 return true; |
233 } | 233 } |
234 | |
235 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
236 | |
237 SK_API bool SkCopyPixelsFromCGImage(const SkImageInfo& info, size_t rowBytes, vo id* pixels, | |
238 CGImageRef image) { | |
239 uint32_t cg_bitmap_info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipli edLast; | |
240 // TODO: update cg_bitmap_info based on colortype | |
241 switch (info.colorType()) { | |
242 case kRGB_565_SkColorType: | |
243 break; | |
244 case kRGBA_8888_SkColorType: | |
245 break; | |
246 case kBGRA_8888_SkColorType: | |
247 break; | |
248 default: | |
249 return false; // no other colortypes are supported (afaik) | |
250 } | |
251 | |
252 CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); | |
253 CGContextRef cg = CGBitmapContextCreate(pixels, info.width(), info.height(), 8, rowBytes, cs, | |
scroggo
2014/04/21 20:18:44
Isn't this 8 specific to 8888? If info.colorType()
reed1
2014/04/21 20:44:41
Yes. that is specfic, and so is the cg_bitmap_info
| |
254 cg_bitmap_info); | |
255 CFRelease(cs); | |
256 if (NULL == cg) { | |
257 return false; | |
258 } | |
259 | |
260 // use this blend mode, to avoid having to erase the pixels first, and to av oid CG performing | |
261 // any blending (which could introduce errors and be slower). | |
262 CGContextSetBlendMode(cg, kCGBlendModeCopy); | |
263 | |
264 CGContextDrawImage(cg, CGRectMake(0, 0, info.width(), info.height()), image) ; | |
265 CGContextRelease(cg); | |
266 return true; | |
267 } | |
268 | |
269 bool SkCreateBitmapFromCGImage(SkBitmap* dst, CGImageRef image, SkISize* scaleTo Fit) { | |
270 const int width = scaleToFit ? scaleToFit->width() : SkToInt(CGImageGetWidth (image)); | |
271 const int height = scaleToFit ? scaleToFit->height() : SkToInt(CGImageGetHei ght(image)); | |
272 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); | |
273 | |
274 SkBitmap tmp; | |
275 if (!tmp.allocPixels(info)) { | |
276 return false; | |
277 } | |
278 | |
279 if (!SkCopyPixelsFromCGImage(tmp.info(), tmp.rowBytes(), tmp.getPixels(), im age)) { | |
280 return false; | |
281 } | |
282 | |
283 CGImageAlphaInfo cgInfo = CGImageGetAlphaInfo(image); | |
scroggo
2014/04/21 20:18:44
I'm not a big fan of this duplicated code, if we c
reed1
2014/04/21 20:44:41
Working on it, but haven't seen how to share yet.
| |
284 switch (cgInfo) { | |
285 case kCGImageAlphaNone: | |
286 case kCGImageAlphaNoneSkipLast: | |
287 case kCGImageAlphaNoneSkipFirst: | |
288 SkASSERT(SkBitmap::ComputeIsOpaque(tmp)); | |
289 tmp.setAlphaType(kOpaque_SkAlphaType); | |
290 break; | |
291 default: | |
292 // we don't know if we're opaque or not, so compute it. | |
293 if (SkBitmap::ComputeIsOpaque(tmp)) { | |
294 tmp.setAlphaType(kOpaque_SkAlphaType); | |
295 } | |
296 } | |
297 | |
298 *dst = tmp; | |
299 return true; | |
300 } | |
301 | |
OLD | NEW |