| #include "SampleCode.h" |
| #include "SkView.h" |
| #include "SkCanvas.h" |
| #include "Sk64.h" |
| #include "SkGradientShader.h" |
| #include "SkGraphics.h" |
| #include "SkImageDecoder.h" |
| #include "SkKernel33MaskFilter.h" |
| #include "SkPath.h" |
| #include "SkRandom.h" |
| #include "SkRegion.h" |
| #include "SkShader.h" |
| #include "SkUtils.h" |
| #include "SkColorPriv.h" |
| #include "SkColorFilter.h" |
| #include "SkTime.h" |
| #include "SkTypeface.h" |
| #include "SkXfermode.h" |
| |
| // effects |
| #include "SkGradientShader.h" |
| #include "SkShaderExtras.h" |
| #include "SkUnitMappers.h" |
| |
| #include "SkStream.h" |
| #include "SkXMLParser.h" |
| |
| #include "SkGLCanvas.h" |
| |
| #include <AGL/agl.h> |
| #include <OpenGL/gl.h> |
| |
| extern void* gSampleWind; |
| |
| static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) |
| { |
| bm->setConfig(config, w, h); |
| bm->allocPixels(); |
| bm->eraseColor(0); |
| |
| SkCanvas canvas(*bm); |
| SkPoint pts[] = { 0, 0, SkIntToScalar(w), SkIntToScalar(h) }; |
| SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; |
| SkScalar pos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; |
| SkPaint paint; |
| |
| SkUnitMapper* um = NULL; |
| |
| // um = new SkCosineMapper; |
| // um = new SkDiscreteMapper(12); |
| |
| SkAutoUnref au(um); |
| |
| paint.setAntiAlias(true); |
| paint.setShader(SkGradientShader::CreateLinear(pts, colors, pos, |
| SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, um))->unref(); |
| |
| SkRect r; |
| r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); |
| canvas.drawOval(r, paint); |
| } |
| |
| static void premulBitmap(const SkBitmap& bm) { |
| for (int y = 0; y < bm.height(); y++) { |
| SkPMColor* p = bm.getAddr32(0, y); |
| for (int x = 0; x < bm.width(); x++) { |
| SkPMColor c = *p; |
| unsigned a = SkGetPackedA32(c); |
| unsigned r = SkGetPackedR32(c); |
| unsigned g = SkGetPackedG32(c); |
| unsigned b = SkGetPackedB32(c); |
| |
| unsigned scale = SkAlpha255To256(a); |
| r = SkAlphaMul(r, scale); |
| g = SkAlphaMul(g, scale); |
| b = SkAlphaMul(b, scale); |
| *p++ = SkPackARGB32(a, r, g, b); |
| } |
| } |
| } |
| |
| class GLView : public SkView { |
| public: |
| AGLContext fCtx; |
| SkBitmap fOffscreen; |
| SkBitmap fTexture[3]; |
| |
| GLView() { |
| makebm(&fTexture[0], SkBitmap::kARGB_8888_Config, 64, 100); |
| makebm(&fTexture[1], SkBitmap::kRGB_565_Config, 64, 100); |
| makebm(&fTexture[2], SkBitmap::kARGB_4444_Config, 64, 100); |
| |
| GLint major, minor; |
| |
| aglGetVersion(&major, &minor); |
| SkDebugf("---- version %d %d\n", major, minor); |
| |
| GLint attr[] = { |
| AGL_RGBA, |
| AGL_DEPTH_SIZE, 32, |
| AGL_OFFSCREEN, |
| AGL_NONE |
| }; |
| |
| SkDebugf("------ attr %p %d\n", attr, sizeof(attr)); |
| AGLPixelFormat format = aglCreatePixelFormat(attr); |
| SkDebugf("----- format %p\n", format); |
| fCtx = aglCreateContext(format, 0); |
| SkDebugf("----- context %p\n", fCtx); |
| GLboolean success; //= aglSetWindowRef(fCtx, (WindowRef)gSampleWind); |
| // SkDebugf("----- aglSetWindowRef %d\n", success); |
| |
| aglEnable(fCtx, GL_BLEND); |
| aglEnable(fCtx, GL_LINE_SMOOTH); |
| aglEnable(fCtx, GL_POINT_SMOOTH); |
| aglEnable(fCtx, GL_POLYGON_SMOOTH); |
| |
| fOffscreen.setConfig(SkBitmap::kARGB_8888_Config, 300, 300); |
| fOffscreen.allocPixels(); |
| |
| success = aglSetOffScreen(fCtx, |
| fOffscreen.width(), |
| fOffscreen.height(), |
| fOffscreen.rowBytes(), |
| fOffscreen.getPixels()); |
| GLenum err = aglGetError(); |
| SkDebugf("---- setoffscreen %d %d %s\n", success, err, aglErrorString(err)); |
| |
| aglSetCurrentContext(fCtx); |
| glOrtho(0, fOffscreen.width(), |
| fOffscreen.height(), 0, |
| -1, 1); |
| |
| glEnable(GL_BLEND); |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); |
| |
| glEnable(GL_TEXTURE_2D); |
| } |
| |
| protected: |
| // overrides from SkEventSink |
| virtual bool onQuery(SkEvent* evt) { |
| if (SampleCode::TitleQ(*evt)) { |
| SampleCode::TitleR(evt, "GL"); |
| return true; |
| } |
| return this->INHERITED::onQuery(evt); |
| } |
| |
| void drawBG(SkCanvas* canvas) { |
| canvas->drawColor(0xFFDDDDDD); |
| } |
| |
| virtual void onDraw(SkCanvas* canvas) { |
| this->drawBG(canvas); |
| |
| SkGLCanvas c(fOffscreen.width(), fOffscreen.height()); |
| |
| glClearColor(0, 0, 0, 0); |
| glClear(GL_COLOR_BUFFER_BIT); |
| |
| SkPaint p; |
| |
| p.setAntiAlias(true); |
| |
| c.drawColor(SK_ColorWHITE); |
| |
| p.setColor(SK_ColorRED); |
| c.drawCircle(SkIntToScalar(40), SkIntToScalar(40), SkIntToScalar(20), p); |
| |
| p.setColor(SK_ColorGREEN); |
| p.setStrokeWidth(SkIntToScalar(6)); |
| p.setStrokeCap(SkPaint::kRound_Cap); |
| c.drawLine(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(40), SkIntToScalar(50), p); |
| |
| // c.scale(SkIntToScalar(3)/2, SkIntToScalar(3)/2); |
| p.setColor(0x880000FF); |
| c.drawCircle(SkIntToScalar(40), SkIntToScalar(40), SkIntToScalar(20), p); |
| |
| for (int i = 0; i < SK_ARRAY_COUNT(fTexture); i++) { |
| c.drawBitmap(fTexture[i], SkIntToScalar(10), SkIntToScalar(100), NULL); |
| c.translate(SkIntToScalar(fTexture[i].width()), 0); |
| } |
| p.setColor(SK_ColorBLUE); |
| c.drawRectCoords(SkIntToScalar(10), SkIntToScalar(100), |
| SkIntToScalar(10+fTexture[0].width()), |
| SkIntToScalar(100+fTexture[0].height()), |
| p); |
| |
| //////// |
| glFlush(); |
| premulBitmap(fOffscreen); |
| canvas->drawBitmap(fOffscreen, SkIntToScalar(10), SkIntToScalar(10), NULL); |
| } |
| |
| private: |
| |
| typedef SkView INHERITED; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| static SkView* MyFactory() { return new GLView; } |
| static SkViewRegister reg(MyFactory); |
| |