blob: 186c2286f2af98d93e01a805c369aa1fcddc8d92 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "SkPDFFormXObject.h"
#include "SkMatrix.h"
#include "SkPDFCatalog.h"
#include "SkPDFDevice.h"
#include "SkStream.h"
#include "SkTypes.h"
SkPDFFormXObject::SkPDFFormXObject(SkPDFDevice* device, const SkMatrix& matrix)
: fContent(device->content(false)),
fDevice(device) {
SkMemoryStream* stream_data = new SkMemoryStream(fContent.c_str(),
fContent.size());
SkAutoUnref stream_data_unref(stream_data);
fStream = new SkPDFStream(stream_data);
fStream->unref(); // SkRefPtr and new both took a reference.
insert("Type", new SkPDFName("XObject"))->unref();
insert("Subtype", new SkPDFName("Form"))->unref();
insert("BBox", device->getMediaBox().get());
insert("Resources", device->getResourceDict().get());
if (!matrix.isIdentity()) {
SkRefPtr<SkPDFArray> transformArray = new SkPDFArray();
transformArray->unref(); // SkRefPtr and new both took a reference.
transformArray->reserve(6);
SkScalar transform[6];
SkAssertResult(matrix.pdfTransform(transform));
for (size_t i = 0; i < SK_ARRAY_COUNT(transform); i++)
transformArray->append(new SkPDFScalar(transform[i]))->unref();
insert("Matrix", transformArray.get());
}
}
SkPDFFormXObject::~SkPDFFormXObject() {}
void SkPDFFormXObject::emitObject(SkWStream* stream, SkPDFCatalog* catalog,
bool indirect) {
if (indirect)
return emitIndirectObject(stream, catalog);
fStream->emitObject(stream, catalog, indirect);
}
size_t SkPDFFormXObject::getOutputSize(SkPDFCatalog* catalog, bool indirect) {
if (indirect)
return getIndirectOutputSize(catalog);
return fStream->getOutputSize(catalog, indirect);
}
void SkPDFFormXObject::getResources(SkTDArray<SkPDFObject*>* resourceList) {
fDevice->getResources(resourceList);
}
SkPDFObject* SkPDFFormXObject::insert(SkPDFName* key, SkPDFObject* value) {
return fStream->insert(key, value);
}
SkPDFObject* SkPDFFormXObject::insert(const char key[], SkPDFObject* value) {
return fStream->insert(key, value);
}