| // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef PRINTING_PDF_PS_METAFILE_LINUX_H_ |
| #define PRINTING_PDF_PS_METAFILE_LINUX_H_ |
| |
| #include <string> |
| |
| #include "base/basictypes.h" |
| |
| typedef struct _cairo_surface cairo_surface_t; |
| typedef struct _cairo cairo_t; |
| |
| namespace base { |
| class FileDescriptor; |
| } |
| |
| class FilePath; |
| |
| namespace printing { |
| |
| // This class uses Cairo graphics library to generate PostScript/PDF stream |
| // and stores rendering results in a string buffer. |
| class PdfPsMetafile { |
| public: |
| enum FileFormat { |
| PDF, |
| PS, |
| }; |
| |
| // In the renderer process, callers should also call Init(void) to see if the |
| // metafile can obtain all necessary rendering resources. |
| // In the browser process, callers should also call Init(const void*, size_t) |
| // to initialize the buffer |all_pages_| to use SaveTo(). |
| explicit PdfPsMetafile(const FileFormat& format); |
| |
| ~PdfPsMetafile(); |
| |
| // Initializes to a fresh new metafile. Returns true on success. |
| // Note: Only call in the renderer to allocate rendering resources. |
| bool Init(); |
| |
| // Initializes a copy of metafile from PDF/PS stream data. |
| // Returns true on success. |
| // |src_buffer| should point to the shared memory which stores PDF/PS |
| // contents generated in the renderer. |
| // Note: Only call in the browser to initialize |all_pages_|. |
| bool Init(const void* src_buffer, size_t src_buffer_size); |
| |
| FileFormat GetFileFormat() const { return format_; } |
| |
| // Prepares a new cairo surface/context for rendering a new page. |
| // The unit is in point (=1/72 in). |
| // Returns NULL when failed. |
| cairo_t* StartPage(double width, double height); |
| |
| // Destroys the surface and the context used in rendering current page. |
| // The results of current page will be appended into buffer |all_pages_|. |
| // Returns true on success |
| // TODO(myhuang): I plan to also do page setup here (margins, the header |
| // and the footer). At this moment, only pre-defined margins for US letter |
| // paper are hard-coded here. |
| // |shrink| decides the scaling factor to fit raw printing results into |
| // printable area. |
| bool FinishPage(float shrink); |
| |
| // Closes resulting PDF/PS file. No further rendering is allowed. |
| void Close(); |
| |
| // Selects the font associated with |font_id| in |context|. |
| // Return true on success. |
| static bool SelectFontById(cairo_t* context, uint32_t font_id); |
| |
| // Returns size of PDF/PS contents stored in buffer |all_pages_|. |
| // This function should ONLY be called after PDF/PS file is closed. |
| unsigned int GetDataSize() const; |
| |
| // Copies PDF/PS contents stored in buffer |all_pages_| into |dst_buffer|. |
| // This function should ONLY be called after PDF/PS file is closed. |
| // Returns true only when success. |
| bool GetData(void* dst_buffer, size_t dst_buffer_size) const; |
| |
| // Saves PDF/PS contents stored in buffer |all_pages_| into the file |
| // associated with |fd|. |
| // This function should ONLY be called after PDF/PS file is closed. |
| bool SaveTo(const base::FileDescriptor& fd) const; |
| |
| private: |
| // Cleans up all resources. |
| void CleanUpAll(); |
| |
| FileFormat format_; |
| |
| // Cairo surface and context for entire PDF/PS file. |
| cairo_surface_t* surface_; |
| cairo_t* context_; |
| |
| // Cairo surface and context for current page only. |
| cairo_surface_t* page_surface_; |
| cairo_t* page_context_; |
| |
| // Buffer stores PDF/PS contents for entire PDF/PS file. |
| std::string all_pages_; |
| |
| // Buffer stores PDF/PS contents for current page only. |
| std::string current_page_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PdfPsMetafile); |
| }; |
| |
| } // namespace printing |
| |
| #endif // PRINTING_PDF_PS_METAFILE_LINUX_H_ |