Updates to the Android SampleApp

http://codereview.appspot.com/4602049/


git-svn-id: http://skia.googlecode.com/svn/trunk@1567 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
djsollen@google.com 2011-06-13 16:58:40 +00:00
parent fc0685652e
commit e32b5837c3
11 changed files with 498 additions and 106 deletions

View File

@ -30,14 +30,13 @@ LOCAL_C_INCLUDES += \
external/skia/include/effects \
external/skia/include/images \
external/skia/include/utils \
$(LOCAL_PATH)/skia_extra/include/views \
$(LOCAL_PATH)/skia_extra/samplecode \
$(LOCAL_PATH)/skia_extra/include/xml \
external/skia/include/utils/android \
external/skia/include/views \
external/skia/samplecode \
external/skia/include/xml \
external/skia/include/gpu \
external/skia/src/core \
external/skia/gpu/include \
frameworks/base/core/jni/android/graphics \
frameworks/base/native/include/android \
$(LOCAL_PATH)/jni
LOCAL_SHARED_LIBRARIES := \
@ -55,16 +54,16 @@ LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libskia-sample
LOCAL_SRC_FILES := \
skia_extra/src/ports/SkXMLParser_empty.cpp \
../../src/ports/SkXMLParser_empty.cpp \
jni/sample-jni.cpp
include $(LOCAL_PATH)/skia_extra/src/views/views_files.mk
LOCAL_SRC_FILES += $(addprefix skia_extra/src/views/, $(SOURCE))
include external/skia/src/views/views_files.mk
LOCAL_SRC_FILES += $(addprefix ../../src/views/, $(SOURCE))
include $(LOCAL_PATH)/skia_extra/src/xml/xml_files.mk
LOCAL_SRC_FILES += $(addprefix skia_extra/src/xml/, $(SOURCE))
include external/skia/src/xml/xml_files.mk
LOCAL_SRC_FILES += $(addprefix ../../src/xml/, $(SOURCE))
include $(LOCAL_PATH)/skia_extra/samplecode/samplecode_files.mk
LOCAL_SRC_FILES += $(addprefix skia_extra/samplecode/, $(SOURCE))
include external/skia/samplecode/samplecode_files.mk
LOCAL_SRC_FILES += $(addprefix ../../samplecode/, $(SOURCE))
include $(BUILD_SHARED_LIBRARY)

View File

@ -21,7 +21,7 @@
<application android:label="@string/app_name"
android:debuggable="true">
<activity android:name=".SampleApp"
android:theme="@android:style/Theme.Holo.NoActionBar"
android:theme="@android:style/Theme.Holo.Light"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -18,11 +18,14 @@
#include <jni.h>
#include "SkCanvas.h"
#include "GraphicsJNI.h"
#include "SkEvent.h"
#include "SkWindow.h"
#include "SkApplication.h"
#include "AndroidKeyToSkKey.h"
#include "utils/android/AndroidKeyToSkKey.h"
#include "SkDevice.h"
#include "SkGpuCanvas.h"
#include "GrContext.h"
///////////////////////////////////////////
///////////////// Globals /////////////////
@ -70,8 +73,7 @@ void SkOSWindow::onHandleInval(const SkIRect& rect)
if (!gActivityGlue.m_env || !gWindowGlue.m_inval || !gWindowGlue.m_obj) {
return;
}
gActivityGlue.m_env->CallVoidMethod(gWindowGlue.m_obj, gWindowGlue.m_inval,
rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
gActivityGlue.m_env->CallVoidMethod(gWindowGlue.m_obj, gWindowGlue.m_inval);
}
///////////////////////////////////////////
@ -95,8 +97,8 @@ static jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[],
}
extern "C" {
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_drawToCanvas(
JNIEnv* env, jobject thiz, jobject jcanvas);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_draw(
JNIEnv* env, jobject thiz);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_init(
JNIEnv* env, jobject thiz);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_term(
@ -111,6 +113,8 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_handleClick(
JNIEnv* env, jobject thiz, jint x, jint y, jint state);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_createOSWindow(
JNIEnv* env, jobject thiz, jobject jsampleView);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_zoom(
JNIEnv* env, jobject thiz, jfloat factor);
};
JNIEXPORT bool JNICALL Java_com_skia_sampleapp_SampleApp_handleKeyDown(
@ -160,10 +164,10 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_createOSWindow(
{
gWindow = create_sk_window(NULL);
// Only using a method on View.
jclass clazz = gActivityGlue.m_env->FindClass("android/view/View");
jclass clazz = gActivityGlue.m_env->FindClass("android/opengl/GLSurfaceView");
gWindowGlue.m_obj = gActivityGlue.m_env->NewWeakGlobalRef(jsampleView);
gWindowGlue.m_inval = GetJMethod(gActivityGlue.m_env, clazz, "invalidate",
"(IIII)V");
gWindowGlue.m_inval = GetJMethod(gActivityGlue.m_env, clazz, "requestRender",
"()V");
gActivityGlue.m_env->DeleteLocalRef(clazz);
}
@ -198,11 +202,42 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_term(JNIEnv* env,
}
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_drawToCanvas(
JNIEnv* env, jobject thiz, jobject jcanvas)
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_draw(
JNIEnv* env, jobject thiz)
{
if (!gWindow) return;
gWindow->update(NULL);
SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, jcanvas);
canvas->drawBitmap(gWindow->getBitmap(), 0, 0);
// Copy the bitmap to the screen in raster mode
if (!gWindow->drawsToHardware()) {
SkBitmap bitmap = gWindow->getBitmap();
GrContext* context = gWindow->getGrContext();
if (!context) {
context = GrContext::Create(kOpenGL_Shaders_GrEngine, NULL);
if (!context || !gWindow->setGrContext(context)) {
return;
}
context->unref();
}
GrRenderTarget* renderTarget = context->createRenderTargetFrom3DApiState();
SkGpuCanvas* gpuCanvas = new SkGpuCanvas(context, renderTarget);
SkDevice* device = gpuCanvas->createDevice(SkBitmap::kARGB_8888_Config,
bitmap.width(), bitmap.height(),
false, false);
gpuCanvas->setDevice(device)->unref();
gpuCanvas->drawBitmap(bitmap, 0, 0);
SkSafeUnref(renderTarget);
SkSafeUnref(gpuCanvas);
}
}
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_zoom(
JNIEnv* env, jobject thiz, jfloat factor)
{
gWindow->changeZoomLevel(factor);
}

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 Skia
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/next"
android:showAsAction="always"
android:icon="@*android:drawable/ic_btn_find_next"
/>
<item
android:id="@+id/overview"
android:title="@string/overview"
/>
<!--
android:icon="@drawable/ic_menu_new_window"
-->
</menu>

View File

@ -19,94 +19,151 @@ package com.skia.sampleapp;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class SampleApp extends Activity
{
private TextView mTitle;
public class SampleView extends View {
public SampleView(Context context) {
super(context);
createOSWindow(this);
}
@Override
protected void onDraw(Canvas canvas) {
drawToCanvas(canvas);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
updateSize(w, h);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int action = event.getAction();
handleClick(x, y, action);
return true;
}
}
private SampleView mView;
@Override
public void onCreate(Bundle savedInstanceState)
{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
setContentView(R.layout.layout);
mTitle = (TextView) findViewById(R.id.title_view);
LinearLayout holder = (LinearLayout) findViewById(R.id.holder);
View view = new SampleView(this);
holder.addView(view, new LinearLayout.LayoutParams(
mView = new SampleView(this);
holder.addView(mView, new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mTitle.setVisibility(View.GONE);
getActionBar().setDisplayShowHomeEnabled(false);
}
@Override
public void onDestroy()
{
term();
public void onDestroy() {
mView.queueEvent(new Runnable() {
@Override
public void run() {
term();
}
});
super.onDestroy();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN:
int uni = event.getUnicodeChar(event.getMetaState());
return handleKeyDown(event.getKeyCode(), uni);
case KeyEvent.ACTION_UP:
return handleKeyUp(event.getKeyCode());
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.sample, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.overview:
mView.queueEvent(new Runnable() {
@Override
public void run() {
handleKeyDown(KeyEvent.KEYCODE_BACK, 0);
}
});
return true;
case R.id.next:
mView.queueEvent(new Runnable() {
@Override
public void run() {
handleKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, 0);
}
});
return true;
default:
return false;
}
}
@Override
public void setTitle(CharSequence title) {
mTitle.setText(title);
public boolean dispatchKeyEvent(KeyEvent event) {
final int keycode = event.getKeyCode();
if (keycode == KeyEvent.KEYCODE_BACK) {
if (event.getAction() == KeyEvent.ACTION_UP) {
finish();
}
return true;
}
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN:
final int uni = event.getUnicodeChar(event.getMetaState());
mView.queueEvent(new Runnable() {
@Override
public void run() {
handleKeyDown(keycode, uni);
}
});
return true;
case KeyEvent.ACTION_UP:
mView.queueEvent(new Runnable() {
@Override
public void run() {
handleKeyUp(keycode);
}
});
return true;
default:
return false;
}
}
private native void drawToCanvas(Canvas canvas);
private native void init();
private native void term();
private static final int SET_TITLE = 1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SET_TITLE:
mTitle.setText((String) msg.obj);
SampleApp.this.getActionBar().setSubtitle((String) msg.obj);
break;
default:
break;
}
}
};
@Override
public void setTitle(CharSequence title) {
mHandler.obtainMessage(SET_TITLE, title).sendToTarget();
}
native void draw();
native void init();
native void term();
// Currently depends on init having already been called.
private native void createOSWindow(SampleView view);
private native void updateSize(int w, int h);
private native void handleClick(int x, int y, int state);
private native boolean handleKeyDown(int key, int uni);
private native boolean handleKeyUp(int key);
native void createOSWindow(GLSurfaceView view);
native void updateSize(int w, int h);
native void handleClick(int x, int y, int state);
native boolean handleKeyDown(int key, int uni);
native boolean handleKeyUp(int key);
native void zoom(float factor);
static {
System.loadLibrary("skia-sample");

View File

@ -0,0 +1,111 @@
/*
* Copyright (C) 2011 Skia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.skia.sampleapp;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class SampleView extends GLSurfaceView implements OnScaleGestureListener {
private final SampleApp mApp;
private ScaleGestureDetector mDetector;
public SampleView(SampleApp app) {
super(app);
mApp = app;
setEGLContextClientVersion(2);
setEGLConfigChooser(8,8,8,8,0,8);
setRenderer(new SampleView.Renderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
mDetector = new ScaleGestureDetector(app, this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mDetector.onTouchEvent(event);
if (mDetector.isInProgress()) {
return true;
}
final int x = (int) event.getX();
final int y = (int) event.getY();
final int action = event.getAction();
queueEvent(new Runnable() {
@Override
public void run() {
mApp.handleClick(x, y, action);
}
});
return true;
}
// ScaleGestureDetector.OnScaleGestureListener implementation
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
if (detector.getScaleFactor() != 1) {
final float difference = detector.getCurrentSpan() - detector.getPreviousSpan();
queueEvent(new Runnable() {
@Override
public void run() {
mApp.zoom(difference * .03f);
}
});
return true;
}
return false;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
private class Renderer implements GLSurfaceView.Renderer {
public void onDrawFrame(GL10 gl) {
mApp.draw();
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
mApp.updateSize(width, height);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearStencil(0);
gl.glClear(gl.GL_STENCIL_BUFFER_BIT);
mApp.init();
mApp.createOSWindow(SampleView.this);
}
}
}

View File

@ -0,0 +1,138 @@
// Modified from chromium/src/webkit/glue/gl_bindings_skia_cmd_buffer.cc
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "GrGLInterface.h"
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES
#endif
#include "gl2.h"
#include "gl2ext.h"
/*
#include "gpu/GLES2/gl2.h"
#include "gpu/GLES2/gl2ext.h"
*/
void GrGLSetDefaultGLInterface() {
static GrGLInterface cmd_buffer_interface = {
kES2_GrGLBinding,
glActiveTexture,
glAttachShader,
glBindAttribLocation,
glBindBuffer,
glBindTexture,
glBlendColor,
glBlendFunc,
glBufferData,
glBufferSubData,
glClear,
glClearColor,
glClearStencil,
NULL, // glClientActiveTexture
NULL, // glColor4ub
glColorMask,
NULL, // glColorPointer
glCompileShader,
glCompressedTexImage2D,
glCreateProgram,
glCreateShader,
glCullFace,
glDeleteBuffers,
glDeleteProgram,
glDeleteShader,
glDeleteTextures,
glDepthMask,
glDisable,
NULL, // glDisableClientState
glDisableVertexAttribArray,
glDrawArrays,
glDrawElements,
glEnable,
NULL, // glEnableClientState
glEnableVertexAttribArray,
glFrontFace,
glGenBuffers,
glGenTextures,
glGetBufferParameteriv,
glGetError,
glGetIntegerv,
glGetProgramInfoLog,
glGetProgramiv,
glGetShaderInfoLog,
glGetShaderiv,
glGetString,
glGetUniformLocation,
glLineWidth,
glLinkProgram,
NULL, // glLoadMatrixf
NULL, // glMatrixMode
glPixelStorei,
NULL, // glPointSize
glReadPixels,
glScissor,
NULL, // glShadeModel
glShaderSource,
glStencilFunc,
glStencilFuncSeparate,
glStencilMask,
glStencilMaskSeparate,
glStencilOp,
glStencilOpSeparate,
NULL, // glTexCoordPointer
NULL, // glTexEnvi
glTexImage2D,
glTexParameteri,
glTexSubImage2D,
glUniform1f,
glUniform1i,
glUniform1fv,
glUniform1iv,
glUniform2f,
glUniform2i,
glUniform2fv,
glUniform2iv,
glUniform3f,
glUniform3i,
glUniform3fv,
glUniform3iv,
glUniform4f,
glUniform4i,
glUniform4fv,
glUniform4iv,
glUniformMatrix2fv,
glUniformMatrix3fv,
glUniformMatrix4fv,
glUseProgram,
glVertexAttrib4fv,
glVertexAttribPointer,
NULL, // glVertexPointer
glViewport,
glBindFramebuffer,
glBindRenderbuffer,
glCheckFramebufferStatus,
glDeleteFramebuffers,
glDeleteRenderbuffers,
glFramebufferRenderbuffer,
glFramebufferTexture2D,
glGenFramebuffers,
glGenRenderbuffers,
glRenderbufferStorage,
NULL, // glRenderbufferStorageMultisampleEXT,
NULL, // glBlitFramebufferEXT,
NULL, // glResolveMultisampleFramebuffer
glMapBufferOES,
glUnmapBufferOES,
NULL,
GrGLInterface::kStaticInitEndGuard
};
static bool host_StubGL_initialized = false;
if (!host_StubGL_initialized) {
GrGLSetGLInterface(&cmd_buffer_interface);
host_StubGL_initialized = true;
}
}

View File

@ -17,7 +17,7 @@
#ifndef _ANDROID_TO_SKIA_KEYCODES_H
#define _ANDROID_TO_SKIA_KEYCODES_H
#include "keycodes.h"
#include "android/keycodes.h"
#include "SkKey.h"
// Convert an Android keycode to an SkKey. This is an incomplete list, only
@ -32,6 +32,8 @@ SkKey AndroidKeycodeToSkKey(int keycode) {
return kUp_SkKey;
case AKEYCODE_DPAD_DOWN:
return kDown_SkKey;
case AKEYCODE_BACK:
return kBack_SkKey;
default:
return kNONE_SkKey;
}

View File

@ -20,14 +20,19 @@
#include "SkWindow.h"
#include "SkEvent.h"
class GrContext;
class SkOSWindow : public SkWindow {
public:
SkOSWindow(void*) {}
~SkOSWindow() {}
bool attachGL() { return false; }
bool attachGL() { return true; }
void detachGL() {}
void presentGL() {}
virtual bool drawsToHardware() { return false; }
virtual bool setGrContext(GrContext*) { return false; }
virtual GrContext* getGrContext() { return NULL; }
virtual void changeZoomLevel(float delta) {}
protected:
// overrides from SkWindow
virtual void onHandleInval(const SkIRect&);

View File

@ -251,6 +251,11 @@ public:
virtual ~SampleWindow();
virtual void draw(SkCanvas* canvas);
#ifdef ANDROID
virtual bool drawsToHardware() { return fCanvasType == kGPU_CanvasType; }
virtual bool setGrContext(GrContext*);
virtual GrContext* getGrContext();
#endif
protected:
virtual void onDraw(SkCanvas* canvas);
@ -287,7 +292,7 @@ private:
SkPath fClipPath;
SkTouchGesture fGesture;
int fZoomLevel;
SkScalar fZoomLevel;
SkScalar fZoomScale;
enum CanvasType {
@ -325,7 +330,10 @@ private:
int fScrollTestX, fScrollTestY;
bool make3DReady();
void changeZoomLevel(int delta);
#ifdef ANDROID
virtual
#endif
void changeZoomLevel(float delta);
void loadView(SkView*);
void updateTitle();
@ -350,6 +358,23 @@ private:
typedef SkOSWindow INHERITED;
};
#ifdef ANDROID
bool SampleWindow::setGrContext(GrContext* context)
{
if (fGrContext) {
fGrContext->unref();
}
fGrContext = context;
fGrContext->ref();
return true;
}
GrContext* SampleWindow::getGrContext()
{
return fGrContext;
}
#endif
bool SampleWindow::zoomIn()
{
// Arbitrarily decided
@ -928,18 +953,20 @@ static SkBitmap::Config cycle_configs(SkBitmap::Config c) {
return gConfigCycle[c];
}
void SampleWindow::changeZoomLevel(int delta) {
fZoomLevel += delta;
void SampleWindow::changeZoomLevel(float delta) {
fZoomLevel += SkFloatToScalar(delta);
if (fZoomLevel > 0) {
fZoomLevel = SkMin32(fZoomLevel, MAX_ZOOM_LEVEL);
fZoomScale = SkIntToScalar(fZoomLevel + 1);
fZoomLevel = SkMinScalar(fZoomLevel, MAX_ZOOM_LEVEL);
fZoomScale = fZoomLevel + SK_Scalar1;
} else if (fZoomLevel < 0) {
fZoomLevel = SkMax32(fZoomLevel, MIN_ZOOM_LEVEL);
fZoomScale = SK_Scalar1 / (1 - fZoomLevel);
fZoomLevel = SkMaxScalar(fZoomLevel, MIN_ZOOM_LEVEL);
fZoomScale = SK_Scalar1 / (SK_Scalar1 - fZoomLevel);
} else {
fZoomScale = SK_Scalar1;
}
this->updateTitle();
this->inval(NULL);
}
@ -1153,20 +1180,20 @@ bool SampleWindow::onHandleKey(SkKey key) {
return true;
case kUp_SkKey:
if (USE_ARROWS_FOR_ZOOM) {
this->changeZoomLevel(1);
this->changeZoomLevel(1.f);
} else {
fNClip = !fNClip;
this->inval(NULL);
this->updateTitle();
}
this->updateTitle();
return true;
case kDown_SkKey:
if (USE_ARROWS_FOR_ZOOM) {
this->changeZoomLevel(-1);
this->changeZoomLevel(-1.f);
} else {
this->setConfig(cycle_configs(this->getBitmap().config()));
this->updateTitle();
}
this->updateTitle();
return true;
case kOK_SkKey:
if (false) {
@ -1333,7 +1360,7 @@ void SampleWindow::updateTitle() {
title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL);
if (fZoomLevel) {
title.prependf("{%d} ", fZoomLevel);
title.prependf("{%.2f} ", SkScalarToFloat(fZoomLevel));
}
if (fMeasureFPS) {

View File

@ -20,12 +20,10 @@ SOURCE := \
SampleShaderText.cpp \
SamplePolyToPoly.cpp \
SampleBlur.cpp \
SampleEffects.cpp \
SampleHairline.cpp \
SampleCircle.cpp \
SampleOvalTest.cpp \
SampleLines.cpp \
SampleCull.cpp \
SampleOverflow.cpp \
SampleStrokePath.cpp \
SampleSlides.cpp \
@ -57,19 +55,9 @@ SOURCE := \
SampleFilter.cpp \
OverView.cpp \
SampleFuzz.cpp \
SampleShaders.cpp
# SampleSVG.cpp \
SampleTests.cpp \
SampleTestGL.cpp \
SampleTriangles.cpp \
SampleSkLayer.cpp \
SampleGM.cpp \
SampleText.cpp \
SampleTextBox.cpp \
SampleShaders.cpp \
SampleImage.cpp \
SampleMovie.cpp \
SampleAnimator.cpp \
SampleUnitMapper.cpp \
SampleImageDir.cpp \
SampleWarp.cpp \
SamplePageFlip.cpp \