ec3ed6a5eb
I have manually examined all of these diffs and restored a few files that seem to require manual adjustment. The following files still need to be modified manually, in a separate CL: android_sample/SampleApp/AndroidManifest.xml android_sample/SampleApp/res/layout/layout.xml android_sample/SampleApp/res/menu/sample.xml android_sample/SampleApp/res/values/strings.xml android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java experimental/CiCarbonSampleMain.c experimental/CocoaDebugger/main.m experimental/FileReaderApp/main.m experimental/SimpleCocoaApp/main.m experimental/iOSSampleApp/Shared/SkAlertPrompt.h experimental/iOSSampleApp/Shared/SkAlertPrompt.m experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig gpu/src/android/GrGLDefaultInterface_android.cpp gyp/common.gypi gyp_skia include/ports/SkHarfBuzzFont.h include/views/SkOSWindow_wxwidgets.h make.bat make.py src/opts/memset.arm.S src/opts/memset16_neon.S src/opts/memset32_neon.S src/opts/opts_check_arm.cpp src/ports/SkDebug_brew.cpp src/ports/SkMemory_brew.cpp src/ports/SkOSFile_brew.cpp src/ports/SkXMLParser_empty.cpp src/utils/ios/SkImageDecoder_iOS.mm src/utils/ios/SkOSFile_iOS.mm src/utils/ios/SkStream_NSData.mm tests/FillPathTest.cpp Review URL: http://codereview.appspot.com/4816058 git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
171 lines
5.8 KiB
C++
171 lines
5.8 KiB
C++
|
|
/*
|
|
* Copyright 2011 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
#ifndef SkGLDevice_DEFINED
|
|
#define SkGLDevice_DEFINED
|
|
|
|
#include "SkDevice.h"
|
|
#include "SkGL.h"
|
|
#include "SkRegion.h"
|
|
|
|
#ifdef SK_BUILD_FOR_MAC
|
|
#include <OpenGL/gl.h>
|
|
#elif defined(ANDROID)
|
|
#include <GLES/gl.h>
|
|
#endif
|
|
|
|
class SkGLDeviceFactory : public SkDeviceFactory {
|
|
public:
|
|
virtual SkDevice* newDevice(SkBitmap::Config config, int width, int height,
|
|
bool isOpaque, bool isForLayer);
|
|
};
|
|
|
|
struct SkGLDrawProcs;
|
|
|
|
class SkGLDevice : public SkDevice {
|
|
public:
|
|
SkGLDevice(const SkBitmap& bitmap, bool offscreen);
|
|
virtual ~SkGLDevice();
|
|
|
|
virtual SkDeviceFactory* getDeviceFactory() {
|
|
return SkNEW(SkGLDeviceFactory);
|
|
}
|
|
|
|
virtual uint32_t getDeviceCapabilities() { return kGL_Capability; }
|
|
|
|
// used to identify GLTextCache data in the glyphcache
|
|
static void GlyphCacheAuxProc(void* data);
|
|
|
|
enum TexOrientation {
|
|
kNo_TexOrientation,
|
|
kTopToBottom_TexOrientation,
|
|
kBottomToTop_TexOrientation
|
|
};
|
|
|
|
/** Called when this device is no longer a candidate for a render target,
|
|
but will instead be used as a texture to be drawn. Be sure to call
|
|
the base impl if you override, as it will compute size and max.
|
|
*/
|
|
virtual TexOrientation bindDeviceAsTexture();
|
|
|
|
// returns true if complex
|
|
SkGLClipIter* updateMatrixClip();
|
|
// call to set the clip to the specified rect
|
|
void scissor(const SkIRect&);
|
|
|
|
// overrides from SkDevice
|
|
virtual void gainFocus(SkCanvas*);
|
|
virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip);
|
|
|
|
virtual void drawPaint(const SkDraw&, const SkPaint& paint);
|
|
virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
|
|
const SkPoint[], const SkPaint& paint);
|
|
virtual void drawRect(const SkDraw&, const SkRect& r,
|
|
const SkPaint& paint);
|
|
virtual void drawPath(const SkDraw&, const SkPath& path,
|
|
const SkPaint& paint);
|
|
virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
|
|
const SkMatrix& matrix, const SkPaint& paint);
|
|
virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
|
|
int x, int y, const SkPaint& paint);
|
|
virtual void drawText(const SkDraw&, const void* text, size_t len,
|
|
SkScalar x, SkScalar y, const SkPaint& paint);
|
|
virtual void drawPosText(const SkDraw&, const void* text, size_t len,
|
|
const SkScalar pos[], SkScalar constY,
|
|
int scalarsPerPos, const SkPaint& paint);
|
|
virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
|
|
const SkPath& path, const SkMatrix* matrix,
|
|
const SkPaint& paint);
|
|
virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
|
|
const SkPoint verts[], const SkPoint texs[],
|
|
const SkColor colors[], SkXfermode* xmode,
|
|
const uint16_t indices[], int indexCount,
|
|
const SkPaint& paint);
|
|
virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
|
|
const SkPaint&);
|
|
|
|
// settings for the global texture cache
|
|
|
|
static size_t GetTextureCacheMaxCount();
|
|
static void SetTextureCacheMaxCount(size_t count);
|
|
|
|
static size_t GetTextureCacheMaxSize();
|
|
static void SetTextureCacheMaxSize(size_t size);
|
|
|
|
/** Call glDeleteTextures for all textures (including those for text)
|
|
This should be called while the gl-context is still valid. Its purpose
|
|
is to free up gl resources. Note that if a bitmap or text is drawn after
|
|
this call, new caches will be created.
|
|
*/
|
|
static void DeleteAllTextures();
|
|
|
|
/** Forget all textures without calling delete (including those for text).
|
|
This should be called if the gl-context has changed, and the texture
|
|
IDs that have been cached are no longer valid.
|
|
*/
|
|
static void AbandonAllTextures();
|
|
|
|
protected:
|
|
/** Return the current glmatrix, from a previous call to setMatrixClip */
|
|
const SkMatrix& matrix() const { return fMatrix; }
|
|
/** Return the current clip, from a previous call to setMatrixClip */
|
|
const SkRegion& clip() const { return fClip; }
|
|
|
|
private:
|
|
SkGLMatrix fGLMatrix;
|
|
SkMatrix fMatrix;
|
|
SkRegion fClip;
|
|
bool fDirty;
|
|
|
|
SkGLClipIter fClipIter;
|
|
SkGLDrawProcs* fDrawProcs;
|
|
|
|
void setupForText(SkDraw* draw, const SkPaint& paint);
|
|
|
|
// global texture cache methods
|
|
class TexCache;
|
|
static TexCache* LockTexCache(const SkBitmap&, GLuint* name,
|
|
SkPoint* size);
|
|
static void UnlockTexCache(TexCache*);
|
|
class SkAutoLockTexCache {
|
|
public:
|
|
SkAutoLockTexCache(const SkBitmap& bitmap, GLuint* name,
|
|
SkPoint* size) {
|
|
fTex = SkGLDevice::LockTexCache(bitmap, name, size);
|
|
}
|
|
~SkAutoLockTexCache() {
|
|
if (fTex) {
|
|
SkGLDevice::UnlockTexCache(fTex);
|
|
}
|
|
}
|
|
TexCache* get() const { return fTex; }
|
|
private:
|
|
TexCache* fTex;
|
|
};
|
|
friend class SkAutoTexCache;
|
|
|
|
// returns cache if the texture is bound for the shader
|
|
TexCache* setupGLPaintShader(const SkPaint& paint);
|
|
|
|
class AutoPaintShader {
|
|
public:
|
|
AutoPaintShader(SkGLDevice*, const SkPaint& paint);
|
|
~AutoPaintShader();
|
|
|
|
bool useTex() const { return fTexCache != 0; }
|
|
private:
|
|
SkGLDevice* fDevice;
|
|
TexCache* fTexCache;
|
|
};
|
|
friend class AutoPaintShader;
|
|
|
|
typedef SkDevice INHERITED;
|
|
};
|
|
|
|
#endif
|
|
|