1 /*
2  * Copyright 2016 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 "SkLatticeIter.h"
9 #include "SkPDFCanvas.h"
10 #include "SkPDFDevice.h"
11 
SkPDFCanvas(const sk_sp<SkPDFDevice> & dev)12 SkPDFCanvas::SkPDFCanvas(const sk_sp<SkPDFDevice>& dev)
13     : SkCanvas(dev.get()) {}
14 
~SkPDFCanvas()15 SkPDFCanvas::~SkPDFCanvas() {}
16 
17 /*
18  *  PDF's impl sometimes wants to access the raster clip as a SkRegion. To keep this valid,
19  *  we intercept all clip calls to ensure that the clip stays BW (i.e. never antialiased), since
20  *  an antialiased clip won't build a SkRegion (it builds SkAAClip).
21  */
onClipRect(const SkRect & rect,SkClipOp op,ClipEdgeStyle edgeStyle)22 void SkPDFCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) {
23     this->INHERITED::onClipRect(rect, op, kHard_ClipEdgeStyle);
24 }
25 
onClipRRect(const SkRRect & rrect,SkClipOp op,ClipEdgeStyle edgeStyle)26 void SkPDFCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) {
27     this->INHERITED::onClipRRect(rrect, op, kHard_ClipEdgeStyle);
28 }
29 
onClipPath(const SkPath & path,SkClipOp op,ClipEdgeStyle edgeStyle)30 void SkPDFCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) {
31     this->INHERITED::onClipPath(path, op, kHard_ClipEdgeStyle);
32 }
33 
onDrawBitmapNine(const SkBitmap & bitmap,const SkIRect & center,const SkRect & dst,const SkPaint * paint)34 void SkPDFCanvas::onDrawBitmapNine(const SkBitmap& bitmap,
35                                    const SkIRect& center,
36                                    const SkRect& dst,
37                                    const SkPaint* paint) {
38     SkLatticeIter iter(bitmap.width(), bitmap.height(), center, dst);
39     SkRect srcR, dstR;
40     while (iter.next(&srcR, &dstR)) {
41         this->drawBitmapRect(bitmap, srcR, dstR, paint);
42     }
43 }
44 
onDrawImageNine(const SkImage * image,const SkIRect & center,const SkRect & dst,const SkPaint * paint)45 void SkPDFCanvas::onDrawImageNine(const SkImage* image,
46                                   const SkIRect& center,
47                                   const SkRect& dst,
48                      const SkPaint* paint) {
49     SkLatticeIter iter(image->width(), image->height(), center, dst);
50     SkRect srcR, dstR;
51     while (iter.next(&srcR, &dstR)) {
52         this->drawImageRect(image, srcR, dstR, paint);
53     }
54 }
55 
onDrawImageRect(const SkImage * image,const SkRect * src,const SkRect & dst,const SkPaint * paint,SkCanvas::SrcRectConstraint constraint)56 void SkPDFCanvas::onDrawImageRect(const SkImage* image,
57                                   const SkRect* src,
58                                   const SkRect& dst,
59                                   const SkPaint* paint,
60                                   SkCanvas::SrcRectConstraint constraint) {
61     SkAutoCanvasRestore autoCanvasRestore(this, true);
62     this->clipRect(dst);
63     this->SkCanvas::onDrawImageRect(image, src, dst, paint, constraint);
64 }
65 
onDrawBitmapRect(const SkBitmap & bitmap,const SkRect * src,const SkRect & dst,const SkPaint * paint,SkCanvas::SrcRectConstraint constraint)66 void SkPDFCanvas::onDrawBitmapRect(const SkBitmap& bitmap,
67                                    const SkRect* src,
68                                    const SkRect& dst,
69                                    const SkPaint* paint,
70                                    SkCanvas::SrcRectConstraint constraint) {
71     SkAutoCanvasRestore autoCanvasRestore(this, true);
72     this->clipRect(dst);
73     this->SkCanvas::onDrawBitmapRect(bitmap, src, dst, paint, constraint);
74 }
75 
onDrawImageLattice(const SkImage * image,const Lattice & lattice,const SkRect & dst,const SkPaint * paint)76 void SkPDFCanvas::onDrawImageLattice(const SkImage* image,
77                                      const Lattice& lattice,
78                                      const SkRect& dst,
79                                      const SkPaint* paint) {
80     SkLatticeIter iter(lattice, dst);
81     SkRect srcR, dstR;
82     while (iter.next(&srcR, &dstR)) {
83         this->drawImageRect(image, srcR, dstR, paint);
84     }
85 }
86 
onDrawBitmapLattice(const SkBitmap & bitmap,const Lattice & lattice,const SkRect & dst,const SkPaint * paint)87 void SkPDFCanvas::onDrawBitmapLattice(const SkBitmap& bitmap,
88                                       const Lattice& lattice,
89                                       const SkRect& dst,
90                                       const SkPaint* paint) {
91     SkLatticeIter iter(lattice, dst);
92     SkRect srcR, dstR;
93     while (iter.next(&srcR, &dstR)) {
94         this->drawBitmapRect(bitmap, srcR, dstR, paint);
95     }
96 }
97 
98