18b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org/* 28b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * Copyright 2011 Google Inc. 38b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * 48b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 58b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * found in the LICENSE file. 68b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org */ 78b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 88b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#ifndef SkReadBuffer_DEFINED 98b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#define SkReadBuffer_DEFINED 108b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 118b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkColorFilter.h" 128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkData.h" 138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkDrawLooper.h" 148b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkImageFilter.h" 158b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkMaskFilter.h" 168b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkPath.h" 178b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkPathEffect.h" 188b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkPicture.h" 198b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkRasterizer.h" 208b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h" 218b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReader32.h" 228b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkRefCnt.h" 238b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkShader.h" 24a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett#include "SkTHash.h" 258b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h" 26d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed#include "SkXfermodePriv.h" 278b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 288b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgclass SkBitmap; 29cd56f812e09fdd8f8322c5c28cbc4423a74b9a0afmalitaclass SkImage; 3054dc4878b02765efea39e68b218df1e4bfff4b88reedclass SkInflator; 318b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 328b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#if defined(SK_DEBUG) && defined(SK_BUILD_FOR_MAC) 338b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org #define DEBUG_NON_DETERMINISTIC_ASSERT 348b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#endif 358b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 368b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgclass SkReadBuffer { 378b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgpublic: 388b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer(); 398b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer(const void* data, size_t size); 408b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkReadBuffer(SkStream* stream); 418b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual ~SkReadBuffer(); 428b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 4399e20891a080f39113bd7a5dc202730f2a13fa07robertphillips virtual SkReadBuffer* clone(const void* data, size_t size) const { 4499e20891a080f39113bd7a5dc202730f2a13fa07robertphillips return new SkReadBuffer(data, size); 4599e20891a080f39113bd7a5dc202730f2a13fa07robertphillips } 4699e20891a080f39113bd7a5dc202730f2a13fa07robertphillips 477ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org enum Version { 4888fd0fbcccea615f2d2cd61a121ac9e3185adfe4mtklein /* 497ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org kFilterLevelIsEnum_Version = 23, 507ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org kGradientFlippedFlag_Version = 24, 517ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org kDashWritesPhaseIntervals_Version = 25, 527ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org kColorShaderNoBool_Version = 26, 5383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org kNoUnitMappers_Version = 27, 54968edcafa61442dc4f7f8ed8f89523d0f353e9fbcommit-bot@chromium.org kNoMoreBitmapFlatten_Version = 28, 55c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo kSimplifyLocalMatrix_Version = 30, 5655b6d8be997a447ef9ce0f029697677a940bfc24senorblanco kImageFilterUniqueID_Version = 31, 573b6255493e458c6b2c1412af908581f0bf3f6b70djsollen kRemoveAndroidPaintOpts_Version = 32, 589fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed kFlattenCreateProc_Version = 33, 5988fd0fbcccea615f2d2cd61a121ac9e3185adfe4mtklein */ 60c5e15a1afab2621e860a251c3fcf5917867ad49freed kRemoveColorTableAlpha_Version = 36, 61234f036b3e731e06e616c5291157d3bb4fbfdee2sugoi kDropShadowMode_Version = 37, 625234075b1c6bcada4ad17ed5a83bfcb53df66b7fJustin Novosad kPictureImageFilterResolution_Version = 38, 63f3c78ccf5694d22d2e4a7061a80399a7e69b59dbjunov kPictureImageFilterLevel_Version = 39, 644a22a433bfb972dcd96f76e3d3b0613c26d8fc86senorblanco kImageFilterNoUniqueID_Version = 40, 6576be9c8dc0e5306ef81c2987848088cdec7ccd3fmtklein kBitmapSourceFilterQuality_Version = 41, 6676be9c8dc0e5306ef81c2987848088cdec7ccd3fmtklein kPictureShaderHasPictureBool_Version = 42, 67871872f3f247f6b699617f6d9ef50ef5da6fbe74reed kHasDrawImageOpCodes_Version = 43, 68f70b531daaf47db1ee95c70da9843f1dd1f418d3reed kAnnotationsMovedToCanvas_Version = 44, 690576aa9c0722bba358a27f80cc134ea2cd4ca2c9mtklein kLightingShaderWritesInvNormRotation = 45, 7027cdd947903a4262bb483e7d35153358f4541bf8robertphillips kBlurMaskFilterWritesOccluder = 47, 71e25d71ccbcdb47c7ee7bdf13235066092ae11af3brianosman kGradientShaderFloatColor_Version = 49, 72374772bd61951f01bf84fe17bf53d8867681c9aereed kXfermodeToBlendMode_Version = 50, 737d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed kXfermodeToBlendMode2_Version = 51, 743a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita kTextBlobImplicitRunCount_Version = 52, 757ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org }; 767ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org 777ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org /** 787ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org * Returns true IFF the version is older than the specified version. 797ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org */ 807ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org bool isVersionLT(Version targetVersion) const { 817ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org SkASSERT(targetVersion > 0); 827ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org return fVersion > 0 && fVersion < targetVersion; 837ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org } 840943f5f58abcff15c7583faafe44549b9a44f47acommit-bot@chromium.org 85b3f543d955637c6e10d7109554b5a46c6e25291aMike Reed uint32_t getVersion() const { return fVersion; } 86b3f543d955637c6e10d7109554b5a46c6e25291aMike Reed 870943f5f58abcff15c7583faafe44549b9a44f47acommit-bot@chromium.org /** This may be called at most once; most clients of SkReadBuffer should not mess with it. */ 887ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org void setVersion(int version) { 897ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org SkASSERT(0 == fVersion || version == fVersion); 907ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org fVersion = version; 910943f5f58abcff15c7583faafe44549b9a44f47acommit-bot@chromium.org } 920943f5f58abcff15c7583faafe44549b9a44f47acommit-bot@chromium.org 938b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org enum Flags { 948b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org kCrossProcess_Flag = 1 << 0, 958b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org kScalarIsFloat_Flag = 1 << 1, 968b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org kPtrIs64Bit_Flag = 1 << 2, 978b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org kValidation_Flag = 1 << 3, 988b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org }; 998b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1008b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void setFlags(uint32_t flags) { fFlags = flags; } 1018b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org uint32_t getFlags() const { return fFlags; } 1028b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1038b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org bool isCrossProcess() const { 1048b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org return this->isValidating() || SkToBool(fFlags & kCrossProcess_Flag); 1058b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org } 1068b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org bool isScalarFloat() const { return SkToBool(fFlags & kScalarIsFloat_Flag); } 1078b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org bool isPtr64Bit() const { return SkToBool(fFlags & kPtrIs64Bit_Flag); } 1088b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org bool isValidating() const { return SkToBool(fFlags & kValidation_Flag); } 1098b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 110f117781362ecf673f43f93918781853690f0e145commit-bot@chromium.org size_t size() { return fReader.size(); } 111f117781362ecf673f43f93918781853690f0e145commit-bot@chromium.org size_t offset() { return fReader.offset(); } 1128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org bool eof() { return fReader.eof(); } 1130951fe12984944406e0f1bb105b9fa4c54fcdcddsugoi virtual const void* skip(size_t size) { return fReader.skip(size); } 1149ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips 1158b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // primitives 1168b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool readBool(); 1178b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual SkColor readColor(); 1188b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual int32_t readInt(); 1198b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual SkScalar readScalar(); 1208b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual uint32_t readUInt(); 1218b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual int32_t read32(); 1228b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 123a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett // peek 124a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett virtual uint8_t peekByte(); 125a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett 1268b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // strings -- the caller is responsible for freeing the string contents 1278b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readString(SkString* string); 1288b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1298b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // common data structures 13097bbf8211fa35bbb0811d5835cb0eaaf37cc679ebrianosman virtual void readColor4f(SkColor4f* color); 1318b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readPoint(SkPoint* point); 1328b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkPoint readPoint() { SkPoint p; this->readPoint(&p); return p; } 1338b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readMatrix(SkMatrix* matrix); 1348b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readIRect(SkIRect* rect); 1358b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readRect(SkRect* rect); 1369ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips virtual void readRRect(SkRRect* rrect); 1378b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readRegion(SkRegion* region); 13888fd0fbcccea615f2d2cd61a121ac9e3185adfe4mtklein 1398b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void readPath(SkPath* path); 14054dc4878b02765efea39e68b218df1e4bfff4b88reed virtual void readPaint(SkPaint* paint) { paint->unflatten(*this); } 1418b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1423b37545bc594a96de45eba62dea0ce478750f2a9mtklein virtual SkFlattenable* readFlattenable(SkFlattenable::Type); 14360c9b58b3214b0154c931656e91e39b230e987d8reed template <typename T> sk_sp<T> readFlattenable() { 1443b37545bc594a96de45eba62dea0ce478750f2a9mtklein return sk_sp<T>((T*)this->readFlattenable(T::GetFlattenableType())); 145cfb6bdf767796c950f89985445738d2d8e7f12b0reed } 14660c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkColorFilter> readColorFilter() { return this->readFlattenable<SkColorFilter>(); } 14760c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkDrawLooper> readDrawLooper() { return this->readFlattenable<SkDrawLooper>(); } 14860c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkImageFilter> readImageFilter() { return this->readFlattenable<SkImageFilter>(); } 14960c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkMaskFilter> readMaskFilter() { return this->readFlattenable<SkMaskFilter>(); } 15060c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkPathEffect> readPathEffect() { return this->readFlattenable<SkPathEffect>(); } 15160c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkRasterizer> readRasterizer() { return this->readFlattenable<SkRasterizer>(); } 15260c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkShader> readShader() { return this->readFlattenable<SkShader>(); } 15360c9b58b3214b0154c931656e91e39b230e987d8reed sk_sp<SkXfermode> readXfermode() { return this->readFlattenable<SkXfermode>(); } 1548b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1558b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // binary data and arrays 1568b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool readByteArray(void* value, size_t size); 1578b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool readColorArray(SkColor* colors, size_t size); 15897bbf8211fa35bbb0811d5835cb0eaaf37cc679ebrianosman virtual bool readColor4fArray(SkColor4f* colors, size_t size); 1598b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool readIntArray(int32_t* values, size_t size); 1608b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool readPointArray(SkPoint* points, size_t size); 1618b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool readScalarArray(SkScalar* values, size_t size); 1628b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 163fde05114e6c4107b36e1aa571c64d31def40f613reed sk_sp<SkData> readByteArrayAsData() { 1648b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org size_t len = this->getArrayCount(); 1658b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org if (!this->validateAvailable(len)) { 166fde05114e6c4107b36e1aa571c64d31def40f613reed return SkData::MakeEmpty(); 1678b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org } 1688b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void* buffer = sk_malloc_throw(len); 1698b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org this->readByteArray(buffer, len); 170fde05114e6c4107b36e1aa571c64d31def40f613reed return SkData::MakeFromMalloc(buffer, len); 1718b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org } 1728b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1738b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // helpers to get info about arrays and binary data 1748b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual uint32_t getArrayCount(); 1758b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 176a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed sk_sp<SkImage> readBitmapAsImage(); 177a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed sk_sp<SkImage> readImage(); 1782867e7648069272ad1827ebafe49bd0d22a619b3reed virtual sk_sp<SkTypeface> readTypeface(); 1798b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1808b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void setTypefaceArray(SkTypeface* array[], int count) { 1818b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org fTFArray = array; 1828b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org fTFCount = count; 1838b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org } 1848b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1858b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org /** 1868b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * Call this with a pre-loaded array of Factories, in the same order as 1878b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org * were created/written by the writer. SkPicture uses this. 1888b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org */ 1898b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void setFactoryPlayback(SkFlattenable::Factory array[], int count) { 1908b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org fFactoryArray = array; 1918b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org fFactoryCount = count; 1928b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org } 1938b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 1948b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org /** 195a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * For an input flattenable (specified by name), set a custom factory proc 196a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * to use when unflattening. Will make a copy of |name|. 197a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * 198a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * If the global registry already has a default factory for the flattenable, 199a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * this will override that factory. If a custom factory has already been 200a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * set for the flattenable, this will override that factory. 201a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * 202a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * Custom factories can be removed by calling setCustomFactory("...", nullptr). 203a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett */ 204a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett void setCustomFactory(const SkString& name, SkFlattenable::Factory factory) { 205a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett fCustomFactory.set(name, factory); 206a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett } 207a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett 208a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed // If nullptr is passed, then the default deserializer will be used 209a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed // which calls SkImage::MakeFromEncoded() 210a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed void setImageDeserializer(SkImageDeserializer* factory); 2118b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // Default impelementations don't check anything. 2139ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips virtual bool validate(bool isValid) { return isValid; } 2148b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool isValid() const { return true; } 2158b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual bool validateAvailable(size_t size) { return true; } 2169ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips bool validateIndex(int index, int count) { 2179ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips return this->validate(index >= 0 && index < count); 2189ca06c4b00bfb9bb1a7f352efd264185e5a95fbcrobertphillips } 2198b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 22054dc4878b02765efea39e68b218df1e4bfff4b88reed SkInflator* getInflator() const { return fInflator; } 22154dc4878b02765efea39e68b218df1e4bfff4b88reed void setInflator(SkInflator* inf) { fInflator = inf; } 22254dc4878b02765efea39e68b218df1e4bfff4b88reed 22354dc4878b02765efea39e68b218df1e4bfff4b88reed// sk_sp<SkImage> inflateImage(); 22454dc4878b02765efea39e68b218df1e4bfff4b88reed 2259e5f85e89d03a850d435fc951e74e9861a0c1bddcommit-bot@chromium.orgprotected: 226a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett /** 227a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * Allows subclass to check if we are using factories for expansion 228a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * of flattenables. 229a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett */ 230a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett int factoryCount() { return fFactoryCount; } 231a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett 232a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett /** 233a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * Checks if a custom factory has been set for a given flattenable. 234a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett * Returns the custom factory if it exists, or nullptr otherwise. 235a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett */ 236a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett SkFlattenable::Factory getCustomFactory(const SkString& name) { 237a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett SkFlattenable::Factory* factoryPtr = fCustomFactory.find(name); 238a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett return factoryPtr ? *factoryPtr : nullptr; 239a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett } 240a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett 2419e5f85e89d03a850d435fc951e74e9861a0c1bddcommit-bot@chromium.org SkReader32 fReader; 2429e5f85e89d03a850d435fc951e74e9861a0c1bddcommit-bot@chromium.org 243a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett // Only used if we do not have an fFactoryArray. 244a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett SkTHashMap<uint32_t, SkString> fFlattenableDict; 245a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett 2468b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgprivate: 2478b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org bool readArray(void* value, size_t size, size_t elementSize); 2488b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2498b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org uint32_t fFlags; 2507ed173b1ebac84671fb0dc1b9bd323a5e6e63771commit-bot@chromium.org int fVersion; 2518b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2528b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org void* fMemoryPtr; 2538b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2548b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkTypeface** fTFArray; 2558b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org int fTFCount; 2568b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2578b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkFlattenable::Factory* fFactoryArray; 2588b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org int fFactoryCount; 2598b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 260a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett // Only used if we do not have an fFactoryArray. 261a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett SkTHashMap<SkString, SkFlattenable::Factory> fCustomFactory; 262a3b3b238f507a6ec7f43febc6bf0bb17e04e770fmsarett 263a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed // We do not own this ptr, we just use it (guaranteed to never be null) 264a9ca05ca5e604b9ee18e9cce19b059085ca0e22creed SkImageDeserializer* fImageDeserializer; 2658b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2668b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#ifdef DEBUG_NON_DETERMINISTIC_ASSERT 2678b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // Debugging counter to keep track of how many bitmaps we 2688b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org // have decoded. 2698b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org int fDecodedBitmapIndex; 2708b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#endif // DEBUG_NON_DETERMINISTIC_ASSERT 27154dc4878b02765efea39e68b218df1e4bfff4b88reed 27254dc4878b02765efea39e68b218df1e4bfff4b88reed SkInflator* fInflator = nullptr; 2738b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org}; 2748b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 2758b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#endif // SkReadBuffer_DEFINED 276