Index: skia/picture/SkPicture.cpp |
=================================================================== |
--- skia/picture/SkPicture.cpp (revision 16859) |
+++ skia/picture/SkPicture.cpp (working copy) |
@@ -1,246 +0,0 @@ |
-/* |
-** |
-** Copyright 2007, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkPictureFlat.h" |
-#include "SkPicturePlayback.h" |
-#include "SkPictureRecord.h" |
- |
-#include "SkCanvas.h" |
-#include "SkChunkAlloc.h" |
-#include "SkPicture.h" |
-#include "SkRegion.h" |
-#include "SkStream.h" |
-#include "SkTDArray.h" |
-#include "SkTSearch.h" |
-#include "SkTime.h" |
- |
-#include "SkReader32.h" |
-#include "SkWriter32.h" |
- |
-#define DUMP_BUFFER_SIZE 65536 |
- |
-//#define ENABLE_TIME_DRAW // dumps milliseconds for each draw |
- |
- |
-#ifdef SK_DEBUG |
-// enable SK_DEBUG_TRACE to trace DrawType elements when |
-// recorded and played back |
-// #define SK_DEBUG_TRACE |
-// enable SK_DEBUG_SIZE to see the size of picture components |
-// #define SK_DEBUG_SIZE |
-// enable SK_DEBUG_DUMP to see the contents of recorded elements |
-// #define SK_DEBUG_DUMP |
-// enable SK_DEBUG_VALIDATE to check internal structures for consistency |
-// #define SK_DEBUG_VALIDATE |
-#endif |
- |
-#if defined SK_DEBUG_TRACE || defined SK_DEBUG_DUMP |
-const char* DrawTypeToString(DrawType drawType) { |
- switch (drawType) { |
- case UNUSED: SkDebugf("DrawType UNUSED\n"); SkASSERT(0); break; |
- case CLIP_PATH: return "CLIP_PATH"; |
- case CLIP_REGION: return "CLIP_REGION"; |
- case CLIP_RECT: return "CLIP_RECT"; |
- case CONCAT: return "CONCAT"; |
- case DRAW_BITMAP: return "DRAW_BITMAP"; |
- case DRAW_BITMAP_MATRIX: return "DRAW_BITMAP_MATRIX"; |
- case DRAW_BITMAP_RECT: return "DRAW_BITMAP_RECT"; |
- case DRAW_PAINT: return "DRAW_PAINT"; |
- case DRAW_PATH: return "DRAW_PATH"; |
- case DRAW_PICTURE: return "DRAW_PICTURE"; |
- case DRAW_POINTS: return "DRAW_POINTS"; |
- case DRAW_POS_TEXT: return "DRAW_POS_TEXT"; |
- case DRAW_POS_TEXT_H: return "DRAW_POS_TEXT_H"; |
- case DRAW_RECT_GENERAL: return "DRAW_RECT_GENERAL"; |
- case DRAW_RECT_SIMPLE: return "DRAW_RECT_SIMPLE"; |
- case DRAW_SPRITE: return "DRAW_SPRITE"; |
- case DRAW_TEXT: return "DRAW_TEXT"; |
- case DRAW_TEXT_ON_PATH: return "DRAW_TEXT_ON_PATH"; |
- case RESTORE: return "RESTORE"; |
- case ROTATE: return "ROTATE"; |
- case SAVE: return "SAVE"; |
- case SAVE_LAYER: return "SAVE_LAYER"; |
- case SCALE: return "SCALE"; |
- case SKEW: return "SKEW"; |
- case TRANSLATE: return "TRANSLATE"; |
- default: |
- SkDebugf("DrawType error 0x%08x\n", drawType); |
- SkASSERT(0); |
- break; |
- } |
- SkASSERT(0); |
- return NULL; |
-} |
-#endif |
- |
-#ifdef SK_DEBUG_VALIDATE |
-static void validateMatrix(const SkMatrix* matrix) { |
- SkScalar scaleX = matrix->getScaleX(); |
- SkScalar scaleY = matrix->getScaleY(); |
- SkScalar skewX = matrix->getSkewX(); |
- SkScalar skewY = matrix->getSkewY(); |
- SkScalar perspX = matrix->getPerspX(); |
- SkScalar perspY = matrix->getPerspY(); |
- if (scaleX != 0 && skewX != 0) |
- SkDebugf("scaleX != 0 && skewX != 0\n"); |
- SkASSERT(scaleX == 0 || skewX == 0); |
- SkASSERT(scaleY == 0 || skewY == 0); |
- SkASSERT(perspX == 0); |
- SkASSERT(perspY == 0); |
-} |
-#endif |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkPicture::SkPicture() { |
- fRecord = NULL; |
- fPlayback = NULL; |
- fWidth = fHeight = 0; |
-} |
- |
-SkPicture::SkPicture(const SkPicture& src) : SkRefCnt() { |
- fWidth = src.fWidth; |
- fHeight = src.fHeight; |
- fRecord = NULL; |
- |
- /* We want to copy the src's playback. However, if that hasn't been built |
- yet, we need to fake a call to endRecording() without actually calling |
- it (since it is destructive, and we don't want to change src). |
- */ |
- if (src.fPlayback) { |
- fPlayback = SkNEW_ARGS(SkPicturePlayback, (*src.fPlayback)); |
- } else if (src.fRecord) { |
- // here we do a fake src.endRecording() |
- fPlayback = SkNEW_ARGS(SkPicturePlayback, (*src.fRecord)); |
- } else { |
- fPlayback = NULL; |
- } |
-} |
- |
-SkPicture::~SkPicture() { |
- fRecord->safeUnref(); |
- SkDELETE(fPlayback); |
-} |
- |
-void SkPicture::swap(SkPicture& other) { |
- SkTSwap(fRecord, other.fRecord); |
- SkTSwap(fPlayback, other.fPlayback); |
- SkTSwap(fWidth, other.fWidth); |
- SkTSwap(fHeight, other.fHeight); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkCanvas* SkPicture::beginRecording(int width, int height) { |
- if (fPlayback) { |
- SkDELETE(fPlayback); |
- fPlayback = NULL; |
- } |
- |
- if (NULL != fRecord) { |
- fRecord->unref(); |
- fRecord = NULL; |
- } |
- |
- fRecord = SkNEW(SkPictureRecord); |
- |
- fWidth = width; |
- fHeight = height; |
- |
- SkBitmap bm; |
- bm.setConfig(SkBitmap::kNo_Config, width, height); |
- fRecord->setBitmapDevice(bm); |
- |
- return fRecord; |
-} |
- |
-SkCanvas* SkPicture::getRecordingCanvas() const { |
- // will be null if we are not recording |
- return fRecord; |
-} |
- |
-void SkPicture::endRecording() { |
- if (NULL == fPlayback) { |
- if (NULL != fRecord) { |
- fPlayback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); |
- fRecord->unref(); |
- fRecord = NULL; |
- } |
- } |
- SkASSERT(NULL == fRecord); |
-} |
- |
-void SkPicture::draw(SkCanvas* surface) { |
- this->endRecording(); |
- if (fPlayback) { |
- fPlayback->draw(*surface); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-#include "SkStream.h" |
- |
-#define PICTURE_VERSION 1 |
- |
-SkPicture::SkPicture(SkStream* stream) : SkRefCnt() { |
- if (stream->readU32() != PICTURE_VERSION) { |
- sk_throw(); |
- } |
- |
- fWidth = stream->readU32(); |
- fHeight = stream->readU32(); |
- |
- fRecord = NULL; |
- fPlayback = NULL; |
- |
- if (stream->readBool()) { |
- fPlayback = SkNEW_ARGS(SkPicturePlayback, (stream)); |
- } |
-} |
- |
-void SkPicture::serialize(SkWStream* stream) const { |
- SkPicturePlayback* playback = fPlayback; |
- |
- if (NULL == playback && fRecord) { |
- playback = SkNEW_ARGS(SkPicturePlayback, (*fRecord)); |
- } |
- |
- stream->write32(PICTURE_VERSION); |
- stream->write32(fWidth); |
- stream->write32(fHeight); |
- if (playback) { |
- stream->writeBool(true); |
- playback->serialize(stream); |
- // delete playback if it is a local version (i.e. cons'd up just now) |
- if (playback != fPlayback) { |
- SkDELETE(playback); |
- } |
- } else { |
- stream->writeBool(false); |
- } |
-} |
- |
-void SkPicture::abortPlayback() { |
- if (NULL == fPlayback) { |
- return; |
- } |
- fPlayback->abort(); |
-} |
- |
- |