expand internal subclasses into separate files

git-svn-id: http://skia.googlecode.com/svn/trunk@4836 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2012-07-30 18:20:12 +00:00
Родитель c9062047ce
Коммит 58b21ec7f0
6 изменённых файлов: 243 добавлений и 203 удалений

Просмотреть файл

@ -47,6 +47,7 @@ static void test_surface(SkCanvas* canvas, SkSurface* surf) {
class ImageGM : public skiagm::GM {
void* fBuffer;
size_t fBufferSize;
SkSize fSize;
enum {
W = 64,
@ -55,7 +56,8 @@ class ImageGM : public skiagm::GM {
};
public:
ImageGM() {
fBuffer = sk_malloc_throw(RB * H);
fBufferSize = RB * H;
fBuffer = sk_malloc_throw(fBufferSize);
fSize.set(SkIntToScalar(W), SkIntToScalar(H));
}
@ -74,6 +76,9 @@ protected:
}
virtual void onDraw(SkCanvas* canvas) {
// since we draw into this directly, we need to start fresh
sk_bzero(fBuffer, fBufferSize);
SkImage::Info info;
info.fWidth = W;

Просмотреть файл

@ -1,217 +1,16 @@
#include "SkImage.h"
#include "SkImage_Base.h"
#include "SkImagePriv.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
///////////////////////////////////////////////////////////////////////////////
class SkImage_Base : public SkImage {
public:
SkImage_Base(int width, int height) : INHERITED(width, height) {}
virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) = 0;
private:
typedef SkImage INHERITED;
};
static SkImage_Base* asIB(SkImage* image) {
return static_cast<SkImage_Base*>(image);
}
///////////////////////////////////////////////////////////////////////////////
class SkImage_Raster : public SkImage_Base {
public:
static bool ValidArgs(const Info& info, SkColorSpace* cs, size_t rowBytes) {
const int maxDimension = SK_MaxS32 >> 2;
const size_t kMaxPixelByteSize = SK_MaxS32;
if (info.fWidth < 0 || info.fHeight < 0) {
return false;
}
if (info.fWidth > maxDimension || info.fHeight > maxDimension) {
return false;
}
if ((unsigned)info.fColorType > (unsigned)kLastEnum_ColorType) {
return false;
}
if ((unsigned)info.fAlphaType > (unsigned)kLastEnum_AlphaType) {
return false;
}
bool isOpaque;
if (SkImageInfoToBitmapConfig(info, &isOpaque) == SkBitmap::kNo_Config) {
return false;
}
// TODO: check colorspace
if (rowBytes < SkImageMinRowBytes(info)) {
return false;
}
int64_t size = (int64_t)info.fHeight * rowBytes;
if (size > kMaxPixelByteSize) {
return false;
}
return true;
}
static SkImage* NewEmpty();
SkImage_Raster(const SkImage::Info&, SkColorSpace*, SkData*, size_t rb);
virtual ~SkImage_Raster();
virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE;
// exposed for SkSurface_Raster via SkNewImageFromPixelRef
SkImage_Raster(const SkImage::Info&, SkPixelRef*, size_t rowBytes);
private:
SkImage_Raster() : INHERITED(0, 0) {}
SkBitmap fBitmap;
typedef SkImage_Base INHERITED;
};
SkImage* SkNewImageFromPixelRef(const SkImage::Info& info, SkPixelRef* pr,
size_t rowBytes) {
return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes));
}
///////////////////////////////////////////////////////////////////////////////
#include "SkData.h"
#include "SkDataPixelRef.h"
SkImage* SkImage_Raster::NewEmpty() {
// Returns lazily created singleton
static SkImage* gEmpty;
if (NULL == gEmpty) {
gEmpty = SkNEW(SkImage_Raster);
}
gEmpty->ref();
return gEmpty;
}
SkImage_Raster::SkImage_Raster(const Info& info, SkColorSpace* cs,
SkData* data, size_t rowBytes)
: INHERITED(info.fWidth, info.fHeight) {
bool isOpaque;
SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes);
fBitmap.setPixelRef(SkNEW_ARGS(SkDataPixelRef, (data)))->unref();
fBitmap.setIsOpaque(isOpaque);
fBitmap.setImmutable();
}
SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes)
: INHERITED(info.fWidth, info.fHeight) {
SkASSERT(pr->isImmutable());
bool isOpaque;
SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes);
fBitmap.setPixelRef(pr);
fBitmap.setIsOpaque(isOpaque);
fBitmap.setImmutable();
}
SkImage_Raster::~SkImage_Raster() {}
void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) {
canvas->drawBitmap(fBitmap, x, y, paint);
}
///////////////////////////////////////////////////////////////////////////////
#include "SkPicture.h"
class SkImage_Picture : public SkImage_Base {
public:
SkImage_Picture(SkPicture*);
virtual ~SkImage_Picture();
virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE;
private:
SkPicture* fPicture;
typedef SkImage_Base INHERITED;
};
SkImage_Picture::SkImage_Picture(SkPicture* pict) : INHERITED(pict->width(), pict->height()) {
pict->endRecording();
pict->ref();
fPicture = pict;
}
SkImage_Picture::~SkImage_Picture() {
fPicture->unref();
}
void SkImage_Picture::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y,
const SkPaint* paint) {
SkImagePrivDrawPicture(canvas, fPicture, x, y, paint);
}
SkImage* SkNewImageFromPicture(SkPicture* pict) {
return SkNEW_ARGS(SkImage_Picture, (pict));
}
///////////////////////////////////////////////////////////////////////////////
SkImage* SkImage::NewRasterCopy(const SkImage::Info& info, SkColorSpace* cs,
const void* pixels, size_t rowBytes) {
if (!SkImage_Raster::ValidArgs(info, cs, rowBytes)) {
return NULL;
}
if (0 == info.fWidth && 0 == info.fHeight) {
return SkImage_Raster::NewEmpty();
}
// check this after empty-check
if (NULL == pixels) {
return NULL;
}
// Here we actually make a copy of the caller's pixel data
SkAutoDataUnref data(SkData::NewWithCopy(pixels, info.fHeight * rowBytes));
return SkNEW_ARGS(SkImage_Raster, (info, cs, data, rowBytes));
}
SkImage* SkImage::NewRasterData(const SkImage::Info& info, SkColorSpace* cs,
SkData* pixelData, size_t rowBytes) {
if (!SkImage_Raster::ValidArgs(info, cs, rowBytes)) {
return NULL;
}
if (0 == info.fWidth && 0 == info.fHeight) {
return SkImage_Raster::NewEmpty();
}
// check this after empty-check
if (NULL == pixelData) {
return NULL;
}
// did they give us enough data?
size_t size = info.fHeight * rowBytes;
if (pixelData->size() < size) {
return NULL;
}
SkAutoDataUnref data(pixelData);
return SkNEW_ARGS(SkImage_Raster, (info, cs, data, rowBytes));
}
///////////////////////////////////////////////////////////////////////////////
#include "SkCanvas.h"
uint32_t SkImage::NextUniqueID() {
static int32_t gUniqueID;

Просмотреть файл

@ -1,3 +1,9 @@
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkImagePriv_DEFINED
#define SkImagePriv_DEFINED

24
src/image/SkImage_Base.h Normal file
Просмотреть файл

@ -0,0 +1,24 @@
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkImage_Base_DEFINED
#define SkImage_Base_DEFINED
#include "SkImage.h"
class SkImage_Base : public SkImage {
public:
SkImage_Base(int width, int height) : INHERITED(width, height) {}
virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) = 0;
private:
typedef SkImage INHERITED;
};
#endif

Просмотреть файл

@ -0,0 +1,45 @@
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkImage_Base.h"
#include "SkImagePriv.h"
#include "SkPicture.h"
class SkImage_Picture : public SkImage_Base {
public:
SkImage_Picture(SkPicture*);
virtual ~SkImage_Picture();
virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE;
private:
SkPicture* fPicture;
typedef SkImage_Base INHERITED;
};
///////////////////////////////////////////////////////////////////////////////
SkImage_Picture::SkImage_Picture(SkPicture* pict) : INHERITED(pict->width(), pict->height()) {
pict->endRecording();
pict->ref();
fPicture = pict;
}
SkImage_Picture::~SkImage_Picture() {
fPicture->unref();
}
void SkImage_Picture::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y,
const SkPaint* paint) {
SkImagePrivDrawPicture(canvas, fPicture, x, y, paint);
}
SkImage* SkNewImageFromPicture(SkPicture* pict) {
return SkNEW_ARGS(SkImage_Picture, (pict));
}

Просмотреть файл

@ -0,0 +1,161 @@
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkImage_Base.h"
#include "SkImagePriv.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkData.h"
#include "SkDataPixelRef.h"
class SkImage_Raster : public SkImage_Base {
public:
static bool ValidArgs(const Info& info, SkColorSpace* cs, size_t rowBytes) {
const int maxDimension = SK_MaxS32 >> 2;
const size_t kMaxPixelByteSize = SK_MaxS32;
if (info.fWidth < 0 || info.fHeight < 0) {
return false;
}
if (info.fWidth > maxDimension || info.fHeight > maxDimension) {
return false;
}
if ((unsigned)info.fColorType > (unsigned)kLastEnum_ColorType) {
return false;
}
if ((unsigned)info.fAlphaType > (unsigned)kLastEnum_AlphaType) {
return false;
}
bool isOpaque;
if (SkImageInfoToBitmapConfig(info, &isOpaque) == SkBitmap::kNo_Config) {
return false;
}
// TODO: check colorspace
if (rowBytes < SkImageMinRowBytes(info)) {
return false;
}
int64_t size = (int64_t)info.fHeight * rowBytes;
if (size > kMaxPixelByteSize) {
return false;
}
return true;
}
static SkImage* NewEmpty();
SkImage_Raster(const SkImage::Info&, SkColorSpace*, SkData*, size_t rb);
virtual ~SkImage_Raster();
virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE;
// exposed for SkSurface_Raster via SkNewImageFromPixelRef
SkImage_Raster(const SkImage::Info&, SkPixelRef*, size_t rowBytes);
private:
SkImage_Raster() : INHERITED(0, 0) {}
SkBitmap fBitmap;
typedef SkImage_Base INHERITED;
};
///////////////////////////////////////////////////////////////////////////////
SkImage* SkImage_Raster::NewEmpty() {
// Returns lazily created singleton
static SkImage* gEmpty;
if (NULL == gEmpty) {
gEmpty = SkNEW(SkImage_Raster);
}
gEmpty->ref();
return gEmpty;
}
SkImage_Raster::SkImage_Raster(const Info& info, SkColorSpace* cs,
SkData* data, size_t rowBytes)
: INHERITED(info.fWidth, info.fHeight) {
bool isOpaque;
SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes);
fBitmap.setPixelRef(SkNEW_ARGS(SkDataPixelRef, (data)))->unref();
fBitmap.setIsOpaque(isOpaque);
fBitmap.setImmutable();
}
SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes)
: INHERITED(info.fWidth, info.fHeight) {
SkASSERT(pr->isImmutable());
bool isOpaque;
SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes);
fBitmap.setPixelRef(pr);
fBitmap.setIsOpaque(isOpaque);
fBitmap.setImmutable();
}
SkImage_Raster::~SkImage_Raster() {}
void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) {
canvas->drawBitmap(fBitmap, x, y, paint);
}
///////////////////////////////////////////////////////////////////////////////
SkImage* SkImage::NewRasterCopy(const SkImage::Info& info, SkColorSpace* cs,
const void* pixels, size_t rowBytes) {
if (!SkImage_Raster::ValidArgs(info, cs, rowBytes)) {
return NULL;
}
if (0 == info.fWidth && 0 == info.fHeight) {
return SkImage_Raster::NewEmpty();
}
// check this after empty-check
if (NULL == pixels) {
return NULL;
}
// Here we actually make a copy of the caller's pixel data
SkAutoDataUnref data(SkData::NewWithCopy(pixels, info.fHeight * rowBytes));
return SkNEW_ARGS(SkImage_Raster, (info, cs, data, rowBytes));
}
SkImage* SkImage::NewRasterData(const SkImage::Info& info, SkColorSpace* cs,
SkData* pixelData, size_t rowBytes) {
if (!SkImage_Raster::ValidArgs(info, cs, rowBytes)) {
return NULL;
}
if (0 == info.fWidth && 0 == info.fHeight) {
return SkImage_Raster::NewEmpty();
}
// check this after empty-check
if (NULL == pixelData) {
return NULL;
}
// did they give us enough data?
size_t size = info.fHeight * rowBytes;
if (pixelData->size() < size) {
return NULL;
}
SkAutoDataUnref data(pixelData);
return SkNEW_ARGS(SkImage_Raster, (info, cs, data, rowBytes));
}
SkImage* SkNewImageFromPixelRef(const SkImage::Info& info, SkPixelRef* pr,
size_t rowBytes) {
return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes));
}