19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h>
19fa9e7c05c7be6891a6cf85a11dc635a6e6853078Christopher Tate#include <sys/socket.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <core/SkCanvas.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <core/SkDevice.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <core/SkPaint.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SkGLCanvas.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
28fa9e7c05c7be6891a6cf85a11dc635a6e6853078Christopher Tate#include <nativehelper/JNIHelp.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int gPrevDur;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_view_ViewRoot_showFPS(JNIEnv* env, jobject, jobject jcanvas,
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                          jint dur) {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NPE_CHECK_RETURN_VOID(env, jcanvas);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, jcanvas);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const SkBitmap& bm = canvas->getDevice()->accessBitmap(false);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int height = bm.height();
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkScalar bot = SkIntToScalar(height);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (height < 200) {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkMatrix m;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkRect   r;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkPaint  p;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char    str[4];
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dur = (gPrevDur + dur) >> 1;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gPrevDur = dur;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dur = 1000 / dur;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    str[3] = (char)('0' + dur % 10); dur /= 10;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    str[2] = (char)('0' + dur % 10); dur /= 10;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    str[1] = (char)('0' + dur % 10); dur /= 10;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    str[0] = (char)('0' + dur % 10);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    m.reset();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    r.set(0, bot-SkIntToScalar(10), SkIntToScalar(26), bot);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    p.setAntiAlias(true);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    p.setTextSize(SkIntToScalar(10));
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas->save();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas->setMatrix(m);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas->clipRect(r, SkRegion::kReplace_Op);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    p.setColor(SK_ColorWHITE);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas->drawPaint(p);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    p.setColor(SK_ColorBLACK);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas->drawText(str, 4, SkIntToScalar(1), bot - SK_Scalar1, p);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    canvas->restore();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_view_ViewRoot_abandonGlCaches(JNIEnv* env, jobject) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkGLCanvas::AbandonAllTextures();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83fa9e7c05c7be6891a6cf85a11dc635a6e6853078Christopher Tate
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kClassPathName = "android/view/ViewRoot";
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {   "nativeShowFPS", "(Landroid/graphics/Canvas;I)V",
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        (void*)android_view_ViewRoot_showFPS },
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {   "nativeAbandonGlCaches", "()V",
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                                (void*)android_view_ViewRoot_abandonGlCaches }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_view_ViewRoot(JNIEnv* env) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kClassPathName, gMethods, NELEM(gMethods));
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
102