blob: 6c3faef250f80bb4e16c21d8653b5715a4264a70 [file] [log] [blame]
fmalita1dedc3d2015-08-04 13:53:14 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkImageGenerator.h"
9
10#include "SkCanvas.h"
11#include "SkMatrix.h"
12#include "SkPaint.h"
13#include "SkPicture.h"
bungemand3ebb482015-08-05 13:57:49 -070014#include "SkTLazy.h"
fmalita1dedc3d2015-08-04 13:53:14 -070015
16class SkPictureImageGenerator : SkImageGenerator {
17public:
18 static SkImageGenerator* Create(const SkISize&, const SkPicture*, const SkMatrix*,
19 const SkPaint*);
20
21protected:
22 bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[],
23 int* ctableCount) override;
24
25private:
26 SkPictureImageGenerator(const SkISize&, const SkPicture*, const SkMatrix*, const SkPaint*);
27
28 SkAutoTUnref<const SkPicture> fPicture;
29 SkMatrix fMatrix;
30 SkTLazy<SkPaint> fPaint;
31
32 typedef SkImageGenerator INHERITED;
33};
34
35SkImageGenerator* SkPictureImageGenerator::Create(const SkISize& size, const SkPicture* picture,
36 const SkMatrix* matrix, const SkPaint* paint) {
37 if (!picture || size.isEmpty()) {
38 return nullptr;
39 }
40
41 return SkNEW_ARGS(SkPictureImageGenerator, (size, picture, matrix, paint));
42}
43
44SkPictureImageGenerator::SkPictureImageGenerator(const SkISize& size, const SkPicture* picture,
45 const SkMatrix* matrix, const SkPaint* paint)
46 : INHERITED(SkImageInfo::MakeN32Premul(size))
47 , fPicture(SkRef(picture)) {
48
49 if (matrix) {
50 fMatrix = *matrix;
51 } else {
52 fMatrix.reset();
53 }
54
55 if (paint) {
56 fPaint.set(*paint);
57 }
58}
59
60bool SkPictureImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
61 SkPMColor ctable[], int* ctableCount) {
62 if (info != getInfo() || ctable || ctableCount) {
63 return false;
64 }
65
66 SkBitmap bitmap;
67 if (!bitmap.installPixels(info, pixels, rowBytes)) {
68 return false;
69 }
70
71 bitmap.eraseColor(SK_ColorTRANSPARENT);
72 SkCanvas canvas(bitmap, SkSurfaceProps(0, kUnknown_SkPixelGeometry));
73 canvas.drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull());
74
75 return true;
76}
77
78SkImageGenerator* SkImageGenerator::NewFromPicture(const SkISize& size, const SkPicture* picture,
79 const SkMatrix* matrix, const SkPaint* paint) {
80 return SkPictureImageGenerator::Create(size, picture, matrix, paint);
81}