170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org/* 270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * Copyright 2011 Google Inc. 370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * 470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be 570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org * found in the LICENSE file. 670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org */ 770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "gm.h" 970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "SkSurface.h" 1070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "SkCanvas.h" 110d276f71d2cf30f4a282cd4f470084c6b42c6af2piotaixr#include "SkDecodingImageGenerator.h" 12d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org#include "SkStream.h" 13d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org#include "SkData.h" 14d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org 1597b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#if SK_SUPPORT_GPU 1697b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#include "GrContext.h" 1797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#endif 1897af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com 19d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.orgstatic void drawJpeg(SkCanvas* canvas, const SkISize& size) { 20ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com // TODO: Make this draw a file that is checked in, so it can 21ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com // be exercised on machines other than mike's. Will require a 22ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com // rebaseline. 2348925e3b3179a19b5cebed8ead237633107f160freed SkAutoDataUnref data(SkData::NewFromFileName("/Users/mike/Downloads/skia.google.jpeg")); 2448925e3b3179a19b5cebed8ead237633107f160freed if (NULL == data.get()) { 2548925e3b3179a19b5cebed8ead237633107f160freed return; 2648925e3b3179a19b5cebed8ead237633107f160freed } 270d276f71d2cf30f4a282cd4f470084c6b42c6af2piotaixr SkImage* image = SkImage::NewFromGenerator( 280d276f71d2cf30f4a282cd4f470084c6b42c6af2piotaixr SkDecodingImageGenerator::Create(data, SkDecodingImageGenerator::Options())); 29d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org if (image) { 30d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org SkAutoCanvasRestore acr(canvas, true); 31d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org canvas->scale(size.width() * 1.0f / image->width(), 32d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org size.height() * 1.0f / image->height()); 33b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImage(image, 0, 0, NULL); 34d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org image->unref(); 35d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org } 36d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org} 3770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 3870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic void drawContents(SkSurface* surface, SkColor fillC) { 3904ba448579b976369075c675d847ef0f779d40f4skia.committer@gmail.com SkSize size = SkSize::Make(SkIntToScalar(surface->width()), 4094acc70312d8fe6605dea99f27f62b180bf22284robertphillips@google.com SkIntToScalar(surface->height())); 41d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org SkCanvas* canvas = surface->getCanvas(); 4270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 4370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkScalar stroke = size.fWidth / 10; 4470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkScalar radius = (size.fWidth - stroke) / 2; 4570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 4670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkPaint paint; 47ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 4870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.setAntiAlias(true); 4970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.setColor(fillC); 5070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint); 51ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 5270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.setStyle(SkPaint::kStroke_Style); 5370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.setStrokeWidth(stroke); 5470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.setColor(SK_ColorBLACK); 5570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint); 5670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org} 5770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 58dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.orgstatic void test_surface(SkCanvas* canvas, SkSurface* surf, bool usePaint) { 5970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org drawContents(surf, SK_ColorRED); 605ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org SkImage* imgR = surf->newImageSnapshot(); 6170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 6297af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com if (true) { 635ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org SkImage* imgR2 = surf->newImageSnapshot(); 6497af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com SkASSERT(imgR == imgR2); 6597af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com imgR2->unref(); 6697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com } 6797af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com 6870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org drawContents(surf, SK_ColorGREEN); 695ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org SkImage* imgG = surf->newImageSnapshot(); 7070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 7197af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com // since we've drawn after we snapped imgR, imgG will be a different obj 7297af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com SkASSERT(imgR != imgG); 7397af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com 7470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org drawContents(surf, SK_ColorBLUE); 7570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 76d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org SkPaint paint; 77d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org// paint.setFilterBitmap(true); 78d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org// paint.setAlpha(0x80); 79d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org 80b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImage(imgR, 0, 0, usePaint ? &paint : NULL); 81b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImage(imgG, 0, 80, usePaint ? &paint : NULL); 82dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org surf->draw(canvas, 0, 160, usePaint ? &paint : NULL); 83dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 84dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org SkRect src1, src2, src3; 85dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org src1.iset(0, 0, surf->width(), surf->height()); 867f1af501f206da48a7ff791af53432c9c1c89d08skia.committer@gmail.com src2.iset(-surf->width() / 2, -surf->height() / 2, 87dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org surf->width(), surf->height()); 88dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org src3.iset(0, 0, surf->width() / 2, surf->height() / 2); 89dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 90dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org SkRect dst1, dst2, dst3, dst4; 91dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org dst1.set(0, 240, 65, 305); 92dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org dst2.set(0, 320, 65, 385); 93dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org dst3.set(0, 400, 65, 465); 94dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org dst4.set(0, 480, 65, 545); 95dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 96b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImageRect(imgR, &src1, dst1, usePaint ? &paint : NULL); 97b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImageRect(imgG, &src2, dst2, usePaint ? &paint : NULL); 98b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImageRect(imgR, &src3, dst3, usePaint ? &paint : NULL); 99b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr canvas->drawImageRect(imgG, NULL, dst4, usePaint ? &paint : NULL); 10070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 10170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org imgG->unref(); 10270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org imgR->unref(); 10370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org} 10470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 10570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgclass ImageGM : public skiagm::GM { 10670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org void* fBuffer; 10758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com size_t fBufferSize; 10870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkSize fSize; 10970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org enum { 11070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org W = 64, 11170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org H = 64, 11270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org RB = W * 4 + 8, 11370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org }; 11470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgpublic: 11570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org ImageGM() { 11658b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com fBufferSize = RB * H; 11758b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com fBuffer = sk_malloc_throw(fBufferSize); 11870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org fSize.set(SkIntToScalar(W), SkIntToScalar(H)); 11970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } 120ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 12170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org virtual ~ImageGM() { 12270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org sk_free(fBuffer); 12370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } 124ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 125ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 12670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgprotected: 12770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org virtual SkString onShortName() { 12897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com return SkString("image-surface"); 12970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } 130ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 13170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org virtual SkISize onISize() { 132dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org return SkISize::Make(960, 1200); 13370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } 134ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 13570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org virtual void onDraw(SkCanvas* canvas) { 136d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org drawJpeg(canvas, this->getISize()); 137d829b5cbff1a6e149af4961f577368a6fb7c2e39mike@reedtribe.org 138d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org canvas->scale(2, 2); 139d2782edf0736c8c37e1075462d384342af283148mike@reedtribe.org 14097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com static const char* kLabel1 = "Original Img"; 14197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com static const char* kLabel2 = "Modified Img"; 14297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com static const char* kLabel3 = "Cur Surface"; 143dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org static const char* kLabel4 = "Full Crop"; 144dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org static const char* kLabel5 = "Over-crop"; 145dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org static const char* kLabel6 = "Upper-left"; 146dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org static const char* kLabel7 = "No Crop"; 14797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 148dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org static const char* kLabel8 = "Pre-Alloc Img"; 149dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org static const char* kLabel9 = "New Alloc Img"; 150cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org static const char* kLabel10 = "Null Paint"; 151cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org static const char* kLabel11 = "GPU"; 15297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 15397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com SkPaint textPaint; 154cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org textPaint.setAntiAlias(true); 155992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&textPaint); 156cae54f1f211e3c293ef9afb968067d06ca0ea23dcommit-bot@chromium.org textPaint.setTextSize(8); 15797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 15897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com canvas->drawText(kLabel1, strlen(kLabel1), 10, 60, textPaint); 15997b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com canvas->drawText(kLabel2, strlen(kLabel2), 10, 140, textPaint); 16097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com canvas->drawText(kLabel3, strlen(kLabel3), 10, 220, textPaint); 161dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel4, strlen(kLabel4), 10, 300, textPaint); 162dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel5, strlen(kLabel5), 10, 380, textPaint); 163dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel6, strlen(kLabel6), 10, 460, textPaint); 164dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel7, strlen(kLabel7), 10, 540, textPaint); 16597b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 166dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel8, strlen(kLabel8), 80, 10, textPaint); 167dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel9, strlen(kLabel9), 160, 10, textPaint); 168dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel10, strlen(kLabel10), 250, 10, textPaint); 169dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawText(kLabel11, strlen(kLabel11), 320, 10, textPaint); 17097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 17197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com canvas->translate(80, 20); 17297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 17358b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com // since we draw into this directly, we need to start fresh 17458b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com sk_bzero(fBuffer, fBufferSize); 17558b21ec7f06cfa8b7d7403a6108c0216345b3510reed@google.com 17632678d9a453e2c9fd26e92be429cdd84250b4d85commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(W, H); 177b947625800a26194fcf63d7b57dadb1a63677f6amike@reedtribe.org SkAutoTUnref<SkSurface> surf0(SkSurface::NewRasterDirect(info, fBuffer, RB)); 178b947625800a26194fcf63d7b57dadb1a63677f6amike@reedtribe.org SkAutoTUnref<SkSurface> surf1(SkSurface::NewRaster(info)); 17997b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#if SK_SUPPORT_GPU 180644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org GrContext* ctx = canvas->getGrContext(); 18197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com 1824a8126e7f81384526629b1e21bf89b632ea13cd9reed SkAutoTUnref<SkSurface> surf4(SkSurface::NewRenderTarget(ctx, info)); 18397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#endif 18470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 185dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org test_surface(canvas, surf0, true); 186dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->translate(80, 0); 187dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org test_surface(canvas, surf1, true); 18897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#if SK_SUPPORT_GPU 18949f085dddff10473b6ebf832a974288300224e60bsalomon if (ctx) { 19097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com canvas->translate(80, 0); 191dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org test_surface(canvas, surf4, true); 19297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com } 19397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#endif 19470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } 195ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 19697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com virtual uint32_t onGetFlags() const SK_OVERRIDE { 1979c72827f90759b37e11da6df6126bc484b5b5d91reed@google.com return GM::kSkipPicture_Flag | GM::kSkipPipe_Flag; 19897af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com } 19997af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com 20070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgprivate: 20170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org typedef skiagm::GM INHERITED; 20270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org}; 203ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 20470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org////////////////////////////////////////////////////////////////////////////// 20570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 20670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic skiagm::GM* MyFactory(void*) { return new ImageGM; } 20770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic skiagm::GMRegistry reg(MyFactory); 208