OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 The Android Open Source Project | 2 * Copyright 2010 The Android Open Source Project |
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 "SkPDFImage.h" | 8 #include "SkPDFImage.h" |
9 | 9 |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 const SkIRect& srcRect) { | 24 const SkIRect& srcRect) { |
25 switch (bitmap.colorType()) { | 25 switch (bitmap.colorType()) { |
26 case kIndex_8_SkColorType: | 26 case kIndex_8_SkColorType: |
27 return srcRect.width() * srcRect.height(); | 27 return srcRect.width() * srcRect.height(); |
28 case kARGB_4444_SkColorType: | 28 case kARGB_4444_SkColorType: |
29 return ((srcRect.width() * 3 + 1) / 2) * srcRect.height(); | 29 return ((srcRect.width() * 3 + 1) / 2) * srcRect.height(); |
30 case kRGB_565_SkColorType: | 30 case kRGB_565_SkColorType: |
31 return srcRect.width() * 3 * srcRect.height(); | 31 return srcRect.width() * 3 * srcRect.height(); |
32 case kRGBA_8888_SkColorType: | 32 case kRGBA_8888_SkColorType: |
33 case kBGRA_8888_SkColorType: | 33 case kBGRA_8888_SkColorType: |
| 34 case kGray_8_SkColorType: |
34 return srcRect.width() * 3 * srcRect.height(); | 35 return srcRect.width() * 3 * srcRect.height(); |
35 case kAlpha_8_SkColorType: | 36 case kAlpha_8_SkColorType: |
36 return 1; | 37 return 1; |
37 default: | 38 default: |
38 SkASSERT(false); | 39 SkASSERT(false); |
39 return 0; | 40 return 0; |
40 } | 41 } |
41 } | 42 } |
42 | 43 |
43 static SkStream* extract_index8_image(const SkBitmap& bitmap, | 44 static SkStream* extract_index8_image(const SkBitmap& bitmap, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 } | 107 } |
107 } | 108 } |
108 } | 109 } |
109 return stream; | 110 return stream; |
110 } | 111 } |
111 | 112 |
112 static SkStream* extract_rgb565_image(const SkBitmap& bitmap, | 113 static SkStream* extract_rgb565_image(const SkBitmap& bitmap, |
113 const SkIRect& srcRect) { | 114 const SkIRect& srcRect) { |
114 SkStream* stream = SkNEW_ARGS(SkMemoryStream, | 115 SkStream* stream = SkNEW_ARGS(SkMemoryStream, |
115 (get_uncompressed_size(bitmap, | 116 (get_uncompressed_size(bitmap, |
116 srcRect))); | 117 srcRect))); |
117 uint8_t* dst = (uint8_t*)stream->getMemoryBase(); | 118 uint8_t* dst = (uint8_t*)stream->getMemoryBase(); |
118 for (int y = srcRect.fTop; y < srcRect.fBottom; y++) { | 119 for (int y = srcRect.fTop; y < srcRect.fBottom; y++) { |
119 uint16_t* src = bitmap.getAddr16(0, y); | 120 uint16_t* src = bitmap.getAddr16(0, y); |
120 for (int x = srcRect.fLeft; x < srcRect.fRight; x++) { | 121 for (int x = srcRect.fLeft; x < srcRect.fRight; x++) { |
121 dst[0] = SkGetPackedR16(src[x]); | 122 dst[0] = SkGetPackedR16(src[x]); |
122 dst[1] = SkGetPackedG16(src[x]); | 123 dst[1] = SkGetPackedG16(src[x]); |
123 dst[2] = SkGetPackedB16(src[x]); | 124 dst[2] = SkGetPackedB16(src[x]); |
124 dst += 3; | 125 dst += 3; |
125 } | 126 } |
126 } | 127 } |
127 return stream; | 128 return stream; |
128 } | 129 } |
129 | 130 |
| 131 static SkStream* extract_gray8_image(const SkBitmap& bitmap, const SkIRect& srcR
ect) { |
| 132 SkStream* stream = SkNEW_ARGS(SkMemoryStream, |
| 133 (get_uncompressed_size(bitmap, srcRect))); |
| 134 uint8_t* dst = (uint8_t*)stream->getMemoryBase(); |
| 135 for (int y = srcRect.fTop; y < srcRect.fBottom; y++) { |
| 136 uint8_t* src = bitmap.getAddr8(0, y); |
| 137 for (int x = srcRect.fLeft; x < srcRect.fRight; x++) { |
| 138 dst[0] = dst[1] = dst[2] = src[x]; |
| 139 dst += 3; |
| 140 } |
| 141 } |
| 142 return stream; |
| 143 } |
| 144 |
130 static uint32_t get_argb8888_neighbor_avg_color(const SkBitmap& bitmap, | 145 static uint32_t get_argb8888_neighbor_avg_color(const SkBitmap& bitmap, |
131 int xOrig, | 146 int xOrig, |
132 int yOrig); | 147 int yOrig); |
133 | 148 |
134 static SkStream* extract_argb8888_data(const SkBitmap& bitmap, | 149 static SkStream* extract_argb8888_data(const SkBitmap& bitmap, |
135 const SkIRect& srcRect, | 150 const SkIRect& srcRect, |
136 bool extractAlpha, | 151 bool extractAlpha, |
137 bool* isOpaque, | 152 bool* isOpaque, |
138 bool* isTransparent) { | 153 bool* isTransparent) { |
139 size_t streamSize = extractAlpha ? srcRect.width() * srcRect.height() | 154 size_t streamSize = extractAlpha ? srcRect.width() * srcRect.height() |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 * extractAlpha == true. | 235 * extractAlpha == true. |
221 * @return Unencoded image data, or NULL if either data was not | 236 * @return Unencoded image data, or NULL if either data was not |
222 * available or alpha data was requested but the image was | 237 * available or alpha data was requested but the image was |
223 * entirely transparent or opaque. | 238 * entirely transparent or opaque. |
224 */ | 239 */ |
225 static SkStream* extract_image_data(const SkBitmap& bitmap, | 240 static SkStream* extract_image_data(const SkBitmap& bitmap, |
226 const SkIRect& srcRect, | 241 const SkIRect& srcRect, |
227 bool extractAlpha, bool* isTransparent) { | 242 bool extractAlpha, bool* isTransparent) { |
228 SkColorType colorType = bitmap.colorType(); | 243 SkColorType colorType = bitmap.colorType(); |
229 if (extractAlpha && (kIndex_8_SkColorType == colorType || | 244 if (extractAlpha && (kIndex_8_SkColorType == colorType || |
230 kRGB_565_SkColorType == colorType)) { | 245 kRGB_565_SkColorType == colorType || |
| 246 kGray_8_SkColorType == colorType)) { |
231 if (isTransparent != NULL) { | 247 if (isTransparent != NULL) { |
232 *isTransparent = false; | 248 *isTransparent = false; |
233 } | 249 } |
234 return NULL; | 250 return NULL; |
235 } | 251 } |
236 | 252 |
237 SkAutoLockPixels lock(bitmap); | 253 SkAutoLockPixels lock(bitmap); |
238 if (NULL == bitmap.getPixels()) { | 254 if (NULL == bitmap.getPixels()) { |
239 return NULL; | 255 return NULL; |
240 } | 256 } |
(...skipping 10 matching lines...) Expand all Loading... |
251 break; | 267 break; |
252 case kARGB_4444_SkColorType: | 268 case kARGB_4444_SkColorType: |
253 stream.reset(extract_argb4444_data(bitmap, srcRect, extractAlpha, | 269 stream.reset(extract_argb4444_data(bitmap, srcRect, extractAlpha, |
254 &isOpaque, &transparent)); | 270 &isOpaque, &transparent)); |
255 break; | 271 break; |
256 case kRGB_565_SkColorType: | 272 case kRGB_565_SkColorType: |
257 if (!extractAlpha) { | 273 if (!extractAlpha) { |
258 stream.reset(extract_rgb565_image(bitmap, srcRect)); | 274 stream.reset(extract_rgb565_image(bitmap, srcRect)); |
259 } | 275 } |
260 break; | 276 break; |
| 277 case kGray_8_SkColorType: |
| 278 if (!extractAlpha) { |
| 279 stream.reset(extract_gray8_image(bitmap, srcRect)); |
| 280 } |
| 281 break; |
261 case kN32_SkColorType: | 282 case kN32_SkColorType: |
262 stream.reset(extract_argb8888_data(bitmap, srcRect, extractAlpha, | 283 stream.reset(extract_argb8888_data(bitmap, srcRect, extractAlpha, |
263 &isOpaque, &transparent)); | 284 &isOpaque, &transparent)); |
264 break; | 285 break; |
265 case kAlpha_8_SkColorType: | 286 case kAlpha_8_SkColorType: |
266 if (!extractAlpha) { | 287 if (!extractAlpha) { |
267 stream.reset(create_black_image()); | 288 stream.reset(create_black_image()); |
268 } else { | 289 } else { |
269 stream.reset(extract_a8_alpha(bitmap, srcRect, | 290 stream.reset(extract_a8_alpha(bitmap, srcRect, |
270 &isOpaque, &transparent)); | 291 &isOpaque, &transparent)); |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 if (SkIRect::MakeWH(bitmap.width(), bitmap.height()) == subset) { | 718 if (SkIRect::MakeWH(bitmap.width(), bitmap.height()) == subset) { |
698 SkAutoTUnref<SkData> encodedData(ref_encoded_data(bitmap)); | 719 SkAutoTUnref<SkData> encodedData(ref_encoded_data(bitmap)); |
699 if (is_jfif_jpeg(encodedData)) { | 720 if (is_jfif_jpeg(encodedData)) { |
700 return SkNEW_ARGS(PDFJPEGImage, | 721 return SkNEW_ARGS(PDFJPEGImage, |
701 (encodedData, bitmap.width(), bitmap.height())); | 722 (encodedData, bitmap.width(), bitmap.height())); |
702 } | 723 } |
703 } | 724 } |
704 #endif | 725 #endif |
705 return SkPDFImage::CreateImage(bitmap, subset); | 726 return SkPDFImage::CreateImage(bitmap, subset); |
706 } | 727 } |
OLD | NEW |