11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <jni.h>
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <sys/time.h>
1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <time.h>
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <android/log.h>
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <stdint.h>
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrContext.h"
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkGpuCanvas.h"
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkPaint.h"
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkString.h"
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkTime.h"
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "gl/GrGLConfig.h"
2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic GrContext* make_context() {
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("---- before create\n");
240199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger    GrContext* ctx = GrContext::Create(GrGpu::kOpenGL_Shaders_Engine, 0);
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("---- after create %p\n", ctx);
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return ctx;
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid gr_run_unittests() {}
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "FlingState.h"
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTouchGesture.h"
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkView.h"
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertypedef SkView* (*SkViewFactory)();
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// these values must match those in Ganesh.java
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum TouchState {
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kUnknown_TouchState,
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDown_TouchState,
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kMoved_TouchState,
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kUp_TouchState
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstruct State {
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    State();
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    ~State();
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int countSlides() const { return fFactory.count(); }
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const char* getSlideTitle(int index) const;
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void chooseSlide(int index) {
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkDebugf("----- index %d\n", index);
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        if (index < fFactory.count()) {
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            this->setView(fFactory[index]());
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setViewport(int w, int h);
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int getWidth() const { return fViewport.fX; }
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int getHeight() const { return fViewport.fY; }
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void handleTouch(void*, TouchState, float x, float y);
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void applyMatrix(SkCanvas*);
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkView* getView() const { return fView; }
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkView*     fView;
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkIPoint    fViewport;
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkTouchGesture fGesture;
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkTDArray<SkViewFactory> fFactory;
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setView(SkView* view) {
7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkSafeUnref(fView);
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fView = view;
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        view->setVisibleP(true);
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        view->setClipToBounds(false);
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        view->setSize(SkIntToScalar(fViewport.fX),
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                      SkIntToScalar(fViewport.fY));
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SampleCode.h"
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkViewRegister* SkViewRegister::gHead;
9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) {
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static bool gOnce;
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (!gOnce) {
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gHead = NULL;
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gOnce = true;
9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fChain = gHead;
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    gHead = this;
10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic const char gCharEvtName[] = "SampleCode_Char_Event";
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic const char gKeyEvtName[] = "SampleCode_Key_Event";
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic const char gTitleEvtName[] = "SampleCode_Title_Event";
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event";
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic const char gFastTextEvtName[] = "SampleCode_FastText_Event";
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerbool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) {
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (evt.isType(gCharEvtName, sizeof(gCharEvtName) - 1)) {
11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        if (outUni) {
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            *outUni = evt.getFast32();
11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return true;
11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return false;
11805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
11905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerbool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) {
12105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) {
12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        if (outKey) {
12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            *outKey = (SkKey)evt.getFast32();
12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return true;
12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return false;
12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerbool SampleCode::TitleQ(const SkEvent& evt) {
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1);
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid SampleCode::TitleR(SkEvent* evt, const char title[]) {
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrAssert(evt && TitleQ(*evt));
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    evt->setString(gTitleEvtName, title);
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerbool SampleCode::PrefSizeQ(const SkEvent& evt) {
14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1);
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) {
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrAssert(evt && PrefSizeQ(*evt));
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkScalar size[2];
14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    size[0] = width;
14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    size[1] = height;
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    evt->setScalars(gPrefSizeEvtName, 2, size);
14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerbool SampleCode::FastTextQ(const SkEvent& evt) {
15205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1);
15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
15405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic SkMSec gAnimTime;
15605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic SkMSec gAnimTimePrev;
15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkMSec SampleCode::GetAnimTime() { return gAnimTime; }
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkMSec SampleCode::GetAnimTimeDelta() { return gAnimTime - gAnimTimePrev; }
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkScalar SampleCode::GetAnimSecondsDelta() {
16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return SkDoubleToScalar(GetAnimTimeDelta() / 1000.0);
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerSkScalar SampleCode::GetAnimScalar(SkScalar speed, SkScalar period) {
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // since gAnimTime can be up to 32 bits, we can't convert it to a float
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // or we'll lose the low bits. Hence we use doubles for the intermediate
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // calculations
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    double seconds = (double)gAnimTime / 1000.0;
16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    double value = SkScalarToDouble(speed) * seconds;
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (period) {
17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        value = ::fmod(value, SkScalarToDouble(period));
17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return SkDoubleToScalar(value);
17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void drawIntoCanvas(State* state, SkCanvas* canvas) {
17705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    gAnimTime = SkTime::GetMSecs();
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkView* view = state->getView();
17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    view->draw(canvas);
18005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
18105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void resetGpuState();
18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerState::State() {
18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fViewport.set(0, 0);
18805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkViewRegister* reg = SkViewRegister::Head();
19005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    while (reg) {
19105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        *fFactory.append() = reg->factory();
19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        reg = reg->next();
19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("----- %d slides\n", fFactory.count());
19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fView = NULL;
19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    this->chooseSlide(0);
19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
19905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerState::~State() {
20105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkSafeUnref(fView);
20205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
20305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid State::setViewport(int w, int h) {
20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fViewport.set(w, h);
20605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (fView) {
20705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fView->setSize(SkIntToScalar(w), SkIntToScalar(h));
20805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
20905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    resetGpuState();
21005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
21105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerconst char* State::getSlideTitle(int index) const {
21305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkEvent evt(gTitleEvtName);
21405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    evt.setFast32(index);
21505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    {
21605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkView* view = fFactory[index]();
21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        view->doQuery(&evt);
21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        view->unref();
21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
22005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return evt.findString(gTitleEvtName);
22105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
22205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
22305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid State::handleTouch(void* owner, TouchState state, float x, float y) {
22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    switch (state) {
22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case kDown_TouchState:
22605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            fGesture.touchBegin(owner, x, y);
22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            break;
22805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case kMoved_TouchState:
22905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            fGesture.touchMoved(owner, x, y);
23005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            break;
23105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case kUp_TouchState:
23205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            fGesture.touchEnd(owner);
23305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            break;
23405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
23505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
23605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid State::applyMatrix(SkCanvas* canvas) {
23805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkMatrix& localM = fGesture.localM();
23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (localM.getType() & SkMatrix::kScale_Mask) {
24005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        canvas->setExternalMatrix(&localM);
24105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
24205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    canvas->concat(localM);
24305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    canvas->concat(fGesture.globalM());
24405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
24505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
24605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic State* get_state() {
24705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static State* gState;
24805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (NULL == gState) {
24905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gState = new State;
25005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
25105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gState;
25205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
25305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
25405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
25505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
25605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic GrContext* gContext;
25705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic int gWidth;
25805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic int gHeight;
25905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic float gX, gY;
26005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
26105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void resetGpuState() {
26205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (NULL == gContext) {
26305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkDebugf("creating context for first time\n");
26405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gContext = make_context();
26505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    } else {
26605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkDebugf("------ gContext refcnt=%d\n", gContext->refcnt());
26705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gContext->abandonAllTextures();
26805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gContext->unref();
26905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gContext = make_context();
27005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
27105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
27205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
27305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void doDraw() {
27405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (NULL == gContext) {
27505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        gContext = make_context();
27605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
27705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
27805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    State* state = get_state();
27905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkBitmap viewport;
28005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    viewport.setConfig(SkBitmap::kARGB_8888_Config,
28105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                       state->getWidth(), state->getHeight());
28205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
28305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGpuCanvas canvas(gContext);
28405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
28505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    canvas.setBitmapDevice(viewport);
28605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    state->applyMatrix(&canvas);
28705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
28805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    drawIntoCanvas(state, &canvas);
28905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrGLCheckErr();
29105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrGLClearErr();
29205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//    gContext->checkError();
29305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//    gContext->clearError();
29405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (true) {
29605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        static const int FRAME_COUNT = 32;
29705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        static SkMSec gDuration;
29805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        static SkMSec gNow;
30005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        static int gFrameCounter;
30105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        if (++gFrameCounter == FRAME_COUNT) {
30205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            gFrameCounter = 0;
30305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            SkMSec now = SkTime::GetMSecs();
30405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
30505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            gDuration = now - gNow;
30605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            gNow = now;
30705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
30805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
30905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        int fps = (FRAME_COUNT * 1000) / gDuration;
31005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkString str;
31105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        str.printf("FPS=%3d MS=%3d", fps, gDuration / FRAME_COUNT);
31205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
31305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkGpuCanvas c(gContext);
31405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        c.setBitmapDevice(viewport);
31505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
31605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkPaint p;
31705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        p.setAntiAlias(true);
31805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkRect r = { 0, 0, 110, 16 };
31905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        p.setColor(SK_ColorWHITE);
32005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        c.drawRect(r, p);
32105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        p.setColor(SK_ColorBLACK);
32205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        c.drawText(str.c_str(), str.size(), 4, 12, p);
32305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
32405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
32505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
32605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
32705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
32805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern "C" {
32905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeSurfaceCreated(
33005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                                           JNIEnv*, jobject);
33105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeViewport(JNIEnv*, jobject,
33205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                                                             jint w, jint h);
33305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeDrawFrame(JNIEnv*, jobject);
33405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeTouch(JNIEnv*, jobject,
33505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                        jint id, jint type, jfloat x, jfloat y);
33605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
33705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT int JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeCountSlides(JNIEnv*, jobject);
33805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT jobject JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeGetSlideTitle(JNIEnv*, jobject, jint index);
33905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    JNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeChooseSlide(JNIEnv*, jobject, jint index);
34005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
34105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
34205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeSurfaceCreated(
34305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                                            JNIEnv*, jobject) {
34405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("------ nativeSurfaceCreated\n");
34505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    resetGpuState();
34605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("------ end nativeSurfaceCreated\n");
34705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
34805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
34905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeViewport(JNIEnv*, jobject,
35005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                                       jint w, jint h) {
35105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    State* state = get_state();
35205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("---- state.setviewport %p %d %d\n", state, w, h);
35305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    state->setViewport(w, h);
35405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkDebugf("---- end setviewport\n");
35505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
35605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
35705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeDrawFrame(JNIEnv*, jobject) {
35805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    doDraw();
35905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
36005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
36105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerunion IntPtr {
36205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    jint    fInt;
36305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void*   fPtr;
36405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
36505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void* int2ptr(jint n) {
36605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    IntPtr data;
36705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    data.fInt = n;
36805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return data.fPtr;
36905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
37005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
37105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeTouch(JNIEnv*, jobject,
37205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                      jint id, jint type, jfloat x, jfloat y) {
37305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    get_state()->handleTouch(int2ptr(id), (TouchState)type, x, y);
37405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
37505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
37605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////
37705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
37805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT int JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeCountSlides(JNIEnv*, jobject) {
37905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return get_state()->countSlides();
38005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
38105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
38205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT jobject JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeGetSlideTitle(JNIEnv* env, jobject, jint index) {
38305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return env->NewStringUTF(get_state()->getSlideTitle(index));
38405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
38505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
38605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerJNIEXPORT void JNICALL Java_com_tetrark_ganesh_MyRenderer_nativeChooseSlide(JNIEnv*, jobject, jint index) {
38705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    get_state()->chooseSlide(index);
38805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
38905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
39005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
39105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
39205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
39305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
394