1bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com/*
2bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com * Copyright 2013 Google Inc.
3bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com *
4bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com * Use of this source code is governed by a BSD-style license that can be
5bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com * found in the LICENSE file.
6bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com */
7bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com
8bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com#ifndef SkPdfTokenLooper_DEFINED
9bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com#define SkPdfTokenLooper_DEFINED
10bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com
11248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.com#include "SkPdfNativeTokenizer.h"
12248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.com// For SkPdfResult
13248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.com#include "SkPdfUtils.h"
14248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.com
15bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.comclass SkCanvas;
16bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.comclass SkPdfContext;
17bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com
1836026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com/**
1936026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com *  An object which reads tokens from a tokenizer and draws it to an SkCanvas.
2036026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com *  FIXME (scroggo): Can this be an interface? See http://goo.gl/AXQtkH
2136026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com */
22248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.comclass SkPdfTokenLooper {
23bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.compublic:
2436026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    /**
2536026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  Create a looper with no parent.
2636026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  @param tokenizer SkPdfNativeTokenizer for reading tokens.
2736026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  @param pdfContext Context for drawing state.
2836026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  @param canvas Target SkCanvas for drawing.
2936026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     */
3036026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    SkPdfTokenLooper(SkPdfNativeTokenizer* tokenizer,
3136026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com                     SkPdfContext* pdfContext,
3236026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com                     SkCanvas* canvas)
3336026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        : fParent(NULL)
3436026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        , fTokenizer(tokenizer)
3536026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        , fPdfContext(pdfContext)
3636026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        , fCanvas(canvas) {}
3736026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com
3836026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    /**
3936026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  Create a looper as a child of parent. It will share the
4036026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  SkPdfContext, SkPdfTokenizer, and SkCanvas with its parent.
4136026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     */
4236026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    explicit SkPdfTokenLooper(SkPdfTokenLooper* parent)
4336026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        : fParent(parent)
4436026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        , fTokenizer(parent->fTokenizer)
4536026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        , fPdfContext(parent->fPdfContext)
4636026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com        , fCanvas(parent->fCanvas) {}
47bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com
48248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.com    virtual ~SkPdfTokenLooper() {}
49bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com
5036026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    /**
5136026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  Consume a token, and draw to fCanvas as directed.
5236026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     */
53bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com    virtual SkPdfResult consumeToken(PdfToken& token) = 0;
5436026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com
5536026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    /**
5636026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     *  Consume all the tokens this looper can handle.
5736026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com     */
58bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com    virtual void loop() = 0;
59bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com
6036026de64400cbe91552c549cf9a906a0926fef3scroggo@google.comprotected:
6136026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    // All are unowned pointers.
6236026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    SkPdfTokenLooper*       fParent;
6336026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    SkPdfNativeTokenizer*   fTokenizer;
6436026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    SkPdfContext*           fPdfContext;
6536026de64400cbe91552c549cf9a906a0926fef3scroggo@google.com    SkCanvas*               fCanvas;
66bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com};
67248647cebb3724fd2ce1d41745afb786516af4f8scroggo@google.com
68bf6426120a8a9a034f37d37feaf942b1386b7a84scroggo@google.com#endif // SkPdfTokenLooper_DEFINED
69