| #include "SampleCode.h" |
| #include "SkView.h" |
| #include "SkCanvas.h" |
| #include "SkCornerPathEffect.h" |
| #include "SkCullPoints.h" |
| #include "SkGradientShader.h" |
| #include "SkPath.h" |
| #include "SkRegion.h" |
| #include "SkShader.h" |
| #include "SkUtils.h" |
| |
| #include <AGL/agl.h> |
| #include <OpenGL/gl.h> |
| |
| static void test_draw_gl(SkCanvas* canvas) { |
| const float verts[] = { |
| 10, 10, 250, 250, 490, 10 |
| }; |
| const float texs[] = { |
| 0, 0, 0.5f, 0, 1, 1 |
| }; |
| const uint8_t colors[] = { |
| 0, 0, 0, 1, |
| 128, 0, 0, 1, |
| 255, 255, 0, 1 |
| }; |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glVertexPointer(2, GL_FLOAT, 0, verts); |
| |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| // glTexCoordPointer(2, GL_FLOAT, 0, texs); |
| |
| glEnableClientState(GL_COLOR_ARRAY); |
| glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors); |
| |
| glDrawArrays(GL_TRIANGLES, 0, 3); |
| } |
| |
| static const char* gVertShaderText = |
| "varying vec2 uv;" |
| "void main(void) {" |
| " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;" |
| " uv = vec2(gl_Color);" |
| "}"; |
| |
| static const char* gFragShaderText = |
| "varying vec2 uv;" |
| "void main(void) {" |
| " float u = uv.x;" |
| " float v = uv.y;" |
| " if (u*u > v) {" |
| " gl_FragColor = vec4(0.0, 0, 0, 0.0);" |
| " } else {" |
| " gl_FragColor = vec4(0, 1.0, 0, 1.0);" |
| "}" |
| "}"; |
| |
| static bool compile_shader(GLuint shader) { |
| glCompileShader(shader); |
| |
| GLint success; |
| glGetShaderiv(shader, GL_COMPILE_STATUS, &success); |
| if (!success) { |
| GLchar buffer[256]; |
| glGetShaderInfoLog(shader, sizeof(buffer), NULL, buffer); |
| SkDebugf("---- glCompileShader failed: %s\n", buffer); |
| return false; |
| } |
| return true; |
| } |
| |
| static bool link_program(GLuint program) { |
| glLinkProgram(program); |
| GLint success; |
| glGetProgramiv(program, GL_LINK_STATUS, &success); |
| if (!success) { |
| GLchar buffer[256]; |
| glGetProgramInfoLog(program, sizeof(buffer), NULL, buffer); |
| SkDebugf("---- glLinkProgram failed: %s\n", buffer); |
| return false; |
| } |
| return true; |
| } |
| |
| static void test_glshader(SkCanvas* canvas) { |
| GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); |
| GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); |
| |
| glShaderSource(vertShader, 1, &gVertShaderText, NULL); |
| glShaderSource(fragShader, 1, &gFragShaderText, NULL); |
| |
| if (!compile_shader(vertShader)) { return; } |
| if (!compile_shader(fragShader)) { return; } |
| |
| GLuint program = glCreateProgram(); |
| glAttachShader(program, vertShader); |
| glAttachShader(program, fragShader); |
| if (link_program(program)) { |
| glUseProgram(program); |
| test_draw_gl(canvas); |
| glUseProgram(0); |
| } |
| glDeleteProgram(program); |
| glDeleteShader(vertShader); |
| glDeleteShader(fragShader); |
| } |
| |
| static void setmatrix6(SkMatrix* matrix, const float val[]) { |
| matrix->reset(); |
| for (int i = 0; i < 6; i++) { |
| matrix->set(i, val[i]); |
| } |
| } |
| |
| static void testinvert() { |
| SkMatrix matrix; |
| |
| const float vals[] = { 0,9,.000001,10000,0,0 }; |
| setmatrix6(&matrix, vals); |
| |
| const float vals2[] = { 0,100,71,9,0,7 }; |
| SkMatrix tmp; |
| setmatrix6(&tmp, vals2); |
| |
| matrix.preConcat(tmp); |
| matrix.dump(); |
| |
| SkMatrix inverse; |
| matrix.invert(&inverse); |
| inverse.dump(); |
| |
| matrix.preConcat(inverse); |
| matrix.dump(); |
| |
| // o2dContext.setTransform(0,9,.000001,10000,0,0); |
| // o2dContext.transform(0,100,71,9,0,7); |
| // o2dContext.setTransform(0,6,95,4,1,0); |
| } |
| |
| /* |
| [0] 9.9999997e-005 float |
| [1] 9.0000003e-006 float |
| [2] 7.0000001e-006 float |
| [3] 1000000.0 float |
| [4] 90639.000 float |
| [5] 70000.000 float |
| [6] 0.00000000 float |
| [7] 0.00000000 float |
| [8] 1.0000000 float |
| */ |
| static void testinvert2() { |
| const float val[] = { |
| 9.9999997e-005, 9.0000003e-006, 7.0000001e-006, |
| 1000000.0, 90639.000, 70000.000 |
| }; |
| SkMatrix matrix; |
| setmatrix6(&matrix, val); |
| matrix.dump(); |
| |
| SkMatrix inverse; |
| matrix.invert(&inverse); |
| inverse.dump(); |
| |
| matrix.preConcat(inverse); |
| matrix.dump(); |
| // result is that matrix[3] is 49550 instead of 0 :( |
| } |
| |
| static void show_ramp(SkCanvas* canvas, const SkRect& r) { |
| SkPoint pts[] = { r.fLeft, 0, r.fRight, 0 }; |
| SkColor colors[] = { SK_ColorRED, SK_ColorBLUE }; |
| SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, |
| SkShader::kRepeat_TileMode); |
| SkPaint p; |
| p.setShader(s)->unref(); |
| canvas->drawRect(r, p); |
| canvas->translate(r.width() + SkIntToScalar(8), 0); |
| p.setDither(true); |
| canvas->drawRect(r, p); |
| } |
| |
| class TestGLView : public SkView { |
| public: |
| TestGLView() { |
| testinvert2(); |
| } |
| |
| protected: |
| // overrides from SkEventSink |
| virtual bool onQuery(SkEvent* evt) { |
| if (SampleCode::TitleQ(*evt)) { |
| SampleCode::TitleR(evt, "TestGL"); |
| return true; |
| } |
| return this->INHERITED::onQuery(evt); |
| } |
| |
| void drawBG(SkCanvas* canvas) { |
| canvas->drawColor(0xFFDDDDDD); |
| } |
| |
| virtual void onDraw(SkCanvas* canvas) { |
| drawBG(canvas); |
| |
| if (canvas->getViewport(NULL)) { |
| test_glshader(canvas); |
| return; |
| } |
| |
| SkRect r; |
| r.set(0, 0, 100, 100); |
| |
| canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); |
| |
| SkPaint paint; |
| paint.setAntiAlias(false); |
| paint.setColor(SK_ColorRED); |
| |
| canvas->drawRect(r, paint); |
| |
| canvas->translate(r.width() + SkIntToScalar(20), 0); |
| paint.setStyle(SkPaint::kStroke_Style); |
| canvas->drawRect(r, paint); |
| |
| canvas->translate(r.width() + SkIntToScalar(20), 0); |
| paint.setStrokeWidth(SkIntToScalar(5)); |
| canvas->drawRect(r, paint); |
| |
| canvas->translate(r.width() * 10/9, 0); |
| show_ramp(canvas, r); |
| } |
| |
| private: |
| typedef SkView INHERITED; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| static SkView* MyFactory() { return new TestGLView; } |
| static SkViewRegister reg(MyFactory); |
| |