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