diff options
Diffstat (limited to 'samplecode/SampleGL.cpp')
-rw-r--r-- | samplecode/SampleGL.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/samplecode/SampleGL.cpp b/samplecode/SampleGL.cpp new file mode 100644 index 0000000..d020b0e --- /dev/null +++ b/samplecode/SampleGL.cpp @@ -0,0 +1,206 @@ +#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); + |