SkBitmapProcShader.h revision 9c9005a347e9996f357bd79591bd34f74f8bbc66
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkBitmapProcShader_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkBitmapProcShader_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBitmapProcState.h" 15a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkSmallAllocator.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkBitmapProcShader : public SkShader { 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 199c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkBitmapProcShader(const SkBitmap& src, TileMode tx, TileMode ty, 209c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org const SkMatrix* localMatrix = NULL); 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkShader 23b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org virtual bool isOpaque() const SK_OVERRIDE; 2476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com virtual BitmapType asABitmap(SkBitmap*, SkMatrix*, TileMode*) const SK_OVERRIDE; 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual bool validContext(const SkBitmap& device, 2787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkPaint& paint, 2887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkMatrix& matrix, 2987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkMatrix* totalInverse = NULL) const SK_OVERRIDE; 3087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual SkShader::Context* createContext(const SkBitmap&, const SkPaint&, 3187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkMatrix&, void* storage) const SK_OVERRIDE; 3287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual size_t contextSize() const SK_OVERRIDE; 3387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool CanDo(const SkBitmap&, TileMode tx, TileMode ty); 35ff21c2e0ae23da0f4742b47d4d37969a2a18bd99skia.committer@gmail.com 360f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org SK_TO_STRING_OVERRIDE() 37ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapProcShader) 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 39e197cbf9a3e66bab926bc5e51962752dad5221a0bsalomon@google.com#if SK_SUPPORT_GPU 400ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com GrEffectRef* asNewEffect(GrContext*, const SkPaint&) const SK_OVERRIDE; 41e197cbf9a3e66bab926bc5e51962752dad5221a0bsalomon@google.com#endif 42e197cbf9a3e66bab926bc5e51962752dad5221a0bsalomon@google.com 4387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org class BitmapProcShaderContext : public SkShader::Context { 4487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org public: 4587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org // The context takes ownership of the state. It will call its destructor 4687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org // but will NOT free the memory. 4787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org BitmapProcShaderContext(const SkBitmapProcShader& shader, 4887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkBitmap& device, 4987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkPaint& paint, 5087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkMatrix& matrix, 5187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkBitmapProcState* state); 5287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual ~BitmapProcShaderContext(); 5387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 5487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE; 5587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual ShadeProc asAShadeProc(void** ctx) SK_OVERRIDE; 5687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) SK_OVERRIDE; 5787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 5887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org virtual uint32_t getFlags() const SK_OVERRIDE { return fFlags; } 5987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 6087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org private: 6187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkBitmapProcState* fState; 6287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org uint32_t fFlags; 6387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 6487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org typedef SkShader::Context INHERITED; 6587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org }; 6687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 688b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkBitmapProcShader(SkReadBuffer& ); 698b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 7187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkBitmap fRawBitmap; // experimental for RLE encoding 7287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org uint8_t fTileModeX, fTileModeY; 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 747c2f27d788fff9dbf66a6d52753e47f786a313c0reed@google.comprivate: 7587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org bool validInternal(const SkBitmap& device, const SkPaint& paint, 7687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org const SkMatrix& matrix, SkMatrix* totalInverse, 7787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org SkBitmapProcState* state) const; 7887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkShader INHERITED; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 8287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// Commonly used allocator. It currently is only used to allocate up to 3 objects. The total 8387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// bytes requested is calculated using one of our large shaders, its context size plus the size of 8487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// an Sk3DBlitter in SkDraw.cpp 8587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// Note that some contexts may contain other contexts (e.g. for compose shaders), but we've not 8687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org// yet found a situation where the size below isn't big enough. 8787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.orgtypedef SkSmallAllocator<3, sizeof(SkBitmapProcShader) + 8887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org sizeof(SkBitmapProcShader::BitmapProcShaderContext) + 8987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org sizeof(SkBitmapProcState) + 9087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org sizeof(void*) * 2> SkTBlitterAllocator; 91a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org 92a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org// If alloc is non-NULL, it will be used to allocate the returned SkShader, and MUST outlive 93a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org// the SkShader. 94a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.orgSkShader* CreateBitmapShader(const SkBitmap& src, SkShader::TileMode, SkShader::TileMode, 959c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org const SkMatrix* localMatrix, SkTBlitterAllocator* alloc); 96a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 98