1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
29b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 The Android Open Source Project
49b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
79b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org */
89b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
109b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#ifndef SkPDFImage_DEFINED
119b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#define SkPDFImage_DEFINED
129b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
13608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org#include "SkPicture.h"
14d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com#include "SkPDFDevice.h"
15181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org#include "SkPDFStream.h"
169b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#include "SkPDFTypes.h"
179b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#include "SkRefCnt.h"
189b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
199b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkBitmap;
209b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFCatalog;
219db86bb9cd1b77be0afc504ccc07026e4282d7e7ctguil@chromium.orgstruct SkIRect;
229b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
239b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org/** \class SkPDFImage
249b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
259b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    An image XObject.
269b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org*/
279b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
289b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org// We could play the same trick here as is done in SkPDFGraphicState, storing
299b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org// a copy of the Bitmap object (not the pixels), the pixel generation number,
309b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org// and settings used from the paint to canonicalize image objects.
31181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.orgclass SkPDFImage : public SkPDFStream {
329b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgpublic:
331cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org    /** Create a new Image XObject to represent the passed bitmap.
341cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  @param bitmap   The image to encode.
351cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  @param srcRect  The rectangle to cut out of bitmap.
361cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  @param paint    Used to calculate alpha, masks, etc.
371cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  @return  The image XObject or NUll if there is nothing to draw for
381cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *           the given parameters.
399b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org     */
401cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org    static SkPDFImage* CreateImage(const SkBitmap& bitmap,
41d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com                                   const SkIRect& srcRect,
42608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org                                   SkPicture::EncodeBitmap encoder);
431cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org
449b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    virtual ~SkPDFImage();
459b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
46f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    /** Add a Soft Mask (alpha or shape channel) to the image.  Refs mask.
471cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  @param mask A gray scale image representing the mask.
48f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org     *  @return The mask argument is returned.
491cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     */
50f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    SkPDFImage* addSMask(SkPDFImage* mask);
511cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org
52181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    bool isEmpty() {
53181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org        return fSrcRect.isEmpty();
54181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    }
55181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org
569b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    // The SkPDFObject interface.
576addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com    virtual void getResources(const SkTSet<SkPDFObject*>& knownResourceObjects,
586addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com                              SkTSet<SkPDFObject*>* newResourceObjects);
591cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org
601cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.orgprivate:
61181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    SkBitmap fBitmap;
62181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    bool fIsAlpha;
63181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    SkIRect fSrcRect;
64608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org    SkPicture::EncodeBitmap fEncoder;
65181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    bool fStreamValid;
66181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org
671cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org    SkTDArray<SkPDFObject*> fResources;
681cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org
691cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org    /** Create a PDF image XObject. Entries for the image properties are
701cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  automatically added to the stream dictionary.
71181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *  @param stream     The image stream. May be NULL. Otherwise, this
72181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *                    (instead of the input bitmap) will be used as the
73181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *                    PDF's content stream, possibly with lossless encoding.
74181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *  @param bitmap     The image. If a stream is not given, its color data
75181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *                    will be used as the image. If a stream is given, this
76181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *                    is used for configuration only.
77181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *  @param isAlpha    Whether or not this is the alpha of an image.
781cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *  @param srcRect    The clipping applied to bitmap before generating
791cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     *                    imageData.
80181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *  @param encoder    A function used to encode the bitmap for compression.
81181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *                    May be NULL.
82181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     */
83181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    SkPDFImage(SkStream* stream, const SkBitmap& bitmap, bool isAlpha,
84608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org               const SkIRect& srcRect, SkPicture::EncodeBitmap encoder);
85181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org
86181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    /** Copy constructor, used to generate substitutes.
87181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org     *  @param image      The SkPDFImage to copy.
881cfa2c458626abe952a63b1a9397d8e496a134d6vandebo@chromium.org     */
89181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    SkPDFImage(SkPDFImage& pdfImage);
90181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org
91181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    // Populate the stream dictionary.  This method returns false if
92181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    // fSubstitute should be used.
93181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    virtual bool populate(SkPDFCatalog* catalog);
94181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org
95181fcb4a21cb87292eded6675a1df05cf9c3aacccommit-bot@chromium.org    typedef SkPDFStream INHERITED;
969b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org};
979b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
989b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org#endif
99