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