Пример #1
0
static void test_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* image, SkImage::LegacyBitmapMode mode) {
    SkBitmap bitmap;
    REPORTER_ASSERT(reporter, image->asLegacyBitmap(&bitmap, mode));
    check_legacy_bitmap(reporter, image, bitmap, mode);

    // Test subsetting to exercise the rowBytes logic.
    SkBitmap tmp;
    REPORTER_ASSERT(reporter, bitmap.extractSubset(&tmp, SkIRect::MakeWH(image->width() / 2,
                                                                         image->height() / 2)));
    SkAutoTUnref<SkImage> subsetImage(SkImage::NewFromBitmap(tmp));
    REPORTER_ASSERT(reporter, subsetImage);

    SkBitmap subsetBitmap;
    REPORTER_ASSERT(reporter, subsetImage->asLegacyBitmap(&subsetBitmap, mode));
    check_legacy_bitmap(reporter, subsetImage, subsetBitmap, mode);
}
Пример #2
0
int  imZoom (struct Mviewer *param)
{
    char     subsetimpath[1024];
    char     subsetredpath[1024];
    char     subsetgrnpath[1024];
    char     subsetbluepath[1024];

    char     graypath[1024];
    char     redpath[1024];
    char     grnpath[1024];
    char     bluepath[1024];

    int      istatus;

    int      ns_subset, nl_subset;
    int      diffx, diffy;

    int      xdim, ydim;


    double   xmin, ymin, xmax, ymax;

    double   dx, xc, dy, yc;
    double   factor, reffactor, new_factor;


    struct timeval   tp;
    struct timezone  tzp;
    double           exacttime, exacttime0;

    int      debugfile = 1;
    int      debugtime = 0;


    if ((debugfile) && (fdebug != (FILE *)NULL)) {

        fprintf (fdebug, "\nFrom imZoom: cmd= [%s]\n", param->cmd);
        fprintf (fdebug, "xmin= [%lf] xmax= [%lf]\n",
                 param->xmin, param->xmax);
        fprintf (fdebug, "ymin= [%lf] ymax= [%lf]\n",
                 param->ymin, param->ymax);
        fflush (fdebug);

        fprintf (fdebug, "imageWidth= [%d] imageHeight= [%d]\n",
                 param->imageWidth, param->imageHeight);
        fprintf (fdebug, "nowcs= [%d]\n", param->nowcs);
        fflush (fdebug);
    }


    factor = param->zoomfactor;
    reffactor = param->refzoomfactor;

    if ((debugfile) && (fdebug != (FILE *)NULL)) {
        fprintf (fdebug, "factor= [%lf] reffactor= [%lf]\n",
                 factor, reffactor);
        fprintf (fdebug, "ss= [%.1f] sl= [%.1f]\n", param->ss, param->sl);
        fprintf (fdebug, "xflip= [%d] yflip= [%d]\n",
                 param->xflip, param->yflip);
        fflush (fdebug);
    }


    /*
        "movebox" input are from refimg pixel coord.
    */
    if (strcasecmp (param->cmd, "movebox") == 0) {

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "case movebox\n");
            fflush (fdebug);
        }

        xmin = param->xmin/reffactor;
        xmax = param->xmax/reffactor;
        ymin = param->ymin/reffactor;
        ymax = param->ymax/reffactor;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "xmin= [%lf] xmax= [%lf]\n", xmin, xmax);
            fprintf (fdebug, "ymin= [%lf] ymax= [%lf]\n", ymin, ymax);
            fflush (fdebug);
        }

        param->xmin = xmin;
        param->xmax = xmax;
        param->ymin = ymin;
        param->ymax = ymax;
    }
    else if (strcasecmp (param->cmd, "zoombox") == 0) {

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "case zoombox: factor= [%lf]\n", factor);
            fprintf (fdebug, "image:xmin= [%lf] ymin= [%lf]\n",
                     param->xmin, param->ymin);
            fprintf (fdebug, "xmax= [%lf] ymax= [%lf]\n",
                     param->xmax, param->ymax);
            fprintf (fdebug, "param->ss= [%lf] sl= [%lf]\n",
                     param->ss, param->sl);
            fprintf (fdebug, "param->xs= [%lf] xe= [%lf]\n",
                     param->xs, param->xe);
            fprintf (fdebug, "param->ys= [%lf] ye= [%lf]\n",
                     param->ys, param->ye);
            fflush (fdebug);
        }

        xmin = param->xs/factor + param->ss;
        xmax = param->xe/factor + param->ss;
        ymin = param->ys/factor + param->sl;
        ymax = param->ye/factor + param->sl;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "screen: xmin= [%lf] ymin= [%lf]\n", xmin, ymin);
            fprintf (fdebug, "xmax= [%lf] ymax= [%lf]\n", xmax, ymax);
            fflush (fdebug);
        }

        /*
            Adjust xmax/ymax to make it a square
        */
        xdim = xmax - xmin;
        ydim = ymax - ymin;

        if (xdim > ydim) {
            ydim = xdim;
        }
        else if (ydim > xdim) {
            xdim = ydim;
        }

        xmax = xmin + xdim;
        ymax = ymin + ydim;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "adjusted: xmin= [%lf] ymin= [%lf]\n", xmin, ymin);
            fprintf (fdebug, "xmax= [%lf] ymax= [%lf]\n", xmax, ymax);
            fflush (fdebug);
        }

        if ((fabs(xmax-xmin) < 5) && (fabs(ymax-ymin) < 5)) {

            strcpy (param->errmsg,
                    "Zoom box is less than 5 image pixels in either directions"
                    " -- too small an area for zoom operation.");
            return (-1);
        }

        param->xmin = xmin;
        param->xmax = xmax;
        param->ymin = ymin;
        param->ymax = ymax;

    }
    else if ((strcasecmp (param->cmd, "zoomin") == 0) ||
             (strcasecmp (param->cmd, "zoomout") == 0)) {

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "cmd= [%s]\n", param->cmd);
            fprintf (fdebug, "ss= [%.1f] sl= [%.1f]\n",
                     param->ss, param->sl);
            fprintf (fdebug, "ns= [%d] nl= [%d]\n",
                     param->cutoutWidth, param->cutoutWidth);
            fflush (fdebug);
        }

        if (param->cutoutWidth > 0)
            param->ns = param->cutoutWidth;
        else
            param->ns = param->imageWidth;

        if (param->cutoutHeight > 0)
            param->nl = param->cutoutHeight;
        else
            param->nl = param->imageHeight;

        xmin = param->ss;
        ymin = param->sl;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "ns= [%d] nl= [%d]\n", param->ns, param->nl);
            fprintf (fdebug, "xmin= [%lf] ymin= [%lf]\n", xmin, ymin);
            fflush (fdebug);
        }

        if (strcasecmp (param->cmd, "zoomin") == 0) {
            new_factor = factor * sqrt(2.);
        }
        else if (strcasecmp (param->cmd, "zoomout") == 0) {
            new_factor = factor / sqrt(2.);
        }

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "new factor: factor= [%lf] reffactor= [%lf]\n",
                     new_factor, reffactor);
            fflush (fdebug);
        }

        xdim = param->ns;
        ydim = param->nl;

        if (xdim > ydim) {

            ydim = xdim;
        }
        else if (ydim > xdim) {
            xdim = ydim;
        }

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "xdim= [%d] ydim= [%d]\n", xdim, ydim);
            fflush (fdebug);
        }

        dx = (double)xdim / 2.0;
        xc = xmin + dx;

        dy = (double)ydim / 2.0;
        yc = ymin + dy;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "dx= [%lf] xc= [%lf]\n", dx, xc);
            fprintf (fdebug, "dy= [%lf] yc= [%lf]\n", dy, yc);
            fflush (fdebug);
        }

        dx = dx*factor/new_factor;
        dy = dy*factor/new_factor;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "new xc and dx: dx= [%lf] xc= [%lf]\n", dx, xc);
            fprintf (fdebug, "dy= [%lf] yc= [%lf]\n", dy, yc);
            fflush (fdebug);
        }

        xmin = xc - dx;
        xmax = xc + dx;
        ymin = yc - dy;
        ymax = yc + dy;

        if (xmin < 0.)
            xmin = 0.;

        if (xmax > (double)param->imageWidth-1)
            xmax = (double)param->imageWidth-1;

        if (ymin < 0.)
            ymin = 0.;

        if (ymax > (double)param->imageHeight-1)
            ymax = (double)param->imageHeight-1;


        param->xmin = xmin;
        param->xmax = xmax;
        param->ymin = ymin;
        param->ymax = ymax;

    }
    else if (strcasecmp (param->cmd, "resetzoom") == 0) {

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "cmd= [%s]\n", param->cmd);
            fprintf (fdebug, "ss= [%.1f] sl= [%.1f]\n",
                     param->ss, param->sl);
            fprintf (fdebug, "ns= [%d] nl= [%d]\n", param->ns, param->nl);
            fflush (fdebug);
        }

        param->ns = param->imageWidth;
        param->nl = param->imageHeight;

        xmin = 0.;
        xmax = (double)param->ns-1;

        ymin = 0.;
        ymax = (double)param->nl-1;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "resetzoom: xmin= %lf xmax= %lf\n", xmin, xmax);
            fprintf (fdebug, "ymin= [%lf] ymax= [%lf]\n", ymin, ymax);
            fflush (fdebug);
        }
    }


    if ((debugfile) && (fdebug != (FILE *)NULL)) {
        fprintf (fdebug, "xmin= [%lf] xmax= [%lf]\n", xmin, xmax);
        fprintf (fdebug, "ymin= [%lf] ymax= [%lf]\n", ymin, ymax);
        fflush (fdebug);
    }


    /*
        Adjust xmin, xmax, ymin, ymax if they exceed image dimensions
    */
    if ((debugfile) && (fdebug != (FILE *)NULL)) {
        fprintf (fdebug, "\n Adjust xmin, xmax, ymin, ymax: \n");
        fprintf (fdebug, "xmin= [%lf] xmax= [%lf]\n", xmin, xmax);
        fprintf (fdebug, "ymin= [%lf] ymax= [%lf]\n", ymin, ymax);
        fprintf (fdebug, "xflip= [%d] yflip= [%d]\n",
                 param->xflip, param->yflip);
        fflush (fdebug);
    }

    if ((int)xmin < 0) {
        dx = -xmin;
        xmin = 0.;
        xmax += dx;
    }

    if ((int)xmax > param->imageWidth) {

        dx = xmax - param->imageWidth;
        xmax = (double)param->imageWidth-1;

        xmin -= dx;
        if (xmin < 0)
            xmin = 0.;
    }


    if ((int)ymin < 0) {
        dy = -ymin;
        ymin = 0.;
        ymax += dy;
    }

    if ((int)ymax > param->imageHeight) {

        dy = ymax - param->imageHeight;
        ymax = (double)param->imageHeight-1;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "here1: ymin= [%lf] ymax= [%lf]\n", ymin, ymax);
            fprintf (fdebug, "dy= [%lf]\n", dy);
            fflush (fdebug);
        }

        ymin -= dy;

        if ((debugfile) && (fdebug != (FILE *)NULL)) {
            fprintf (fdebug, "ymin= [%lf]\n", ymin);
            fflush (fdebug);
        }
        if (ymin < 0)
            ymin = 0.;
    }

    if ((debugfile) && (fdebug != (FILE *)NULL)) {
        fprintf (fdebug, "\nadjusted: xmin= [%lf] xmax= [%lf]\n",
                 xmin, xmax);
        fprintf (fdebug, "ymin= [%lf] ymax= [%lf]\n", ymin, ymax);
        fflush (fdebug);
    }

    ns_subset = (int)(xmax - xmin);
    diffx = (int)xmin + ns_subset - param->imageWidth;
    if (diffx > 0)
        ns_subset -= diffx;

    nl_subset = (int)(ymax - ymin);
    diffy = (int)ymin + nl_subset - param->imageHeight;
    if (diffy > 0)
        nl_subset -= diffy;



    if ((debugfile) && (fdebug != (FILE *)NULL)) {
        fprintf (fdebug, "ns_subset= [%d] nl_subset= ]%d]\n",
                 ns_subset, nl_subset);
        fflush (fdebug);
    }

    if ((strcasecmp (param->cmd, "zoomin") == 0) &&
            ((ns_subset < 5) || (nl_subset < 5))) {

        strcpy (param->errmsg, "New zoom area is less than 5x5 pixels "
                "-- too small for zoomIn operation.");
        return (-1);
    }



    /*
        make subset image
    */
    if (strcasecmp (param->cmd, "resetzoom") != 0) {

        if (param->iscolor) {

            sprintf (redpath, "%s/%s", param->directory, param->redFile);
            sprintf (grnpath, "%s/%s", param->directory, param->greenFile);
            sprintf (bluepath, "%s/%s", param->directory, param->blueFile);

            if ((int)strlen(param->subsetredfile) == 0) {
                sprintf (param->subsetredfile, "%s_cutout_%s",
                         param->imageFile, param->redFile);
            }
            sprintf (subsetredpath, "%s/%s",
                     param->directory, param->subsetredfile);

            if ((int)strlen(param->subsetgrnfile) == 0) {
                sprintf (param->subsetgrnfile, "%s_cutout_%s",
                         param->imageFile, param->greenFile);
            }
            sprintf (subsetgrnpath, "%s/%s",
                     param->directory, param->subsetgrnfile);

            if ((int)strlen(param->subsetbluefile) == 0) {
                sprintf (param->subsetbluefile, "%s_cutout_%s",
                         param->imageFile, param->blueFile);
            }
            sprintf (subsetbluepath, "%s/%s",
                     param->directory, param->subsetbluefile);

            if ((debugfile) && (fdebug != (FILE *)NULL)) {

                fprintf (fdebug, "redpath= [%s]\n", redpath);
                fprintf (fdebug, "grnpath= [%s]\n", grnpath);
                fprintf (fdebug, "bluepath= [%s]\n", bluepath);

                fprintf (fdebug, "subsetredpath= [%s]\n", subsetredpath);
                fprintf (fdebug, "subsetgrnpath= [%s]\n", subsetgrnpath);
                fprintf (fdebug, "subsetbluepath= [%s]\n", subsetbluepath);
                fflush (fdebug);
            }



            istatus = subsetImage (redpath, param->imageWidth,
                                   param->imageHeight, param->xflip,
                                   param->yflip, param->nowcs, subsetredpath, xmin, ymin,
                                   (double)ns_subset, (double)nl_subset, param->errmsg);

            if ((debugfile) && (fdebug != (FILE *)NULL)) {
                fprintf (fdebug,
                         "returned subsetImage (red): istatus= [%d]\n", istatus);
                fflush (fdebug);
            }

            if (istatus == -1) {
                return (-1);
            }

            istatus = subsetImage (grnpath, param->imageWidth,
                                   param->imageHeight, param->xflip,
                                   param->yflip, param->nowcs, subsetgrnpath, xmin, ymin,
                                   (double)ns_subset, (double)nl_subset, param->errmsg);

            if ((debugfile) && (fdebug != (FILE *)NULL)) {
                fprintf (fdebug,
                         "returned subsetImage (grn): istatus= [%d]\n", istatus);
                fflush (fdebug);
            }

            if (istatus == -1) {
                return (-1);
            }

            istatus = subsetImage (bluepath, param->imageWidth,
                                   param->imageHeight, param->xflip,
                                   param->yflip, param->nowcs, subsetbluepath, xmin, ymin,
                                   (double)ns_subset, (double)nl_subset, param->errmsg);

            if ((debugfile) && (fdebug != (FILE *)NULL)) {
                fprintf (fdebug,
                         "returned subsetImage (blue): istatus= [%d]\n", istatus);
                fflush (fdebug);
            }

            if (istatus == -1) {
                return (-1);
            }
        }
        else {
            sprintf (graypath, "%s/%s", param->directory, param->grayFile);

            if ((int)strlen(param->subsetimfile) == 0) {

                sprintf (param->subsetimfile, "%s_cutout_%s",
                         param->imageFile, param->grayFile);
            }

            sprintf (subsetimpath, "%s/%s",
                     param->directory, param->subsetimfile);

            if ((debugfile) && (fdebug != (FILE *)NULL)) {

                if (debugtime) {
                    gettimeofday (&tp, &tzp);
                    exacttime0 = (double)tp.tv_sec
                                 + (double)tp.tv_usec/1000000.;
                }

                fprintf (fdebug, "call subsetImage\n");
                fprintf (fdebug, "graypath= [%s]\n", graypath);
                fprintf (fdebug, "subsetimpath= [%s]\n", subsetimpath);
                fflush (fdebug);
            }

            istatus = subsetImage (graypath, param->imageWidth,
                                   param->imageHeight, param->xflip,
                                   param->yflip, param->nowcs, subsetimpath, xmin, ymin,
                                   (double)ns_subset, (double)nl_subset, param->errmsg);

            if ((debugfile) && (fdebug != (FILE *)NULL)) {
                fprintf (fdebug, "returned subsetImage: istatus= [%d]\n",
                         istatus);
                fflush (fdebug);
            }

            if (istatus == -1) {
                return (-1);
            }

            if ((debugfile) && (fdebug != (FILE *)NULL)) {

                if (debugtime) {
                    gettimeofday (&tp, &tzp);
                    exacttime = (double)tp.tv_sec + (double)tp.tv_usec/1000000.;
                    fprintf (fdebug, "time (subsetImage): %.6f sec\n",
                             (exacttime-exacttime0));
                }
            }
        }
    }

    param->zoomfactor = factor;

    if ((debugfile) && (fdebug != (FILE *)NULL)) {
        fprintf (fdebug, "zoomfactor= %lf\n", param->zoomfactor);
        fflush (fdebug);
    }

    param->ss = xmin;
    param->sl = ymin;

    return (0);
}