blob: a0dfea30e7fbcccb6bcf88bcd14f38dd0a946e7a [file] [log] [blame]
reed@android.com9b46e772009-06-05 12:24:41 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkCornerPathEffect.h"
5#include "SkCullPoints.h"
6#include "SkGradientShader.h"
7#include "SkPath.h"
8#include "SkRegion.h"
9#include "SkShader.h"
10#include "SkUtils.h"
11
reed@android.com04d86c62010-01-25 22:02:44 +000012#include <AGL/agl.h>
13#include <OpenGL/gl.h>
14
15static void test_draw_gl(SkCanvas* canvas) {
16 const float verts[] = {
17 10, 10, 250, 250, 490, 10
18 };
19 const float texs[] = {
20 0, 0, 0.5f, 0, 1, 1
21 };
22 const uint8_t colors[] = {
23 0, 0, 0, 1,
24 128, 0, 0, 1,
25 255, 255, 0, 1
26 };
27
28 glEnableClientState(GL_VERTEX_ARRAY);
29 glVertexPointer(2, GL_FLOAT, 0, verts);
30
31 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
32// glTexCoordPointer(2, GL_FLOAT, 0, texs);
33
34 glEnableClientState(GL_COLOR_ARRAY);
35 glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
36
37 glDrawArrays(GL_TRIANGLES, 0, 3);
38}
39
40static const char* gVertShaderText =
41 "varying vec2 uv;"
42 "void main(void) {"
43 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
44 " uv = vec2(gl_Color);"
45 "}";
46
47static const char* gFragShaderText =
48 "varying vec2 uv;"
49 "void main(void) {"
50 " float u = uv.x;"
51 " float v = uv.y;"
52 " if (u*u > v) {"
reed@android.comf2b98d62010-12-20 18:26:13 +000053" gl_FragColor = vec4(0.0, 0, 0, 0.0);"
reed@android.com04d86c62010-01-25 22:02:44 +000054 " } else {"
55 " gl_FragColor = vec4(0, 1.0, 0, 1.0);"
56 "}"
57 "}";
58
59static bool compile_shader(GLuint shader) {
60 glCompileShader(shader);
61
62 GLint success;
63 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
64 if (!success) {
65 GLchar buffer[256];
66 glGetShaderInfoLog(shader, sizeof(buffer), NULL, buffer);
67 SkDebugf("---- glCompileShader failed: %s\n", buffer);
68 return false;
69 }
70 return true;
71}
72
73static bool link_program(GLuint program) {
74 glLinkProgram(program);
75 GLint success;
76 glGetProgramiv(program, GL_LINK_STATUS, &success);
77 if (!success) {
78 GLchar buffer[256];
79 glGetProgramInfoLog(program, sizeof(buffer), NULL, buffer);
80 SkDebugf("---- glLinkProgram failed: %s\n", buffer);
81 return false;
82 }
83 return true;
84}
85
86static void test_glshader(SkCanvas* canvas) {
87 GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
88 GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
89
90 glShaderSource(vertShader, 1, &gVertShaderText, NULL);
91 glShaderSource(fragShader, 1, &gFragShaderText, NULL);
92
93 if (!compile_shader(vertShader)) { return; }
94 if (!compile_shader(fragShader)) { return; }
95
96 GLuint program = glCreateProgram();
97 glAttachShader(program, vertShader);
98 glAttachShader(program, fragShader);
99 if (link_program(program)) {
100 glUseProgram(program);
101 test_draw_gl(canvas);
102 glUseProgram(0);
103 }
104 glDeleteProgram(program);
105 glDeleteShader(vertShader);
106 glDeleteShader(fragShader);
107}
108
109static void setmatrix6(SkMatrix* matrix, const float val[]) {
110 matrix->reset();
111 for (int i = 0; i < 6; i++) {
112 matrix->set(i, val[i]);
113 }
114}
115
116static void testinvert() {
117 SkMatrix matrix;
118
119 const float vals[] = { 0,9,.000001,10000,0,0 };
120 setmatrix6(&matrix, vals);
121
122 const float vals2[] = { 0,100,71,9,0,7 };
123 SkMatrix tmp;
124 setmatrix6(&tmp, vals2);
125
126 matrix.preConcat(tmp);
127 matrix.dump();
128
129 SkMatrix inverse;
130 matrix.invert(&inverse);
131 inverse.dump();
132
133 matrix.preConcat(inverse);
134 matrix.dump();
135
136// o2dContext.setTransform(0,9,.000001,10000,0,0);
137// o2dContext.transform(0,100,71,9,0,7);
138// o2dContext.setTransform(0,6,95,4,1,0);
139}
140
141/*
142 [0] 9.9999997e-005 float
143 [1] 9.0000003e-006 float
144 [2] 7.0000001e-006 float
145 [3] 1000000.0 float
146 [4] 90639.000 float
147 [5] 70000.000 float
148 [6] 0.00000000 float
149 [7] 0.00000000 float
150 [8] 1.0000000 float
151 */
152static void testinvert2() {
153 const float val[] = {
154 9.9999997e-005, 9.0000003e-006, 7.0000001e-006,
155 1000000.0, 90639.000, 70000.000
156 };
157 SkMatrix matrix;
158 setmatrix6(&matrix, val);
159 matrix.dump();
160
161 SkMatrix inverse;
162 matrix.invert(&inverse);
163 inverse.dump();
164
165 matrix.preConcat(inverse);
166 matrix.dump();
167 // result is that matrix[3] is 49550 instead of 0 :(
168}
169
reed@android.com5119bdb2009-06-12 21:27:03 +0000170static void show_ramp(SkCanvas* canvas, const SkRect& r) {
171 SkPoint pts[] = { r.fLeft, 0, r.fRight, 0 };
172 SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
173 SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2,
174 SkShader::kRepeat_TileMode);
175 SkPaint p;
176 p.setShader(s)->unref();
177 canvas->drawRect(r, p);
178 canvas->translate(r.width() + SkIntToScalar(8), 0);
179 p.setDither(true);
180 canvas->drawRect(r, p);
181}
182
reed@android.com9b46e772009-06-05 12:24:41 +0000183class TestGLView : public SkView {
184public:
185 TestGLView() {
reed@android.com04d86c62010-01-25 22:02:44 +0000186 testinvert2();
reed@android.com9b46e772009-06-05 12:24:41 +0000187 }
188
189protected:
190 // overrides from SkEventSink
191 virtual bool onQuery(SkEvent* evt) {
192 if (SampleCode::TitleQ(*evt)) {
193 SampleCode::TitleR(evt, "TestGL");
194 return true;
195 }
196 return this->INHERITED::onQuery(evt);
197 }
198
199 void drawBG(SkCanvas* canvas) {
200 canvas->drawColor(0xFFDDDDDD);
201 }
202
203 virtual void onDraw(SkCanvas* canvas) {
204 drawBG(canvas);
reed@android.com1eadb952010-01-25 22:09:16 +0000205
206 if (canvas->getViewport(NULL)) {
207 test_glshader(canvas);
208 return;
209 }
reed@android.com04d86c62010-01-25 22:02:44 +0000210
reed@android.com9b46e772009-06-05 12:24:41 +0000211 SkRect r;
212 r.set(0, 0, 100, 100);
213
214 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
215
216 SkPaint paint;
217 paint.setAntiAlias(false);
218 paint.setColor(SK_ColorRED);
219
220 canvas->drawRect(r, paint);
221
222 canvas->translate(r.width() + SkIntToScalar(20), 0);
223 paint.setStyle(SkPaint::kStroke_Style);
224 canvas->drawRect(r, paint);
225
226 canvas->translate(r.width() + SkIntToScalar(20), 0);
227 paint.setStrokeWidth(SkIntToScalar(5));
228 canvas->drawRect(r, paint);
reed@android.com5119bdb2009-06-12 21:27:03 +0000229
230 canvas->translate(r.width() * 10/9, 0);
231 show_ramp(canvas, r);
reed@android.com9b46e772009-06-05 12:24:41 +0000232 }
233
234private:
235 typedef SkView INHERITED;
236};
237
238//////////////////////////////////////////////////////////////////////////////
239
240static SkView* MyFactory() { return new TestGLView; }
241static SkViewRegister reg(MyFactory);
242