PdfDocument.cpp revision ff4adde5737be08d3e2d03fbe588c591d27d4a74
1ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov/* 2ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * Copyright (C) 2013 The Android Open Source Project 3ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * 4ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 5ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * you may not use this file except in compliance with the License. 6ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * You may obtain a copy of the License at 7ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * 8ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 9ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * 10ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software 11ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 12ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * See the License for the specific language governing permissions and 14ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * limitations under the License. 15ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov */ 16ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 17ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "jni.h" 18ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "GraphicsJNI.h" 19ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include <android_runtime/AndroidRuntime.h> 20ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 21ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "SkCanvas.h" 22ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "SkPDFDevice.h" 23ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "SkPDFDocument.h" 24ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "SkRect.h" 25ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "SkSize.h" 26ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov#include "CreateJavaOutputStreamAdaptor.h" 27ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 28ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovnamespace android { 29ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 30ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovstatic jint nativeCreateDocument(JNIEnv* env, jobject clazz) { 31ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov return reinterpret_cast<jint>(new SkPDFDocument()); 32ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov} 33ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 34ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovstatic void nativeFinalize(JNIEnv* env, jobject thiz, jint documentPtr) { 35ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov delete reinterpret_cast<SkPDFDocument*>(documentPtr); 36ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov} 37ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 38ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovstatic jint nativeCreatePage(JNIEnv* env, jobject thiz, 39ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov jobject pageSize, jobject contentSize, jint initialTransformation) { 40ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkIRect skPageSizeRect; 41ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov GraphicsJNI::jrect_to_irect(env, pageSize, &skPageSizeRect); 42ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkISize skPageSize = SkISize::Make(skPageSizeRect.width(), 43ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov skPageSizeRect.height()); 44ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 45ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkIRect skContentRect; 46ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov GraphicsJNI::jrect_to_irect(env, contentSize, &skContentRect); 47ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkISize skContentSize = SkISize::Make(skContentRect.width(), 48ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov skContentRect.height()); 49ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 50ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkMatrix* transformation = reinterpret_cast<SkMatrix*>(initialTransformation); 51ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkPDFDevice* skPdfDevice = new SkPDFDevice(skPageSize, skContentSize, *transformation); 52ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 53ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov return reinterpret_cast<jint>(new SkCanvas(skPdfDevice)); 54ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov} 55ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 56ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovstatic void nativeAppendPage(JNIEnv* env, jobject thiz, jint documentPtr, jint pagePtr) { 57ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkCanvas* page = reinterpret_cast<SkCanvas*>(pagePtr); 58ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkPDFDocument* document = reinterpret_cast<SkPDFDocument*>(documentPtr); 59ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkPDFDevice* device = static_cast<SkPDFDevice*>(page->getDevice()); 60ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov document->appendPage(device); 61ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov} 62ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 63ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovstatic void nativeWriteTo(JNIEnv* env, jobject clazz, jint documentPtr, 64ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov jobject out, jbyteArray chunk) { 65ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkWStream* skWStream = CreateJavaOutputStreamAdaptor(env, out, chunk); 66ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov SkPDFDocument* document = reinterpret_cast<SkPDFDocument*>(documentPtr); 67ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov document->emitPDF(skWStream); 68ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov delete skWStream; 69ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov} 70ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 71ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovstatic JNINativeMethod gPdfDocument_Methods[] = { 72ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov {"nativeCreateDocument", "()I", (void*) nativeCreateDocument}, 73ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov {"nativeFinalize", "(I)V", (void*) nativeFinalize}, 74ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov {"nativeCreatePage", "(Landroid/graphics/Rect;Landroid/graphics/Rect;I)I", 75ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov (void*) nativeCreatePage}, 76ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov {"nativeAppendPage", "(II)V", (void*) nativeAppendPage}, 77ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov {"nativeWriteTo", "(ILjava/io/OutputStream;[B)V", (void*) nativeWriteTo} 78ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov}; 79ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 80ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganovint register_android_print_pdf_PdfDocument(JNIEnv* env) { 81ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov int result = android::AndroidRuntime::registerNativeMethods( 82ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov env, "android/print/pdf/PdfDocument", gPdfDocument_Methods, 83ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov NELEM(gPdfDocument_Methods)); 84ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov return result; 85ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov} 86ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 87ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov}; 88