| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkColorPriv.h" | 8 #include "SkColorPriv.h" |
| 9 #include "SkData.h" | 9 #include "SkData.h" |
| 10 #include "SkDeflate.h" | 10 #include "SkDeflate.h" |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 //////////////////////////////////////////////////////////////////////////////// | 242 //////////////////////////////////////////////////////////////////////////////// |
| 243 | 243 |
| 244 namespace { | 244 namespace { |
| 245 // This SkPDFObject only outputs the alpha layer of the given bitmap. | 245 // This SkPDFObject only outputs the alpha layer of the given bitmap. |
| 246 class PDFAlphaBitmap : public SkPDFObject { | 246 class PDFAlphaBitmap : public SkPDFObject { |
| 247 public: | 247 public: |
| 248 PDFAlphaBitmap(const SkBitmap& bm) : fBitmap(bm) {} | 248 PDFAlphaBitmap(const SkBitmap& bm) : fBitmap(bm) {} |
| 249 ~PDFAlphaBitmap() {} | 249 ~PDFAlphaBitmap() {} |
| 250 void emitObject(SkWStream*, | 250 void emitObject(SkWStream*, |
| 251 const SkPDFObjNumMap&, | 251 const SkPDFObjNumMap&, |
| 252 const SkPDFSubstituteMap&) override; | 252 const SkPDFSubstituteMap&) const override; |
| 253 | 253 |
| 254 private: | 254 private: |
| 255 const SkBitmap fBitmap; | 255 const SkBitmap fBitmap; |
| 256 }; | 256 }; |
| 257 | 257 |
| 258 void PDFAlphaBitmap::emitObject(SkWStream* stream, | 258 void PDFAlphaBitmap::emitObject(SkWStream* stream, |
| 259 const SkPDFObjNumMap& objNumMap, | 259 const SkPDFObjNumMap& objNumMap, |
| 260 const SkPDFSubstituteMap& substitutes) { | 260 const SkPDFSubstituteMap& substitutes) const { |
| 261 SkAutoLockPixels autoLockPixels(fBitmap); | 261 SkAutoLockPixels autoLockPixels(fBitmap); |
| 262 SkASSERT(fBitmap.colorType() != kIndex_8_SkColorType || | 262 SkASSERT(fBitmap.colorType() != kIndex_8_SkColorType || |
| 263 fBitmap.getColorTable()); | 263 fBitmap.getColorTable()); |
| 264 | 264 |
| 265 // Write to a temporary buffer to get the compressed length. | 265 // Write to a temporary buffer to get the compressed length. |
| 266 SkDynamicMemoryWStream buffer; | 266 SkDynamicMemoryWStream buffer; |
| 267 SkDeflateWStream deflateWStream(&buffer); | 267 SkDeflateWStream deflateWStream(&buffer); |
| 268 bitmap_alpha_to_a8(fBitmap, &deflateWStream); | 268 bitmap_alpha_to_a8(fBitmap, &deflateWStream); |
| 269 deflateWStream.finalize(); // call before detachAsStream(). | 269 deflateWStream.finalize(); // call before detachAsStream(). |
| 270 SkAutoTDelete<SkStreamAsset> asset(buffer.detachAsStream()); | 270 SkAutoTDelete<SkStreamAsset> asset(buffer.detachAsStream()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 286 } // namespace | 286 } // namespace |
| 287 | 287 |
| 288 //////////////////////////////////////////////////////////////////////////////// | 288 //////////////////////////////////////////////////////////////////////////////// |
| 289 | 289 |
| 290 namespace { | 290 namespace { |
| 291 class PDFDefaultBitmap : public SkPDFBitmap { | 291 class PDFDefaultBitmap : public SkPDFBitmap { |
| 292 public: | 292 public: |
| 293 const SkAutoTUnref<SkPDFObject> fSMask; | 293 const SkAutoTUnref<SkPDFObject> fSMask; |
| 294 void emitObject(SkWStream*, | 294 void emitObject(SkWStream*, |
| 295 const SkPDFObjNumMap&, | 295 const SkPDFObjNumMap&, |
| 296 const SkPDFSubstituteMap&) override; | 296 const SkPDFSubstituteMap&) const override; |
| 297 void addResources(SkPDFObjNumMap*, | 297 void addResources(SkPDFObjNumMap*, |
| 298 const SkPDFSubstituteMap&) const override; | 298 const SkPDFSubstituteMap&) const override; |
| 299 PDFDefaultBitmap(const SkBitmap& bm, SkPDFObject* smask) | 299 PDFDefaultBitmap(const SkBitmap& bm, SkPDFObject* smask) |
| 300 : SkPDFBitmap(bm), fSMask(smask) {} | 300 : SkPDFBitmap(bm), fSMask(smask) {} |
| 301 }; | 301 }; |
| 302 } // namespace | 302 } // namespace |
| 303 | 303 |
| 304 void PDFDefaultBitmap::addResources( | 304 void PDFDefaultBitmap::addResources( |
| 305 SkPDFObjNumMap* catalog, | 305 SkPDFObjNumMap* catalog, |
| 306 const SkPDFSubstituteMap& substitutes) const { | 306 const SkPDFSubstituteMap& substitutes) const { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 pmcolor_to_rgb24(colors[i], tablePtr); | 338 pmcolor_to_rgb24(colors[i], tablePtr); |
| 339 tablePtr += 3; | 339 tablePtr += 3; |
| 340 } | 340 } |
| 341 SkString tableString(tableArray, 3 * table->count()); | 341 SkString tableString(tableArray, 3 * table->count()); |
| 342 result->appendString(tableString); | 342 result->appendString(tableString); |
| 343 return result; | 343 return result; |
| 344 } | 344 } |
| 345 | 345 |
| 346 void PDFDefaultBitmap::emitObject(SkWStream* stream, | 346 void PDFDefaultBitmap::emitObject(SkWStream* stream, |
| 347 const SkPDFObjNumMap& objNumMap, | 347 const SkPDFObjNumMap& objNumMap, |
| 348 const SkPDFSubstituteMap& substitutes) { | 348 const SkPDFSubstituteMap& substitutes) const { |
| 349 SkAutoLockPixels autoLockPixels(fBitmap); | 349 SkAutoLockPixels autoLockPixels(fBitmap); |
| 350 SkASSERT(fBitmap.colorType() != kIndex_8_SkColorType || | 350 SkASSERT(fBitmap.colorType() != kIndex_8_SkColorType || |
| 351 fBitmap.getColorTable()); | 351 fBitmap.getColorTable()); |
| 352 | 352 |
| 353 // Write to a temporary buffer to get the compressed length. | 353 // Write to a temporary buffer to get the compressed length. |
| 354 SkDynamicMemoryWStream buffer; | 354 SkDynamicMemoryWStream buffer; |
| 355 SkDeflateWStream deflateWStream(&buffer); | 355 SkDeflateWStream deflateWStream(&buffer); |
| 356 bitmap_to_pdf_pixels(fBitmap, &deflateWStream); | 356 bitmap_to_pdf_pixels(fBitmap, &deflateWStream); |
| 357 deflateWStream.finalize(); // call before detachAsStream(). | 357 deflateWStream.finalize(); // call before detachAsStream(). |
| 358 SkAutoTDelete<SkStreamAsset> asset(buffer.detachAsStream()); | 358 SkAutoTDelete<SkStreamAsset> asset(buffer.detachAsStream()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 * Jpeg-encoded data that can be directly embedded into a PDF. | 400 * Jpeg-encoded data that can be directly embedded into a PDF. |
| 401 */ | 401 */ |
| 402 class PDFJpegBitmap : public SkPDFBitmap { | 402 class PDFJpegBitmap : public SkPDFBitmap { |
| 403 public: | 403 public: |
| 404 SkAutoTUnref<SkData> fData; | 404 SkAutoTUnref<SkData> fData; |
| 405 bool fIsYUV; | 405 bool fIsYUV; |
| 406 PDFJpegBitmap(const SkBitmap& bm, SkData* data, bool isYUV) | 406 PDFJpegBitmap(const SkBitmap& bm, SkData* data, bool isYUV) |
| 407 : SkPDFBitmap(bm), fData(SkRef(data)), fIsYUV(isYUV) {} | 407 : SkPDFBitmap(bm), fData(SkRef(data)), fIsYUV(isYUV) {} |
| 408 void emitObject(SkWStream*, | 408 void emitObject(SkWStream*, |
| 409 const SkPDFObjNumMap&, | 409 const SkPDFObjNumMap&, |
| 410 const SkPDFSubstituteMap&) override; | 410 const SkPDFSubstituteMap&) const override; |
| 411 }; | 411 }; |
| 412 | 412 |
| 413 void PDFJpegBitmap::emitObject(SkWStream* stream, | 413 void PDFJpegBitmap::emitObject(SkWStream* stream, |
| 414 const SkPDFObjNumMap& objNumMap, | 414 const SkPDFObjNumMap& objNumMap, |
| 415 const SkPDFSubstituteMap& substituteMap) { | 415 const SkPDFSubstituteMap& substituteMap) const { |
| 416 SkPDFDict pdfDict("XObject"); | 416 SkPDFDict pdfDict("XObject"); |
| 417 pdfDict.insertName("Subtype", "Image"); | 417 pdfDict.insertName("Subtype", "Image"); |
| 418 pdfDict.insertInt("Width", fBitmap.width()); | 418 pdfDict.insertInt("Width", fBitmap.width()); |
| 419 pdfDict.insertInt("Height", fBitmap.height()); | 419 pdfDict.insertInt("Height", fBitmap.height()); |
| 420 if (fIsYUV) { | 420 if (fIsYUV) { |
| 421 pdfDict.insertName("ColorSpace", "DeviceRGB"); | 421 pdfDict.insertName("ColorSpace", "DeviceRGB"); |
| 422 } else { | 422 } else { |
| 423 pdfDict.insertName("ColorSpace", "DeviceGray"); | 423 pdfDict.insertName("ColorSpace", "DeviceGray"); |
| 424 } | 424 } |
| 425 pdfDict.insertInt("BitsPerComponent", 8); | 425 pdfDict.insertInt("BitsPerComponent", 8); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 } | 464 } |
| 465 | 465 |
| 466 SkPDFObject* smask = NULL; | 466 SkPDFObject* smask = NULL; |
| 467 if (!bm.isOpaque() && !SkBitmap::ComputeIsOpaque(bm)) { | 467 if (!bm.isOpaque() && !SkBitmap::ComputeIsOpaque(bm)) { |
| 468 smask = SkNEW_ARGS(PDFAlphaBitmap, (bm)); | 468 smask = SkNEW_ARGS(PDFAlphaBitmap, (bm)); |
| 469 } | 469 } |
| 470 SkPDFBitmap* pdfBitmap = SkNEW_ARGS(PDFDefaultBitmap, (bm, smask)); | 470 SkPDFBitmap* pdfBitmap = SkNEW_ARGS(PDFDefaultBitmap, (bm, smask)); |
| 471 canon->addBitmap(pdfBitmap); | 471 canon->addBitmap(pdfBitmap); |
| 472 return pdfBitmap; | 472 return pdfBitmap; |
| 473 } | 473 } |
| OLD | NEW |