1 /*
2  * Copyright 2013 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 #ifndef SkPdfTokenLooper_DEFINED
9 #define SkPdfTokenLooper_DEFINED
10 
11 #include "SkPdfNativeTokenizer.h"
12 // For SkPdfResult
13 #include "SkPdfUtils.h"
14 
15 class SkCanvas;
16 class SkPdfContext;
17 
18 /**
19  *  An object which reads tokens from a tokenizer and draws it to an SkCanvas.
20  *  FIXME (scroggo): Can this be an interface? See http://goo.gl/AXQtkH
21  */
22 class SkPdfTokenLooper {
23 public:
24     /**
25      *  Create a looper with no parent.
26      *  @param tokenizer SkPdfNativeTokenizer for reading tokens.
27      *  @param pdfContext Context for drawing state.
28      *  @param canvas Target SkCanvas for drawing.
29      */
SkPdfTokenLooper(SkPdfNativeTokenizer * tokenizer,SkPdfContext * pdfContext,SkCanvas * canvas)30     SkPdfTokenLooper(SkPdfNativeTokenizer* tokenizer,
31                      SkPdfContext* pdfContext,
32                      SkCanvas* canvas)
33         : fParent(NULL)
34         , fTokenizer(tokenizer)
35         , fPdfContext(pdfContext)
36         , fCanvas(canvas) {}
37 
38     /**
39      *  Create a looper as a child of parent. It will share the
40      *  SkPdfContext, SkPdfTokenizer, and SkCanvas with its parent.
41      */
SkPdfTokenLooper(SkPdfTokenLooper * parent)42     explicit SkPdfTokenLooper(SkPdfTokenLooper* parent)
43         : fParent(parent)
44         , fTokenizer(parent->fTokenizer)
45         , fPdfContext(parent->fPdfContext)
46         , fCanvas(parent->fCanvas) {}
47 
~SkPdfTokenLooper()48     virtual ~SkPdfTokenLooper() {}
49 
50     /**
51      *  Consume a token, and draw to fCanvas as directed.
52      */
53     virtual SkPdfResult consumeToken(PdfToken& token) = 0;
54 
55     /**
56      *  Consume all the tokens this looper can handle.
57      */
58     virtual void loop() = 0;
59 
60 protected:
61     // All are unowned pointers.
62     SkPdfTokenLooper*       fParent;
63     SkPdfNativeTokenizer*   fTokenizer;
64     SkPdfContext*           fPdfContext;
65     SkCanvas*               fCanvas;
66 };
67 
68 #endif // SkPdfTokenLooper_DEFINED
69