1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_UTILITY_CLOUD_PRINT_PWG_ENCODER_H_
6#define CHROME_UTILITY_CLOUD_PRINT_PWG_ENCODER_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11
12namespace cloud_print {
13
14class BitmapImage;
15
16struct PwgHeaderInfo {
17  PwgHeaderInfo()
18      : dpi(300),
19        total_pages(1),
20        flipx(false),
21        flipy(false),
22        color_space(SRGB),
23        duplex(false),
24        tumble(false) {}
25  enum ColorSpace { SGRAY = 18, SRGB = 19 };
26  uint32 dpi;
27  uint32 total_pages;
28  bool flipx;
29  bool flipy;
30  ColorSpace color_space;
31  bool duplex;
32  bool tumble;
33};
34
35class PwgEncoder {
36 public:
37  PwgEncoder();
38
39  void EncodeDocumentHeader(std::string *output) const;
40  bool EncodePage(const BitmapImage& image,
41                  const PwgHeaderInfo& pwg_header_info,
42                  std::string* output) const;
43
44 private:
45  void EncodePageHeader(const BitmapImage& image,
46                        const PwgHeaderInfo& pwg_header_info,
47                        std::string* output) const;
48
49  template <typename InputStruct, class RandomAccessIterator>
50  void EncodeRow(RandomAccessIterator pos,
51                 RandomAccessIterator row_end,
52                 bool monochrome,
53                 std::string* output) const;
54
55  template <typename InputStruct>
56  bool EncodePageWithColorspace(const BitmapImage& image,
57                                const PwgHeaderInfo& pwg_header_info,
58                                std::string* output) const;
59
60  const uint8* GetRow(const BitmapImage& image, int row, bool flipy) const;
61};
62
63}  // namespace cloud_print
64
65#endif  // CHROME_UTILITY_CLOUD_PRINT_PWG_ENCODER_H_
66